ZGlmZiAtLWdpdCBhL3NjcmlwdHMvcnVuaGVsbG9lZGdlbnQuc2ggYi8uZWRpdG9yY29uZmlnCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gc2NyaXB0cy9ydW5oZWxsb2VkZ2VudC5zaApyZW5hbWUgdG8gLmVkaXRvcmNvbmZpZwppbmRleCBmMDgwMTBmLi5kZjczODNjCi0tLSBhL3NjcmlwdHMvcnVuaGVsbG9lZGdlbnQuc2gKKysrIGIvLmVkaXRvcmNvbmZpZwpAQCAtMSw0ICsxLDMgQEAKLSMhL2Jpbi9iYXNoCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTE1LDkgKzE0LDE4IEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCi1lZGdlbnQ9Li4KIAotIyBSdW5zIEhlbGxvRWRnZW50Ci0jCi1leHBvcnQgQ0xBU1NQQVRIPSIke2VkZ2VudH0vc2FtcGxlcy9saWIvZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuamFyIgotamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LkhlbGxvRWRnZW50CitbKl0KK2NoYXJzZXQ9dXRmLTgKK2VuZF9vZl9saW5lPWxmCitpbnNlcnRfZmluYWxfbmV3bGluZT1mYWxzZQoraW5kZW50X3N0eWxlPXNwYWNlCitpbmRlbnRfc2l6ZT00CisKK1t7Ki55bWwsKi55YW1sfV0KK2luZGVudF9zdHlsZT1zcGFjZQoraW5kZW50X3NpemU9MgorCitbKi54bWxdCitpbmRlbnRfc3R5bGU9c3BhY2UKK2luZGVudF9zaXplPTIKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDkyNzc4ZTIuLmVhN2UxOTIgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSwxMyArMSwxNCBAQAogKi5jbGFzcwogCisjIExvY2FsIGRldmVsb3BlcnMgdG9vbGNoYWluCisvdG9vbGNoYWlucy1sb2NhbC54bWwKKworIyBFeGNsdWRlIHRoZSBtYXZlbi13cmFwcGVyLmphcgorLm12bi93cmFwcGVyL21hdmVuLXdyYXBwZXIuamFyCisKICMgTW9yZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzCi0vdGFyZ2V0Ci0vdGVzdC9zdnQvbGliCi0vcmVsZWFzZS1lZGdlbnQKK3RhcmdldC8KIC9yZXBvcnRzCi0vLmdyYWRsZS8KLWJ1aWxkLwotL2V4dGVybmFsSmFycwogCiAjIE1vYmlsZSBUb29scyBmb3IgSmF2YSAoSjJNRSkKIC5tdGoudG1wLwpAQCAtMjIsMyArMjMsMTEgQEAKICMgSW50ZWxsaUogSWRlYQogLmlkZWEvCiAqLmltbAorCisjIEVjbGlwc2UKKy5jbGFzc3BhdGgKKy5wcm9qZWN0Cisuc2V0dGluZ3MvCisKKyMgRW1hY3MKKyp+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvLmdyYWRsZS13cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiLy5ncmFkbGUtd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzgwMzUuLjAwMDAwMDAKLS0tIGEvLmdyYWRsZS13cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLy5ncmFkbGUtd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvLmdyYWRsZS13cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWUxYzQuLjAwMDAwMDAKLS0tIGEvLmdyYWRsZS13cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWRpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQotZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCi16aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQotemlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKLWRpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTMuMS1iaW4uemlwCi1kaXN0cmlidXRpb25TaGEyNTZTdW09YzdkZTM0NDI0MzIyNTM1MjU5MDJmN2U4ZDdlYWM4YjVmZDZjZTE2MjNmOTZkNzY5MTZhZjZkMGUzODMwMTBmYwpkaWZmIC0tZ2l0IGEvLm12bi93cmFwcGVyL01hdmVuV3JhcHBlckRvd25sb2FkZXIuamF2YSBiLy5tdm4vd3JhcHBlci9NYXZlbldyYXBwZXJEb3dubG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmOGUwMAotLS0gL2Rldi9udWxsCisrKyBiLy5tdm4vd3JhcHBlci9NYXZlbldyYXBwZXJEb3dubG9hZGVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworcHVibGljIGNsYXNzIE1hdmVuV3JhcHBlckRvd25sb2FkZXIgeworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBVUkwgdG8gZG93bmxvYWQgdGhlIG1hdmVuLXdyYXBwZXIuamFyIGZyb20sIGlmIG5vICdkb3dubG9hZFVybCcgaXMgcHJvdmlkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRE9XTkxPQURfVVJMID0KKyAgICAgICAgICAgICJodHRwczovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIvaW8vdGFrYXJpL21hdmVuLXdyYXBwZXIvMC4yLjEvbWF2ZW4td3JhcHBlci0wLjIuMS5qYXIiOworCisgICAgLyoqCisgICAgICogUGF0aCB0byB0aGUgbWF2ZW4td3JhcHBlci5wcm9wZXJ0aWVzIGZpbGUsIHdoaWNoIG1pZ2h0IGNvbnRhaW4gYSBkb3dubG9hZFVybCBwcm9wZXJ0eSB0bworICAgICAqIHVzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFWRU5fV1JBUFBFUl9QUk9QRVJUSUVTX1BBVEggPQorICAgICAgICAgICAgIi5tdm4vd3JhcHBlci9tYXZlbi13cmFwcGVyLnByb3BlcnRpZXMiOworCisgICAgLyoqCisgICAgICogUGF0aCB3aGVyZSB0aGUgbWF2ZW4td3JhcHBlci5qYXIgd2lsbCBiZSBzYXZlZCB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFWRU5fV1JBUFBFUl9KQVJfUEFUSCA9CisgICAgICAgICAgICAiLm12bi93cmFwcGVyL21hdmVuLXdyYXBwZXIuamFyIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGRvd25sb2FkIHVybCBmb3IgdGhlIHdyYXBwZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUVfV1JBUFBFUl9VUkwgPSAid3JhcHBlclVybCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLSBEb3dubG9hZGVyIHN0YXJ0ZWQiKTsKKyAgICAgICAgRmlsZSBiYXNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoYXJnc1swXSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLSBVc2luZyBiYXNlIGRpcmVjdG9yeTogIiArIGJhc2VEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIElmIHRoZSBtYXZlbi13cmFwcGVyLnByb3BlcnRpZXMgZXhpc3RzLCByZWFkIGl0IGFuZCBjaGVjayBpZiBpdCBjb250YWlucyBhIGN1c3RvbQorICAgICAgICAvLyB3cmFwcGVyVXJsIHBhcmFtZXRlci4KKyAgICAgICAgRmlsZSBtYXZlbldyYXBwZXJQcm9wZXJ0eUZpbGUgPSBuZXcgRmlsZShiYXNlRGlyZWN0b3J5LCBNQVZFTl9XUkFQUEVSX1BST1BFUlRJRVNfUEFUSCk7CisgICAgICAgIFN0cmluZyB1cmwgPSBERUZBVUxUX0RPV05MT0FEX1VSTDsKKyAgICAgICAgaWYobWF2ZW5XcmFwcGVyUHJvcGVydHlGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gbWF2ZW5XcmFwcGVyUHJvcGVydHlGaWxlSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYXZlbldyYXBwZXJQcm9wZXJ0eUZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obWF2ZW5XcmFwcGVyUHJvcGVydHlGaWxlKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIG1hdmVuV3JhcHBlclByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIG1hdmVuV3JhcHBlclByb3BlcnRpZXMubG9hZChtYXZlbldyYXBwZXJQcm9wZXJ0eUZpbGVJbnB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgdXJsID0gbWF2ZW5XcmFwcGVyUHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9QRVJUWV9OQU1FX1dSQVBQRVJfVVJMLCB1cmwpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLSBFUlJPUiBsb2FkaW5nICciICsgTUFWRU5fV1JBUFBFUl9QUk9QRVJUSUVTX1BBVEggKyAiJyIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZihtYXZlbldyYXBwZXJQcm9wZXJ0eUZpbGVJbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXZlbldyYXBwZXJQcm9wZXJ0eUZpbGVJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgLi4uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLSBEb3dubG9hZGluZyBmcm9tOiA6ICIgKyB1cmwpOworCisgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKGJhc2VEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCksIE1BVkVOX1dSQVBQRVJfSkFSX1BBVEgpOworICAgICAgICBpZighb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGlmKCFvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICItIEVSUk9SIGNyZWF0aW5nIG91dHB1dCBkaXJlY3JvcnkgJyIgKyBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICInIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItIERvd25sb2FkaW5nIHRvOiAiICsgb3V0cHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkb3dubG9hZEZpbGVGcm9tVVJMKHVybCwgb3V0cHV0RmlsZSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItIEVycm9yIGRvd25sb2FkaW5nIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvd25sb2FkRmlsZUZyb21VUkwoU3RyaW5nIHVybFN0cmluZywgRmlsZSBkZXN0aW5hdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFVSTCB3ZWJzaXRlID0gbmV3IFVSTCh1cmxTdHJpbmcpOworICAgICAgICBSZWFkYWJsZUJ5dGVDaGFubmVsIHJiYzsKKyAgICAgICAgcmJjID0gQ2hhbm5lbHMubmV3Q2hhbm5lbCh3ZWJzaXRlLm9wZW5TdHJlYW0oKSk7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pOworICAgICAgICBmb3MuZ2V0Q2hhbm5lbCgpLnRyYW5zZmVyRnJvbShyYmMsIDAsIExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgIHJiYy5jbG9zZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3JhZGxlLnByb3BlcnRpZXMgYi8ubXZuL3dyYXBwZXIvbWF2ZW4td3JhcHBlci5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggNjUlCnJlbmFtZSBmcm9tIGdyYWRsZS5wcm9wZXJ0aWVzCnJlbmFtZSB0byAubXZuL3dyYXBwZXIvbWF2ZW4td3JhcHBlci5wcm9wZXJ0aWVzCmluZGV4IGNjYTE0NzIuLjdlOGYzODIgMTAwNjQ0Ci0tLSBhL2dyYWRsZS5wcm9wZXJ0aWVzCisrKyBiLy5tdm4vd3JhcHBlci9tYXZlbi13cmFwcGVyLnByb3BlcnRpZXMKQEAgLTE1LDEzICsxNSw2IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWJ1aWxkX2dyb3VwOiBvcmcuYXBhY2hlLmVkZ2VudAotYnVpbGRfbmFtZTogZWRnZW50Ci1idWlsZF92ZXJzaW9uOiAxLjIuMAotYnVpbGRfdmVuZG9yOiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorZGlzdHJpYnV0aW9uVXJsPWh0dHBzOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMi9vcmcvYXBhY2hlL21hdmVuL2FwYWNoZS1tYXZlbi8zLjUuMC9hcGFjaGUtbWF2ZW4tMy41LjAtYmluLnppcAogCi0jIE1pbmltdW0gcmVxdWlyZWQgZ3JhZGxlIHZlcnNpb24gYW5kIHZlcnNpb24gZm9yIHRoZSB3cmFwcGVyIHRvIHVzZS4KLSMgQ29tbWVudCBvdXQgZ3JhZGxlRGlzdHJpYnV0aW9uU2hhMjU2U3VtIHRvIGRpc2FibGUgdmFsaWRhdGlvbiBvZgotIyBhIHdyYXBwZXIgZG93bmxvYWRlZCBncmFkbGUgZGlzdHJpYnV0aW9uLgotZ3JhZGxlVmVyc2lvbiA9IDMuMQotZ3JhZGxlRGlzdHJpYnV0aW9uU2hhMjU2U3VtID0gYzdkZTM0NDI0MzIyNTM1MjU5MDJmN2U4ZDdlYWM4YjVmZDZjZTE2MjNmOTZkNzY5MTZhZjZkMGUzODMwMTBmYworI3dyYXBwZXJVcmw9aHR0cHM6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yL2lvL3Rha2FyaS9tYXZlbi13cmFwcGVyLzAuMi4xL21hdmVuLXdyYXBwZXItMC4yLjEuamFyCmRpZmYgLS1naXQgYS8ucHJvamVjdCBiLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTE4NzdhLi4wMDAwMDAwCi0tLSBhLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLSAgICA8bmFtZT5fZWRnZW50PC9uYW1lPgotICAgIDxjb21tZW50PlRvcCBsZXZlbCBwcm9qZWN0PC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8udHJhdmlzLnltbCBiLy50cmF2aXMueW1sCmluZGV4IDMxMTcxYmEuLmI3ZDZjOGUgMTAwNjQ0Ci0tLSBhLy50cmF2aXMueW1sCisrKyBiLy50cmF2aXMueW1sCkBAIC0xNywyNCArMTcsMTUgQEAKIAogbGFuZ3VhZ2U6IGphdmEKIAorZW52OgorICAgLSBNQVZFTl9PUFRTPSItWG1zNTEybSAtWG14NTEybSIKKwogbWF0cml4OgogICAgZmFzdF9maW5pc2g6IHRydWUKIAogaW5zdGFsbDogdHJ1ZQogCi0jIGF2b2lkIHVwbG9hZGluZyB0aGUgY2FjaGUgYWZ0ZXIgZXZlcnkgYnVpbGQgKHBlciB0cmF2aXMgZG9jKQotYmVmb3JlX2NhY2hlOgotICAtIHJtIC1mICAkSE9NRS8uZ3JhZGxlL2NhY2hlcy9tb2R1bGVzLTIvbW9kdWxlcy0yLmxvY2sKLSAgLSBybSAtZnIgJEhPTUUvLmdyYWRsZS9jYWNoZXMvKi9wbHVnaW4tcmVzb2x1dGlvbi8KLWNhY2hlOgotICBkaXJlY3RvcmllczoKLSAgICAtICRIT01FLy5ncmFkbGUvY2FjaGVzLwotICAgIC0gJEhPTUUvLmdyYWRsZS93cmFwcGVyLwotCiBzY3JpcHQ6CiAgICAgLSBqZGtfc3dpdGNoZXIgdXNlIG9yYWNsZWpkazgKLSAgICAtIC4vZ3JhZGxldyByZWxlYXNlIC1EZWRnZW50LmJ1aWxkLmNpPXRydWUKLSAgICAtIC4vZ3JhZGxldyB0ZXN0IC0tY29udGludWUgLURlZGdlbnQuYnVpbGQuY2k9dHJ1ZQotICAgIC0gLi9ncmFkbGV3IHRlc3Q3Q29tcGlsZSAtRGVkZ2VudC5idWlsZC5jaT10cnVlCi0gICAgLSBqZGtfc3dpdGNoZXIgdXNlIG9yYWNsZWpkazcKLSAgICAtIC4vZ3JhZGxldyB0ZXN0N1J1biAtLWNvbnRpbnVlIC1EZWRnZW50LmJ1aWxkLmNpPXRydWUgCisgICAgLSBtdm4gY2xlYW4gaW5zdGFsbCAtUGRpc3RyaWJ1dGlvbiAtRGVkZ2VudC5idWlsZC5jaT10cnVlCisjICAgIC0gbXZuIC10IHRvb2xjaGFpbnMtdHJhdmlzLnhtbCAtRGphdmE4LmhvbWU9L3Vzci9saWIvanZtL2phdmEtOC1vcmFjbGUgY2xlYW4gaW5zdGFsbCBzaXRlOnNpdGUgLVBkaXN0cmlidXRpb24scGxhdGZvcm0tamF2YTcscGxhdGZvcm0tYW5kcm9pZCAtRGVkZ2VudC5idWlsZC5jaT10cnVlCmRpZmYgLS1naXQgYS9DT05UUklCVVRPUlMgYi9DT05UUklCVVRPUlMKaW5kZXggM2Q4NGY1MC4uMThlNTI2MSAxMDA2NDQKLS0tIGEvQ09OVFJJQlVUT1JTCisrKyBiL0NPTlRSSUJVVE9SUwpAQCAtMSw1ICsxLDMyIEBACis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorCiBUaGUgZm9sbG93aW5nIHZvbHVudGVlcnMgaGF2ZSBjb250cmlidXRlZCBjb2RlLCBkb2N1bWVudGF0aW9uLCB0ZXN0aW5nIGFuZC9vciBzdXBwb3J0IHRvIHRoZSBBcGFjaGUgRWRnZW50KGluY3ViYXRpbmcpLgogCitBcGFjaGUgRWRnZW50KGluY3ViYXRpbmcpIDEuMi4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NocmlzdG9mZXIgRHV0egorRGFsZSBMYUJvc3NpZXJlCitKb2huIEFtZW50CitKdXN0aW4gTWNsZWFuCitUaG9tYXMgQ3Jpc3RhbmlzCisKIEFwYWNoZSBFZGdlbnQoaW5jdWJhdGluZykgMS4xLjAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ2F6ZW4gTGVlCmRpZmYgLS1naXQgYS9ERVZFTE9QTUVOVC5tZCBiL0RFVkVMT1BNRU5ULm1kCmluZGV4IGZlZWEyOTcuLmQ1N2NkYzEgMTAwNjQ0Ci0tLSBhL0RFVkVMT1BNRU5ULm1kCisrKyBiL0RFVkVMT1BNRU5ULm1kCkBAIC0xLDEwICsxLDI4IEBACis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgogIyMgRGV2ZWxvcG1lbnQgb2YgQXBhY2hlIEVkZ2VudAogCiAqQXBhY2hlIEVkZ2VudCBpcyBhbiBlZmZvcnQgdW5kZXJnb2luZyBpbmN1YmF0aW9uIGF0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSwgc3BvbnNvcmVkIGJ5IHRoZSBJbmN1YmF0b3IgUE1DLiBJbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZCBwcm9qZWN0cyB1bnRpbCBhIGZ1cnRoZXIgcmV2aWV3IGluZGljYXRlcyB0aGF0IHRoZSBpbmZyYXN0cnVjdHVyZSwgY29tbXVuaWNhdGlvbnMsIGFuZCBkZWNpc2lvbiBtYWtpbmcgcHJvY2VzcyBoYXZlIHN0YWJpbGl6ZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIG90aGVyIHN1Y2Nlc3NmdWwgQVNGIHByb2plY3RzLiBXaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uIG9mIHRoZSBjb21wbGV0ZW5lc3Mgb3Igc3RhYmlsaXR5IG9mIHRoZSBjb2RlLCBpdCBkb2VzIGluZGljYXRlIHRoYXQgdGhlIHByb2plY3QgaGFzIHlldCB0byBiZSBmdWxseSBlbmRvcnNlZCBieSB0aGUgQVNGLioKIAogU2VlIFtSRUFETUUubWRdKFJFQURNRS5tZCkgZm9yIGhpZ2gtbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQgQXBhY2hlIEVkZ2VudC4KIAotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgZGV2ZWxvcG1lbnQgb2YgQXBhY2hlIEVkZ2VudCBpdHNlbGYsIG5vdCBob3cgdG8gZGV2ZWxvcCBFZGdlbnQgYXBwbGljYXRpb25zLgorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgYnVpbGRpbmcgYW5kIHRoZSBkZXZlbG9wbWVudCBvZiBBcGFjaGUgRWRnZW50IGl0c2VsZiwgbm90IGhvdyB0byBkZXZlbG9wIEVkZ2VudCBhcHBsaWNhdGlvbnMuCiAKICAqIFNlZSBodHRwOi8vZWRnZW50LmluY3ViYXRvci5hcGFjaGUub3JnL2RvY3MvZWRnZW50LWdldHRpbmctc3RhcnRlZCBmb3IgZ2V0dGluZyBzdGFydGVkIHVzaW5nIEVkZ2VudAogCkBAIC0xNiwxMDYgKzM0LDE4MSBAQAogCiBTZWUgdGhlIFtFZGdlbnQgV2lraV0oaHR0cHM6Ly9jd2lraS5hcGFjaGUub3JnL2NvbmZsdWVuY2UvZGlzcGxheS9FREdFTlQpIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluY2x1ZGluZyBJbnRlcm5hbCBhbmQgRGVzaWduIG5vdGVzLiAKIAotIyMgU3dpdGNoZWQgZnJvbSBBbnQgdG8gR3JhZGxlCisjIyBTd2l0Y2hlZCBmcm9tIEFudCBhbmQgR3JhZGxlIHRvIE1hdmVuCiAKIFNlZSB0aGUgdXBkYXRlZCBfQnVpbGRpbmdfIGFuZCBfVXNpbmcgRWNsaXBzZV8gc2VjdGlvbnMgYmVsb3cuCi1UaGUgQW50IHRvb2xpbmcgaXMgbm8gbG9uZ2VyIGZ1bmN0aW9uYWwuCitUaGUgQW50IGFuZCBHcmFkbGUgdG9vbGluZyBpcyBubyBsb25nZXIgZnVuY3Rpb25hbC4KIAogSXQncyByZWNvbW1lbmRlZCB0aGF0IGRldmVsb3BlcnMgb2YgRWRnZW50IGNyZWF0ZSBhIG5ldyB3b3Jrc3BhY2UgaW5zdGVhZCBvZgotcmV1c2luZyBjdXJyZW50IGFudC1iYXNlZCBFZGdlbnQgd29ya3NwYWNlcy4KK3JldXNpbmcgY3VycmVudCBncmFkbGUtYmFzZWQgRWRnZW50IHdvcmtzcGFjZXMuCiAKLSMjIFJlbmFtZWQgZnJvbSBBcGFjaGUgUXVhcmtzCi1BcGFjaGUgRWRnZW50IGlzIHRoZSBuZXcgbmFtZSBhbmQgdGhlIGNvbnZlcnNpb24gaXMgY29tcGxldGUuCisjIyBCcmFuY2hlcwogCi1Db2RlIGNoYW5nZXM6CitUaGUgYGRldmVsb3BgIGJyYW5jaCBpcyB1c2VkIGZvciBkZXZlbG9wbWVudC4gIEplbmtpbnMgaXMgc2V0dXAgdG8gYnVpbGQgdGhpcyBicmFuY2ggYW5kIHB1Ymxpc2ggaW50ZXJuYWwgU05BUFNIT1QgYnVpbGQgcmVzdWx0cyB0byB0aGUgQVNGIE5leHVzIFNOQVBTSE9UUyBSZXBvc2l0b3J5IChodHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9zbmFwc2hvdHMpLgogCi0gICogUGFja2FnZSBuYW1lcyBoYXZlIHRoZSBwcmVmaXggIm9yZy5hcGFjaGUuZWRnZW50IgotICAqIEpBUiBuYW1lcyBoYXZlIHRoZSBwcmVmaXggImVkZ2VudCIKLQotVXNlcnMgb2YgRWRnZW50IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlaXIgcmVmZXJlbmNlcyB0byB0aGUgYWJvdmUuCi1JdCdzIHJlY29tbWVuZGVkIHRoYXQgZGV2ZWxvcGVycyBvZiBFZGdlbnQgY3JlYXRlIGEgbmV3IHdvcmtzcGFjZSBpbnN0ZWFkIG9mCi1yZXVzaW5nIHRoZWlyIFF1YXJrcyB3b3Jrc3BhY2UuCitUaGUgYG1hc3RlcmAgYnJhbmNoIGNvbnRhaW5zIHJlbGVhc2VkIGNvZGUuIFJlbGVhc2VzIGFyZSBwdWJsaXNoZWQgdG8gdGhlIEFTRiBOZXh1cyBSZWxlYXNlcyBSZXBvc2l0b3J5IChodHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcykuIFRoZSBSZWxlYXNlcyByZXBvc2l0b3J5IGlzIGF1dG9tYXRpY2FsbHkgbWlycm9yZWQgdG8gdGhlIE1hdmVuIENlbnRyYWwgUmVwb3NpdG9yeS4KIAogIyMgU2V0dXAKIAogT25jZSB5b3UgaGF2ZSBmb3JrZWQgdGhlIHJlcG9zaXRvcnkgYW5kIGNyZWF0ZWQgeW91ciBsb2NhbCBjbG9uZSB5b3UgbmVlZCB0byBkb3dubG9hZAogdGhlc2UgYWRkaXRpb25hbCBkZXZlbG9wbWVudCBzb2Z0d2FyZSB0b29scy4KIAotKiBKYXZhIDggLSBUaGUgZGV2ZWxvcG1lbnQgc2V0dXAgYXNzdW1lcyBKYXZhIDggYW5kIExpbnV4LgotKiBncmFkbGUgLSAoaHR0cHM6Ly9ncmFkbGUub3JnLykgb25seSBpZiBidWlsZGluZyBmcm9tIGEgc291cmNlIHJlbGVhc2UgYnVuZGxlCisqIEphdmEgOCAtIFRoZSBkZXZlbG9wbWVudCBzZXR1cCBhc3N1bWVzIEphdmEgOAorKiBKYXZhIDcgLSAqKG9wdGlvbmFsKSBvbmx5IHJlcXVpcmVkIHdoZW4gYWxzbyBidWlsZGluZyB0aGUgSmF2YSA3IGFuZCBBbmRyb2lkIGFydGlmYWN0cyB3aXRoIGB0b29sY2hhaW5gIHN1cHBvcnQqIAorKiBNYXZlbiAtICoob3B0aW9uYWwpIChodHRwczovL21hdmVuLmFwYWNoZS5vcmcvKSoKIAotQWxsIEVkZ2VudCBydW50aW1lIGRldmVsb3BtZW50IGlzIGRvbmUgdXNpbmcgSmF2YSA4LiAgSkFScyBmb3IgSmF2YSA3IGFuZCBBbmRyb2lkCi1wbGF0Zm9ybXMgYXJlIGNyZWF0ZWQgYXMgZGVzY3JpYmVkIGJlbG93LgorTWF2ZW4gaXMgdXNlZCBhcyBidWlsZCB0b29sLiBDdXJyZW50bHkgdGhlcmUgYXJlIHR3byBvcHRpb25zOgogCi0jIyBCdWlsZGluZyBhIEJpbmFyeSBSZWxlYXNlIEJ1bmRsZQorMS4gVXNpbmcgdGhlIG1hdmVuLXdyYXBwZXIgKHRoZSBgbXZud2Agb3IgYG12bncuYmF0YCBjb21tYW5kIC0gcHJlZmVycmVkKQorMi4gVXNpbmcgYW4gaW5zdGFsbGVkIHZlcnNpb24gb2YgTWF2ZW4gKHRoZSBgbXZuYCBjb21tYW5kKQogCi1CdWlsZGluZyBmcm9tIGEgc291cmNlIHJlbGVhc2UgYnVuZGxlIChsYWNraW5nIGEgYC4vZ3JhZGxld2ApIHJlcXVpcmVzCi1wZXJmb3JtaW5nIGEgb25lLXRpbWUgYm9vdHN0cmFwIHN0ZXAgdXNpbmcgYW4gaW5zdGFsbGVkIHZlcnNpb24gb2YgZ3JhZGxlOgotYGBgIHNoCi0kIGdyYWRsZSAgICAgICAgICAjIG9uZSB0aW1lIGdyYWRsZSBidWlsZCBib290c3RyYXAgc2V0dXAuCitUaGUgbWF2ZW4td3JhcHBlciB3aWxsIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIGNvcnJlY3QgTWF2ZW4gdmVyc2lvbiBhbmQgdXNlIHRoYXQuIEJlc2lkZXMgdGhpcywgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHVzaW5nIHRoZSBgbXZuYCBhbmQgYG12bndgIGNvbW1hbmQuCisKK1lvdSBtYXkgYWxzbyB1c2UgYSBtYXZlbi1pbnRlZ3JhdGVkIElERSBmb3IgRWRnZW50IGRldmVsb3BtZW50LiAgZS5nLiwgc2VlIHRoZSBfVXNpbmcgRWNsaXBzZV8gc2VjdGlvbiBiZWxvdy4KKworQWxsIEVkZ2VudCBydW50aW1lIGRldmVsb3BtZW50IGlzIGRvbmUgdXNpbmcgSmF2YSA4LiBKQVJzIGZvciBKYXZhIDcgYW5kIEFuZHJvaWQgcGxhdGZvcm1zIGFyZSBjcmVhdGVkIGJ5IGJhY2stcG9ydGluZyB0aGUgY29tcGlsZWQgSmF2YSA4IGNvZGUgdXNpbmcgYSB0b29sIGNhbGxlZCBgcmV0cm9sYW1iZGFgLiBNb3JlIGRldGFpbHMgb24gdGhpcyBiZWxvdy4KKworUGVyIGRlZmF1bHQgdGhlIGJ1aWxkIHdpbGwgdXNlIEphdmEgOCB0byBwZXJmb3JtIHRoZSBidWlsZCBvZiB0aGUgSmF2YSA3IGFuZCBBbmRyb2lkIG1vZHVsZXMuIEluIG9yZGVyIHRvIHJlbGlhYmx5IF9fdGVzdF9fIHRoZSBKYXZhIDcgbW9kdWxlcyBvbiBhIHJlYWwgSmF2YSA3IFJ1bnRpbWUsIHdlIGRlZmluZWQgYW4gYWRkaXRpb25hbCBwcm9maWxlIGB0b29sY2hhaW5gIHdoaWNoIGxldHMgTWF2ZW4gcnVuIHRoZSB0ZXN0cyBpbiB0aGUgSmF2YSA3IE1vZHVsZXMgd2l0aCBhIHJlYWwgSmF2YSA3IFJ1bnRpbWUuCisKK0luIHByZXBhcmF0aW9uIGZvciB0ZXN0aW5nIHRoZSBKYXZhIDcgYW5kIEFuZHJvaWQgbW9kdWxlcyB3aXRoIGVuYWJsZWQgYHRvb2xjaGFpbmAgc3VwcG9ydCwgZWRpdCBvciBjcmVhdGUgYH4vLm0yL3Rvb2xjaGFpbnMueG1sYDoKKworYGBgIHRvb2xjaGFpbnMueG1sCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEY4Ij8+Cis8dG9vbGNoYWlucz4KKyAgPHRvb2xjaGFpbj4KKyAgICA8dHlwZT5qZGs8L3R5cGU+CisgICAgPHByb3ZpZGVzPgorICAgICAgPHZlcnNpb24+MS44PC92ZXJzaW9uPgorICAgICAgPHZlbmRvcj5vcmFjbGU8L3ZlbmRvcj4KKyAgICA8L3Byb3ZpZGVzPgorICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgPGpka0hvbWU+e3BhdGggdG8gdGhlIEphdmEgOCBTREt9PC9qZGtIb21lPgorICAgIDwvY29uZmlndXJhdGlvbj4KKyAgPC90b29sY2hhaW4+CisgIDx0b29sY2hhaW4+CisgICAgPHR5cGU+amRrPC90eXBlPgorICAgIDxwcm92aWRlcz4KKyAgICAgIDx2ZXJzaW9uPjEuNzwvdmVyc2lvbj4KKyAgICAgIDx2ZW5kb3I+b3JhY2xlPC92ZW5kb3I+CisgICAgPC9wcm92aWRlcz4KKyAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgIDxqZGtIb21lPntwYXRoIHRvIHRoZSBKYXZhIDcgU0RLfTwvamRrSG9tZT4KKyAgICA8L2NvbmZpZ3VyYXRpb24+CisgIDwvdG9vbGNoYWluPgorPHRvb2xjaGFpbnM+CiBgYGAKIAotQnVpbGRpbmcgYW4gRWRnZW50IGJpbmFyeSByZWxlYXNlIGJ1bmRsZToKK1NldCB0aGUgamRrSG9tZSB2YWx1ZXMgYXBwcm9wcmlhdGVseSBmb3IgeW91ciBzeXN0ZW0uCitlLmcuLCBvbiBhbiBPU1ggc3lzdGVtOgogYGBgIHNoCi0kIC4vZ3JhZGxldyByZWxlYXNlCisgIGo4IGpka0hvbWU6ICAvTGlicmFyeS9KYXZhL0phdmFWaXJ0dWFsTWFjaGluZXMvamRrMS44LjBfMTEyLmpkay9Db250ZW50cy9Ib21lCisgIGo3IGpka0hvbWU6ICAvTGlicmFyeS9KYXZhL0phdmFWaXJ0dWFsTWFjaGluZXMvamRrMS43LjBfODAuamRrL0NvbnRlbnRzL0hvbWUKIGBgYAogCi1UaGUgYnVpbGQgcmVwb3J0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gYnVuZGxlIHRoYXQgY2FuIHRoZW4KLWJlIHVucGFja2VkIGFuZCB1c2VkIGluIGJ1aWxkaW5nIGFwcGxpY2F0aW9ucy4KIAotU2VlIFtHZXR0aW5nIFN0YXJ0ZWRdKGh0dHBzOi8vZWRnZW50LmFwYWNoZS5vcmcvZG9jcy9lZGdlbnQtZ2V0dGluZy1zdGFydGVkKQotZm9yIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBiaW5hcnkgcmVsZWFzZSBidW5kbGUuCisjIyBCdWlsZGluZyBFZGdlbnQgRm9yIEVkZ2VudCBEZXZlbG9wbWVudAogCi0jIyBCdWlsZGluZyBmb3IgRWRnZW50IFJ1bnRpbWUgRGV2ZWxvcG1lbnQKK0FueSBwdWxsIHJlcXVlc3QgaXMgZXhwZWN0ZWQgdG8gbWFpbnRhaW4gdGhlIGJ1aWxkIHN1Y2Nlc3Mgb2YgYG12biBwYWNrYWdlYC4KIAotVGhlIHByaW1hcnkgYnVpbGQgcHJvY2VzcyBpcyB1c2luZyBbR3JhZGxlXShodHRwczovL2dyYWRsZS5vcmcvKSwKLWFueSBwdWxsIHJlcXVlc3QgaXMgZXhwZWN0ZWQgdG8gbWFpbnRhaW4gdGhlIGJ1aWxkIHN1Y2Nlc3Mgb2YgYGNsZWFuLCBhc3NlbWJsZSwgdGVzdGAuCi0KLVRoZSBHcmFkbGUgd3JhcHBlciBgZWRnZW50L3tncmFkbGV3LGdyYWRsZXcuYmF0fWAgc2hvdWxkIGJlIHVzZWQuCi1UaGUgd3JhcHBlciBlbnN1cmVzIHRoZSBhcHByb3ByaWF0ZSB2ZXJzaW9uIG9mIEdyYWRsZSBpcyB1c2VkIGFuZCBpdAotd2lsbCBhdXRvbWF0aWNhbGx5IGRvd25sb2FkIGl0IGlmIG5lZWRlZCwgZS5nLjoKK1RvIGJ1aWxkIGFuZCB0ZXN0IGZvciBKYXZhIDgKIGBgYCBzaAotJCAuL2dyYWRsZXcgLS12ZXJzaW9uCi0kIC4vZ3JhZGxldyBjbGVhbiBidWlsZAorJCAuL212bncgY2xlYW4gcGFja2FnZSAgICMgLURza2lwVGVzdHMgdG8gb21pdCB0ZXN0cwogYGBgCiAKLVRoZSBHcmFkbGUgdG9vbGluZzoKK1RvIGJ1aWxkIF9fYW5kIHByb3Blcmx5IHRlc3RfXyB0aGUgRWRnZW50IEphdmEgNyBhbmQgQW5kcm9pZCBwbGF0Zm9ybSBqYXJzCityZXF1aXJlcyBhbiBpbnN0YWxsZWQgSmF2YSA3IEpSRSBhbmQgdGhlIGB0b29sY2hhaW5zLnhtbGAgc2V0dXAgYWJvdmUsIHRoZW4KK2BgYCBzaAorJCAuL212bncgY2xlYW4gcGFja2FnZSAtRGphdmE4LmhvbWU9JEpBVkFfSE9NRSAtUHRvb2xjaGFpbixwbGF0Zm9ybS1qYXZhNyxwbGF0Zm9ybS1hbmRyb2lkCitgYGAKIAotLSBDcmVhdGVzIHJlbGVhc2UgaW1hZ2VzIHVuZGVyIGA8ZWRnZW50Pi9idWlsZC9yZWxlYXNlLWVkZ2VudGAKLS0gQ3JlYXRlcyBidWlsZCBhcnRpZmFjdHMgdW5kZXIgYDxlZGdlbnQ+L2J1aWxkL2Rpc3RyaWJ1dGlvbnNgIGFuZCBgPGVkZ2VudD4vPHByb2plY3Q+L2J1aWxkYAorIyMjIERvY3VtZW50YXRpb24gb2YgYWxsIGRlZmluZWQgTWF2ZW4gcHJvZmlsZXMKKworQSBzZXQgb2YgTWF2ZW4gYHByb2ZpbGVzYCBoYXZlIGJlZW4gY3JlYXRlZCB0byBjb250cm9sIHdoaWNoIHBhcnRzIHNob3VsZCBiZSBidWlsdC4gCitUaGUgZGVmYXVsdCBwcm9maWxlIG9ubHkgYnVpbGRzIGFuZCB0ZXN0cyB0aGUgSmF2YSA4IHZlcnNpb25zIG9mIGFsbCBtb2R1bGVzIGFuZCBkb2Vzbid0IGFzc2VtYmxlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBhcyB1c3VhbGx5IE1hdmVuIGJ1aWxkcyBkb24ndCByZXF1aXJlIHN1Y2ggYSBzdGVwLiAKK0l0IGFsc28gZG9lc24ndCBidWlsZCB0aGUgSmF2YSA3IG9yIEFuZHJvaWQgbW9kdWxlcyBlaXRoZXIuCisKK0VkZ2VudCBjdXJyZW50bHkgY29tZXMgd2l0aCB0aGVzZSBwcm9maWxlczoKKworLSBgYXBhY2hlLXJlbGVhc2VgOiBCdWlsZHMgc291cmNlIHJlbGVhc2UgYnVuZGxlIHVuZGVyIGB0YXJnZXRgIAorLSBgZGlzdHJpYnV0aW9uYDogQnVpbGRzIG9uZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGJ1bmRsZSB1bmRlciBgZGlzdHJpYnV0aW9uL3RhcmdldGAgZm9yIEphdmEgOC4gSWYgdGhlIGphdmEgNyBhbmQgYW5kcm9pZCBwcm9maWxlcyBhcmUgZW5hYmxlZCB0b28sIGZvciBlYWNoIG9mIHRoZXNlIGFuIGFkZGl0aW9uYWwgYmluYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjcmVhdGVkLgorLSBgcGxhdGZvcm0tamF2YTdgOiBCdWlsZHMgSmF2YSA3IHZlcnNpb25zIG9mIGFsbCBFZGdlbnQgbW9kdWxlcyBhbmQgcnVucyB0aGUgdGVzdHMuCistIGBwbGF0Zm9ybS1hbmRyb2lkYDogQnVpbGRzIEFuZHJvaWQgdmVyc2lvbnMgb2YgYWxsIEVkZ2VudCBtb2R1bGVzIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBBbmRyb2lkIChTZWUgW0pBVkFfU1VQUE9SVC5tZF0oSkFWQV9TVVBQT1JULm1kKS4KKy0gYHRvb2xjaGFpbmA6IFJ1bnMgdGhlIHRlc3RzIGluIHRoZSBKYXZhIDcgYW5kIEFuZHJvaWQgbW9kdWxlcyB1c2luZyBhIEphdmEgNyBydW50aW1lIGluc3RlYWQgb2YgSmF2YSA4IHZlcnNpb24sIHdoaWNoIGhhcHBlbnMgaWYgdGhpcyBwcm9maWxlIGlzIG5vdCBlbmFibGVkLiAKKworQXMgdGhlIEFuZHJvaWQgbW9kdWxlcyBhcmUgYmFzZWQgb24gdGhlIEphdmEgNyB2ZXJzaW9ucywgd2hlbiBidWlsZGluZyB0aGUgYHBsYXRmb3JtLWFuZHJvaWRgIHByb2ZpbGUsIHRoZSBgcGxhdGZvcm0tamF2YTdgIHByb2ZpbGUgaXMgcmVxdWlyZWQgdG8gYmUgZW5hYmxlZCB0b28sIG9yIHRoZSBidWlsZCB3aWxsIGZhaWwuIAorCitGb3IgYSBub3QgcXVpdGUgdHdvIGhvdXIgaW50cm9kdWN0aW9uIGludG8gTWF2ZW4gcGxlYXNlIGZlZWwgZnJlZSB0byB3YXRjaCB0aGlzIHZpZGVvIHdlIGNyZWF0ZWQgZm9yIGFub3RoZXIgQXBhY2hlIHByb2plY3Q6IGh0dHBzOi8vdmltZW8uY29tLzE2Nzg1NzMyNworCisjIyBCdWlsZGluZyBFZGdlbnQgRm9yIFVzaW5nIEVkZ2VudAorCitfX05vdGU6X18gQXBhY2hlIEVkZ2VudCByZWxlYXNlcyBpbmNsdWRlIGNvbnZlbmllbmNlIGJpbmFyaWVzLiBVc2Ugb2YgdGhlbQoraXMgY292ZXJlZCBpbiBbc2FtcGxlcy9BUFBMSUNBVElPTl9ERVZFTE9QTUVOVC5tZF0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3ItZWRnZW50LXNhbXBsZXMvYmxvYi9kZXZlbG9wL0FQUExJQ0FUSU9OX0RFVkVMT1BNRU5ULm1kKS4KKworSWYgaW5zdGVhZCB5b3Ugd2FudCB0byBidWlsZCBFZGdlbnQgZm9yIHlvdXIgdXNlIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHVzZS1jYXNlczoKKworMS4gIEJ1aWxkIEVkZ2VudCBmb3IgdXNlIHdpdGggYSBNYXZlbiBwcm9qZWN0LiAKKzIuICBCdWlsZCBFZGdlbnQgZm9yIHVzZSB3aXRoIG5vbi1NYXZlbiBpbnRlZ3JhdGVkIHRvb2xpbmcuICAKKworIyMjIEJ1aWxkaW5nIEVkZ2VudCBmb3IgdXNlIHdpdGggTWF2ZW4KKworQnVpbGQsIHRlc3QsIGFuZCBpbnN0YWxsIHRoZSBFZGdlbnQgSmF2YTggamFycyBpbiB0aGUgbG9jYWwgbWF2ZW4gcmVwb3NpdG9yeQorYGBgIHNoCiskIC4vbXZudyBjbGVhbiBpbnN0YWxsICAjIC1Ec2tpcFRlc3RzIHRvIHNraXAgdGVzdHMKK2BgYAorCitUbyBhbHNvIGJ1aWxkLCBidXQgbm90IHRlc3QsIHRoZSBFZGdlbnQgSmF2YSA3IGFuZCBBbmRyb2lkIHBsYXRmb3JtIGphcnM6CitgYGAgc2gKKyQgLi9tdm53IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMgLVBwbGF0Zm9ybS1qYXZhNyxwbGF0Zm9ybS1hbmRyb2lkCitgYGAKKworVG8gYnVpbGQgX19hbmQgcHJvcGVybHkgdGVzdF9fIHRoZSBFZGdlbnQgSmF2YSA3IGFuZCBBbmRyb2lkIHBsYXRmb3JtIGphcnMKK3JlcXVpcmVzIGFuIGluc3RhbGxlZCBKYXZhIDcgSlJFIGFuZCB0aGUgYHRvb2xjaGFpbnMueG1sYCBzZXR1cCBhYm92ZSwgdGhlbgorYGBgIHNoCiskIC4vbXZudyBjbGVhbiBpbnN0YWxsIC1EamF2YTguaG9tZT0kSkFWQV9IT01FIC1QdG9vbGNoYWluLHBsYXRmb3JtLWphdmE3LHBsYXRmb3JtLWFuZHJvaWQKK2BgYAogCiAKLVRoZSB0b3AtbGV2ZWwgR3JhZGxlIGZpbGUgaXMgYGVkZ2VudC9idWlsZC5ncmFkbGVgIGFuZCBpdCBjb250YWlucyBzZXZlcmFsCi11bmlxdWUgdGFza3M6CisjIyMgQnVpbGRpbmcgRWRnZW50IGZvciBOT1QgdXNpbmcgaXQgd2l0aCBNYXZlbgogCi0qIGB3cmFwcGVyYCAoZGVmYXVsdCkgOiBvbmUtdGltZSBib290c3RyYXAgcHJvY2Vzc2luZyBmb3IgdXNlIHdoZW4gYnVpbGRpbmcgZnJvbSBhIHNvdXJjZSByZWxlYXNlIGJ1bmRsZSAKLSogYGFzc2VtYmxlYCA6IEJ1aWxkIGFsbCBjb2RlIGFuZCBKYXZhZG9jIGludG8gYGJ1aWxkXGRpc3RyaWJ1dGlvbnNgLiBUaGUgYnVpbGQgd2lsbCBmYWlsIG9uIGFueSBjb2RlIGVycm9yIG9yIEphdmFkb2Mgd2FybmluZyBvciBlcnJvci4KLSogYGFsbGAgOiBTeW5vbnltIGZvciBgYXNzZW1ibGVgCi0qIGBidWlsZGAgOiBFc3NlbnRpYWxseSBsaWtlICJhc3NlbWJsZSB0ZXN0IHJlcG9ydHMiCi0qIGBjbGVhbmAgOiBDbGVhbiB0aGUgcHJvamVjdAotKiBgdGVzdGAgOiBSdW4gdGhlIEpVbml0IHRlc3RzLCBpZiBhbnkgdGVzdCBmYWlscyB0aGUgdGVzdCBydW4gc3RvcHMuICBVc2UgYC0tY29udGludWVgIHRvIG5vdCBzdG9wIG9uIHRoZSBmaXJzdCBmYWlsdXJlLgotICAqIFVzZSBhIHByb2plY3QgdGVzdCB0YXNrIGFuZCBvcHRpb25hbGx5IHRoZSBgLS10ZXN0c2Agb3B0aW9uIHRvIHJ1biBhIHN1YnNldCBvZiB0aGUgdGVzdHMuICBNdWx0aXBsZSBgLS10ZXN0c2Agb3B0aW9ucyBtYXkgYmUgc3BlY2lmaWVkIGZvbGxvd2luZyBlYWNoIHRlc3QgdGFzay4KLSAgICAqIGAkIC4vZ3JhZGxldyA8cHJvamVjdD46dGVzdGAKLSAgICAqIGAkIC4vZ3JhZGxldyA8cHJvamVjdD46dGVzdCAtLXRlc3RzICcqLlNvbWVUZXN0J2AKLSAgICAqIGAkIC4vZ3JhZGxldyA8cHJvamVjdD46dGVzdCAtLXRlc3RzICcqLlNvbWVUZXN0LnNvbWVNZXRob2QnYAotICAqIFVzZSB0aGUgYGNsZWFuVGVzdGAgdGFzayB0byBmb3JjZSByZXJ1bm5pbmcgYSBwcmV2aW91c2x5IHN1Y2Nlc3NmdWwgdGVzdCB0YXNrICh3aXRob3V0IGZvcmNpbmcgYSByZXJ1biBvZiBhbGwgb2YgdGhlIHRhc2sncyBkZXBlbmRlbmNpZXMpOgotICAgICogYCQgLi9ncmFkbGV3IFs8cHJvamVjdD46XWNsZWFuVGVzdCBbPHByb2plY3Q+Ol10ZXN0YAotKiBgcmVwb3J0c2AgOiBHZW5lcmF0ZSBKVW5pdCBhbmQgQ29kZSBDb3ZlcmFnZSByZXBvcnRzIGluIGBidWlsZFxkaXN0cmlidXRpb25zXHJlcG9ydHNgLiBVc2UgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBgdGVzdGAgdGFyZ2V0LgotICAqIGByZXBvcnRzXHRlc3RzXG92ZXJ2aWV3LXN1bW1hcnkuaHRtbGAgLSBKVW5pdCB0ZXN0IHJlcG9ydAotICAqIGByZXBvcnRzXGNvdmVyYWdlXGluZGV4Lmh0bWxgIC0gQ29kZSBjb3ZlcmFnZSByZXBvcnQKLSogYHJlbGVhc2VgIDogQnVpbGQgcmVsZWFzZSBidW5kbGVzIGluIGBidWlsZC9yZWxlYXNlLWVkZ2VudGAsIHRoYXQgaW5jbHVkZXMgc3Vic2V0cyBvZiB0aGUgRWRnZW50IEpBUnMgdGhhdCBydW4gb24gSmF2YSA3IChgYnVpbGQvZGlzdHJpYnV0aW9ucy9qYXZhN2ApIGFuZCBBbmRyb2lkIChgYnVpbGQvZGlzdHJpYnV0aW9ucy9hbmRyb2lkYCkuIEJ5IGRlZmF1bHQsIFNOQVBTSE9UIGJ1bmRsZXMgYXJlIGNyZWF0ZWQuICBTcGVjaWZ5IGAtRGVkZ2VudC5zbmFwc2hvdElkPSIiYCB0byBjcmVhdGUgYnVuZGxlcyBmb3IgYSBmb3JtYWwgcmVsZWFzZS4KLSogYHJhdGAgOiBydW4gdGhlIEFwYWNoZSBSZWxlYXNlIEFuYWx5c2lzIFRvb2wgKGxpY2Vuc2UgY2hlY2tpbmcpLgotKiBgc2lnbkFsbGAgOiBTaWduIHRoZSByZWxlYXNlIGJ1bmRsZXMgaW4gYGJ1aWxkL3JlbGVhc2UtZWRnZW50YCAoZmlyc3QgcnVuIGByZWxlYXNlYCkuICBZb3Ugd2lsbCBiZSBwcm9tb3RlZCBmb3IgeW91ciBQR1AgY29kZSBzaWduaW5nIGtleSdzIElELCB0aGUgbG9jYXRpb24gb2YgdGhlIGtleXJpbmcgZmlsZSwgYW5kIHRoZSBzZWNyZXQga2V5IHBhc3N3b3JkLiAgRGVmYXVsdCByZXNwb25zZSB2YWx1ZXMgbWF5IGJlIHNldCB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlczoKLSAgKiBgR1BHX0lEYCAtIHRoZSBjb2RlIHNpZ25pbmcga2V5J3MgSUQgKGUuZy4sIEQwRjU2Q0FEKQotICAqIGBHUEdfU0VDUklOR2AgLSBwYXRoIHRvIHRoZSBzZWNyZXQga2V5J3Mga2V5cmluZyBmaWxlCitCdWlsZCBFZGdlbnQgYXMgZGVzY3JpYmVkIGFib3ZlIHRvIHBvcHVsYXRlIHRoZSBsb2NhbCBtYXZlbiByZXBvc2l0b3J5LgorVGhlbiBzZWUgW3NhbXBsZXMvQVBQTElDQVRJT05fREVWRUxPUE1FTlQubWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLWVkZ2VudC1zYW1wbGVzL2Jsb2IvZGV2ZWxvcC9BUFBMSUNBVElPTl9ERVZFTE9QTUVOVC5tZCkKK2ZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYGdldC1lZGdlbnQtamFycy5zaGAgc2NyaXB0LgogCi1UaGUgYnVpbGQgcHJvY2VzcyBoYXMgYmVlbiB0ZXN0ZWQgb24gTGludXggYW5kIG1hY09TLgorQW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgdGhlIGBnZXQtZWRnZW50LWphcnMuc2hgIHNjcmlwdCBpcyB0bworY3JlYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBidW5kbGUgY29uc2lzdGluZyBvZiB0aGUgRWRnZW50IHJ1bnRpbWUKK2phcnMgYW5kIHRoZWlyIGV4dGVybmFsIGRlcGVuZGVuY2llcy4KIAotVG8gYnVpbGQgb24gV2luZG93cyBwcm9iYWJseSBuZWVkcyBzb21lIGNoYW5nZXMsIHBsZWFzZSBnZXQgaW52b2x2ZWQgYW5kIGNvbnRyaWJ1dGUgdGhlbSEKK0J1aWxkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBidW5kbGUgZm9yIEphdmEgOAorYGBgIHNoCiskIC4vbXZudyBjbGVhbiBwYWNrYWdlIC1Ec2tpcFRlc3RzIC1QZGlzdHJpYnV0aW9uCitgYGAKKworVGhlIGRpc3RyaWJ1dGlvbiBidW5kbGUgaXMgY3JlYXRlZCB1bmRlciBgZGlzdHJpYnV0aW9uL3RhcmdldGAuCitUaGUgYGxpYnNgIGRpcmVjdG9yeSBpbnNpZGUgdGhlIGJ1bmRsZSBjb250YWlucyB0aGUgRWRnZW50IGphcnMgYW5kIAordGhlIGBleHRgIGRpcmVjdG9yeSBjb250YWlucyB0aGlyZCBwYXJ0eSBkZXBlbmRlbmNpZXMgdGhlIEVkZ2VudCBqYXJzIHJlcXVpcmUuCisKKzxiPk5PVEU6IGVhY2ggdGhpcmQgcGFydHkgZGVwZW5kZW5jeSBpbiB0aGUgYnVuZGxlIGNvbWVzIHdpdGggaXRzIAorb3duIGNvcHlyaWdodCBhbmQgbGljZW5zZSB0ZXJtcyB3aGljaCB5b3UgaW1wbGljaXRseSBhY2NlcHQgd2hlbiB1c2luZworYSBkaXN0cmlidXRpb24gYnVuZGxlLiAgU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgYnVuZGxlIGZvciBtb3JlCitpbmZvcm1hdGlvbi48L2I+CisKK1lvdSB3aWxsIG5lZWQgdG8gbWFudWFsbHkgc2V0dXAgdGhlIENMQVNTUEFUSCBmb3IgdGhlIGJ1aWxkIHRvb2xpbmcgdGhhdCB5b3UncmUKK3VzaW5nIHRvIGRldmVsb3AgeW91ciBFZGdlbnQgYXBwbGljYXRpb24uCisKKworVG8gYWxzbyBidWlsZCB0aGUgRWRnZW50IEphdmEgNyBhbmQgQW5kcm9pZCBwbGF0Zm9ybSBqYXJzOgorYGBgIHNoCiskIC4vbXZudyBjbGVhbiBwYWNrYWdlIC1Ec2tpcFRlc3RzIC1QZGlzdHJpYnV0aW9uIC1QcGxhdGZvcm0tamF2YTcscGxhdGZvcm0tYW5kcm9pZAorYGBgCitUaGUgZGlzdHJpYnV0aW9uIGJ1bmRsZXMgd2lsbCBiZSBpbiBgcGxhdGZvcm1zL2phdmE3L2Rpc3RyaWJ1dGlvbi90YXJnZXRgCithbmQgYHBsYXRmb3Jtcy9hbmRyb2lkL2Rpc3RyaWJ1dGlvbi90YXJnZXRgIHJlc3BlY3RpdmVseS4KKyAKIAogIyMgQ29udGludW91cyBJbnRlZ3JhdGlvbgogCi1XaGVuIGEgcHVsbCByZXF1ZXN0IGlzIG9wZW5lZCBvbiB0aGUgR2l0SHViIG1pcnJvciBzaXRlLCB0aGUgVHJhdmlzIENJIHNlcnZpY2UgcnVucyBhIGZ1bGwgYnVpbGQuCisjIyMgVHJhdmlzIENJCisKK1doZW4gYSBwdWxsIHJlcXVlc3QgaXMgb3BlbmVkIG9uIHRoZSBHaXRIdWIgbWlycm9yIHNpdGUsIHRoZSBUcmF2aXMgQ0kgc2VydmljZSBydW5zIGEgZnVsbCBidWlsZCBvZiB0aGUgamF2YTggbW9kdWxlcy4KIAogVGhlIGxhdGVzdCBidWlsZCBzdGF0dXMgZm9yIHRoZSBwcm9qZWN0J3MgYnJhbmNoZXMgY2FuIGJlIHNlZW4gYXQ6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9hcGFjaGUvaW5jdWJhdG9yLWVkZ2VudC9icmFuY2hlcwogCkBAIC0xMjMsOSArMjE2LDIzIEBACiBJdCBpbmNsdWRlczoKIAogKiBCdWlsZGluZyB0aGUgcHJvamVjdAotKiBUZXN0aW5nIG9uIEphdmEgOCBhbmQgSmF2YSA3CisqIFRlc3Rpbmcgb24gSmF2YSA4CiAgIC0gTm90IGFsbCB0ZXN0cyBtYXkgYmUgcnVuLCBzb21lIHRlc3RzIGFyZSBza2lwcGVkIGR1ZSB0byB0aW1pbmcgaXNzdWVzIG9yIGlmIGV4Y2Vzc2l2ZSBzZXR1cCBpcyByZXF1aXJlZC4KIAorSW4gYW4gYXR0ZW1wdCB0byBtb3JlIGdlbmVyYWxseSBkZXNlbnRpemUgdG1vIGZhaWx1cmVzCit3aGVuIHRoZSBzeXN0ZW0gcHJvcGVydHkgZWRnZW50LmJ1aWxkLmNpPXRydWUgaXMgc2V0Citzb21lIHJ1bnRpbWUgYW5kIHRlc3QgaW5mcmFzdHJ1Y3R1cmUgY29tcG9uZW50cyB3aWxsIAorYnVtcCB0aGUgbm9ybWFsIHRtbyB2YWx1ZSAoZS5nLiwgMTB4KS4KK1RoaXMgYWZmZWN0cyB0cmF2aXMgYW5kIEplbmtpbnMgcnVucyAoYm90aCBzZXQgZWRnZW50LmJ1aWxkLmNpKS4KK1NlZToKKworICAgICogVFN0cmVhbVRlc3Qud2FpdEZvckNvbXBsZXRpb24oKQorICAgICogQWJzdHJhY3RUZXN0ZXIuY29tcGxldGUoKQorICAgICogRXhlY3VhdGJsZS5pbnZva2VBY3Rpb24oKQorICAgICogZ2VuZXJhbGx5IHNlYXJjaCBmb3IgdXNlcyBvZiBlZGdlbnQuYnVpbGQuY2kKKyAgICAgICAgKiBtYXliZSByZW1vdmUgb3RoZXIgdGVzdCBzcGVjaWZpYyB1c2VzIG9mIGl0IGluIGxpZ2h0IG9mIHRoZSBnZW5lcmFsIGNoYW5nZSAKKworVGhlIGZvbGxvd2luZyBtYXkgbm93IGJlc3QgYmUgYXZvaWRlZDoKIElmIHlvdXIgdGVzdCByYW5kb21seSBmYWlscyBiZWNhdXNlLCBmb3IgZXhhbXBsZSwgaXQgZGVwZW5kcyBvbiBwdWJsaWNseSBhdmFpbGFibGUgdGVzdCBzZXJ2aWNlcywKIG9yIGlzIHRpbWluZyBkZXBlbmRlbnQsIGFuZCBpZiB0aW1pbmcgdmFyaWFuY2VzIG9uIHRoZSBUcmF2aXMgQ0kgc2VydmVycyBtYXkgbWFrZSBpdCBtb3JlIGxpa2VseQogZm9yIHlvdXIgdGVzdHMgdG8gZmFpbCwgeW91IG1heSBkaXNhYmxlIHRoZSB0ZXN0IGZyb20gYmVpbmcgZXhlY3V0ZWQgb24gVHJhdmlzIENJIHVzaW5nIHRoZQpAQCAtMTQxLDQzICsyNDgsMTk5IEBACiAKIENsb3NpbmcgYW5kIHJlb3BlbmluZyBhIHB1bGwgcmVxdWVzdCB3aWxsIGtpY2sgb2ZmIGEgbmV3IGJ1aWxkIGFnYWluc3QgdGhlIHB1bGwgcmVxdWVzdC4KIAotIyMgSmF2YSA3IGFuZCBBbmRyb2lkCisjIyMgSmVua2lucywgU29uYXJRdWJlCisKK0luIGFkZGl0aW9uIHRvIFRyYXZpcyBDSSBydW5uaW5nIHRoZSBxdWljayB0ZXN0cyB3aXRoIG9ubHkgdGhlIEphdmE4IG1vZHVsZXMsIHdlIGhhdmUgYWxzbyBzZXR1cCBhZGRpdGlvbmFsIGJ1aWxkLWpvYnMgYXQgdGhlIEFwYWNoZXMgSmVua2lucyBpbnN0YW5jZSBhdCBodHRwczovL2J1aWxkcy5hcGFjaGUub3JnL3ZpZXcvRS1HL3ZpZXcvRWRnZW50LworCitUaGlzIGJ1aWxkIGFsc28gYXV0b21hdGljYWxseSBydW5zIG9uIGV2ZXJ5IGNvbW1pdCwgYnV0IGluIGNvbnRyYXN0IHRvIHRoZSBUcmF2aXMgYnVpbGQsIGl0IGFsc28gYnVpbGRzIGFuZCB0ZXN0cyB0aGUgSmF2YTcgYW5kIEFuZHJvaWQgbW9kdWxlcyB1c2luZyB0aGUgdG9vbGNoYWluIHByb2ZpbGUuCisKK1RoaXMgaXMgYWxzbyB0aGUgYnVpbGQgd2hpY2ggcHJvZHVjZXMgYW5kIGRlcGxveXMgdGhlIE1hdmVuIGFydGlmYWN0cyB0aGF0IGFyZSBwdWJsaXNoZWQgdG8gdGhlIEFwYWNoZSBNYXZlbiByZXBvc2l0b3J5IGF0IGh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnLworCitBcyBhbiBhZGRpdGlvbmFsIHF1YWxpdHkgYXNzdXJhbmNlIHRvb2wsIHRoaXMgYnVpbGQgYWxzbyBydW5zIGEgU29uYXJRdWJlIGFuYWx5c2lzIHdobydzIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSBhdCBBcGFjaGVzIFNvbmFyUXViZSBpbnN0YW5jZSBhdCBodHRwczovL2J1aWxkcy5hcGFjaGUub3JnL2FuYWx5c2lzL292ZXJ2aWV3P2lkPTQ1MTU0CisKK0hlYWRzIHVwOiB0aGUgKEplbmtpbnM/KSB0ZXN0IGZhaWx1cmUgcmVwb3J0aW5nIHRvb2xpbmcgc2VlbXMgdG8gZ2V0IGNvbmZ1c2VkCitpbiB0aGUgZmFjZSBvZiB0aGUgc2FtZSBuYW1lZCB0ZXN0cyBiZWluZyBydW4gZm9yIG11bHRpcGxlIHBsYXRmb3Jtcy4KK0dlbmVyYWxseSB5b3Ugd2lsbCBzZWUgZWFjaCB0ZXN0IGZpbGUgbGlzdGVkIHR3aWNlOiBvbmNlIGZvciBKYXZhOCBhbmQgb25jZQorZm9yIEphdmE3LiAgSW4gdGhlIGh0bWwgcmVzdWx0cyBpdCBzZWVtcyBpbXBvc3NpYmxlIHRvIHRlbGwgd2hpY2ggcGxhdGZvcm0KK2EgZmFpbGVkIHRlc3QgKG9yIHBhc3NlZCB0ZXN0IGZvciB0aGF0IG1hdHRlcikgYXBwbGllcyB0by4gIEV2ZW4gdGhvdWdoIHRoZQoraHRtbCBsaW5rcyBmb3IgdGhlIHR3byB0ZXN0cyBkaWZmZXIgKGUuZy4sIHRoZSAybmQgb25lIGhhcyBhICJfMiIgYXQgdGhlIGVuZAorb2YgdGhlIFVSTCksIGEgZmFpbGVkIHRlc3QncyBwYWdlIHNob3dzIHRoZSBwYXNzZWQgdGVzdCdzIHBhZ2UuICBNeSBhcHByb2FjaAordG8gaW52ZXN0aWdhdGluZyBmYWlsdXJlcyBpcyB0byBvcGVuIHRoZSAiVmlldyBhcyBwbGFpbiB0ZXh0IiBwYWdlIGFuZAordGhlbiB1c2UgdGhlIGJyb3dzZXIncyBzZWFyY2ggZmVhdHVyZSB0byBsb29rIGZvciB0aGUgdGVzdCBuYW1lIG9mIGludGVyZXN0Cit0byBsb2NhdGUgdGhlIG91dHB1dCBmb3IgdGhlIGZhaWxpbmcgdGVzdC4gIHVnaC4KKworIyMgSmF2YSA3IGFuZCBBbmRyb2lkIEJ1aWxkIFRvb2xpbmcKKwogSmF2YSA3IGFuZCBBbmRyb2lkIHRhcmdldCBwbGF0Zm9ybXMgYXJlIHN1cHBvcnRlZCB0aHJvdWdoIHVzZSBvZgotcmV0cm9sYW1iZGEgdG8gY29udmVydCBFZGdlbnQgSmF2YTggSkFScyB0byBKYXZhNyBKQVJzLgorcmV0cm9sYW1iZGEgdG8gY29udmVydCBFZGdlbnQgSmF2YSA4IEpBUnMgdG8gSmF2YSA3IEpBUnMuIEluIG9yZGVyCit0byBtYWtlIGl0IGVhc3kgdG8gYWRkcmVzcyBlYXNpbHksIGZvciBlYWNoIEphdmEgOCBtb2R1bGUgYSBtYXRjaGluZworSmF2YSA3IHZlcnNpb24gaXMgbG9jYXRlZCBpbnNpZGUgdGhlIGA8ZWRnZW50Pi9wbGF0Zm9ybXMvamF2YTdgCitkaXJlY3RvcnkuIEZvciBBbmRyb2lkIG9ubHkgdGhvc2UgY291bnRlcnBhcnRzIGV4aXN0IHdoaWNoIGFyZSBnZW5lcmFsbHkKK3N1cHBvcnRlZCBvbiBBbmRyb2lkLgogCi1CdWlsZGluZyBhIHJlbGVhc2UgKGAuL2dyYWRsZXcgcmVsZWFzZWApIHByb2R1Y2VzIHRocmVlIHNldHMgb2YgSkFScyB1bmRlcgorSW4gZ2VuZXJhbCBhbGwgSmF2YSA3IG1vZHVsZXMgZGlmZmVyIGZyb20gdGhlIG9yZGluYXJ5IEphdmEgOCB2ZXJzaW9ucyAKK2FzIHRoZXNlIG1vZHVsZXMgZG9uJ3QgY29udGFpbiBhbnkgc291cmNlIGNvZGUgb3IgcmVzb3VyY2VzLiBUaGV5IGFyZQorYWxsIGJ1aWx0IGJ5IHVucGFja2luZyB0aGUgSmF2YSA4IGphcnMgY29udGVudCBpbnRvIHRoZSBjdXJyZW50IG1vZHVsZXMgCit0YXJnZXQgZGlyZWN0b3J5LiBTbyB0aGUgb3V0cHV0IGlzIGVmZmVjdGl2ZWx5IGxvY2F0ZWQgZXhhY3RseSBpbiB0aGUgCitzYW1lIGxvY2F0aW9uIGl0IHdvdWxkIGhhdmUgd2hlbiBub3JtYWxseSBjb21waWxpbmcgdGhlIEphdmEgOCB2ZXJzaW9uLiAKK1RoZXJlIHRoZSByZXRyb2xhbWJkYSBwbHVnaW4gaXMgZXhlY3V0ZWQgdG8gY29udmVydCB0aGUgZXhpc3RpbmcgY2xhc3MgCitmaWxlcyBpbnRvIG9uZXMgY29tcGF0aWJsZSB3aXRoIEphdmEgNy4KIAotKiBidWlsZC9kaXN0cmlidXRpb25zL2phdmE4IC0gSmF2YSA4IFNFCi0qIGJ1aWxkL2Rpc3RyaWJ1dGlvbnMvamF2YTcgLSBKYXZhIDcgU0UKLSogYnVpbGQvZGlzdHJpYnV0aW9ucy9hbmRyb2lkIC0gQW5kcm9pZAorVGhlIEFuZHJvaWQgdmVyc2lvbnMgYXJlIGV2ZW4gc2ltcGxlciwgYXMgYWxsIHRoZXkgZG8gaXMgdW5wYWNrIHRoZSBKYXZhIDcKK3ZlcnNpb25zIGFuZCByZS1wYWNrIHRoZSBjb250ZW50IHdpdGggdGhlIGFuZHJvaWQgZ3JvdXBJZC4gQWxsIGV4Y2VwdCB0aGUKK3R3byBtb2R1bGVzIHdoaWNoIGFyZSBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgb24gQW5kcm9pZCAKKyhsb2NhdGVkIGluIHRoZSBgPGVkZ2VudD4vcGxhdGZvcm1zL2FuZHJvaWQvYW5kcm9pZGAgZGlyZWN0b3J5KS4gVGhlc2UgCittb2R1bGVzIGFyZSBidWlsdCB1cCBzaW1pbGFyIHRvIHRoZSBKYXZhIDggdmVyc2lvbnMsIGJ1dCB0aGV5IGFsc28gY29udGFpbgordGhlIHJldHJvbGFtYmRhIHBsdWdpbiBleGVjdXRpb24uIFdoaWxlIGl0IHdvdWxkIGhhdmUgYmVlbiBwb3NzaWJsZSB0byAKK3RyZWF0IHRoZXNlIG1vZHVsZXMgYXMgSmF2YSA3LCBmb3IgdGhlIHNha2Ugb2YgYW4gZXF1YWwgY29kaW5nIGV4cGVyaWVuY2UKK2l0IHdhcyBkZWNpZGVkIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gd3JpdGUgdGhlIHNhbWUgdHlwZSBvZiBjb2RlIGZvciBhbGwKK21vZHVsZXMuCiAKLVNlZSBbSkFWQV9TVVBQT1JULm1kXShKQVZBX1NVUFBPUlQubWQpIGZvciB3aGljaCBFZGdlbnQgY2FwYWJpbGl0aWVzIC8gSkFScyBhcmUgc3VwcG9ydGVkCi1mb3IgZWFjaCBlbnZpcm9ubWVudC4KK0FuIEFuZHJvaWQgbW9kdWxlJ3MgZGVwZW5kZW5jeSBvbiB0aGUgSmF2YSA3IHZlcnNpb24gbWFrZXMgdGhlIHJlcXVpcmVtZW50CitvYnZpb3VzLCB0aGF0IGluIG9yZGVyIHRvIGJ1aWxkIHRoZSBBbmRyb2lkIHZlcnNpb25zLCB0aGUgSmF2YSA3IHZlcnNpb25zCitoYXZlIHRvIGJlIGJ1aWx0IHRvby4KIAotIyMjIEFkZGluZyBFZGdlbnQgUnVudGltZSBKQVJzIHRvIEphdmEgNyAmIEFuZHJvaWQKK1NlZSBbSkFWQV9TVVBQT1JULm1kXShKQVZBX1NVUFBPUlQubWQpIGZvciB3aGljaCBFZGdlbnQgY2FwYWJpbGl0aWVzIC8gSkFScyAKK2FyZSBzdXBwb3J0ZWQgZm9yIGVhY2ggZW52aXJvbm1lbnQuCiAKLVRoZSBHcmFkbGUgdG9vbGluZyB1c2VzIHNvbWUgQW50IHRvb2xpbmcgdG8gY3JlYXRlIHRoZSBKYXZhIDcgYW5kIEFuZHJvaWQgcGxhdGZvcm0gSkFScy4KLQotSmF2YSA3IEVkZ2VudCBydW50aW1lIEpBUnMgYXJlIGNyZWF0ZWQgdXNpbmcgYHBsYXRmb3JtL2phdmE3L2J1aWxkLnhtbGAuIEFkZGluZyBhIEpBUiBqdXN0IHJlcXVpcmVzOgotCi0qIEFkZGluZyBpdCB0byB0YXJnZXQgYHJldHJvNy5lZGdlbnRgIC0gQ29weSBlbnRyeSBmb3IgYW4gZXhpc3RpbmcgSkFSLgotKiBBZGRpbmcgYW55IHRlc3RzIGZvciBpdCB0byB0YXJnZXRzIGB0ZXN0Ny5zZXR1cGAgYW5kIGB0ZXN0Ny5ydW5gIC0gQ29weSBlbnRyeSBmb3IgYW4gZXhpc3RpbmcgSkFSLgotCi1BbnkgSmF2YSA3IEpBUiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEFuZHJvaWQgdW5sZXNzIGl0IGlzIGV4cGxpY3RseSBleGNsdWRlZCBpbiBgcGxhdGZvcm0vYW5kcm9pZC9idWlsZC54bWxgLgorQWxzbyBzZWUgX0NvZGluZyBDb252ZW50aW9uc18gYmVsb3cuCiAKICMjIFRlc3QgcmVwb3J0cwogCi1SdW5uaW5nIHRoZSBgcmVwb3J0c2AgdGFyZ2V0IHByb2R1Y2VzIHR3byByZXBvcnRzOgorVGhlIHR5cGljYWwgbWF2ZW4gYnVpbGQgY29udGFpbnMgdHdvIHBoYXNlcyBvZiB1bml0LXRlc3RzLgorVGhlIFVuaXQtVGVzdCBwaGFzZSB3aGljaCBpcyBleGVjdXRlZCBieSB0aGUgc3VyZWZpcmUgbWF2ZW4gcGx1Z2luCithbmQgdGhlIEludGVncmF0aW9uLVRlc3QgcGhhc2UsIHdoaWNoIGlzIGV4ZWN1dGVkIGJ5IHRoZSBmYWlsc2FmZQorbWF2ZW4gcGx1Z2luLgogCi0qIGBidWlsZHMvZGlzdHJpYnV0aW9ucy9yZXBvcnRzL3Rlc3RzL2luZGV4Lmh0bWxgIC0gSlVuaXQgdGVzdCByZXBvcnQKLSogYGJ1aWxkcy9kaXN0cmlidXRpb25zL3JlcG9ydHMvY292ZXJhZ2UvaW5kZXguaHRtbGAgLSBDb2RlIGNvdmVyYWdlIHJlcG9ydC4KK1doZW4gcnVubmluZyBhIG5vcm1hbCBtYXZlbiBgcGFja2FnZWAgYnVpbGQsIG9ubHkgdGhlIHVuaXQtdGVzdCBwaGFzZSBpcyBleGVjdXRlZC4KK1doZW4gcnVubmluZyBgdmVyaWZ5YCBvciBhYm92ZSAoYGluc3RhbGxgLCBgZGVwbG95YCwgZXRjLikgdGhlIGludGVncmF0aW9uCit0ZXN0cyBhcmUgYWxzbyBleGVjdXRlZC4KKworRWFjaCBNYXZlbiBwbHVnaW4gcHJvZHVjZXMgb3V0cHV0IHRvIGRpZmZlcmVudCBkaXJlY3RvcmllczoKKworKiBgPG1vZHVsZT4vdGFyZ2V0L3N1cmVmaXJlLXJlcG9ydHNgIC0gSlVuaXQgdW5pdC10ZXN0IHJlcG9ydHMKKyogYDxtb2R1bGU+L3RhcmdldC9mYWlsc2FmZS1yZXBvcnRzYCAtIEpVbml0IGludGVncmF0aW9uLXRlc3QgcmVwb3J0cworCitJbiBhZGRpdGlvbiB0byBydW5uaW5nIHRoZSB1bml0IHRlc3RzLCBjb3ZlcmFnZSBkYXRhIGlzIGF1dG9tYXRpY2FsbHkgCitjb2xsZWN0ZWQgYnkgdGhlIGBqYWNvY28tbWF2ZW4tcGx1Z2luYCwgd2hpY2ggaXMgY29uZmlndXJlZCB0byBzdG9yZQoraXRzIGRhdGEgaW4gYDxtb2R1bGU+L3RhcmdldC9jb3ZlcmFnZS1yZXBvcnRzYCBpbiBmaWxlcyBjYWxsZWQgCitgamFjb2NvLXV0LmV4ZWNgIGFuZCBgamFjb2NvLWl0LmV4ZWNgLgorCitFdmVuIGlmIGF0IGxlYXN0IHRoZSBzdXJmaXJlIGFuZCBmYWlsc2FmZSBvdXRwdXQgaXMgZ2VuZXJhdGVkIGluIGEgaHVtYW4KK3JlYWRhYmxlIHR4dCBhbmQgeG1sIGZvcm0sIHRoZSBqYWNvY28gb3V0cHV0IGlzIGludGVuZGVkIG9uIGJlaW5nIHVzZWQgCitieSB0b29scy4gU29uYXJRdWJlIGlzIGZvciBleGFtcGxlIGFibGUgdG8gaW50ZXJwcmV0IHRoaXMgaW5mb3JtYXRpb24gCitJbiBvcmRlciB0byBnZW5lcmF0ZSBuaWNlbHkgZm9ybWF0dGVkIGh0bWwgcmVwb3J0cywgcGxlYXNlIGhhdmUgYSBsb29rCithdCB0aGUgZm9sbG93aW5nIGBTaXRlIGdlbmVyYXRpb25gIGNoYXB0ZXIuCisKKyMjIFNpdGUgZ2VuZXJhdGlvbgorCitNYXZlbiBoYXMgMyBidWlsdCBpbiBsaWZlY3ljbGVzOgorCisqIGNsZWFuIC0gRm9yIGNsZWFuaW5nIHVwIChlZmZlY3RpdmVseSBzaW1wbHkgZGVsZXRpbmcgdGhlIG91dHB1dCBmb2xkZXIpCisqIGRlZmF1bHQgLSBGb3IgYnVpbGRpbmcsIHRlc3RpbmcsIGRlcGxveWluZyB0aGUgY29kZQorKiBzaXRlIC0gRm9yIGdlbmVyYXRpbmcsIGRvY3VtZW50YXRpb24sIHJlcG9ydHMsIC4uLgorCitJZiB0aGUgaHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiBhbGwgb2YgdGhlc2Ugc2hvdWxkIGJlIGdlbmVyYXRlZCwgYWxsIG5lZWRlZAordG8gZG8gdGhpcywgaXMgdG8gYXBwZW5kIGEgc2ltcGxlIGBzaXRlOnNpdGVgIGF0IHRoZSBlbmQgb2YgdGhlIG1hdmVuIGNvbW1hbmQuCisKK2BgYHNoCisuL212bncgLVBkaXN0cmlidXRpb24scGxhdGZvcm0tamF2YTcscGxhdGZvcm0tYW5kcm9pZCBjbGVhbiB2ZXJpZnkgc2l0ZTpzaXRlCitgYGAKK0VhY2ggbW9kdWxlcyBgPG1vZHVsZT4vdGFyZ2V0L3NpdGVgIGRpcmVjdG9yeSB3aWxsIHRoZW4gY29udGFpbiB0aGUgZ2VuZXJhdGVkIAorTW9kdWxlIGRvY3VtZW50YXRpb24uCisKKyMjIE1vcmUgQnVpbGQgVG9vbGluZyBNaXNjZWxsZW5lYQorCitUaGVyZSBpcyBhIGxvdCBvZiBzdXJmYWNlIGFyZWEgdG8gdGhlIG1hdmVuIGJ1aWxkIHRvb2xpbmcuICBUaGUgZm9sbG93aW5nCitpbmZvcm1hdGlvbiBtYXkgaGVscCB0byBiZXR0ZXIgdW5kZXJzdGFuZCBpdC4KKworKiBgcG9tLnhtbC9tYXZlbi1zdXJlZmlsZS1wbHVnaW5gIC0gdW5pdCB0ZXN0IGV4ZWN1dGlvbgorKiBgcG9tLnhtbC9tYXZlbi1mYWlsc2FmZS1wbHVnaW5gIC0gaW50ZWdyYXRpb24gdGVzdCBleGVjdXRpb24KKyogYHBvbS54bWwvamFjb2NvLW1hdmVuLXBsdWdpbmAgLSBqYWNvY28gY29kZSBjb3ZlcmFnZSByZXBvcnRzCisqIGBwb20ueG1sL2FuaW1hbC1zbmlmZmVyLW1hdmVuLXBsdWdpbmAgLSByZXRyb2xhbWJkYSByZXN1bHRzIGNoZWNrZXIKKyogYHBvbS54bWwvb3JnLmNvZGVoYXVzLnNvbmFyLXBsdWdpbnNgIC0gU29uYXJRdWJlIGNvZGUgcXVhbGl0eSByZXBvcnRzCisqIGBwb20ueG1sL21hdmVuLWphdmFkb2MtcGx1Z2luYCAtIGphdmFkb2MgZ2VuZXJhdGlvbiBhbmQgdGhlIGNvbmZpZworICBmb3IgYWxsIG9mIHRoZSAiZ3JvdXBpbmciIGNvbnRyb2wuCisqIGBwb20ueG1sL2FwYWNoZS1yYXQtcGx1Z2luYCAtIGJ1aWxkcyBhdXRvbWF0aWNhbGx5IHJ1biBBcGFjaGUgUkFUCisgIChSZWxlYXNlIEF1ZGl0IFRvb2wpIGZvciBjaGVja2luZyBmb3IgYXBwcm9wcmlhdGUgY29udGVudC4gIAorICBUaGUgYnVpbGQgZmFpbHMgaWYgdGhlIGNoZWNraW5nIGZhaWxzLgorICBTZWUgY29uZmlndXJhdGlvbiBpbmZvIGZvciBjb250cm9sbGluZyBleGNsdWRlZCBhcnRpZmFjdHMuCisqIGBwb20ueG1sL21hdmVuLWFzc2VtYmx5LXBsdWdpbmAgLSB1c2VkIGluIGEgY291cGxlIHBsYWNlcyBmb3IgY29uZmlndXJpbmcKKyAgYW5kIGdlbmVyYXRpbmcgImFzc2VtYmxpZXMiID0+IHNvdXJjZSByZWxlYXNlIGJ1bmRsZSwgZGlzdHJpYnV0aW9uIGJ1bmRsZXMgIAorKiBgcG9tLnhtbC9tYXZlbi1zaXRlLXBsdWdpbmAgLSB0aGluZ3MgcmVsYXRlZCB0byB3ZWJzaXRlIGdlbmVyYXRpb24gdGhhdCBpbmNsdWRlcworICAgYSBudW1iZXIgb2YgaW50ZXJlc3RpbmcgdGhpbmdzLCBpbmNsdWRpbmcgaHRtbCByZXBvcnRzIGZyb20gdmFyaW91cyB0aGluZ3MKKyAgIGFib3ZlIHBsdXMgYWdncmVnYXRlZCBqYXZhZG9jLiAgSG93IC8gaWYgdGhpcyB1bnRpbWF0ZWx5IHJlbGF0ZXMgdG8gdGhlCisgICBwdWJsaWMgd2Vic2l0ZSBpcyBUREIuCisqIGBwbGF0Zm9ybXMvamF2YTcvcG9tLnhtbC9yZXRyb2xhbWJkYS1tYXZlbi1wbHVnaW5gIAorICAgYW5kIGBwbGF0Zm9ybXMvYW5kcm9pZC9hbmRyb2lkL3BvbS54bWwvcmV0cm9sYW1iZGEtbWF2ZW4tcGx1Z2luYCAtIHdoZXJlCisgICByZXRyb2xhbWJkYSBpcyBlbmFibGVkCisqIEFzIG1lbnRpb25lZCBlYXJsaWVyIHRoZSBjdXJyZW50IHNjaGVtZSBmb3IgZ2VuZXJhdGluZyBKYXZhNyBhbmQgQW5kcm9pZAorICBFZGdlbnQgamFycywgaXMgYWNoaWV2ZWQgYnkgcmVwbGljYXRpbmcgdGhlIGphdmE4IHByb2plY3Qgc3RydWN0dXJlIGluCisgIHBsYXRmb3Jtcy97amF2YTcsYW5kcm9pZH0uICA8Yj5NYW51YWwgc3luY2hyb25pemF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgIGluZm8gaW4gdGhlIGFsdGVybmF0ZSBwbGF0Zm9ybSBwb21zIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzCisgIGlzIHJlcXVpcmVkLjwvYj4KKyogTElDRU5TRSBhbmQgTk9USUNFOiBpdCdzIGEgcmVxdWlyZW1lbnQgdGhhdCByZWxlYXNlZCBidW5kbGVzCisgIChzb3VyY2UgcmVsZWFzZSBidW5kbGUsIHJlbGVhc2VkIGphcnMpIGNvbnRhaW4gYWNjdXJhdGUgTElDRU5TRSwgTk9USUNFCisgIGFuZCBESVNDTEFJTUVSIGZpbGVzLiAgU29tZSBvZiB0aGUgRWRnZW50IHByb2plY3RzIGNvbnRhaW4gY29kZSB0aGF0CisgIHRoYXQgd2FzIGNvbnRyaWJ1dGVkIGJ5IElCTSwgc29tZSBvZiB0aGUgZ2VuZXJhdGVkIGphcnMvd2FyIGJ1bmRsZQorICBleHRlcm5hbCBjb21wb25lbnRzLiAgVGhlIGJ1aWxkIHRvb2xpbmcgaXMgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5CisgIGluY2x1ZGUgc3RhbmRhcmQgQUx2Mi4wIExJQ0VOU0UgYW5kIE5PVElDRSBmaWxlcyBpbiB0aGUgamFycy4KKyAgVGhlIG5vbi1kZWZhdWx0IGNhc2VzIGFyZSBoYW5kbGVkIGluIGEgdmFyaWV0eSBvZiB3YXlzOiAKKyAgICAqIGBwb20ueG1sL21hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luYCBjb25maWcgcGxheXMgYSByb2xlIGluIGFsbCBvZiB0aGlzCisgICAgKiBgc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzYCAtIGNvbnRhaW5zIGNvcGllcyBvZiBsaWNlbnNlIHRleHQgZm9yCisgICAgICBhcnRpZmFjdHMgdGhhdCBhcmUgYnVuZGxlZCBpbiBFZGdlbnQgYnVuZGxlcy4gIEZvciB0aGUgbW9zdCBwYXJ0CisgICAgICB0aGlzIG1lYW5zIHRoZSBFZGdlbnQgQ29uc29sZSBqYXIvd2FyLiAgVGhlc2UgYXJlIGluY29ycG9yYXRlZAorICAgICAgaW50byBhIGphciBieSBpbmNsdWRpbmcgYSBkZWNsYXJhdGlvbiBsaWtlIHRoZSBmb2xsb3dpbmcgaW4gdGhlCisgICAgICBwcm9qZWN0J3MgcG9tOgorYGBgIHhtbAorICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vLi4vc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL2xpY2Vuc2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgPHRhcmdldFBhdGg+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS9NRVRBLUlORi9saWNlbnNlczwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPC9yZXNvdXJjZT4KK2BgYAorICAgICogYHNyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzYCAtIGNvbnRhaW5zIHRoZSBOT1RJQ0UgZnJhZ21lbnQgZm9yCisgICAgICBwcm9qZWN0cyBjb250YWluaW5nIElCTSBjb250cmlidXRlZCBjb2RlLiAgQXBwbGljYWJsZSBwcm9qZWN0J3MKKyAgICAgIGRlZmluZSB0aGUgZm9sbG93aW5nIGluIHRoZWlyIHBvbSB0byBlbnN1cmUgYSBjb3JyZWN0CisgICAgICBOT1RJQ0UgaXMgaW5jbHVkZWQgaW4gdGhlIHByb2plY3QncyBqYXI6CitgYGAgeG1sCisgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgICAgICAgIDwvcHJvcGVydGllcz4KK2BgYAorICAgICogYGVkZ2VudC1jb25zb2xlLXNlcnZsZXRzOndhcmAgY29udGFpbnMgYnVuZGxlZCBjb2RlIChkb3dubG9hZGVkIGFuZAorICAgICAgaW5jb3Jwb3JhdGVkIGJ5IHRoZSBidWlsZCB0b29saW5nKS4gIEl0IGluY2x1ZGVzIHRoZSBidW5kbGVkIGNvZGUncworICAgICAgbGljZW5zZSB0ZXh0IGFzIGRlc2NyaWJlZCBhYm92ZS4gIEl0cyBvd24gTElDRU5TRSBhbmQgTk9USUNFIGlzCisgICAgICBjb3BpZWQgZnJvbSB0aGUgcmVzcGVjdGl2ZSBmaWxlcyBpbiBpdHMgYHNyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkZgLgorICAgICAgPGI+VGhlcmUgYXJlIGNvcGllcyBvZiB0aG9zZSBpbiB1bmRlciB0aGUgamF2YTcgcGxhdGZvcm0gYXMgd2VsbC48L2I+CisgICAgKiBgZWRnZW50LWNvbnNvbGUtc2VydmVyOmphcmAgYnVuZGxlcyB0aGUgY29uc29sZS1zZXJ2bGV0cyB3YXIgYW5kIGFzIHN1Y2gKKyAgICAgIHJlcXVpcmVzIHRoZSBzYW1lIExJQ0VOU0UvTk9USUNFL2xpY2Vuc2VzIHRyZWF0bWVudCBhcyB0aGUgc2VydmxldHMgd2FyLgorICAgICAgPGI+VGhlcmUgYXJlIGNvcGllcyBvZiBpdHMgTElDRU5TRS9OT1RJQ0UgaW4gaXRzICBgc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORmAuCisgICAgICBUaGVyZSBhcmUgY29waWVzIG9mIHRob3NlIGluIHVuZGVyIHRoZSBqYXZhNyBwbGF0Zm9ybSBhcyB3ZWxsLjwvYj4KKyogc291cmNlLXJlbGVhc2UgYnVuZGxlCisgICAgKiBgc3JjL2Fzc2VtYmx5L3NvdXJjZS1yZWxlYXNlLnhtbGAgLSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgICAgICBjb250cm9sbGluZyBzb3VyY2UtcmVsZWFzZSBidW5kbGUgYW5kIGRpc3RyaWJ1dGlvbiBidW5kbGUgbmFtZXMsCisgICAgICBpbmNsdWRlZC9leGNsdWRlZCBmaWxlcywgZXRjLgorKiBkaXN0cmlidXRpb24gYnVuZGxlczoKKyAgRWFjaCBwbGF0Zm9ybSBoYXMgYSAiZGlzdHJpYnV0aW9uIiBwcm9qZWN0LgorICBXZSBkb24ndCByZWxlYXNlIHRoZXNlIGJ1bmRsZXMgaGVuY2UgdGhleSBhcmVuJ3Qgb2JsaWdhdGVkIHRvIAorICBzdHJpY3RseSBjb25mb3JtIHRvIHRoZSBBU0YgTElDRU5TRS9OT1RJQ0UgZmlsZSByZXF1aXJlbWVudHMuCisgIFRoYXQgc2FpZCwgbXVjaCBvZiB0aGUgc2FtZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCB2aWEgYW4KKyAgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgREVQRU5ERU5DSUVTIGZpbGUgaW4gdGhlIGJ1bmRsZS4KKyAgPGI+VGhlcmUgYXJlIGNvcGllcyBvZiB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBqYXZhNyBhbmQgYW5kcm9pZCBwbGF0Zm9ybXMuPC9iPgorICBSZWxhdGVkLCBgc2FtcGxlcy9nZXQtZWRnZW50LWphcnMtcHJvamVjdGAgdXNlcyB0aGUgc2FtZSBzY2hlbWUgYW5kIGhhcworICBpdHMgb3duIGNvcGllcyBvZiB0aGUgZmlsZXMuCisgICogdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgc291cmNlLXJlbGVhc2UgYnVuZGxlJ3MKKyAgICBjb25maWd1cmF0aW9uIGZpbGUgbm90ZWQgYWJvdmUuCisgICogc3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWwgLSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gaW5mbworICAqIHNyYy9tYWluL3Jlc291cmNlcy9SRUFETUUgLSBzb3VyY2Ugb2YgdGhlIGZpbGUgaW4gdGhlIGJ1bmRsZQorICAgIAogCiAjIyBUZXN0aW5nIHRoZSBLYWZrYSBDb25uZWN0b3IKIAogVGhlIGthZmthIGNvbm5lY3RvciB0ZXN0cyBhcmVuJ3QgcnVuIGJ5IGRlZmF1bHQgYXMgdGhlIGNvbm5lY3RvciBtdXN0CiBjb25uZWN0IHRvIGEgcnVubmluZyBLYWZrYS9ab29rZWVwZXIgY29uZmlnLgogCi1UaGVyZSBhcmUgYXBwYXJlbnRseSB3YXlzIHRvIGVtYmVkZCBLYWZrYSBhbmQgWm9va2VlcGVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGJ1dAorVGhlcmUgYXJlIGFwcGFyZW50bHkgd2F5cyB0byBlbWJlZCBLYWZrYSBhbmQgWm9va2VlcGVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGJ1dAogd2UncmUgbm90IHRoZXJlIHlldC4gQ29udHJpYnV0aW9ucyB3ZWxjb21lIQogCiBTZXR0aW5nIHVwIHRoZSBzZXJ2ZXJzIGlzIGVhc3kuCkBAIC0xODYsODkgKzQ0OSwxNiBAQAogT25jZSBrYWZrYS96b29rZWVwZXIgYXJlIHJ1bm5pbmcgeW91IGNhbiBydW4gdGhlIHRlc3RzIGFuZCBzYW1wbGVzOgogYGBgc2gKICMjIyMgcnVuIHRoZSBrYWZrYSB0ZXN0cwotLi9ncmFkbGV3IGNvbm5lY3RvcnM6a2Fma2E6dGVzdCAtLXRlc3RzICcqLipNYW51YWwnCisuL212bncgLXBsIGNvbm5lY3RvcnMva2Fma2EgdGVzdCAnLUR0ZXN0PSoqLypNYW51YWwnCiAKICMjIyMgcnVuIHRoZSBzYW1wbGUKLWNkIGphdmE4L3NjcmlwdHMvY29ubmVjdG9ycy9rYWZrYQorKGNkIHNhbXBsZXM7IC4vbXZudyBwYWNrYWdlIC1Ec2tpcFRlc3RzKSAgIyBidWlsZCBpZiBub3QgYWxyZWFkeSBkb25lCitjZCBzYW1wbGVzL3NjcmlwdHMvY29ubmVjdG9ycy9rYWZrYQogY2F0IFJFQURNRQogLi9ydW5rYWZrYXNhbXBsZS5zaCBzdWIKIC4vcnVua2Fma2FzYW1wbGUuc2ggcHViCiBgYGAKIAotIyMgVGVzdGluZyB0aGUgSkRCQyBDb25uZWN0b3IKLQotVGhlIEpEQkMgY29ubmVjdG9yIHRlc3RzIGFyZSB3cml0dGVuIHRvIHJ1biBhZ2FpbnN0IEFwYWNoZSBEZXJieSAKLWFzIHRoZSBiYWNraW5nIGRibXMgYW5kIHRoZSBkZXJieSBqYXIgbmVlZHMgdG8gYmUgb24gdGhlIGNsYXNzcGF0aC4KLVRoZSB0ZXN0cyBhcmUgc2tpcHBlZCBpZiBkZXJieSBjYW4ndCBiZSBsb2FkZWQuCi1UaGUgdGVzdCBoYXJuZXNzIGFkZHMgJERFUkJZX0hPTUUvZGIvbGliL2RlcmJ5LmphciB0byB0aGUgY2xhc3NwYXRoLgotU2VlIFtKZGJjU3RyZWFtc1Rlc3RdKGNvbm5lY3RvcnMvamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9qZGJjL0pkYmNTdHJlYW1zVGVzdC5qYXZhKSAKLWZvciBtb3JlIGluZm8gYnV0IHRoZSBmb2xsb3dpbmcgc2hvdWxkIHN1ZmZpY2U6Ci0KLWBgYHNoCi1leHBvcnQgREVSQllfSE9NRT0kSkFWQV9IT01FL2RiCi0KLSMjIyMgaWYgSkFWQV9IT01FIGlzbid0IHNldCAtIGUuZy4sIG9uIE9TWC4uLgotZXhwb3J0IERFUkJZX0hPTUU9YC91c3IvbGliZXhlYy9qYXZhX2hvbWVgL2RiCi1gYGAKLQotT25jZSBERVJCWV9IT01FIGlzIHNldCB0aGUgdGVzdHMgYW5kIHNhbXBsZXMgY2FuIGJlIHJ1biBhcyBmb2xsb3dzCi1gYGBzaAotIyMjIyBydW4gdGhlIGpkYmMgdGVzdHMKLS4vZ3JhZGxldyBjb25uZWN0b3JzOmpkYmM6dGVzdAotCi0jIyMjIHJ1biB0aGUgc2FtcGxlCi1jZCBqYXZhOC9zY3JpcHRzL2Nvbm5lY3RvcnMvamRiYwotY2F0IFJFQURNRQotLi9ydW5qZGJjc2FtcGxlLnNoIHdyaXRlcgotLi9ydW5qZGJjc2FtcGxlLnNoIHJlYWRlcgotYGBgCi0KLSMjIFRlc3RpbmcgRWRnZW50IHdpdGggSmF2YTcKLQotQWxsIG9mIHRoZSBzdGFuZGFyZCBidWlsZCBzeXN0ZW0gX3Rhc2tzXyBhYm92ZSBtdXN0IGJlIHJ1biB3aXRoCi1gSkFWQV9IT01FYCBzZXQgdG8gdXNlIGEgSmF2YTggVk0uCi0KLUFzIG5vdGVkIGFib3ZlLCB0aGUgYHJlbGVhc2VgIHRhc2sgaW5jbHVkZXMgZ2VuZXJhdGlvbiBvZiBKYXZhNwotY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiB0aGUgRWRnZW50IEpBUnMuIEFmdGVyIHRoZSByZWxlYXNlIHRhc2sgaGFzIGJlZW4gcnVuLAotRWRnZW50IG1heSBiZSB0ZXN0ZWQgaW4gYSBKYXZhNyBjb250ZXh0IHVzaW5nIHNvbWUgc3BlY2lhbCBfdGVzdDdfIHRhc2tzLgotCi1TZWUgW0pBVkFfU1VQUE9SVF0oSkFWQV9TVVBQT1JULm1kKSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgd2hhdAotRWRnZW50IGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgaW4gdGhlIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuCi0KLWBgYCBzaAotICMgcGF2ZSB0aGUgd2F5IGZvciB1c2VmdWwgcmVwb3J0IGdlbmVyYXRpb24gYXQgdGhlIGVuZAotJCAuL2dyYWRsZXcgY2xlYW5UZXN0Ci0kIC4vZ3JhZGxldyByZXBvcnRzCi0KLSAjIHJ1biB3aXRoIEpBVkFfSE9NRS9QQVRIIHNldCBmb3IgSmF2YTgKLSQgLi9ncmFkbGV3IHRlc3Q3Q29tcGlsZSAgIyBjb21waWxlIHRoZSBFZGdlbnQgdGVzdHMgdG8gb3BlcmF0ZSBpbiBhIEphdmE3IGVudmlyb25tZW50Ci0KLSQgc2ggICAjIG11Y2sgd2l0aCBFVnMgZm9yIEphdmE3IGluIGEgc3Vic2hlbGwKLSAgJCBleHBvcnQgSkFWQV9IT01FPWAvdXNyL2xpYmV4ZWMvamF2YV9ob21lIC12IDEuN2AgICAjIG9uIE9TWAotICAkIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICi0gICQgLi9ncmFkbGV3IHRlc3Q3UnVuICAgICAgIyBydW4gdGhlIHRlc3RzIHdpdGggYSBKYXZhNyBWTQotICAkIGV4aXQKLQotICMgcnVuIHdpdGggSkFWQV9IT01FIHNldCBmb3IgSmF2YTgKLSQgLi9ncmFkbGV3IHRlc3Q3UmVwb3J0cyAgIyBnZW5lcmF0ZSB0aGUgSlVuaXQgYW5kIGNvdmVyYWdlIHJlcG9ydHMKLWBgYAotCi0jIyBQdWJsaXNoIHRvIE1hdmVuIFJlcG9zaXRvcnkKLQotSW5pdGlhbCBzdXBwb3J0IGZvciBwdWJsaXNoaW5nIHRvIGEgbG9jYWwgTWF2ZW4gcmVwb3NpdG9yeSBoYXMgYmVlbiBhZGRlZC4KLVVzZSB0aGUgZm9sbG93aW5nIHRvIGRvIHRoZSBwdWJsaXNoLgotCi1gYGAgc2gKLSQgLi9ncmFkbGV3IHB1Ymxpc2hUb01hdmVuTG9jYWwKLWBgYAotCi1UaGUgY29tcG9uZW50IEpBUnMgLyBXQVJzIGFyZSBwdWJsaXNoZWQgYXMgd2VsbCBhcyB0aGVpciBzb3VyY2VzLgotVGhlIHB1Ymxpc2hlZCBncm91cElkIGlzIGBvcmcuYXBhY2hlLmVkZ2VudGAuIFRoZSBhcnRpZmFjdElkcyBtYXRjaCB0aGUKLW5hbWVzIG9mIHRoZSBKQVJzIGluIHRoZSB0YXJnZXQtZGlyIC8gcmVsZWFzZSB0Z3ouCi0KLUZvciBleGFtcGxlOiBgb3JnLmFwYWNoZS5lZGdlbnQ6ZWRnZW50LmFwaS50b3BvbG9neTowLjQuMGAKLQotCiAjIyBDb2RlIExheW91dAogCiBUaGUgY29kZSBpcyBicm9rZW4gaW50byBhIG51bWJlciBvZiBwcm9qZWN0cyBhbmQgbW9kdWxlcyB3aXRoaW4gdGhvc2UgcHJvamVjdHMgZGVmaW5lZCBieSBkaXJlY3RvcmllcyB1bmRlciBgZWRnZW50YC4KQEAgLTI5NCwxMCArNDg0LDExIEBACiAqIGBhbmFseXRpY3NgIC0gQW5hbHl0aWNzIGZvciB1c2UgYnkgRWRnZW50IGFwcGxpY2F0aW9ucy4KICogYHV0aWxzYCAtIE9wdGlvbmFsIHV0aWxpdGllcyBmb3IgRWRnZW50IGFwcGxpY2F0aW9ucy4KICogYGNvbnNvbGVgIC0gRGV2ZWxvcG1lbnQgY29uc29sZSB0aGF0IGFsbG93cyB2aXN1YWxpemF0aW9uIG9mIHRoZSBzdHJlYW1zIHdpdGhpbiBhbiBFZGdlbnQgYXBwbGljYXRpb24gZHVyaW5nIGRldmVsb3BtZW50LgotKiBgc2FtcGxlc2AgLSBTYW1wbGUgYXBwbGljYXRpb25zLCBmcm9tIEhlbGxvIFdvcmxkIHRvIHNvbWUgc2Vuc29yIHNpbXVsYXRpb24gYXBwbGljYXRpb25zLgogKiBgYW5kcm9pZGAgLSBDb2RlIHNwZWNpZmljIHRvIEFuZHJvaWQuCiAqIGB0ZXN0YCAtIFNWVAogCitTYW1wbGVzIGFyZSBsb2NhdGVkIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLWVkZ2VudC1zYW1wbGVzCisKICMjIENvZGluZyBDb252ZW50aW9ucwogCiBQbGFjZWhvbGRlcjogc2VlIFtFREdFTlQtMjNdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRURHRU5ULTIzKQpAQCAtMzA4LDE2ICs0OTksMTEgQEAKICogRG9uJ3QgdXNlIHdpbGRjYXJkIGltcG9ydHMKICogRG9uJ3QgZGVsaXZlciBjb2RlIHdpdGggd2FybmluZ3MgKGUuZy4sIHVudXNlZCBpbXBvcnRzKQogKiBBbGwgc291cmNlIGZpbGVzLCBzY3JpcHRzLCBldGMgbXVzdCBoYXZlIHRoZSBzdGFuZGFyZCBBcGFjaGUgTGljZW5zZSBoZWFkZXIKLSAgKiBydW4gdGhlIGByYXRgIGJ1aWxkIHRhc2sgdG8gY2hlY2sgbGljZW5zZSBoZWFkZXJzCi0qIFBlciBBU0YgcG9saWN5LCByZWxlYXNlZCBzb3VyY2UgYnVuZGxlcyBtdXN0IG5vdCBjb250YWluIGJpbmFyaWVzIChlLmcuLCAuY2xhc3MsIC5qYXIpCisgICogdGhlIGJ1aWxkIHRvb2xpbmcgYXV0b21hdGljYWxseSBydW5zIGByYXRgIHRvIGNoZWNrIGxpY2Vuc2UgaGVhZGVycworICAgIGFuZCBmYWlscyBpZiBub24tY29uZm9ybWluZyBmaWxlcyBhcmUgZW5jb3VudGVyZWQuCisqIF9fUGVyIEFTRiBwb2xpY3ksIHJlbGVhc2VkIHNvdXJjZSBidW5kbGVzIG11c3Qgbm90IGNvbnRhaW4gYmluYXJpZXMgKGUuZy4sIC5jbGFzcywgLmphcilfXwogKiBQZXIgQVNGIHBvbGljeSwgcmVsZWFzZSBzb3VyY2UgYW5kIGJpbmFyeSBidW5kbGUgTElDRU5TRSBhbmQgTk9USUNFIGZpbGVzIG11c3QgYmUgYWNjdXJhdGUgYW5kIHVwIHRvIGRhdGUsIGFuZCBvbmx5IGJ1bmRsZWQgM3JkIHBhcnR5IGRlcGVuZGVuY2llcyB3aG9zZSBsaWNlbnNlIG1lZXRzIHRoZSBBU0YgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBjYW4gYmUgaW5jbHVkZWQuIAogCi0jIyBMb2dnaW5nCi0KLVtTTEY0Sl0oaHR0cDovL3d3dy5zbGY0ai5vcmcpIGlzIHVzZWQgZm9yIGxvZ2dpbmcgYW5kIHRyYWNpbmcuCi0KLVNlYXJjaCB0aGUgY29kZSBmb3Igb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkgdG8gc2VlIGEgc2FtcGxlIG9mIGl0cyB1c2UuCi0KICMjIyBVc2Ugb2YgSmF2YSA4IGZlYXR1cmVzCiBFZGdlbnQncyBwcmltYXJ5IGRldmVsb3BtZW50IGVudmlyb25tZW50IGlzIEphdmEgOCwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbGFtYmRhIGV4cHJlc3Npb25zCiBzaW5jZSBFZGdlbnQncyBwcmltYXJ5IEFQSSBpcyBhIGZ1bmN0aW9uYWwgb25lLgpAQCAtMzI1LDIwICs1MTEsMjQgQEAKICoqSG93ZXZlcioqLCBpbiBvcmRlciB0byBzdXBwb3J0IEFuZHJvaWQgKGFuZCBKYXZhIDcpLCBvdGhlciBmZWF0dXJlcyBvZiBKYXZhIDggYXJlIG5vdCB1c2VkIGluIHRoZSBjb3JlCiBjb2RlLiBMYW1iZGFzIGFyZSB0cmFuc2xhdGVkIGludG8gSmF2YSA3IGNvbXBhdGlibGUgY2xhc3NlcyB1c2luZyByZXRyb2xhbWJkYS4KIAotVGh1czoKK1RodXMgZm9yIGNvcmUgY29kZSBhbmQgdGVzdHMgdGhhdCBuZWVkcyB0byBydW4gb24gQW5kcm9pZC9KYXZhNzoKIAotKiBGb3IgY29yZSBjb2RlIHRoYXQgbmVlZHMgdG8gcnVuIG9uIEFuZHJvaWQ6CiAgICAqIFRoZSBvbmx5IEphdmEgOCBmZWF0dXJlIHRoYXQgY2FuIGJlIHVzZWQgaXMgbGFtYmRhIGV4cHJlc3Npb25zCi0gICAqIEpNWCBmdW5jdGlvbmFsaXR5IGNhbm5vdCBiZSB1c2VkLgotKiBGb3IgdGVzdCBjb2RlIHRoYXQgdGVzdHMgY29yZSBjb2RlIHRoYXQgcnVucyBvbiBBbmRyb2lkOgotICAgKiBKYXZhIDggbGFtYmRhIGV4cHJlc3Npb25zIGNhbiBiZSB1c2VkCi0gICAqIEphdmEgOCBkZWZhdWx0ICYgc3RhdGljIGludGVyZmFjZSBtZXRob2RzCisgICAqIEphdmEgOCBkZWZhdWx0ICYgc3RhdGljIGludGVyZmFjZSBtZXRob2RzIGNhbm5vdCBiZSB1c2VkCiAgICAqIEphdmEgOCBuZXcgY2xhc3NlcyBhbmQgbWV0aG9kcyBjYW5ub3QgYmUgdXNlZAorICAgKiBBbmRyb2lkIG9ubHk6IEpNWCBmdW5jdGlvbmFsaXR5IGNhbm5vdCBiZSB1c2VkCiAKLUluIGdlbmVyYWwsIG1vc3QgY29kZSBpcyBleHBlY3RlZCB0byB3b3JrIG9uIEFuZHJvaWQgKGJ1dCBtaWdodCBub3QgeWV0KSB3aXRoIHRoZSBleGNlcHRpb246CitJbiBnZW5lcmFsLCBtb3N0IGNvZGUgaXMgZXhwZWN0ZWQgdG8gd29yayBvbiBBbmRyb2lkIChidXQgbWlnaHQgbm90IHlldCkKK3dpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGVzZSBleGNsdWRlZCBmZWF0dXJlczoKIAotKiBGdW5jdGlvbmFsaXR5IGFpbWVkIGF0IHRoZSBkZXZlbG9wZXIgZW52aXJvbm1lbnQsIHN1Y2ggYXMgY29uc29sZSBhbmQgZGV2ZWxvcG1lbnQgcHJvdmlkZXIKLSogQW55IEpNWCByZWxhdGVkIGNvZGUKKyAgICogRnVuY3Rpb25hbGl0eSBhaW1lZCBhdCB0aGUgZGV2ZWxvcGVyIGVudmlyb25tZW50LCBzdWNoIGFzIGNvbnNvbGUgYW5kIGRldmVsb3BtZW50IHByb3ZpZGVyCisgICAqIEFueSBKTVggcmVsYXRlZCBjb2RlCisKKyMjIyBMb2dnaW5nCisKK1tTTEY0Sl0oaHR0cDovL3d3dy5zbGY0ai5vcmcpIGlzIHVzZWQgZm9yIGxvZ2dpbmcgYW5kIHRyYWNpbmcuCisKK1NlYXJjaCB0aGUgY29kZSBmb3Igb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkgdG8gc2VlIGEgc2FtcGxlIG9mIGl0cyB1c2UuCiAKICMjIFRoZSBBU0YgLyBHaXRIdWIgSW50ZWdyYXRpb24KIApAQCAtMzg1LDQyICs1NzUsNTcgQEAKIAogIyMgVXNpbmcgRWNsaXBzZQogCi1UaGUgRWRnZW50IEdpdCByZXBvc2l0b3J5IGNvbnRhaW5zIEVjbGlwc2UgcHJvamVjdCBkZWZpbml0aW9ucyBmb3IgdGhlCi10b3AtbGV2ZWwgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGNvZGUsIHN1Y2ggYXMgYXBpLCBydW50aW1lLCBjb25uZWN0b3JzLgorVGhlIEVkZ2VudCBHaXQgcmVwb3NpdG9yeSwgb3Igc291cmNlIHJlbGVhc2UgYnVuZGxlLCBjb250YWlucyAKK01hdmVuIHByb2plY3QgZGVmaW5pdGlvbnMgZm9yIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgRWRnZW50CitzdWNoIGFzIGFwaSwgcnVudGltZSwgY29ubmVjdG9ycy4KIAotKipUaGUgR2l0IHJlcG9zaXRvcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgM3JkIHBhcnR5IEpBUnMgdGhhdCBFZGdlbnQgZGVwZW5kcyBvbiwKLWFuZCBFY2xpcHNlIGJ1aWxkcyBvZiBFZGdlbnQgcHJvamVjdHMgd2lsbCBmYWlsIHVudGlsIGEgR3JhZGxlIHRhc2sgaXMgcnVuCi10byBtYWtlIHRoZW0gYXZhaWxhYmxlIGluIHlvdXIgd29ya3NwYWNlLiAgU2VlIHRoZSBzdGVwcyBiZWxvdy4qKgorT25jZSB5b3UgaW1wb3J0IHRoZSBNYXZlbiBwcm9qZWN0cyBpbnRvIHlvdXIgd29ya3NwYWNlLAorYnVpbGRzIGFuZCBKVW5pdCB0ZXN0aW5nIG9mIEVkZ2VudCBpbiBFY2xpcHNlIHVzZSB0aGUgCitzYW1lIGFydGlmYWN0cyBhcyB0aGUgTWF2ZW4gY29tbWFuZCBsaW5lIHRvb2xpbmcuIExpa2UKK3RoZSBjb21tYW5kIGxpbmUgdG9vbGluZywgdGhlIGphcnMgZm9yIGRlcGVuZGVudCBwcm9qZWN0cworYXJlIGF1dG9tYXRpY2FsbHkgZG93bmxvYWRlZCB0byB0aGUgbG9jYWwgbWF2ZW4gcmVwb3NpdG9yeQorYW5kIHVzZWQuCiAKLVVzaW5nIHRoZSBFY2xpcHNlIEdpdCBUZWFtIFByb3ZpZGVyIHBsdWdpbiBhbGxvd3MgeW91IHRvIGltcG9ydCB0aGVzZSBwcm9qZWN0cwotaW50byB5b3VyIEVjbGlwc2Ugd29ya3NwYWNlIGRpcmVjdGx5IGZyb20geW91ciBmb3JrLgorSWYgeW91IHdhbnQgdG8gdXNlIEVjbGlwc2UgdG8gY2xvbmUgeW91ciBmb3JrLCB1c2UgdGhlIEVjbGlwc2UgR2l0IFRlYW0gUHJvdmlkZXIgcGx1Z2luCiAKIDEuIEZyb20gdGhlICpGaWxlKiBtZW51LCBzZWxlY3QgKkltcG9ydC4uLioKIDIuIEZyb20gdGhlICpHaXQqIGZvbGRlciwgc2VsZWN0ICpQcm9qZWN0cyBmcm9tIEdpdCogYW5kIGNsaWNrICpOZXh0KgotMy4gSW4gdGhlICpTZWxlY3QgUmVwb3NpdG9yeSBTb3VyY2UqIHdpbmRvdywgc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAtICpFeGlzdGluZyBsb2NhbCByZXBvc2l0b3J5KiBpZiB5b3UgaGF2ZSBhbHJlYWR5IGNsb25lZCB0aGUgcHJvamVjdCB0byB5b3VyIG1hY2hpbmUuIENsaWNrICpOZXh0Ki4KLSAgICArIENsaWNrICpBZGQqIGFuZCBicm93c2UgdG8gdGhlIGxvY2FsIEdpdCByZXBvc2l0b3J5IGRpcmVjdG9yeQotICAgICsgU2VsZWN0IHRoZSBjaGVja2JveCBuZXh0IHRvIHRoZSByZXBvc2l0b3J5IGFuZCBjbGljayAqRmluaXNoKgotICAgICsgSW4gdGhlICpTZWxlY3QgYSBHaXQgcmVwb3NpdG9yeSogd2luZG93LCBjaG9vc2UgKmluY3ViYXRvci1lZGdlbnQqIGFuZCBjbGljayAqTmV4dCoKLSAgLSAqQ2xvbmUgVVJJKiB0byBjbG9uZSB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIENsaWNrICpOZXh0Ki4KKzMuIFNlbGVjdCAqQ2xvbmUgVVJJKiB0byBjbG9uZSB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIENsaWNrICpOZXh0Ki4KICAgICArIEluIHRoZSAqTG9jYXRpb24qIHNlY3Rpb24sIGVudGVyIHRoZSBVUkkgb2YgeW91ciBmb3JrIGluIHRoZSAqVVJJKiBmaWVsZCAoZS5nLiwgYGdpdEBnaXRodWIuY29tOjx1c2VybmFtZT4vaW5jdWJhdG9yLWVkZ2VudC5naXRgKS4gVGhlIG90aGVyIGZpZWxkcyB3aWxsIGJlIHBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5LiBDbGljayAqTmV4dCouIElmIHJlcXVpcmVkLCBlbnRlciB5b3VyIHBhc3NwaHJhc2UuCiAgICAgKyBJbiB0aGUgKlNvdXJjZSBHaXQgUmVwb3NpdG9yeSogd2luZG93LCBzZWxlY3QgdGhlIGJyYW5jaCAodXN1YWxseSBgbWFzdGVyYCkgYW5kIGNsaWNrICpOZXh0KgotICAgICsgU3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdXIgbG9jYWwgY2xvbmUgd2lsbCBiZSBzdG9yZWQgYW5kIGNsaWNrICpOZXh0Ki4gTm90ZTogWW91IGNhbiBidWlsZCBhbmQgcnVuIHRlc3RzIHVzaW5nIHRoZSBHcmFkbGUgdGFyZ2V0cyBpbiB0aGlzIGRpcmVjdG9yeS4KLTQuIEluIHRoZSAqU2VsZWN0IGEgd2l6YXJkIHRvIHVzZSBmb3IgaW1wb3J0aW5nIHByb2plY3RzKiB3aW5kb3csIGNob29zZSAqSW1wb3J0IGV4aXN0aW5nIEVjbGlwc2UgcHJvamVjdHMqIGFuZCBjbGljayAqTmV4dCoKLTUuIEluIHRoZSAqSW1wb3J0IFByb2plY3RzKiB3aW5kb3csIGVuc3VyZSB0aGF0IHRoZSAqU2VhcmNoIGZvciBuZXN0ZWQgcHJvamVjdHMqIGNoZWNrYm94IGlzIHNlbGVjdGVkLiBDbGljayAqRmluaXNoKiB0byBicmluZyBpbiBhbGwgdGhlIEVkZ2VudCBwcm9qZWN0cy4gKipFeHBlY3QgYnVpbGQgZmFpbHVyZXMgdW50aWwgeW91Li4uKioKLTYuIFJ1biB0aGUgZm9sbG93aW5nIEdyYWRsZSB0YXNrIGluIHlvdXIgY2xvbmUgZGlyZWN0b3J5IHRvIG1ha2UgYWxsIG9mIHRoZSBkZXBlbmRhbnQgM3JkIHBhcnR5IEpBUnMgYXZhaWxhYmxlIHRvIEVjbGlwc2UuIFdoZW4gdGhlIGNvbW1hbmQgZmluaXNoZXMsIHJlZnJlc2ggeW91ciBFY2xpcHNlIHdvcmtzcGFjZSAoKkZpbGUqID4gKlJlZnJlc2gqKSBzbyB0aGF0IGl0IHJlYnVpbGRzIHRoZSBwcm9qZWN0cy4KLWBgYCBzaAotJCAuL2dyYWRsZXcgc2V0dXBFeHRlcm5hbEphcnMKLWBgYAorICAgICsgU3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdXIgbG9jYWwgY2xvbmUgd2lsbCBiZSBzdG9yZWQgYW5kIGNsaWNrICpOZXh0Ki4gVGhlIHJlcG9zaXRvcnkgd2lsbCBiZSBjbG9uZWQuIE5vdGU6IFlvdSBjYW4gYnVpbGQgYW5kIHJ1biB0ZXN0cyB1c2luZyBNYXZlbiBpbiB0aGlzIGRpcmVjdG9yeS4KKzQuIEluIHRoZSAqU2VsZWN0IGEgd2l6YXJkIHRvIHVzZSBmb3IgaW1wb3J0aW5nIHByb2plY3RzKiB3aW5kb3csIGNsaWNrICpDYW5jZWwqLiAgVGhlbiBmb2xsb3cgdGhlIHN0ZXBzIGJlbG93IHRvIGltcG9ydCB0aGUgTWF2ZW4gcHJvamVjdHMuCiAKLVRoZSBgX2VkZ2VudGAgcHJvamVjdCBleGlzdHMgdG8gbWFrZSB0aGUgdG9wLWxldmVsIGFydGlmYWN0cyBzdWNoIGFzCi1gYnVpbGQuZ3JhZGxlYCBtYW5hZ2VhYmxlIHZpYSBFY2xpcHNlLiAgVW5mb3J0dW5hdGVseSwgZm9sZGVycyBmb3IgdGhlCi1vdGhlciBwcm9qZWN0cyAoZS5nLiwgYGFwaWApIGFsc28gc2hvdyB1cCBpbiB0aGUgYF9lZGdlbnRgIGZvbGRlciwgYW5kCi1hcmUgYmVzdCBpZ25vcmVkLgogCi1CdWlsZHMgYW5kIEpVbml0IHRlc3Rpbmcgb2YgRWRnZW50IGluIEVjbGlwc2UgYXJlIGluZGVwZW5kZW50IGZyb20gdGhlIGFydGlmYWN0cwotZ2VuZXJhdGVkIGJ5IHRoZSBHcmFkbGUgYnVpbGQgdG9vbGluZy4gIE5laXRoZXIgZW52aXJvbm1lbnQgaXMgYWZmZWN0ZWQgYnkKLXRoZSBvdGhlci4gVGhpcyBpcyBub3QgaWRlYWwsIGJ1dCBpdCdzIHdoZXJlIHRoaW5ncyBhcmUgYXQgYXQgdGhpcyB0aW1lLgotQm90aCBzZXRzIG9mIHRvb2xpbmcgY2FuIGJlLCBhbmQgdHlwaWNhbGx5IGFyZSwgdXNlZCBpbiB0aGUgc2FtZSB3b3Jrc3BhY2UuCitPbmNlIHlvdSBoYXZlIGNsb25lZCB0aGUgR2l0IHJlcG9zaXRvcnkgdG8geW91ciBtYWNoaW5lIG9yIGFyZSB3b3JraW5nIGZyb20gYW4gdW5wYWNrZWQgc291cmNlIHJlbGVhc2UgYnVuZGxlLCBpbXBvcnQgdGhlIE1hdmVuIHByb2plY3RzIGludG8geW91ciB3b3Jrc3BhY2UKIAotTm90ZTogU3BlY2lmaWNzIG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIHlvdXIgdmVyc2lvbiBvZiBFY2xpcHNlIG9yIHRoZSBFY2xpcHNlIEdpdCBUZWFtIFByb3ZpZGVyLgorMS4gRnJvbSB0aGUgKkZpbGUqIG1lbnUsIHNlbGVjdCAqSW1wb3J0Li4uKgorMi4gRnJvbSB0aGUgKk1hdmVuKiBmb2xkZXIsIHNlbGVjdCAqRXhpc3RpbmcgTWF2ZW4gUHJvamVjdHMqIGFuZCBjbGljayAqTmV4dCoKKyAgKyBicm93c2UgdG8gdGhlIHJvb3Qgb2YgdGhlIGNsb25lIG9yIHNvdXJjZSByZWxlYXNlIGRpcmVjdG9yeSBhbmQgc2VsZWN0IGl0LiAgQSBoaWVyYXJjaHkgb2YgcHJvamVjdHMgLyBwb20ueG1sIGZpbGVzIHdpbGwgYmUgbGlzdGVkIGFuZCBhbGwgc2VsZWN0ZWQuIAorICArIFZlcmlmeSB0aGUgKkFkZCBwcm9qZWN0KHMpIHRvIHdvcmtpbmcgc2V0KiBjaGVja2JveCBpcyBjaGVja2VkCisgICsgQ2xpY2sgKkZpbmlzaCouICBFY2xpcHNlIHN0YXJ0cyB0aGUgaW1wb3J0IHByb2Nlc3MgYW5kIGJ1aWxkcyB0aGUgd29ya3NwYWNlLiAgQmUgcGF0aWVudCwgaXQgbWF5IHRha2UgYSBtaW51dGUgb3Igc28uCisKK1RvcC1sZXZlbCBhcnRpZmFjdHMgc3VjaCBhcyBgUkVBRE1FLm1kYCBhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSBgZWRnZW50LXBhcmVudGAgcHJvamVjdC4KKworTm90ZTogU3BlY2lmaWNzIG1heSBjaGFuZ2UgZGVwZW5kaW5nIG9uIHlvdXIgdmVyc2lvbiBvZiBFY2xpcHNlIG9yIHRoZSBFY2xpcHNlIE1hdmVuIG9yIEdpdCBUZWFtIFByb3ZpZGVyLgorCisjIyMgTWFya2Rvd24gVGV4dCBFZGl0b3IKKworVGhlIEFMdjIgbGljZW5zZSBoZWFkZXJzIGluIHZhcmlvdXMgbWFya2Rvd24gZmlsZXMgKGUuZy4sIFJFQURNRS5tZCkKK3NlZW0gdG8gY29uZnVzZSB0aGUgRWNsaXBzZSBgd2lraXRleHRgIGVkaXRvciByZXN1bHRpbmcgaW4gYmxhbmsgY29udGVudHMKK2luIGl0cyBwcmV2aWV3IHBhbmVsLiAgVGhpcyBzaXR1YXRpb24gbWF5IGJlIGltcHJvdmVkIGJ5IGluc3RhbGxpbmcgCit0aGUgYE1hcmtkb3duIHRleHQgZWRpdG9yYCBmcm9tIHRoZSBFY2xpcHNlIG1hcmtldHBsYWNlIGFuZCBhZGp1c3RpbmcKK0VjbGlwc2UncyBmaWxlIGFzc29jaWF0aW9ucyBhY2NvcmRpbmdseS4KKworIyMgUmVuYW1lZCBmcm9tIEFwYWNoZSBRdWFya3MKK0FwYWNoZSBFZGdlbnQgaXMgdGhlIG5ldyBuYW1lIGFuZCB0aGUgY29udmVyc2lvbiBpcyBjb21wbGV0ZS4KKworQ29kZSBjaGFuZ2VzOgorCisgICogUGFja2FnZSBuYW1lcyBoYXZlIHRoZSBwcmVmaXggIm9yZy5hcGFjaGUuZWRnZW50IgorICAqIEpBUiBuYW1lcyBoYXZlIHRoZSBwcmVmaXggImVkZ2VudCIKKworVXNlcnMgb2YgRWRnZW50IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlaXIgcmVmZXJlbmNlcyB0byB0aGUgYWJvdmUuCitJdCdzIHJlY29tbWVuZGVkIHRoYXQgZGV2ZWxvcGVycyBvZiBFZGdlbnQgY3JlYXRlIGEgbmV3IHdvcmtzcGFjZSBpbnN0ZWFkIG9mCityZXVzaW5nIHRoZWlyIFF1YXJrcyB3b3Jrc3BhY2UuCisKZGlmZiAtLWdpdCBhL0RJU0NMQUlNRVIgYi9ESVNDTEFJTUVSCmluZGV4IDhiY2MyOTUuLjU4Y2YzYWQgMTAwNjQ0Ci0tLSBhL0RJU0NMQUlNRVIKKysrIGIvRElTQ0xBSU1FUgpAQCAtMSw4ICsxLDEwIEBACitBcGFjaGUgRWRnZW50IGlzIGFuIGVmZm9ydCB1bmRlcmdvaW5nIGluY3ViYXRpb24gYXQgdGhlIEFwYWNoZSBTb2Z0d2FyZQorRm91bmRhdGlvbiAoQVNGKSwgc3BvbnNvcmVkIGJ5IHRoZSBBcGFjaGUgSW5jdWJhdG9yIFBNQy4KIAotQXBhY2hlIEVkZ2VudCBpcyBhbiBlZmZvcnQgdW5kZXJnb2luZyBpbmN1YmF0aW9uIGF0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSwgCi1zcG9uc29yZWQgYnkgdGhlIEluY3ViYXRvciBQTUMuIEluY3ViYXRpb24gaXMgcmVxdWlyZWQgb2YgYWxsIG5ld2x5IGFjY2VwdGVkIAotcHJvamVjdHMgdW50aWwgYSBmdXJ0aGVyIHJldmlldyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5mcmFzdHJ1Y3R1cmUsIGNvbW11bmljYXRpb25zLCAKLWFuZCBkZWNpc2lvbiBtYWtpbmcgcHJvY2VzcyBoYXZlIHN0YWJpbGl6ZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIG90aGVyIAotc3VjY2Vzc2Z1bCBBU0YgcHJvamVjdHMuIFdoaWxlIGluY3ViYXRpb24gc3RhdHVzIGlzIG5vdCBuZWNlc3NhcmlseSBhIHJlZmxlY3Rpb24KLW9mIHRoZSBjb21wbGV0ZW5lc3Mgb3Igc3RhYmlsaXR5IG9mIHRoZSBjb2RlLCBpdCBkb2VzIGluZGljYXRlIHRoYXQgdGhlIHByb2plY3QKLWhhcyB5ZXQgdG8gYmUgZnVsbHkgZW5kb3JzZWQgYnkgdGhlIEFTRi4KK0luY3ViYXRpb24gaXMgcmVxdWlyZWQgb2YgYWxsIG5ld2x5IGFjY2VwdGVkIHByb2plY3RzIHVudGlsIGEgZnVydGhlciByZXZpZXcKK2luZGljYXRlcyB0aGF0IHRoZSBpbmZyYXN0cnVjdHVyZSwgY29tbXVuaWNhdGlvbnMsIGFuZCBkZWNpc2lvbiBtYWtpbmcgcHJvY2VzcworaGF2ZSBzdGFiaWxpemVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBzdWNjZXNzZnVsIEFTRiBwcm9qZWN0cy4KKworV2hpbGUgaW5jdWJhdGlvbiBzdGF0dXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgcmVmbGVjdGlvbiBvZiB0aGUgY29tcGxldGVuZXNzCitvciBzdGFiaWxpdHkgb2YgdGhlIGNvZGUsIGl0IGRvZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvamVjdCBoYXMgeWV0IHRvIGJlCitmdWxseSBlbmRvcnNlZCBieSB0aGUgQVNGLgpkaWZmIC0tZ2l0IGEvSkFWQV9TVVBQT1JULm1kIGIvSkFWQV9TVVBQT1JULm1kCmluZGV4IGVjNmEyMjEuLjVhM2JiNDQgMTAwNjQ0Ci0tLSBhL0pBVkFfU1VQUE9SVC5tZAorKysgYi9KQVZBX1NVUFBPUlQubWQKQEAgLTEsMTEwICsxLDE3MyBAQAorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KICMgRWRnZW50IEphdmEgc3VwcG9ydAogCiBUaGUgRWRnZW50IHJ1bnRpbWUgaXMgc3VwcG9ydGVkIG9uIGFsbCBKYXZhIDggU0UsIEphdmEgNyBTRSwgYW5kIEFuZHJvaWQKIHBsYXRmb3JtcyB3aXRoIHRoZSBleGNlcHRpb25zIG5vdGVkIGJlbG93LgogCi1BbiBFZGdlbnQgYmluYXJ5IHJlbGVhc2UgYnVuZGxlIGhhcyBhIGRpcmVjdG9yeSBmb3IgZWFjaCBvZiB0aGUgdGFyZ2V0IHBsYXRmb3Jtcy4KLUVhY2ggdGFyZ2V0IHBsYXRmb3JtIGRpcmVjdG9yeSBjb250YWlucyBhIHNldCBvZiBqYXJzIGZvciB0aGF0IHBsYXRmb3JtCi0qIGphdmE4IC0gSmF2YSA4IFNFCi0qIGphdmE3IC0gSmF2YSA3IFNFCi0qIGFuZHJvaWQgLSBBbmRyb2lkCitBbiBFZGdlbnQgcmVsZWFzZSBpbmNsdWRlcyBjb252ZW5pZW5jZSBiaW5hcmllcyBmb3IgdGhlIEVkZ2VudCBTREsuCitUaGUgYmluYXJpZXMgKGphcnMgYW5kIHdhcnMpIGFyZSBhdmFpbGFibGUgaW4gdGhlIEFwYWNoZSBOZXh1cyByZXBvc2l0b3J5CithbmQgTWF2ZW4gQ2VudHJhbC4gIElmIHlvdSBhcmUgYnVpbGRpbmcgdGhlIEVkZ2VudCBTREssIHRoZSBhcnRpZmFjdHMKK3dpbGwgYmUgaW5zdGFsbGVkIGludG8gdGhlIGxvY2FsIG1hdmVuIHJlcG9zaXRvcnkuCiAKLVdoZW4gYnVpbGRpbmcgYW4gRWRnZW50IHJlbGVhc2UgKGAuL2dyYWRsZXcgcmVsZWFzZWApIHRoZSBhYm92ZSBwbGF0Zm9ybQotZGlyZWN0b3JpZXMgYXJlIGluIGBidWlsZC9kaXN0cmlidXRpb25zYC4gIFNlZSBbREVWRUxPUE1FTlQubWRdKERFVkVMT1BNRU5ULm1kKSBmb3IgbW9yZQotaW5mb3JtYXRpb24uCitTZWUgYHNhbXBsZXMvUkVBRE1FLm1kYCBmb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgRWRnZW50IEFwcGxpY2F0aW9uCitkZXZlbG9wbWVudCBhbmQgZGVwbG95bWVudCBhbmQgdG9vbGluZyB0byBzdXBwb3J0IHRoYXQuCiAKLVRoaXMgcGFnZSBkb2N1bWVudHMgd2hpY2ggamFycyBhcmUgZXhwZWN0ZWQgdG8gd29yayBpbiBlYWNoIGVudmlyb25tZW50LgorU0RLIGJpbmFyeSBhcnRpZmFjdHMgYXJlIHB1Ymxpc2hlZCBmb3IgZWFjaCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtIHR5cGVzCithbmQgdGhlIGFydGlmYWN0J3MgZ3JvdXBJZCBwb3J0aW9uIG9mIGl0cyBjb29yZGluYXRlIGluZGljYXRlcyB3aGljaAorcGxhdGZvcm0gdGhlIGFydGlmYWN0IGlzIGZvci4gIFRoZSBFZGdlbnQgamFyL3dhciBmaWxlIG5hbWUgaXMgdGhlIHNhbWUKK2ZvciBlYWNoIG9mIHRoZSBwbGF0Zm9ybXMuCiAKLUEgYmxhbmsgZW50cnkgbWVhbnMgYSBqYXIgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgaW4gdGhhdCBlbnZpcm9ubWVudAotYW5kIG5vIGludmVzdGlnYXRpb24gaGFzIHRha2VuIHBsYWNlIHRvIHNlZSBpZiBpdCBjYW4gYmUgc3VwcG9ydGVkLgorVGhlIGNvb3JkaW5hdGVzIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtOgorKiBncm91cElkOiBgb3JnLmFwYWNoZS5lZGdlbnRbLnBsYXRmb3JtXWAKKyogYXJ0aWZhY3RJZDogYGVkZ2VudC08Y29tcG9uZW50Pi08c3ViY29tcG9uZW50PmAKKworVGhlIFsucGxhdGZvcm1dIGlzIGFzIGZvbGxvd3M6CisqIGJsYW5rL29taXR0ZWQgLSBKYXZhIDggU0UKKyogYC5qYXZhN2AgLSBKYXZhIDcgU0UKKyogYC5hbmRyb2lkYCAtIEFuZHJvaWQKKworRm9yIGV4YW1wbGU6CitgYGAKKzwhLS0gZm9yIEphdmE4IC0tPgorPGRlcGVuZGVuY3k+CisgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+Cis8L2RlcGVuZGVuY3k+CisKKzwhLS0gZm9yIEphdmE3IC0tPgorPGRlcGVuZGVuY3k+CisgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+Cis8L2RlcGVuZGVuY3k+CitgYGAKKworR2VuZXJhbGx5LCBhbiBFZGdlbnQgYXBwbGljYXRpb24gbmVlZHMgdG8gZGVjbGFyZSB0aGVzZSBkZXBlZGVuY2llczoKKyogdGhlIEVkZ2VudCBQcm92aWRlciB1c2VkCisqIHRoZSBFZGdlbnQgQW5hbHl0aWNzIHVzZWQKKyogdGhlIEVkZ2VudCBVdGlscyB1c2VkCisqIHRoZSBFZGdlbnQgQ29ubmVjdG9ycyB1c2VkCisqIGFuIFNMRjRKIGltcGxlbWVudGF0aW9uIGZvciBjYXRlZ29yeSAicnVudGltZSIKKworQXQgYXBwbGljYXRpb24gZXhlY3V0aW9uIHRpbWUsIHRob3NlIHNhbWUgZGVwZW5kZW5jaWVzIGFzIHdlbGwKK2FzIHRoZWlyIGRlcGVuZGVuY2llcyAoZS5nLiwgb3RoZXIgImludGVybmFsIiBFZGdlbnQgQ29yZSBqYXJzLCAKK2V4dGVybmFsIGRlcGVuZGVuY3kgamFycyBzdWNoIGFzIGZvciBtcXR0KSBtdXN0IGJlIGluY2x1ZGVkIG9uCit0aGUgYXBwbGljYXRpb24ncyBjbGFzc3BhdGguCisKK1RoZSBgc2FtcGxlcy90ZW1wbGF0ZS9wb20ueG1sYCBpcyBzdHJ1Y3R1cmVkIHRvIHN1cHBvcnQgYWxsIG9mIHRoaXMuCisKK1RoaXMgcGFnZSBkb2N1bWVudHMgd2hpY2ggRWRnZW50IFNESyBqYXJzIGFyZSBleHBlY3RlZCB0byB3b3JrIGluIGVhY2ggZW52aXJvbm1lbnQuCisKK0EgYmxhbmsgZW50cnkgbWVhbnMgbm8gaW52ZXN0aWdhdGlvbiBoYXMgdGFrZW4gcGxhY2UgdG8gc2VlIGlmIHRoZSBqYXIKK2FuZCBpdHMgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGF0IGVudmlyb25tZW50LgogCiAjIyBDb3JlCiAKLXwgSmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEphdmEgOCBTRSB8IEphdmEgNyBTRSB8IEFuZHJvaWQgfCBOb3RlcyB8Ci18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfAotfGVkZ2VudC5hcGkuZXhlY3V0aW9uLmphciAgICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKLXxlZGdlbnQuYXBpLmZ1bmN0aW9uLmphciAgICAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Ci18ZWRnZW50LmFwaS5ncmFwaC5qYXIgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAotfGVkZ2VudC5hcGkub3BsZXQuamFyICAgICAgICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKLXxlZGdlbnQuYXBpLnRvcG9sb2d5LmphciAgICAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Ci18ZWRnZW50LmFwaS53aW5kb3cuamFyICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAotfGVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuamFyIHwgeWVzICAgICAgIHwgICAgICAgICAgIHwgbm8gICAgICB8IFVzZXMgSk1YLCBGb3IgZGV2ZWxvcG1lbnQgb25seSwgbm90IGRlcGxveW1lbnQgfAotfGVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LmphciAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKLXxlZGdlbnQucHJvdmlkZXJzLmlvdC5qYXIgICAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Ci18ZWRnZW50LnJ1bnRpbWUuYXBwc2VydmljZS5qYXIgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAotfGVkZ2VudC5ydW50aW1lLmV0aWFvLmphciAgICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKLXxlZGdlbnQucnVudGltZS5qbXhjb250cm9sLmphciAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IG5vICAgICAgfCBVc2VzIEpNWCB8Ci18ZWRnZW50LnJ1bnRpbWUuam9icmVnaXN0cnkuamFyICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5ydW50aW1lLmpzb25jb250cm9sLmphciAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKLXxlZGdlbnQuc3BpLmdyYXBoLmphciAgICAgICAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Ci18ZWRnZW50LnNwaS50b3BvbG9neS5qYXIgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfCBKYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSmF2YSA4IFNFIHwgSmF2YSA3IFNFIHwgQW5kcm9pZCB8IE5vdGVzIHwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18Cit8ZWRnZW50LWFwaS1leGVjdXRpb24tPHZlcj4uamFyICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1hcGktZnVuY3Rpb24tPHZlcj4uamFyICAgICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKK3xlZGdlbnQtYXBpLWdyYXBoLTx2ZXI+LmphciAgICAgICAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Cit8ZWRnZW50LWFwaS1vcGxldC08dmVyPi5qYXIgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1hcGktdG9wb2xvZ3ktPHZlcj4uamFyICAgICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKK3xlZGdlbnQtYXBpLXdpbmRvdy08dmVyPi5qYXIgICAgICAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Cit8ZWRnZW50LXByb3ZpZGVycy1kZXZlbG9wbWVudC08dmVyPi5qYXIgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCBubyAgICAgIHwgVXNlcyBKTVgsIEZvciBkZXZlbG9wbWVudCBvbmx5LCBub3QgZGVwbG95bWVudCB8Cit8ZWRnZW50LXByb3ZpZGVycy1kaXJlY3QtPHZlcj4uamFyICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1wcm92aWRlcnMtaW90LTx2ZXI+LmphciAgICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKK3xlZGdlbnQtcnVudGltZS1hcHBzZXJ2aWNlLTx2ZXI+LmphciAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Cit8ZWRnZW50LXJ1bnRpbWUtZXRpYW8tPHZlcj4uamFyICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1ydW50aW1lLWpteGNvbnRyb2wtPHZlcj4uamFyICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgbm8gICAgICB8IFVzZXMgSk1YIHwKK3xlZGdlbnQtcnVudGltZS1qb2JyZWdpc3RyeS08dmVyPi5qYXIgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Cit8ZWRnZW50LXJ1bnRpbWUtanNvbmNvbnRyb2wtPHZlcj4uamFyICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1zcGktZ3JhcGgtPHZlcj4uamFyICAgICAgICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKK3xlZGdlbnQtc3BpLXRvcG9sb2d5LTx2ZXI+LmphciAgICAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8CiAKICMjIENvbm5lY3RvcnMKIAotfCBKYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBKYXZhIDggU0UgfCBKYXZhIDcgU0UgfCBBbmRyb2lkIHwgTm90ZXMgfAotfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfAotfGVkZ2VudC5jb25uZWN0b3JzLmNvbW1vbi5qYXIgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLmNvbW1hbmQuamFyICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLmNzdi5qYXIgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLmZpbGUuamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLmh0dHAuamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLmlvdGYuamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLmlvdC5qYXIgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLmpkYmMuamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLmthZmthLmphciAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLm1xdHQuamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLnB1YnN1Yi5qYXIgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLnNlcmlhbC5qYXIgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLndzY2xpZW50LmphciAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5jb25uZWN0b3JzLndzY2xpZW50LWphdmF4LndlYnNvY2tldC5qYXIgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC5qYXZheC53ZWJzb2NrZXQuamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfCBKYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBKYXZhIDggU0UgfCBKYXZhIDcgU0UgfCBBbmRyb2lkIHwgTm90ZXMgfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfAorfGVkZ2VudC1jb25uZWN0b3JzLWNvbW1vbi08dmVyPi5qYXIgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLWNvbW1hbmQtPHZlcj4uamFyICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLWNzdi08dmVyPi5qYXIgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLWZpbGUtPHZlcj4uamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLWh0dHAtPHZlcj4uamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLWlvdGYtPHZlcj4uamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLWlvdC08dmVyPi5qYXIgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLWpkYmMtPHZlcj4uamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLWthZmthLTx2ZXI+LmphciAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLW1xdHQtPHZlcj4uamFyICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLXB1YnN1Yi08dmVyPi5qYXIgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLXNlcmlhbC08dmVyPi5qYXIgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC08dmVyPi5qYXIgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1iYXNlLTx2ZXI+LmphciAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1qZXR0eS08dmVyPi5qYXIgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1taXNjLTx2ZXI+LmphciAgICAgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAogCiAjIyBBcHBsaWNhdGlvbnMKLXwgSmFyICAgICAgICAgICAgICAgICAgICB8IEphdmEgOCBTRSB8IEphdmEgNyBTRSB8IEFuZHJvaWQgfCBOb3RlcyB8Ci18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfAotfGVkZ2VudC5hcHBzLmlvdC5qYXIgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwgCi18ZWRnZW50LmFwcHMucnVudGltZS5qYXIgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfCAKK3wgSmFyICAgICAgICAgICAgICAgICAgICAgICAgICB8IEphdmEgOCBTRSB8IEphdmEgNyBTRSB8IEFuZHJvaWQgfCBOb3RlcyB8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfAorfGVkZ2VudC1hcHBzLWlvdC08dmVyPi5qYXIgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwgCit8ZWRnZW50LWFwcHMtcnVudGltZS08dmVyPi5qYXIgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgIHwgICAgICAgfCAKIAogIyMjIEFuYWx5dGljcwogCi18IEphciAgICAgICAgICAgICAgICAgICAgICAgICB8IEphdmEgOCBTRSB8IEphdmEgNyBTRSB8IEFuZHJvaWQgfCBOb3RlcyB8Ci18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18Ci18ZWRnZW50LmFuYWx5dGljcy5tYXRoMy5qYXIgICB8IHllcyAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICB8Ci18ZWRnZW50LmFuYWx5dGljcy5zZW5zb3JzLmphciB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8Cit8IEphciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEphdmEgOCBTRSB8IEphdmEgNyBTRSB8IEFuZHJvaWQgfCBOb3RlcyB8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18Cit8ZWRnZW50LWFuYWx5dGljcy1tYXRoMy08dmVyPi5qYXIgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8ICAgICAgICAgfCAgICAgICB8Cit8ZWRnZW50LWFuYWx5dGljcy1zZW5zb3JzLTx2ZXI+LmphciB8IHllcyAgICAgICB8IHllcyAgICAgICB8IHllcyAgICAgfCAgICAgICB8CiAKICMjIyBVdGlsaXRpZXMKIAotfCBKYXIgICAgICAgICAgICAgICAgICAgICAgICAgfCBKYXZhIDggU0UgfCBKYXZhIDcgU0UgfCBBbmRyb2lkIHwgTm90ZXMgfAotfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfAotfGVkZ2VudC51dGlscy5tZXRyaWNzLmphciAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAotfGVkZ2VudC51dGlscy5zdHJlYW1zY29wZS5qYXIgfCB5ZXMgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfCBKYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBKYXZhIDggU0UgfCBKYXZhIDcgU0UgfCBBbmRyb2lkIHwgTm90ZXMgfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfAorfGVkZ2VudC11dGlscy1tZXRyaWNzLTx2ZXI+LmphciAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAorfGVkZ2VudC11dGlscy1zdHJlYW1zY29wZS08dmVyPi5qYXIgfCB5ZXMgICAgICAgfCB5ZXMgICAgICAgfCAgICAgICAgIHwgICAgICAgfAogCiAjIyMgRGV2ZWxvcG1lbnQgQ29uc29sZQogCi18IEphciAgICAgICAgICAgICAgICAgICAgICAgICB8IEphdmEgOCBTRSB8IEphdmEgNyBTRSB8IEFuZHJvaWQgfCBOb3RlcyB8Ci18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18Ci18ZWRnZW50LmNvbnNvbGUuc2VydmxldHMuamFyICB8IHllcyAgICAgICB8ICAgICAgICAgICB8IG5vICAgICAgfCBVc2VzIEpNWCwgU2VydmxldCB8Ci18ZWRnZW50LmNvbnNvbGUuc2VydmVyLmphciAgICB8IHllcyAgICAgICB8ICAgICAgICAgICB8IG5vICAgICAgfCBVc2VzIEpNWCwgU2VydmxldCB8Cit8IEphciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEphdmEgOCBTRSB8IEphdmEgNyBTRSB8IEFuZHJvaWQgfCBOb3RlcyB8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18Cit8ZWRnZW50LWNvbnNvbGUtc2VydmVyLTx2ZXI+LmphciAgICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IG5vICAgICAgfCBVc2VzIEpNWCwgU2VydmxldCB8Cit8ZWRnZW50LWNvbnNvbGUtc2VydmxldHMtPHZlcj4ud2FyICB8IHllcyAgICAgICB8IHllcyAgICAgICB8IG5vICAgICAgfCBVc2VzIEpNWCwgU2VydmxldCB8CiAKICMjIyBBbmRyb2lkCi18IEphciAgICAgICAgICAgICAgICAgICAgICAgICB8IEphdmEgOCBTRSB8IEphdmEgNyBTRSB8IEFuZHJvaWQgfCBOb3RlcyB8Ci18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18Ci18ZWRnZW50LmFuZHJvaWQudG9wb2xvZ3kuamFyICB8IG5vICAgICAgICB8IG5vICAgICAgICB8IHllcyAgICAgfCAgICAgICB8Ci18ZWRnZW50LmFuZHJvaWQuaGFyZHdhcmUuamFyICB8IG5vICAgICAgICB8IG5vICAgICAgICB8IHllcyAgICAgfCAgICAgICB8CisKK3wgSmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSmF2YSA4IFNFIHwgSmF2YSA3IFNFIHwgQW5kcm9pZCB8IE5vdGVzIHwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwKK3xlZGdlbnQtYW5kcm9pZC10b3BvbG9neS08dmVyPi5qYXIgIHwgbm8gICAgICAgIHwgbm8gICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKK3xlZGdlbnQtYW5kcm9pZC1oYXJkd2FyZS08dmVyPi5qYXIgIHwgbm8gICAgICAgIHwgbm8gICAgICAgIHwgeWVzICAgICB8ICAgICAgIHwKIAogCiAjIyBKYXZhIEFQSSBVc2FnZQogCi1Eb2N1bWVudGVkIHVzZSBvZiBKYXZhIHBhY2thZ2VzIG91dHNpZGUgb2YgdGhlIEphdmEgY29yZSBwYWNrYWdlcy4KK0RvY3VtZW50ZWQgdXNlIG9mIEphdmEgcGFja2FnZXMgb3V0c2lkZSBvZiB0aGUgSmF2YSBjb3JlIHBhY2thZ2VzLQogSmF2YSBjb3JlIGhhcyBhIG51bWJlciBvZiBkZWZpbml0aW9ucywgYnV0IGF0IGxlYXN0IHRob3NlIG91dHNpZGUKLW9mIHRoZSBKYXZhIDggY29tcGFjdDEgZGVmaW5pdGlvbi4KK29mIHRoZSBKYXZhIDggY29tcGFjdDEgZGVmaW5pdGlvbi0KIAogfCBGZWF0dXJlICB8IFBhY2thZ2VzICAgICAgICAgICAgICB8IEVkZ2VudCBVc2FnZSAgICAgIHwgTm90ZXMgfAogfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfAotfEpNWCAgICAgICB8IGBqYXZhLmxhbmcubWFuYWdlbWVudCwgamF2YXgubWFuYWdtZW50KmAgfCAgICAgfCBKTVggbm90IHN1cHBvcnRlZCBvbiBBbmRyb2lkIHwKK3xKTVggICAgICAgfCBgamF2YS1sYW5nLW1hbmFnZW1lbnQsIGphdmF4LW1hbmFnbWVudCpgIHwgICAgIHwgSk1YIG5vdCBzdXBwb3J0ZWQgb24gQW5kcm9pZCB8CiB8Sk1YICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgdXRpbHMvbWV0cmljcyAgICAgfCBPcHRpb25hbCB1dGlsaXR5IG1ldGhvZHMgfAogfEpNWCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnNvbGUvc2VydmxldHMsIHJ1bnRpbWUvam14Y29udHJvbCB8IAotfFNlcnZsZXQgICB8IGBqYXZheC5zZXJ2bGV0KmAgICAgICB8IGNvbnNvbGUvc2VydmxldHMgIHwKLXxXZWJzb2NrZXQgfCBgamF2YXgud2Vic29ja2V0YCAgICAgfCBjb25uZWN0b3JzL2VkZ2VudC5qYXZheC53ZWJzb2NrZXQsIGNvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgtd2Vic29ja2V0LCBjb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQgfAotfEpEQkMgICAgICB8IGBqYXZhLnNxbCwgamF2YXguc3FsYCB8IGNvbm5lY3RvcnMvamRiYyAgIHwKK3xTZXJ2bGV0ICAgfCBgamF2YXgtc2VydmxldCpgICAgICAgfCBjb25zb2xlL3NlcnZsZXRzICB8Cit8V2Vic29ja2V0IHwgYGphdmF4LXdlYnNvY2tldGAgICAgIHwgY29ubmVjdG9ycy93ZWJzb2NrZXQqIHwKK3xKREJDICAgICAgfCBgamF2YS1zcWwsIGphdmF4LXNxbGAgfCBjb25uZWN0b3JzL2pkYmMgICB8CiAKZGlmZiAtLWdpdCBhL0plbmtpbnNmaWxlIGIvSmVua2luc2ZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiYzg0NQotLS0gL2Rldi9udWxsCisrKyBiL0plbmtpbnNmaWxlCkBAIC0wLDAgKzEsMTIyIEBACisjIWdyb292eQorCisvKgorICoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworbm9kZSgndWJ1bnR1JykgeworCisgICAgY3VycmVudEJ1aWxkLnJlc3VsdCA9ICJTVUNDRVNTIgorCisgICAgZWNobyAnQnVpbGRpbmcgQnJhbmNoOiAnICsgZW52LkJSQU5DSF9OQU1FCisKKyAgICAvLyBTZXR1cCB0aGUgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgIGRlZiBtdm5Ib21lID0gIiR7dG9vbCAnTWF2ZW4gMyAobGF0ZXN0KSd9IgorICAgIGVudi5KQVZBX0hPTUU9IiR7dG9vbCAnSkRLIDEuOCAobGF0ZXN0KSd9IgorICAgIGVudi5QQVRIPSIke2Vudi5KQVZBX0hPTUV9L2Jpbjoke2Vudi5QQVRIfSIKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmVhdHVyZSBicmFuY2hlcyBkb24ndCBjaGFuZ2UgdGhlIFNOQVBTSE9UUyBpbiBOZXh1cy4KKyAgICBkZWYgbWF2ZW5Hb2FsID0gImluc3RhbGwiCisgICAgZGVmIG1hdmVuTG9jYWxSZXBvID0gIiIKKyAgICBpZihlbnYuQlJBTkNIX05BTUUgPT0gJ2RldmVsb3AnKSB7CisgICAgICAgIG1hdmVuR29hbCA9ICJzb25hcjpzb25hciBkZXBsb3kiCisgICAgfSBlbHNlIHsKKyAgICAgICAgbWF2ZW5Mb2NhbFJlcG8gPSAiLURtYXZlbi5yZXBvLmxvY2FsPSR7ZW52LldPUktTUEFDRX0vLnJlcG9zaXRvcnkiCisgICAgfQorICAgIGRlZiBtYXZlbkZhaWx1cmVNb2RlID0gIiIgLy8gY29uc2lkZXIgIi0tZmFpbC1hdC1lbmQiPyBPZGQgb3JkZXJpbmcgc2lkZSBlZmZlY3RzPworCisgICAgdHJ5IHsKKyAgICAgICAgLypzdGFnZSAoJ0NsZWFudXAnKSB7CisgICAgICAgICAgICBlY2hvICdDbGVhbmluZyB1cCB0aGUgd29ya3NwYWNlJworICAgICAgICAgICAgZGVsZXRlRGlyKCkKKyAgICAgICAgfSovCisKKyAgICAgICAgc3RhZ2UgKCdDaGVja291dCcpIHsKKyAgICAgICAgICAgIGVjaG8gJ0NoZWNraW5nIG91dCBicmFuY2ggJyArIGVudi5CUkFOQ0hfTkFNRQorICAgICAgICAgICAgY2hlY2tvdXQgc2NtCisgICAgICAgIH0KKworICAgICAgICBzdGFnZSAoJ0NsZWFuJykgeworICAgICAgICAgICAgZWNobyAnQ2xlYW5pbmcgRWRnZW50JworICAgICAgICAgICAgc2ggIiR7bXZuSG9tZX0vYmluL212biAke21hdmVuTG9jYWxSZXBvfSAtUHBsYXRmb3JtLWFuZHJvaWQscGxhdGZvcm0tamF2YTcsZGlzdHJpYnV0aW9uIGNsZWFuIgorICAgICAgICB9CisKKyAgICAgICAgc3RhZ2UgKCdCdWlsZCBFZGdlbnQnKSB7CisgICAgICAgICAgICBlY2hvICdCdWlsZGluZyBFZGdlbnQnCisgICAgICAgICAgICBzaCAiJHttdm5Ib21lfS9iaW4vbXZuICR7bWF2ZW5GYWlsdXJlTW9kZX0gJHttYXZlbkxvY2FsUmVwb30gLVBwbGF0Zm9ybS1hbmRyb2lkLHBsYXRmb3JtLWphdmE3LGRpc3RyaWJ1dGlvbix0b29sY2hhaW4gLURqYXZhOC5ob21lPSR7ZW52LkpBVkFfSE9NRX0gLURlZGdlbnQuYnVpbGQuY2k9dHJ1ZSAke21hdmVuR29hbH0iCisgICAgICAgIH0KKworICAgICAgICBzdGFnZSAoJ0J1aWxkIFNpdGUnKSB7CisgICAgICAgICAgICBpZihlbnYuQlJBTkNIX05BTUUgPT0gJ2RldmVsb3AnKSB7CisgICAgICAgICAgICAgICAgZWNobyAnQnVpbGRpbmcgU2l0ZScKKyAgICAgICAgICAgICAgICBzaCAiJHttdm5Ib21lfS9iaW4vbXZuICR7bWF2ZW5Mb2NhbFJlcG99IHNpdGUgc2l0ZTpzdGFnZSIKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZWNobyAnQnVpbGRpbmcgU2l0ZSAoc2tpcHBlZCBmb3Igbm9uIGRldmVsb3AgYnJhbmNoKScKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSBUT0RPIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHNhbXBsZXMgbm93IGluIGEgc2VwYXJhdGUgcmVwbworICAgICAgICBzdGFnZSAoJ0J1aWxkIFNhbXBsZXMnKSB7CisgICAgICAgICAgICBlY2hvICdCdWlsZGluZyBzYW1wbGVzJworICAgICAgICAgICAgc2ggImNkIHNhbXBsZXM7ICR7bXZuSG9tZX0vYmluL212biAke21hdmVuRmFpbHVyZU1vZGV9ICR7bWF2ZW5Mb2NhbFJlcG99IGNsZWFuIHBhY2thZ2UiCisgICAgICAgICAgICBzaCAiY2Qgc2FtcGxlcy90b3BvbG9neTsgLi9ydW4tc2FtcGxlLnNoIEhlbGxvRWRnZW50IgorICAgICAgICAgICAgc2ggImNkIHNhbXBsZXM7ICR7bXZuSG9tZX0vYmluL212biAke21hdmVuRmFpbHVyZU1vZGV9ICR7bWF2ZW5Mb2NhbFJlcG99IC1QcGxhdGZvcm0tamF2YTcgY2xlYW4gcGFja2FnZSIKKyAgICAgICAgICAgIHNoICJjZCBzYW1wbGVzL3RvcG9sb2d5OyAuL3J1bi1zYW1wbGUuc2ggSGVsbG9FZGdlbnQiCisgICAgICAgIH0KKworICAgICAgICBzdGFnZSAoJ0J1aWxkIFRlbXBsYXRlcycpIHsKKyAgICAgICAgICAgIGVjaG8gJ0J1aWxkaW5nIHRlbXBsYXRlcycKKyAgICAgICAgICAgIHNoICJjZCBzYW1wbGVzL3RlbXBsYXRlOyAke212bkhvbWV9L2Jpbi9tdm4gJHttYXZlbkZhaWx1cmVNb2RlfSAke21hdmVuTG9jYWxSZXBvfSBjbGVhbiBwYWNrYWdlOyAuL2FwcC1ydW4uc2giCisgICAgICAgICAgICBzaCAiY2Qgc2FtcGxlcy90ZW1wbGF0ZTsgJHttdm5Ib21lfS9iaW4vbXZuICR7bWF2ZW5GYWlsdXJlTW9kZX0gJHttYXZlbkxvY2FsUmVwb30gLVBwbGF0Zm9ybS1qYXZhNyBjbGVhbiBwYWNrYWdlOyAuL2FwcC1ydW4uc2giCisgICAgICAgICAgICBzaCAiY2Qgc2FtcGxlcy90ZW1wbGF0ZTsgJHttdm5Ib21lfS9iaW4vbXZuICR7bWF2ZW5GYWlsdXJlTW9kZX0gJHttYXZlbkxvY2FsUmVwb30gLVBwbGF0Zm9ybS1hbmRyb2lkIGNsZWFuIHBhY2thZ2U7IC4vYXBwLXJ1bi5zaCIKKyAgICAgICAgfQorPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgICAgICAvKiBUaGVyZSBzZWVtcyB0byBiZSBhIHByb2JsZW0gd2l0aCB0aGlzIChIZXJlIHRoZSBvdXRwdXQgb2YgdGhlIGJ1aWxkIGxvZyk6CisKKyAgICAgICAgVmVyaWZ5aW5nIGdldC1lZGdlbnQtamFycworICAgICAgICBbUGlwZWxpbmVdIHNoCisgICAgICAgIFtlZGdlbnQtcGlwZWxpbmVfZGV2ZWxvcC1KTjRESE82QlFWNFNDVEdCREpFT0w0WklDNlQzNkRHT05ISDNWR1M0RENEQk82VVhINE1BXSBSdW5uaW5nIHNoZWxsIHNjcmlwdAorICAgICAgICArIGNkIHNhbXBsZXMvZ2V0LWVkZ2VudC1qYXJzLXByb2plY3QKKyAgICAgICAgKyAuL2dldC1lZGdlbnQtamFycy5zaAorICAgICAgICAuL2dldC1lZGdlbnQtamFycy5zaDogMTExOiBbOiBqYXZhODogdW5leHBlY3RlZCBvcGVyYXRvcgorICAgICAgICAuL2dldC1lZGdlbnQtamFycy5zaDogMTE4OiAuL2dldC1lZGdlbnQtamFycy5zaDogU3ludGF4IGVycm9yOiAiKCIgdW5leHBlY3RlZAorCisgICAgICAgICovCisgICAgICAgIC8qc3RhZ2UgKCdWZXJpZnkgZ2V0LWVuZ2VudC1qYXJzJykgeworICAgICAgICAgICAgaWYoZW52LkJSQU5DSF9OQU1FID09ICdkZXZlbG9wJykgeworICAgICAgICAgICAgICAgIGVjaG8gJ1ZlcmlmeWluZyBnZXQtZWRnZW50LWphcnMnCisgICAgICAgICAgICAgICAgc2ggImNkIHNhbXBsZXMvZ2V0LWVkZ2VudC1qYXJzLXByb2plY3Q7IC4vZ2V0LWVkZ2VudC1qYXJzLnNoIgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlY2hvICdWZXJpZnlpbmcgZ2V0LWVkZ2VudC1qYXJzIChza2lwcGVkIGZvciBub24gZGV2ZWxvcCBicmFuY2gpJworICAgICAgICAgICAgfQorICAgICAgICB9Ki8KKyAgICB9CisKKworICAgIGNhdGNoIChlcnIpIHsKKyAgICAgICAgY3VycmVudEJ1aWxkLnJlc3VsdCA9ICJGQUlMVVJFIgorLyogICAgICAgICAgICBtYWlsIGJvZHk6ICJwcm9qZWN0IGJ1aWxkIGVycm9yIGlzIGhlcmU6ICR7ZW52LkJVSUxEX1VSTH0iICwKKyAgICAgICAgICAgIGZyb206ICd4eHh4QHl5eXkuY29tJywKKyAgICAgICAgICAgIHJlcGx5VG86ICdkZXZAZWRnZW50LmFwYWNoZS5vcmcnLAorICAgICAgICAgICAgc3ViamVjdDogJ0F1dG9idWlsZCBmb3IgQnJhbmNoICcgZW52LkJSQU5DSF9OQU1FCisgICAgICAgICAgICB0bzogJ2NvbW1pdHNAZWRnZW50LmFwYWNoZS5vcmcnCisqLworICAgICAgICB0aHJvdyBlcnIKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCBmNDc0OGU5Li5iNTYwNDJhIDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTIwMywyNyArMjAzLDM3IEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogQVBBQ0hFIEVER0VOVCBTVUJDT01QT05FTlRTOgogCi1BcGFjaGUgRWRnZW50IHNvdXJjZSBpbmNsdWRlcyBhIG51bWJlciBvZiBzdWJjb21wb25lbnRzIHdpdGgKK0FwYWNoZSBFZGdlbnQgc291cmNlIGEgaW5jbHVkZXMgb25lIG9yIG1vcmUgc3ViY29tcG9uZW50cyB3aXRoCiBzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gIFlvdXIgdXNlIG9mIHRoZQogc291cmNlIGNvZGUgZm9yIHRoZXNlIGNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCiBjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCiAKLVRoaXMgcHJvZHVjdCBidW5kbGVzIGQzLWxlZ2VuZCB3aGljaCBpcyBhdmFpbGFibGUgdW5kZXIgYSBNSVQgbGljZW5zZS4KLUZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvZDMtbGVnZW5kLk1JVAorVGhpcyBwcm9kdWN0IGJ1bmRsZXMgZDMtbGVnZW5kIHdoaWNoIGlzIGF2YWlsYWJsZSB1bmRlciBhIHNlcGFyYXRlIGxpY2Vuc2UuCiAKLVRoaXMgcHJvZHVjdCBidW5kbGVzIHBvcnRpb25zIG9mIGQzIHdoaWNoIGlzIGF2YWlsYWJsZSB1bmRlciBhIEJTRCBsaWNlbnNlLgotRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9kMy5CU0QKK2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL2pzL2V4dC9kMy1sZWdlbmQvZDMubGVnZW5kLmpzCitodHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1pKT05TU09OLzM5MTgzNjkvcmF3L2JmOWJjZTZiNjhhM2I3MGY4NzQ1MGYxNTU0MzZjYTRhODRhZjFiYTQvZDMubGVnZW5kLmpzCitXaXRoIEVkZ2VudCBzcGVjaWZpYyBtb2RpZmljYXRpb25zLgorTGljZW5zZSB0eXBlOiBNSVQKIAotVGhpcyBwcm9kdWN0IGJ1bmRsZXMgcG9ydGlvbnMgb2YgZDMtc2Fua2V5IHdoaWNoIGlzIGF2YWlsYWJsZSB1bmRlciBhIEJTRCBsaWNlbnNlLgotRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9kMy1zYW5rZXkuQlNECi0gCi1UaGlzIHByb2R1Y3QgYnVuZGxlcyBwb3J0aW9ucyBvZiBqcXVlcnktdWkgd2hpY2ggaXMgYXZhaWxhYmxlIHVuZGVyIGEgTUlUIGxpY2Vuc2UuCi1Gb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2pxdWVyeS11aS5NSVQKLSAKLVRoZSBidW5kbGVkIGpxdWVyeS11aSBidW5kbGVzIGpxdWVyeSB3aGljaCBpcyBhdmFpbGFibGUgdW5kZXIgYSBNSVQgbGljZW5zZS4KLUZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvanF1ZXJ5Lk1JVAorICBDb3B5cmlnaHQgKGMpIDIwMTIgemlnZ3kuam9uc3Nvbi5ueWNAZ21haWwuY29tCiAKLVRoZSBidW5kbGVkIGpxdWVyeSBidW5kbGVzIFNpenpsZSB3aGljaCBpcyBhdmFpbGFibGUgdW5kZXIgYSBNSVQgbGljZW5zZS4KLUZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvc2l6emxlLk1JVAorICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKyAgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9QUk9CTEVNUy5tZCBiL1BST0JMRU1TLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjVjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9QUk9CTEVNUy5tZApAQCAtMCwwICsxLDIxIEBACis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorCisxKSBSZW5hbWUgY29uc29sZS9zZXJ2bGV0cyB0byBjb25zb2xlL3dlYmFwcAorCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggZWJmZmIwYS4uNDBkMDhhZCAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSwzMiArMSwzNSBAQAotQnVpbGRpbmcgRWRnZW50IGZyb20gYSBTb3VyY2UgRGlzdHJpYnV0aW9uCitCdWlsZGluZyB0aGUgQXBhY2hlIEVkZ2VudCBTREsgZnJvbSBhIFNvdXJjZSBEaXN0cmlidXRpb24KKworUXVpY2tzdGFydAorLS0tLS0tLS0tLQorCitZb3UgbXVzdCBoYXZlIEphdmEgOCBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gYW5kIGNvbm5lY3Rpdml0eSB0byBNYXZlbiBDZW50cmFsCisoZm9yIGRvd25sb2FkaW5nIGV4dGVybmFsIHRocmlkIHBhcnR5IGRlcGVuZGVuY2llcykuIE1hdmVuIHdpbGwgYmUgYXV0b21hdGljYWxseQorZG93bmxvYWRlZCBhbmQgaW5zdGFsbGVkIGJ5IHRoZSBtYXZlbiB3cmFwcGVyIGBtdm53YC4KKworQnVpbGQgdGhlIEVkZ2VudCBTREsgSmF2YTggamFycyBhbmQgaW5zdGFsbCB0aGVtIGluIHlvdXIgbG9jYWwgbWF2ZW4gcmVwb3NpdG9yeQorCiskIC4vbXZudyBjbGVhbiBpbnN0YWxsICAjIGFkZCAtRHNraXBUZXN0cyB0byBvbWl0IHJ1bm5pbmcgdGhlIHRlc3RzCisKK1lvdSBjYW4gbm93IGNvbnN0cnVjdCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgRWRnZW50LiAgVGhlIEVkZ2VudCBzYW1wbGVzCithcmUgYSBnb29kIHBsYWNlIHRvIHN0YXJ0IGFuZCBhcmUgYXZhaWxhYmxlIGFzIGEgc2VwYXJhdGUgZG93bmxvYWQKK2F0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLWVkZ2VudC1zYW1wbGVzCisKK0FkZGl0aW9uYWwgSW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXBhY2hlIEVkZ2VudCBpcyBzdXBwb3J0ZWQgb24gc2V2ZXJhbCBKYXZhIHRhcmdldCBwbGF0Zm9ybXMuCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgSkFWQV9TVVBQT1JULm1kIGluIHRoZSBzb3VyY2UgdHJlZQogb3IgaW4gdGhlIEFTRiBnaXQgcmVwb3NpdG9yeSBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvaW5jdWJhdG9yLWVkZ2VudC5naXQKIG9yIGluIHRoZSByZXBvc2l0b3J5IG1pcnJvciBhdCBnaXRodWIgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3ItZWRnZW50LgogCi1QcmUtcmVxdWlzaXRlczoKLS0gSmF2YSA4IGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGFuIEVkZ2VudCBiaW5hcnkgZGlzdHJpYnV0aW9uCi0tIGdyYWRsZSAoaHR0cHM6Ly9ncmFkbGUub3JnLykgb25seSBpZiBidWlsZGluZyBmcm9tIGEgc291cmNlIHJlbGVhc2UgYnVuZGxlCitTZWUgREVWRUxPUE1FTlQubWQgaW4gdGhpcyBmb2xkZXIgb3IgCitodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1lZGdlbnQvREVWRUxPUE1FTlQubWQgZm9yIGluZm9ybWF0aW9uCithYm91dCBidWlsZGluZyB0aGUgRWRnZW50IFNESyBmb3IgdGhlIEphdmEgNyBhbmQgQW5kcm9pZCBwbGF0Zm9ybXMuCiAKLUJ1aWxkaW5nIGZyb20gYSBzb3VyY2UgcmVsZWFzZSBidW5kbGUgKGxhY2tpbmcgYSAuL2dyYWRsZXcpIHJlcXVpcmVzCi1wZXJmb3JtaW5nIGEgb25lLXRpbWUgYm9vdHN0cmFwIHN0ZXAgdXNpbmcgYW4gaW5zdGFsbGVkIHZlcnNpb24gb2YgZ3JhZGxlOgogCi0kIGdyYWRsZSAgICAgICAgICAjIG9uZSB0aW1lIGdyYWRsZSBidWlsZCBib290c3RyYXAgc2V0dXAuCi0KLUJ1aWxkIGFuIEVkZ2VudCBiaW5hcnkgZGlzdHJpYnV0aW9uOgotCi0kIC4vZ3JhZGxldyByZWxlYXNlICAgIyAuXGdyYWRsZXcuYmF0IG9uIFdpbmRvd3MKLQotVGhlIGJ1aWxkIHJlcG9ydHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGJ1bmRsZSB0aGF0IGNhbiB0aGVuCi1iZSB1bnBhY2tlZCBhbmQgdXNlZCBpbiBidWlsZGluZyBhcHBsaWNhdGlvbnMuCi0KLVNlZSBHZXR0aW5nIFN0YXJ0ZWQgaHR0cHM6Ly9lZGdlbnQuYXBhY2hlLm9yZy9kb2NzL2VkZ2VudC1nZXR0aW5nLXN0YXJ0ZWQKLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEVkZ2VudCBzb3VyY2VzLCB0ZXN0aW5nLCBhbmQKLWNvbnRyaWJ1dGluZyB0byBFZGdlbnQgcnVudGltZSBkZXZlbG9wbWVudCBzZWUgREVWRUxPUE1FTlQubWQgaW4gdGhlIHNvdXJjZSB0cmVlCi1vciBpbiB0aGUgQVNGIGdpdCByZXBvc2l0b3J5IGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi9pbmN1YmF0b3ItZWRnZW50LmdpdAotb3IgaW4gdGhlIHJlcG9zaXRvcnkgbWlycm9yIGF0IGdpdGh1YiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1lZGdlbnQuCitMaWNlbnNpbmcKKy0tLS0tLS0tLQogCiBBcGFjaGUgRWRnZW50IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMC4KIApkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCmluZGV4IGZmNzA2ZDEuLjlkZGEzMTggMTAwNjQ0Ci0tLSBhL1JFQURNRS5tZAorKysgYi9SRUFETUUubWQKQEAgLTEsMTAgKzEsMzAgQEAKKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+CiAjIFdlbGNvbWUgdG8gQXBhY2hlIEVkZ2VudCEKIAorWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL2luY3ViYXRvci1lZGdlbnQuc3ZnP2JyYW5jaD1kZXZlbG9wKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS9pbmN1YmF0b3ItZWRnZW50KQorCiAqQXBhY2hlIEVkZ2VudCBpcyBhbiBlZmZvcnQgdW5kZXJnb2luZyBpbmN1YmF0aW9uIGF0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSwgc3BvbnNvcmVkIGJ5IHRoZSBJbmN1YmF0b3IgUE1DLiBJbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZCBwcm9qZWN0cyB1bnRpbCBhIGZ1cnRoZXIgcmV2aWV3IGluZGljYXRlcyB0aGF0IHRoZSBpbmZyYXN0cnVjdHVyZSwgY29tbXVuaWNhdGlvbnMsIGFuZCBkZWNpc2lvbiBtYWtpbmcgcHJvY2VzcyBoYXZlIHN0YWJpbGl6ZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIG90aGVyIHN1Y2Nlc3NmdWwgQVNGIHByb2plY3RzLiBXaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uIG9mIHRoZSBjb21wbGV0ZW5lc3Mgb3Igc3RhYmlsaXR5IG9mIHRoZSBjb2RlLCBpdCBkb2VzIGluZGljYXRlIHRoYXQgdGhlIHByb2plY3QgaGFzIHlldCB0byBiZSBmdWxseSBlbmRvcnNlZCBieSB0aGUgQVNGLioKIAogQXBhY2hlIEVkZ2VudCBpcyBhbiBvcGVuIHNvdXJjZSBwcm9ncmFtbWluZyBtb2RlbCBhbmQgcnVudGltZSBmb3IgZWRnZSBkZXZpY2VzIHRoYXQgZW5hYmxlcyB5b3UgdG8gYW5hbHl6ZSBkYXRhIGFuZCBldmVudHMgYXQgdGhlIGRldmljZS4KIAotUGxlYXNlIGpvaW5zIHVzIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBkZXZlbG9wZXIgbWFpbGluZyBsaXN0CitQbGVhc2Ugam9pbiB1cyBieSBzdWJzY3JpYmluZyB0byB0aGUgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdAogW2RldiBhdCBlZGdlbnQuaW5jdWJhdG9yLmFwYWNoZS5vcmddKGh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvaW5jdWJhdG9yLWVkZ2VudC1kZXYvKS4KIFRvIHN1YnNjcmliZSwgc2VuZCBhbiBlbWFpbCB0byBgZGV2LXN1YnNjcmliZSBhdCBlZGdlbnQuaW5jdWJhdG9yLmFwYWNoZS5vcmdgLgogCkBAIC0yNCwzNCArNDQsMTIgQEAKIAogRWRnZW50IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBbQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjBdKExJQ0VOU0UpCiAKLSMgUmVuYW1lZCBmcm9tIEFwYWNoZSBRdWFya3MKLUFwYWNoZSBFZGdlbnQgaXMgdGhlIG5ldyBuYW1lLiBUaGluZ3MgYXJlIGluIGEgc3RhdGUgb2YgdHJhbnNpdGlvbiB1bnRpbCBhbGwKLW9mIHRoZSBwaWVjZXMgYXJyaXZlLgotCi1UaGUgImluY3ViYXRvci1xdWFya3MiIHJlcG9zaXRvcnkgaGFzIGJlZW4gZnVsbHkgdXBkYXRlZC4KLQotVW50aWwgdGhlIEFwYWNoZSBpbmZyYXN0cnVjdHVyZSBjaGFuZ2VzIGFyZSBkb25lLCBjb250aW51ZSB0byB1c2UKLXRoZSBRdWFya3MgbWFpbGluZyBsaXN0LCB3ZWJzaXRlLCBhbmQgcmVwb3NpdG9yaWVzOgotICAqIG1haWxpbmcgbGlzdDogZGV2IGF0IHF1YXJrcy5pbmN1YmF0b3IuYXBhY2hlLm9yZwotICAqIGh0dHA6Ly9xdWFya3MuaW5jdWJhdG9yLmFwYWNoZS5vcmcvCi0gICogaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2luY3ViYXRvci1xdWFya3MuZ2l0Ci0gICogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3ItcXVhcmtzCi0KLUNvZGUgY2hhbmdlczoKLSAgKiBwYWNrYWdlIG5hbWVzIGhhdmUgdGhlIHByZWZpeCAib3JnLmFwYWNoZS5lZGdlbnQiCi0gICogamFyIG5hbWVzIGhhdmUgdGhlIHByZWZpeCAiZWRnZW50IgotICAKLVVzZXJzIG9mIEVkZ2VudCB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZWlyIHJlZmVyZW5jZXMgdG8gdGhlIGFib3ZlLgotSXQncyByZWNvbW1lbmRlZCB0aGF0IGRldmVsb3BlcnMgb2YgRWRnZW50IGNyZWF0ZSBhIG5ldyB3b3Jrc3BhY2UgaW5zdGVhZCBvZgotcmV1c2luZyB0aGVpciBRdWFya3Mgd29ya3NwYWNlLgotCiAjIEVkZ2VudAogRGV2aWNlcyBhbmQgc2Vuc29ycyBhcmUgZXZlcnl3aGVyZS4gQW5kIG1vcmUgYXJlIGNvbWluZyBvbmxpbmUgZXZlcnkgZGF5LiBZb3UgbmVlZCBhIHdheSB0byBhbmFseXplIGFsbCBvZiB0aGUgZGF0YSBjb21pbmcgZnJvbSB5b3VyIGRldmljZXMsIGJ1dCBpdCBjYW4gYmUgZXhwZW5zaXZlIHRvIHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSBmcm9tIGEgc2Vuc29yIHRvIHlvdXIgY2VudHJhbCBhbmFseXRpY3MgZW5naW5lLgogCiBFZGdlbnQgaXMgYW4gb3BlbiBzb3VyY2UgcHJvZ3JhbW1pbmcgbW9kZWwgYW5kIHJ1bnRpbWUgZm9yIGVkZ2UgZGV2aWNlcyB0aGF0IGVuYWJsZXMgeW91IHRvIGFuYWx5emUgZGF0YSBhbmQgZXZlbnRzIGF0IHRoZSBkZXZpY2UuIFdoZW4geW91IGFuYWx5emUgb24gdGhlIGVkZ2UsIHlvdSBjYW46CiAKICogUmVkdWNlIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHlvdSB0cmFuc21pdCB0byB5b3VyIGFuYWx5dGljcyBzZXJ2ZXIKLQogKiBSZWR1Y2UgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgeW91IHN0b3JlCiAKIEFuIEVkZ2VudCBhcHBsaWNhdGlvbiB1c2VzIGFuYWx5dGljcyB0byBkZXRlcm1pbmUgd2hlbiBkYXRhIG5lZWRzIHRvIGJlIHNlbnQgdG8gYSBiYWNrLWVuZCBzeXN0ZW0gZm9yIGZ1cnRoZXIgYW5hbHlzaXMsIGFjdGlvbiwgb3Igc3RvcmFnZS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIEVkZ2VudCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN5c3RlbSBpcyBydW5uaW5nIG91dHNpZGUgb2Ygbm9ybWFsIHBhcmFtZXRlcnMsIHN1Y2ggYXMgYW4gZW5naW5lIHRoYXQgaXMgcnVubmluZyB0b28gaG90LgpAQCAtMTAyLDMgKzEwMCw4IEBACiBGb3IgZGV0YWlscyBhYm91dCB0aGUgRWRnZW50IHNvdXJjZXMgYW5kIGNvbnRyaWJ1dGluZyB0byAKIEVkZ2VudCBydW50aW1lIGRldmVsb3BtZW50IHNlZSBbREVWRUxPUE1FTlQubWRdKERFVkVMT1BNRU5ULm1kKQogCisjIFJlbmFtZWQgZnJvbSBBcGFjaGUgUXVhcmtzCitBcGFjaGUgUXVhcmtzIHdhcyByZW5hbWVkIHRvIEFwYWNoZSBFZGdlbnQuCisKK1NlZSB0aGUgW1JFTEVBU0VfTk9URVNdKFJFTEVBU0VfTk9URVNdIGZvciBjaGFuZ2UgaW5mb3JtYXRpb24gaWYKK3lvdSBhcmUgY29udmVydGluZyBmcm9tICJBcGFjaGUgUXVhcmtzIi4KZGlmZiAtLWdpdCBhL1JFTEVBU0VfTk9URVMgYi9SRUxFQVNFX05PVEVTCmluZGV4IGQ5ZGJhMDAuLmZjMmJiZDggMTAwNjQ0Ci0tLSBhL1JFTEVBU0VfTk9URVMKKysrIGIvUkVMRUFTRV9OT1RFUwpAQCAtMSwzICsxLDg5IEBACitBcGFjaGUgRWRnZW50IChpbmN1YmF0aW5nKSAxLjIuMAorPT09PT09PT09PT09PT09PT09CisKK1RoZSByZWxlYXNlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIG1pbm9yIFNESyBidWdmaXhlcyBhbmQgZW5oYW5jZW1lbnRzIGxpc3RlZCBiZWxvdy4KKworQSByZWxlYXNlIG5vdyBpbmNsdWRlcyB0d28gc291cmNlIGJ1bmRsZXM6CisgIC0gRWRnZW50IFNESyBidW5kbGUKKyAgLSBFZGdlbnQgU2FtcGxlcyBidW5kbGUKKworQSByZWxlYXNlIG5vdyBwdWJsaXNoZXMgdGhlIEVkZ2VudCBTREsgamFycyBpbiBBcGFjaGUgTmV4dXMgUmVsZWFzZQorcmVwb3NpdG9yeSB3aGljaCBhcmUgYXV0b21hdGljYWxseSBtaXJyb3JlZCB0byB0aGUgTWF2ZW4gQ2VudHJhbCByZXBvc2l0b3J5LgorCitBIGJpbmFyeSBidW5kbGUgKHRneikgaXMgbm8gbG9uZ2VyIHJlbGVhc2VkLiAgVGhlIG5ldyBgZ2V0LWVkZ2VudC1qYXJzLnNoYAordG9vbCBpbmNsdWRlZCBpbiB0aGUgU2FtcGxlcyBzb3VyY2UgYnVuZGxlIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBzdWNoCithIGJ1bmRsZS4KKworQSB1c2VyIG5vdyBidWlsZHMgdGhlIHNhbXBsZXMgZnJvbSB0aGUgcmVsZWFzZWQgU2FtcGxlcyBzb3VyY2UgYnVuZGxlCittdWNoIGFzIGEgcmVhbCBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgbWlnaHQuCitQcmUtYnVpbHQgc2FtcGxlcyBqYXJzIGFyZSBubyBsb25nZXIgcmVsZWFzZWQuICAKK1RoZSBTYW1wbGVzIGJ1bmRsZSBpbmNsdWRlcyBhbiBFZGdlbnQgQXBwbGljYXRpb24gcHJvamVjdCB0ZW1wbGF0ZQorYW5kIHNvbWUgdG9vbHMuCisKK1RoZXJlIGhhdmUgYmVlbiBtYW55IHVwZGF0ZXMgdG8gdGhlIEVkZ2VudCB3ZWJzaXRlIChodHRwczovL2VkZ2VudC5hcGFjaGUub3JnLykKK3JlbGF0ZWQgdG8gdGhlIGFib3ZlOgorICAtIHVwZGF0ZWQgR2V0dGluZyBTdGFydGVkIEd1aWRlCisgIC0gdXBkYXRlZCBEb3dubG9hZHMgcGFnZQorICAtIGEgbmV3IFRoZSBQb3dlciBvZiBFZGdlbnQgcGFnZQorICAtIHVwZGF0ZWQgRkFRIHBhZ2UKKyAgLSBhIG5ldyBRdWlja3N0YXJ0IHdpdGggRWRnZW50IFNhbXBsZXMgcGFnZQorICAtIGEgbmV3IEVkZ2VudCBBcHBsaWNhdGlvbiBEZXZlbG9wbWVudCBwYWdlCisKK1RoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgY2hhbmdlcyBhZmZlY3RpbmcgdGhlCit1c2Ugb2YgRWRnZW50IGluIGRldmVsb3BpbmcgRWRnZW50IGFwcGxpY2F0aW9uczoKKworVGhlIG5hbWVzIG9mIHRoZSBFZGdlbnQgamFycyBub3cgY29uZm9ybSB0byBzdGFuZGFyZAorcHJhY3RpY2VzOiAiLiIgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCAiLSIgYW5kIHRoZSBFZGdlbnQgU0RLCit2ZXJzaW9uSWQgaXMgbm93IGluY2x1ZGVkLiAgCisKK0FsbW9zdCBhbGwgb2YgdGhlIEVkZ2VudCBTREsgamFycyBhcmUgbm93IGF2YWlsYWJsZSBmb3IgdGhlIEphdmE3IGFuZCBBbmRyb2lkIHBsYXRmb3Jtcy4KKworVGhlIHdlYnNvY2tldCBjb25uZWN0b3IgamFyIG5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkOgorKiBgZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LTx2ZXI+LmphcmAgd2FzIGBlZGdlbnQuY29ubmVjdG9ycy53ZWJzb2NrZXQud3NjbGllbnQtamF2YXgud2Vic29ja2V0LmphcmAKKyogYGVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1iYXNlLTx2ZXI+LmphcmAgd2FzICBgZWRnZW50LmNvbm5lY3RvcnMud3NjbGllbnQuamFyYAorKiBgZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LW1pc2MtPHZlcj4uamFyYCB3YXMgIGBlZGdlbnQuamF2YXgud2Vic29ja2V0LmphcmAKKyogYGVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1qZXR0eS08dmVyPi5qYXJgIHdhcyAgYGphdmF4LndlYnNvY2tldC1jbGllbnQuamFyYAorCitTZWUgdGhlIGBKQVZBX1NVUFBPUlRgIGRvY3VtZW50YXRpb24gb24gdGhlIERvd25sb2FkcyBwYWdlIGRldGFpbHMuCisKK0Zyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGJ1aWxkaW5nLCBkZXZlbG9wbWVudCwgYW5kIHJlbGVhc2luZworRWRnZW50LCBNYXZlbiBpcyBub3cgdXNlZCBmb3IgdGhlIGJ1aWxkIHRvb2xpbmcuCitUaGUgREVWRUxPUE1FTlQubWQgZmlsZSBoYXMgYmVlbiB1cGRhdGVkIGFjY29yZGluZ2x5LgorCisKK05ldyBGZWF0dXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VER0VOVC0zOTMgIEFkZCBSYW5nZXMub3V0c2lkZU9mKCkKK0VER0VOVC0yNzMgIEFkZCBzY3JpcHRzLCBldGMgdG8gZW5hYmxlIGJ1aWxkaW5nIHNhbXBsZXMKKworSW5jb21wYXRpYmxlIEFQSSBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05PTkUKKyAgICAKK0tub3duIElzc3VlcworLS0tLS0tLS0KK09wZW4gSklSQXMgbWF5IGJlIGZvdW5kIGF0IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvRURHRU5UCisKK0J1ZyBGaXhlcworLS0tLS0tLS0tCitFREdFTlQtNDI5ICBKb2JNb25pdG9yQXBwLmNsb3NlSm9iKCkgZG9lc24ndCB3YWl0IGZvciBjbG9zZQorRURHRU5ULTQyMyAgUmFuZ2UudG9TdHJpbmdVbnNpZ25lZCgpIG5vdCBzdXBwb3J0ZWQgb24gSmF2YTcvQW5kcm9pZAorCitNaXNjZWxsYW5lb3VzIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRURHRU5ULTQzOCAgSW1wcm92ZSBXZWJTb2NrZXRDbGllbnRUZXN0IHNraXAtaWYtY2FudC1jb25uZWN0CitFREdFTlQtNDM2ICBDaGFuZ2UgdGVzdHMgdGhhdCB1c2UgY29tcGxldGUoKSBUTU8gZm9yIHN1Y2Nlc3NmdWwgcnVucworRURHRU5ULTQzNSAgQ01FIGluIFRyYWNraW5nU2NoZWR1bGVkRXhlY3V0b3Igc2VlbiB3aXRoIHRlc3RNdWx0aVRvcG9sb2d5UG9sbFdpdGhFcnJvcigpCitFREdFTlQtNDM0ICBEZXNlbnNpdGl6ZSBQbHVtYmluZ1Rlc3QudGVzdFBhcmFsbGVsQmFsYW5jZWQKK0VER0VOVC00MzMgIEF1dG9tYXRpY2FsbHkgYnVtcCBzb21lIFRNTyB2YWx1ZXMgd2hlbiBydW5uaW5nIENJIHRlc3QgY29udGV4dAorRURHRU5ULTQzMiAgUmVkdWNlIHJ1bnRpbWUgb2Ygc29tZSBXaW5kb3dzVGVzdCB0ZXN0cworRURHRU5ULTQzMSAgQ2xlYW51cCBzb21lIGNvbnNvbGUgY29kZSBoeWdpZW5lIHdhcm5pbmdzCitFREdFTlQtNDE4ICBMSUNFTlNFL05PVElDRSBpbiAud2FyIGFyZSB3cm9uZworRURHRU5ULTQxMyAgU2ltcGxpZnkgZG93bmxvYWQgZXhwZXJpZW5jZQorRURHRU5ULTIxOSAgV2luZG93c1Rlc3Qua2V5ZWRUaW1lQmF0Y2hXSW5kb3dUZXN0IGlzbid0IHJvYnVzdAorRURHRU5ULTMxICAgRmlsZVN0cmVhbXNUZXh0RmlsZVdyaXRlclRlc3QudGVzdFJldGFpbkFnZUJhc2VkIHRlc3QgZmFpbHMKKworCiBBcGFjaGUgRWRnZW50IChpbmN1YmF0aW5nKSAxLjEuMAogPT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL2FuYWx5dGljcy8uY2xhc3NwYXRoIGIvYW5hbHl0aWNzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWNmM2QuLjAwMDAwMDAKLS0tIGEvYW5hbHl0aWNzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtYXRoMy9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibWF0aDMvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlbnNvcnMvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlbnNvcnMvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvYW5hbHl0aWNzL21hdGgzL2V4dC9jb21tb25zLW1hdGgzLTMuNC4xLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5KVU5JVF9DT05UQUlORVIvNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9hcGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvZXh0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL3Byb3ZpZGVycyIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9zcGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYW5hbHl0aWNzLy5naXRpZ25vcmUgYi9hbmFseXRpY3MvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4ZmU0NC4uMDAwMDAwMAotLS0gYS9hbmFseXRpY3MvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotL2NsYXNzZXMvCi0qKi90ZXN0LmNsYXNzZXMvCi0qKi9jbGFzc2VzLwotKiovdW5pdHRlc3RzLwotL2Jpbi8KZGlmZiAtLWdpdCBhL2FuYWx5dGljcy8ucHJvamVjdCBiL2FuYWx5dGljcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2YTI5Yy4uMDAwMDAwMAotLS0gYS9hbmFseXRpY3MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5hbmFseXRpY3M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW5hbHl0aWNzL21hdGgzL2J1aWxkLmdyYWRsZSBiL2FuYWx5dGljcy9tYXRoMy9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDJlOWMuLjAwMDAwMDAKLS0tIGEvYW5hbHl0aWNzL21hdGgzL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTp0b3BvbG9neScKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtbWF0aDM6My40LjEnCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JwpkaWZmIC0tZ2l0IGEvYW5hbHl0aWNzL21hdGgzL3BvbS54bWwgYi9hbmFseXRpY3MvbWF0aDMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDAxN2ExCi0tLSAvZGV2L251bGwKKysrIGIvYW5hbHl0aWNzL21hdGgzL3BvbS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljcy1tYXRoMzwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBBbmFseXRpY3M6IE1hdGgzPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1tYXRoMzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuNC4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW5hbHl0aWNzL21hdGgzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL21hdGgzL0FnZ3JlZ2F0aW9ucy5qYXZhIGIvYW5hbHl0aWNzL21hdGgzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL21hdGgzL0FnZ3JlZ2F0aW9ucy5qYXZhCmluZGV4IGJjYzllYTAuLmFmNGNkZmIgMTAwNjQ0Ci0tLSBhL2FuYWx5dGljcy9tYXRoMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9tYXRoMy9BZ2dyZWdhdGlvbnMuamF2YQorKysgYi9hbmFseXRpY3MvbWF0aDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmFseXRpY3MvbWF0aDMvQWdncmVnYXRpb25zLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuanNvbi5Kc29uQW5hbHl0aWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5zdGF0LlJlZ3Jlc3Npb24yOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5zdGF0LlN0YXRpc3RpYzI7CitpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLnV0aWxzLkphdmE3SGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLlRvRG91YmxlRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFdpbmRvdzsKIApAQCAtMTk1LDYgKzE5Niw3IEBACiAgICAqIEFuIGFnZ3JlZ2F0aW9uIHJlc3VsdCBtYXkgYmUgbnVsbCB1bmRlciBvdGhlciBjb25kaXRpb25zLAogICAgKiBlLmcuLCBhIFJlZ3Jlc3Npb24yLlNMT1BFIHdoZXJlIHRoZSBtaW5pbXVtIG51bWJlciBvZiBzYW1wbGVzIGhhcyBub3QgYmVlbiBtZXQuCiAgICAqIAorICAgKiBAcGFyYW0gPFQ+IFR1cGxlIHR5cGUKICAgICogQHBhcmFtIGMgdGhlIENvbGxlY3Rpb24gdG8gYWdncmVnYXRlCiAgICAqIEBwYXJhbSBnZXR0ZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YXJpYWJsZSB0byBhZ2dyZWdhdGUgZnJvbSBhIHtAY29kZSBUfQogICAgKiBAcGFyYW0gYWdncmVnYXRlIHRoZSBhZ2dyZWdhdGlvbiB0byBwZXJmb3JtCkBAIC0yMTMsNiArMjE1LDcgQEAKICAgICogVGhlIFJlc3VsdE1hcCBkb2VzIG5vdCBjb250YWluIGFuIGVudHJ5IGZvciBhbiBhZ2dyZWdhdGlvbiB3aXRoIGEgbnVsbCwKICAgICogZS5nLiwgYSBSZWdyZXNzaW9uMi5TTE9QRSB3aGVyZSB0aGUgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyBoYXMgbm90IGJlZW4gbWV0LgogICAgKiAKKyAgICogQHBhcmFtIDxUPiBUdXBsZSB0eXBlCiAgICAqIEBwYXJhbSBjIHRoZSBDb2xsZWN0aW9uIHRvIGFnZ3JlZ2F0ZQogICAgKiBAcGFyYW0gZ2V0dGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFyaWFibGUgdG8gYWdncmVnYXRlIGZyb20gYSB7QGNvZGUgVH0KICAgICogQHBhcmFtIGFnZ3JlZ2F0ZXMgdGhlIGFnZ3JlZ2F0aW9ucyB0byBwZXJmb3JtCkBAIC0yNDIsOCArMjQ1LDggQEAKICAgICAgICAgICAvLyBkbyBhcyBKc29uQW5hbHl0aWNzIGRpZCBhbmQgb21pdCBOYW4vSW5mIHJlc3VsdHMgZnJvbSB0aGUgbWFwLgogICAgICAgICAgIGRvdWJsZSBydiA9IGFnZy5nZXRSZXN1bHQoKTsKICAgICAgICAgICAKLSAgICAgICAgICBpZiAoRG91YmxlLmlzRmluaXRlKHJ2KSkKLSAgICAgICAgICAgICAgcmVzdWx0LnB1dChhZ2cuZ2V0QWdncmVnYXRlKCksIERvdWJsZS52YWx1ZU9mKHJ2KSk7CisgICAgICAgICAgaWYgKEphdmE3SGVscGVyLmRvdWJsZUlzRmluaXRlKHJ2KSkKKyAgICAgICAgICAgICAgcmVzdWx0LnB1dChhZ2cuZ2V0QWdncmVnYXRlKCksIHJ2KTsKICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2FuYWx5dGljcy9tYXRoMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9tYXRoMy9qc29uL0pzb25BbmFseXRpY3MuamF2YSBiL2FuYWx5dGljcy9tYXRoMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9tYXRoMy9qc29uL0pzb25BbmFseXRpY3MuamF2YQppbmRleCA4MzM1NzU3Li4yN2Y2MjAyIDEwMDY0NAotLS0gYS9hbmFseXRpY3MvbWF0aDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmFseXRpY3MvbWF0aDMvanNvbi9Kc29uQW5hbHl0aWNzLmphdmEKKysrIGIvYW5hbHl0aWNzL21hdGgzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL21hdGgzL2pzb24vSnNvbkFuYWx5dGljcy5qYXZhCkBAIC0yNDksNiArMjQ5LDcgQEAKICAgICAgKiAgICB9KTsKICAgICAgKiB9PC9wcmU+CiAgICAgICogCisgICAgICogQHBhcmFtIDxLPiBQYXJ0aXRpb24gdHlwZQogICAgICAqIEBwYXJhbSB3aW5kb3cgdGhlIHdpbmRvdyB0byBjb21wdXRlIGFnZ3JlZ2F0aW9ucyBvdmVyCiAgICAgICogQHBhcmFtIHJlc3VsdFBhcnRpdGlvbktleVByb3BlcnR5IG5hbWUgb2YgdGhlIHBhcnRpdGlvbiBrZXkgcHJvcGVydHkgaW4gdGhlIHJlc3VsdAogICAgICAqIEBwYXJhbSByZXN1bHRQcm9wZXJ0eSBuYW1lIG9mIHRoZSBhZ2dyZWdhdGlvbiByZXN1bHRzIHByb3BlcnR5IGluIHRoZSByZXN1bHQKZGlmZiAtLWdpdCBhL2FuYWx5dGljcy9tYXRoMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9tYXRoMy9zdGF0L0pzb25PTFMuamF2YSBiL2FuYWx5dGljcy9tYXRoMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9tYXRoMy9zdGF0L0pzb25PTFMuamF2YQppbmRleCBjMWQzNTFiLi5iZjVlMzhjIDEwMDY0NAotLS0gYS9hbmFseXRpY3MvbWF0aDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmFseXRpY3MvbWF0aDMvc3RhdC9Kc29uT0xTLmphdmEKKysrIGIvYW5hbHl0aWNzL21hdGgzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL21hdGgzL3N0YXQvSnNvbk9MUy5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLnV0aWxzLkphdmE3SGVscGVyOwogCiBjbGFzcyBKc29uT0xTIGltcGxlbWVudHMgSnNvblVuaXZhcmlhdGVBZ2dyZWdhdG9yIHsKICAgICAKQEAgLTY2LDcgKzY3LDcgQEAKICAgICAgICAgICAgIC8vIFswXSBpcyB0aGUgY29uc3RhbnQgKHplcm8ndGggb3JkZXIpCiAgICAgICAgICAgICAvLyBbMV0gaXMgdGhlIGZpcnN0IG9yZGVyICwgd2hpY2ggd2UgdXNlIGFzIHRoZSBzbG9wZS4KICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBzbG9wZSA9IHJlZ3Jlc3Npb25QYXJhbXNbMV07Ci0gICAgICAgICAgICBpZiAoRG91YmxlLmlzRmluaXRlKHNsb3BlKSkKKyAgICAgICAgICAgIGlmIChKYXZhN0hlbHBlci5kb3VibGVJc0Zpbml0ZShzbG9wZSkpCiAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZFByb3BlcnR5KHR5cGUubmFtZSgpLCBzbG9wZSk7CiAgICAgICAgIH0KICAgICAgICAgdmFsdWVzID0gbnVsbDsKZGlmZiAtLWdpdCBhL2FuYWx5dGljcy9tYXRoMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9tYXRoMy9zdGF0L0pzb25TdG9yZWxlc3NTdGF0aXN0aWMuamF2YSBiL2FuYWx5dGljcy9tYXRoMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9tYXRoMy9zdGF0L0pzb25TdG9yZWxlc3NTdGF0aXN0aWMuamF2YQppbmRleCA3MDJmN2MzLi44YzQzYzg0IDEwMDY0NAotLS0gYS9hbmFseXRpY3MvbWF0aDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmFseXRpY3MvbWF0aDMvc3RhdC9Kc29uU3RvcmVsZXNzU3RhdGlzdGljLmphdmEKKysrIGIvYW5hbHl0aWNzL21hdGgzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL21hdGgzL3N0YXQvSnNvblN0b3JlbGVzc1N0YXRpc3RpYy5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLnV0aWxzLkphdmE3SGVscGVyOwogCiAvKioKICAqIEpTT04gdW5pdmFyaWF0ZSBhZ2dyZWdhdG9yIGltcGxlbWVudGF0aW9uIHdyYXBwaW5nIGEge0Bjb2RlIFN0b3JlbGVzc1VuaXZhcmlhdGVTdGF0aXN0aWN9LgpAQCAtNTEsNyArNTIsNyBAQAogICAgIHB1YmxpYyB2b2lkIHJlc3VsdChKc29uRWxlbWVudCBwYXJ0aXRpb24sIEpzb25PYmplY3QgcmVzdWx0KSB7ICAgICAgICAKICAgICAgICAgZG91YmxlIHJ2ID0gc3RhdEltcGwuZ2V0UmVzdWx0KCk7CiAgICAgICAgIAotICAgICAgICBpZiAoRG91YmxlLmlzRmluaXRlKHJ2KSkKKyAgICAgICAgaWYgKEphdmE3SGVscGVyLmRvdWJsZUlzRmluaXRlKHJ2KSkKICAgICAgICAgICAgIHJlc3VsdC5hZGRQcm9wZXJ0eShzdGF0Lm5hbWUoKSwgcnYpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvcGFja2FnZS1pbmZvLmphdmEgYi9hbmFseXRpY3MvbWF0aDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmFseXRpY3MvbWF0aDMvdXRpbHMvSmF2YTdIZWxwZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBzYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9wYWNrYWdlLWluZm8uamF2YQpyZW5hbWUgdG8gYW5hbHl0aWNzL21hdGgzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL21hdGgzL3V0aWxzL0phdmE3SGVscGVyLmphdmEKaW5kZXggMDAwY2IwMy4uMGEyZTdmNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvcGFja2FnZS1pbmZvLmphdmEKKysrIGIvYW5hbHl0aWNzL21hdGgzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL21hdGgzL3V0aWxzL0phdmE3SGVscGVyLmphdmEKQEAgLTE2LDkgKzE2LDEyIEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KICovCitwYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy51dGlsczsKIAotLyoqCi0gKiBTYW1wbGVzIHNob3dpbmcgY3JlYXRpbmcgYW5kIGV4ZWN1dGluZyBiYXNpYyB0b3BvbG9naWVzIC4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5OworcHVibGljIGNsYXNzIEphdmE3SGVscGVyIHsKIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb3VibGVJc0Zpbml0ZShkb3VibGUgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIChEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkgPCB2YWx1ZSkgJiYgKHZhbHVlIDwgRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FuYWx5dGljcy9tYXRoMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvYW5hbHl0aWNzL21hdGgzL1N0YXRpc3RpY3MyVGVzdC5qYXZhIGIvYW5hbHl0aWNzL21hdGgzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9hbmFseXRpY3MvbWF0aDMvU3RhdGlzdGljczJUZXN0LmphdmEKaW5kZXggNjk5NWIzMC4uNzc5YzliNyAxMDA2NDQKLS0tIGEvYW5hbHl0aWNzL21hdGgzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9hbmFseXRpY3MvbWF0aDMvU3RhdGlzdGljczJUZXN0LmphdmEKKysrIGIvYW5hbHl0aWNzL21hdGgzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9hbmFseXRpY3MvbWF0aDMvU3RhdGlzdGljczJUZXN0LmphdmEKQEAgLTI4LDcgKzI4LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1hdGgzLnV0aWwuUGFpcjsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuQWdncmVnYXRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5NdlJlc3VsdE1hcDsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuUmVzdWx0TWFwOwpkaWZmIC0tZ2l0IGEvYW5hbHl0aWNzL3BvbS54bWwgYi9hbmFseXRpY3MvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzc1YWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5hbHl0aWNzL3BvbS54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljczwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBBbmFseXRpY3M8L25hbWU+CisKKyAgPG1vZHVsZXM+CisgICAgPG1vZHVsZT5zZW5zb3JzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5tYXRoMzwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FuYWx5dGljcy9zZW5zb3JzL2J1aWxkLmdyYWRsZSBiL2FuYWx5dGljcy9zZW5zb3JzL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4NmQyNi4uMDAwMDAwMAotLS0gYS9hbmFseXRpY3Mvc2Vuc29ycy9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JwpkaWZmIC0tZ2l0IGEvYW5hbHl0aWNzL3NlbnNvcnMvcG9tLnhtbCBiL2FuYWx5dGljcy9zZW5zb3JzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlNWZjMwotLS0gL2Rldi9udWxsCisrKyBiL2FuYWx5dGljcy9zZW5zb3JzL3BvbS54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljcy1zZW5zb3JzPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IEFuYWx5dGljczogU2Vuc29yczwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW5hbHl0aWNzL3NlbnNvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmFseXRpY3Mvc2Vuc29ycy9SYW5nZS5qYXZhIGIvYW5hbHl0aWNzL3NlbnNvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmFseXRpY3Mvc2Vuc29ycy9SYW5nZS5qYXZhCmluZGV4IDY1NDMwZTcuLjdiYTJiNTYgMTAwNjQ0Ci0tLSBhL2FuYWx5dGljcy9zZW5zb3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL3NlbnNvcnMvUmFuZ2UuamF2YQorKysgYi9hbmFseXRpY3Mvc2Vuc29ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9zZW5zb3JzL1JhbmdlLmphdmEKQEAgLTI1LDYgKzI1LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5GdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMudXRpbHMuSmF2YTdIZWxwZXIuKjsKKwogLyoqCiAgKiBBIGdlbmVyaWMgaW1tdXRhYmxlIHJhbmdlIG9mIHZhbHVlcyBhbmQgYSB3YXkgdG8gCiAgKiBjaGVjayBhIHZhbHVlIGZvciBjb250YWlubWVudCBpbiB0aGUgcmFuZ2UuCkBAIC0xNjIsNiArMTY0LDExIEBACiAgICAgICogQ3JlYXRlIGEgbmV3IFJhbmdlJmx0O1QmZ3Q7CiAgICAgICogPHA+CiAgICAgICogU2VlIHtAbGluayBSYW5nZXN9IGZvciBhIGNvbGxlY3Rpb24gb2YgY29udmVuaWVuY2UgY29uc3RydWN0b3JzLgorICAgICAqIDxwPgorICAgICAqIFdoaWxlIG5vdCBlbmZvcmNlZCwgZm9yIGEgUmFuZ2UgdG8gYmUgdXNlZnVsL3NlbnNpYmxlLAorICAgICAqIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOiB7QGNvZGUgbG93ZXJFbmRwb2ludCA8PSB1cHBlckVuZHBvaW50fS4KKyAgICAgKiBPdGhlcndpc2UgdGhlIFJhbmdlIHdpbGwgYmUgcmV0dXJuZWQgYnV0IHRlc3QoKSBhbmQgY29udGFpbnMoKQorICAgICAqIGNhbiBuZXZlciByZXR1cm4gdHJ1ZS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gPFQ+IGEgQ29tcGFyYWJsZSB0eXBlCiAgICAgICogQHBhcmFtIGxvd2VyRW5kcG9pbnQgbnVsbCBmb3IgYW4gaW5maW5pdGUgdmFsdWUgKGFuZCBsYnQgbXVzdCBiZSBPUEVOKQpAQCAtMTcyLDYgKzE3OSw5IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIENvbXBhcmFibGU8Pz4+IFJhbmdlPFQ+IHJhbmdlKFQgbG93ZXJFbmRwb2ludCwgQm91bmRUeXBlIGxidCwgVCB1cHBlckVuZHBvaW50LCBCb3VuZFR5cGUgdWJ0KSB7CiAgICAgICAgIC8vIG1hdGNocyBHdWF2YSBSYW5nZS5yYW5nZSBwYXJhbSBvcmRlcgorICAgICAgICAvLyBOb3RlOiB0aGUgbG93ZXJFbmRwb2ludCA8PSB1cHBlckVuZHBvaW50ICJyZXF1aXJlbWVudCIgaXMgdGhlIHNhbWUgYXMgR3VhdmEKKyAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiBHdWF2YSBSYW5nZS5yYW5nZSgpIGVuZm9yY2VzIHRoYXQuCisgICAgICAgIC8vIFNpbmNlIHdlIGRpZG4ndCBvcmlnaW5hbGx5IGVuZm9yY2UgdGhhdCwgbGVhdmUgaXQgdGhhdCB3YXkuIAogICAgICAgICByZXR1cm4gbmV3IFJhbmdlPFQ+KGxvd2VyRW5kcG9pbnQsIGxidCwgdXBwZXJFbmRwb2ludCwgdWJ0KTsKICAgICB9CiAKQEAgLTI2MSw3ICsyNzEsNyBAQAogICAgICAqIDxwcmU+CiAgICAgICogQ29tcGFyYXRvciZsdDtCeXRlJmd0OyB1bnNpZ25lZEJ5dGVDb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3ImbHQ7Qnl0ZSZndDsoKSB7CiAgICAgICogICAgIHB1YmxpYyBpbnQgY29tcGFyZShCeXRlIGIxLCBCeXRlIGIyKSB7Ci0gICAgICogICAgICAgICByZXR1cm4gSW50ZWdlci5jb21wYXJlVW5zaWduZWQoQnl0ZS50b1Vuc2lnbmVkSW50KGIxKSwgQnl0ZS50b1Vuc2lnbmVkSW50KGIyKSk7CisgICAgICogICAgICAgICByZXR1cm4gaW50Q29tcGFyZVVuc2lnbmVkKGJ5dGVUb1Vuc2lnbmVkSW50KGIxKSwgYnl0ZVRvVW5zaWduZWRJbnQoYjIpKTsKICAgICAgKiAgICAgfQogICAgICAqICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8yKSB7IHJldHVybiBvMj09dGhpczsgfQogICAgICAqICAgICB9OwpAQCAtMzI5LDcgKzMzOSw3IEBACiAgICAgLyoqCiAgICAgICogUGFyc2UgYSBTdHJpbmcgZnJvbSB7QGxpbmsgI3RvU3RyaW5nKCl9CiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nCisgICAgICogQHBhcmFtIHMgdGhlIFN0cmluZwogICAgICAqIEByZXR1cm4gRm91ciBlbGVtZW50IGFycmF5IHdpdGggdGhlIHJhbmdlJ3MgY29tcG9uZW50IFN0cmluZ3MKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICAqLwpAQCAtNDU3LDE0ICs0NjcsMTQgQEAKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyA8VD4gU3RyaW5nIHRvVW5zaWduZWRTdHJpbmcoVCB2KSB7CiAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgQnl0ZSkKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvVW5zaWduZWRTdHJpbmcoQnl0ZS50b1Vuc2lnbmVkSW50KChCeXRlKXYpKTsKKyAgICAgICAgICAgIHJldHVybiBpbnRUb1Vuc2lnbmVkU3RyaW5nKGJ5dGVUb1Vuc2lnbmVkSW50KChCeXRlKXYpKTsKICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFNob3J0KQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudG9VbnNpZ25lZFN0cmluZyhTaG9ydC50b1Vuc2lnbmVkSW50KChTaG9ydCl2KSk7CisgICAgICAgICAgICByZXR1cm4gaW50VG9VbnNpZ25lZFN0cmluZyhzaG9ydFRvVW5zaWduZWRJbnQoKFNob3J0KXYpKTsKICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1Vuc2lnbmVkU3RyaW5nKChJbnRlZ2VyKXYpOworICAgICAgICAgICAgcmV0dXJuIGludFRvVW5zaWduZWRTdHJpbmcoKEludGVnZXIpdik7CiAgICAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBMb25nKQotICAgICAgICAgICAgcmV0dXJuIExvbmcudG9VbnNpZ25lZFN0cmluZygoTG9uZyl2KTsKKyAgICAgICAgICAgIHJldHVybiBsb25nVG9VbnNpZ25lZFN0cmluZygoTG9uZyl2KTsKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IFJhbmdlIG9mIEJ5dGUsU2hvcnQsSW50ZWdlciwgb3IgTG9uZyIrdi5nZXRDbGFzcygpKTsKICAgICB9Ci0gICAgCisKIH0KZGlmZiAtLWdpdCBhL2FuYWx5dGljcy9zZW5zb3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL3NlbnNvcnMvUmFuZ2VzLmphdmEgYi9hbmFseXRpY3Mvc2Vuc29ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9zZW5zb3JzL1Jhbmdlcy5qYXZhCmluZGV4IGM0ZjQ4NWYuLmUyNzJlNGIgMTAwNjQ0Ci0tLSBhL2FuYWx5dGljcy9zZW5zb3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL3NlbnNvcnMvUmFuZ2VzLmphdmEKKysrIGIvYW5hbHl0aWNzL3NlbnNvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmFseXRpY3Mvc2Vuc29ycy9SYW5nZXMuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMuUmFuZ2UuQm91bmRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLlByZWRpY2F0ZTsKIAogLyoqCiAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgYW5kIHV0aWxpdHkgb3BlcmF0aW9ucyBvbiB7QGxpbmsgUmFuZ2V9LgpAQCAtMTM2LDYgKzEzNywyMyBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBQcmVkaWNhdGUgd2hvc2Uge0Bjb2RlIHRlc3Qodil9IGJlaGF2ZXMgbGlrZSB7QGNvZGUgISByYW5nZS50ZXN0KHYpfQorICAgICAqIDxwPgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBhIHNpdHVhdGlvbiBzdWNoIGFzIGZpbHRlcmluZyB0byBpbmNsdWRlIG9ubHkgdmFsdWVzCisgICAgICogdGhhdCBhcmUgb3V0c2lkZSBvZiBhIHJhbmdlLgorICAgICAqIDxwcmU+e0Bjb2RlCisgICAgICogICAgIFRTdHJlYW08Pz4gb3V0c2lkZVJhbmdlID0gcmVhZGluZ3MuZmlsdGVyKFJhbmdlcy5vdXRzaWRlT2YoUmFuZ2VzLm9wZW4oMTAsMjApKSk7CisgICAgICogfTwvcHJlPgorICAgICAqIAorICAgICAqIEBwYXJhbSA8VD4gRW5kcG9pbnQgdHlwZQorICAgICAqIEBwYXJhbSByYW5nZSB0aGUgUmFuZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSBQcmVkaWNhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/Pj4gUHJlZGljYXRlPFQ+IG91dHNpZGVPZihSYW5nZTxUPiByYW5nZSkgeworICAgICAgICByZXR1cm4gdCAtPiAhIHJhbmdlLnRlc3QodCk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIENyZWF0ZSBhIFJhbmdlIGZyb20gYSBSYW5nZSZsdDtJbnRlZ2VyJmd0Oy50b1N0cmluZygpIHZhbHVlLgogICAgICAqIEBwYXJhbSBzdHIgdGhlIFN0cmluZwogICAgICAqIEByZXR1cm4gdGhlIFJhbmdlCmRpZmYgLS1naXQgYS9hbmFseXRpY3Mvc2Vuc29ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9zZW5zb3JzL3V0aWxzL0phdmE3SGVscGVyLmphdmEgYi9hbmFseXRpY3Mvc2Vuc29ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuYWx5dGljcy9zZW5zb3JzL3V0aWxzL0phdmE3SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNWMxNQotLS0gL2Rldi9udWxsCisrKyBiL2FuYWx5dGljcy9zZW5zb3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5hbHl0aWNzL3NlbnNvcnMvdXRpbHMvSmF2YTdIZWxwZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMudXRpbHM7CisKK3B1YmxpYyBjbGFzcyBKYXZhN0hlbHBlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBieXRlVG9VbnNpZ25lZEludChieXRlIGlucHV0KSB7CisgICAgICAgIHJldHVybiAoKGludCkgaW5wdXQpICYgMHhmZjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBzaG9ydFRvVW5zaWduZWRJbnQoc2hvcnQgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuICgoaW50KSBpbnB1dCkgJiAweGZmZmY7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIGludFRvVW5zaWduZWRMb25nKGludCBpbnB1dCkgeworICAgICAgICByZXR1cm4gKChsb25nKSBpbnB1dCkgJiAweGZmZmZmZmZmTDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRUb1Vuc2lnbmVkU3RyaW5nKGludCBpbnB1dCkgeworICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhpbnRUb1Vuc2lnbmVkTG9uZyhpbnB1dCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvbmdUb1Vuc2lnbmVkU3RyaW5nKGxvbmcgaW5wdXQpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBvZiBhIHBvc2l0aXZlIHNpZ25lZCB2YWx1ZSwganVzdCBvdXRwdXQgdGhhdC4KKyAgICAgICAgaWYgKGlucHV0ID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKGlucHV0LCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMKKyAgICAgICAgLy8gMSBhbmQgSmF2YSBpcyBpbnRlcnByZXRpbmcgdGhlIG51bWJlciBhcyBuZWdhdGl2ZSB2YWx1ZS4KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBTaGlmdCBldmVyeXRoaW5nIHJpZ2h0IG9uZSBiaXQgKGZpbGxpbmcgdXAgd2l0aCAwKQorICAgICAgICAgICAgbG9uZyBxdW90ID0gKGlucHV0ID4+PiAxKSAvIDU7CisgICAgICAgICAgICBsb25nIHJlbSA9IGlucHV0IC0gcXVvdCAqIDEwOworICAgICAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcocXVvdCkgKyByZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBpbnRDb21wYXJlVW5zaWduZWQoaW50IHgsIGludCB5KSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoeCArIEludGVnZXIuTUlOX1ZBTFVFLCB5ICsgSW50ZWdlci5NSU5fVkFMVUUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGxvbmdDb21wYXJlVW5zaWduZWQobG9uZyB4LCBsb25nIHkpIHsKKyAgICAgICAgcmV0dXJuIExvbmcuY29tcGFyZSh4ICsgTG9uZy5NSU5fVkFMVUUsIHkgKyBMb25nLk1JTl9WQUxVRSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hbmFseXRpY3Mvc2Vuc29ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvYW5hbHl0aWNzL3NlbnNvcnMvUmFuZ2VUZXN0LmphdmEgYi9hbmFseXRpY3Mvc2Vuc29ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvYW5hbHl0aWNzL3NlbnNvcnMvUmFuZ2VUZXN0LmphdmEKaW5kZXggN2Q0YjMxNi4uOTIyOThkMSAxMDA2NDQKLS0tIGEvYW5hbHl0aWNzL3NlbnNvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2FuYWx5dGljcy9zZW5zb3JzL1JhbmdlVGVzdC5qYXZhCisrKyBiL2FuYWx5dGljcy9zZW5zb3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9hbmFseXRpY3Mvc2Vuc29ycy9SYW5nZVRlc3QuamF2YQpAQCAtOCw3ICs4LDcgQEAKIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCisKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5zZW5zb3JzLnV0aWxzLkphdmE3SGVscGVyLio7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwogaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwpAQCAtMzEsNiArMzIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5zZW5zb3JzLlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5zZW5zb3JzLlJhbmdlczsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5QcmVkaWNhdGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKQEAgLTQwLDEzICs0MiwxOCBAQAogICogVGVzdCBSYW5nZSBhbmQgUmFuZ2VzCiAgKi8KIHB1YmxpYyBjbGFzcyBSYW5nZVRlc3QgeworICAKKyAgcHJpdmF0ZSA8VCBleHRlbmRzIENvbXBhcmFibGU8Pz4+IHZvaWQgdGVzdE91dHNpZGVPZihSYW5nZTxUPiByYW5nZSwgVCB2KSB7CisgICAgICBQcmVkaWNhdGU8VD4gbm90UHJlZGljYXRlID0gUmFuZ2VzLm91dHNpZGVPZihyYW5nZSk7IAorICAgICAgYXNzZXJ0RXF1YWxzKCJvdXRzaWRlT2YtIityYW5nZSsiLnRlc3QoIit2KyIpIiwgIXJhbmdlLnRlc3QodiksIG5vdFByZWRpY2F0ZS50ZXN0KHYpKTsKKyAgfQogICAgIAogICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8+PiB2b2lkIHRlc3RDb250YWlucyhSYW5nZTxUPiByYW5nZSwgVCB2LCBCb29sZWFuIGV4cGVjdGVkKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmFuZ2UiK3JhbmdlKyIuY29udGFpbnMocmFuZ2UiK3YrIikiLCBleHBlY3RlZCwgcmFuZ2UuY29udGFpbnModikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJhbmdlIityYW5nZSsiLmNvbnRhaW5zKCIrdisiKSIsIGV4cGVjdGVkLCByYW5nZS5jb250YWlucyh2KSk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8+PiB2b2lkIHRlc3RQcmVkaWNhdGUoUmFuZ2U8VD4gcmFuZ2UsIFQgdiwgQm9vbGVhbiBleHBlY3RlZCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoInJhbmdlIityYW5nZSsiLnRlc3QocmFuZ2UiK3YrIikiLCBleHBlY3RlZCwgcmFuZ2UudGVzdCh2KSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmFuZ2UiK3JhbmdlKyIudGVzdCgiK3YrIikiLCBleHBlY3RlZCwgcmFuZ2UudGVzdCh2KSk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8+PiB2b2lkIHRlc3RUb1N0cmluZyhSYW5nZTxUPiByYW5nZSwgU3RyaW5nIGV4cGVjdGVkKSB7CkBAIC0xNjIsNiArMTY5LDE1IEBACiAgICAgICAgIHRlc3RQcmVkaWNhdGUoUmFuZ2VzLmNsb3NlZCgyLDQpLCA0LCB0cnVlKTsKICAgICAgICAgdGVzdFByZWRpY2F0ZShSYW5nZXMuY2xvc2VkKDIsNCksIDUsIGZhbHNlKTsKICAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0c2lkZU9mKCkgeworICAgICAgICB0ZXN0T3V0c2lkZU9mKFJhbmdlcy5jbG9zZWQoMiw0KSwgMSk7CisgICAgICAgIHRlc3RPdXRzaWRlT2YoUmFuZ2VzLmNsb3NlZCgyLDQpLCAyKTsKKyAgICAgICAgdGVzdE91dHNpZGVPZihSYW5nZXMuY2xvc2VkKDIsNCksIDMpOworICAgICAgICB0ZXN0T3V0c2lkZU9mKFJhbmdlcy5jbG9zZWQoMiw0KSwgNCk7CisgICAgICAgIHRlc3RPdXRzaWRlT2YoUmFuZ2VzLmNsb3NlZCgyLDQpLCA1KTsKKyAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CkBAIC0zNzIsMTQgKzM4OCwxMyBAQAogICAgICAqIFRlc3QgdW5zaWduZWQgaGFuZGxpbmcuCiAgICAgICogdG9VbnNpZ25lZFN0cmluZygpIGFuZCBjb21wYXJlKFQsIENvbXBhcmF0b3I8VD4pCiAgICAgICovCi0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUb1Vuc2lnbmVkU3RyaW5nKCkgewogICAgICAgICB0ZXN0VG9TdHJpbmdVbnNpZ25lZChSYW5nZXMub3BlbigoYnl0ZSkwLChieXRlKTI1NSksICIoMC4uMjU1KSIpOwogICAgICAgICB0ZXN0VG9TdHJpbmdVbnNpZ25lZChSYW5nZXMuY2xvc2VkKChieXRlKTAsKGJ5dGUpMjU1KSwgIlswLi4yNTVdIik7CiAgICAgICAgIHRlc3RUb1N0cmluZ1Vuc2lnbmVkKFJhbmdlcy5vcGVuKChzaG9ydCkwLChzaG9ydCkweEZGRkYpLCAiKDAuLjY1NTM1KSIpOwotICAgICAgICB0ZXN0VG9TdHJpbmdVbnNpZ25lZChSYW5nZXMub3BlbigwLDB4RkZGRkZGRkYpLCAiKDAuLiIrSW50ZWdlci50b1Vuc2lnbmVkU3RyaW5nKDB4RkZGRkZGRkYpKyIpIik7Ci0gICAgICAgIHRlc3RUb1N0cmluZ1Vuc2lnbmVkKFJhbmdlcy5vcGVuKDBMLDB4RkZGRkZGRkZGRkZGRkZGRkwpLCAiKDAuLiIrTG9uZy50b1Vuc2lnbmVkU3RyaW5nKDB4RkZGRkZGRkZGRkZGRkZGRkwpKyIpIik7CisgICAgICAgIHRlc3RUb1N0cmluZ1Vuc2lnbmVkKFJhbmdlcy5vcGVuKDAsMHhGRkZGRkZGRiksICIoMC4uIisgaW50VG9VbnNpZ25lZFN0cmluZygweEZGRkZGRkZGKSsiKSIpOworICAgICAgICB0ZXN0VG9TdHJpbmdVbnNpZ25lZChSYW5nZXMub3BlbigwTCwweEZGRkZGRkZGRkZGRkZGRkZMKSwgIigwLi4iK2xvbmdUb1Vuc2lnbmVkU3RyaW5nKDB4RkZGRkZGRkZGRkZGRkZGRkwpKyIpIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM4Nyw3ICs0MDIsNyBAQAogICAgICAgICAvLyBVbnNpZ25lZCBCeXRlID09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgQ29tcGFyYXRvcjxCeXRlPiB1bnNpZ25lZEJ5dGVDb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8Qnl0ZT4oKSB7CiAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQnl0ZSB2MSwgQnl0ZSB2MikgewotICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmVVbnNpZ25lZChCeXRlLnRvVW5zaWduZWRJbnQodjEpLCBCeXRlLnRvVW5zaWduZWRJbnQodjIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Q29tcGFyZVVuc2lnbmVkKGJ5dGVUb1Vuc2lnbmVkSW50KHYxKSwgYnl0ZVRvVW5zaWduZWRJbnQodjIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbzIpIHsgcmV0dXJuIG8yPT10aGlzOyB9CiAgICAgICAgICAgICB9OwpAQCAtNDAxLDcgKzQxNiw3IEBACiAgICAgICAgIC8vIFVuc2lnbmVkIFNob3J0ID09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgQ29tcGFyYXRvcjxTaG9ydD4gdW5zaWduZWRTaG9ydENvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxTaG9ydD4oKSB7CiAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoU2hvcnQgdjEsIFNob3J0IHYyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuY29tcGFyZVVuc2lnbmVkKFNob3J0LnRvVW5zaWduZWRJbnQodjEpLCBTaG9ydC50b1Vuc2lnbmVkSW50KHYyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludENvbXBhcmVVbnNpZ25lZChzaG9ydFRvVW5zaWduZWRJbnQodjEpLCBzaG9ydFRvVW5zaWduZWRJbnQodjIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbzIpIHsgcmV0dXJuIG8yPT10aGlzOyB9CiAgICAgICAgICAgICB9OwpAQCAtNDE0LDcgKzQyOSw3IEBACiAgICAgICAgIC8vIFVuc2lnbmVkIEludGVnZXIgPT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICBDb21wYXJhdG9yPEludGVnZXI+IHVuc2lnbmVkSW50ZWdlckNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxJbnRlZ2VyPigpIHsKICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShJbnRlZ2VyIHYxLCBJbnRlZ2VyIHYyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuY29tcGFyZVVuc2lnbmVkKHYxLCB2Mik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludENvbXBhcmVVbnNpZ25lZCh2MSwgdjIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMikgeyByZXR1cm4gbzI9PXRoaXM7IH0KICAgICAgICAgICAgIH07CkBAIC00MjcsNyArNDQyLDcgQEAKICAgICAgICAgLy8gVW5zaWduZWQgTG9uZyA9PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgIENvbXBhcmF0b3I8TG9uZz4gdW5zaWduZWRMb25nQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPExvbmc+KCkgewogICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKExvbmcgdjEsIExvbmcgdjIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5jb21wYXJlVW5zaWduZWQodjEsIHYyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZ0NvbXBhcmVVbnNpZ25lZCh2MSwgdjIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMikgeyByZXR1cm4gbzI9PXRoaXM7IH0KICAgICAgICAgICAgIH07CmRpZmYgLS1naXQgYS9hbmRyb2lkLy5naXRpZ25vcmUgYi9hbmRyb2lkLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjA5ZjMuLjAwMDAwMDAKLS0tIGEvYW5kcm9pZC8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0vY2xhc3Nlcy8KLSoqL3Rlc3QuY2xhc3Nlcy8KLSoqL2NsYXNzZXMvCi0qKi91bml0dGVzdHMvCmRpZmYgLS1naXQgYS9hbmRyb2lkL2hhcmR3YXJlL2J1aWxkLmdyYWRsZSBiL2FuZHJvaWQvaGFyZHdhcmUvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzY4Zjk1Li4wMDAwMDAwCi0tLSBhL2FuZHJvaWQvaGFyZHdhcmUvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLWV4dC5hbmRyb2lkSmFyU3BlYyA9ICdjb20uZ29vZ2xlLmFuZHJvaWQ6YW5kcm9pZDo0LjEuMS40QGphcicKLQotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTp0b3BvbG9neScKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCBhbmRyb2lkSmFyU3BlYwotICAKLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KLQotdGVzdCB7Ci0gIC8vIHRoaXMgcHJvamVjdCBsYWNrcyB0ZXN0cyBhbmQgdGhpcyB0YXNrIGZhaWxzIGlmIGF0dGVtcHRlZCAKLSAgZW5hYmxlZCA9IGZhbHNlCi19CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RvcG9sb2d5L2J1aWxkLmdyYWRsZSBiL2FuZHJvaWQvdG9wb2xvZ3kvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWU5MTA2Li4wMDAwMDAwCi0tLSBhL2FuZHJvaWQvdG9wb2xvZ3kvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6b3BsZXQnCi0gIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgcHJvamVjdCgnOmFuZHJvaWQ6aGFyZHdhcmUnKS5hbmRyb2lkSmFyU3BlYwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLXRlc3QgewotICAvLyB0aGlzIHByb2plY3QgbGFja3MgdGVzdHMgYW5kIHRoaXMgdGFzayBmYWlscyBpZiBhdHRlbXB0ZWQgCi0gIGVuYWJsZWQgPSBmYWxzZQotfQpkaWZmIC0tZ2l0IGEvYXBpLy5jbGFzc3BhdGggYi9hcGkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxY2RhYi4uMDAwMDAwMAotLS0gYS9hcGkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZ1bmN0aW9uL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmdW5jdGlvbi9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXhlY3V0aW9uL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleGVjdXRpb24vc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImdyYXBoL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJncmFwaC9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3BsZXQvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im9wbGV0L3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0b3BvbG9neS9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idG9wb2xvZ3kvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndpbmRvdy9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2luZG93L3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvZXh0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkpVTklUX0NPTlRBSU5FUi80Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2FwaS8uZ2l0aWdub3JlIGIvYXBpLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGZlNDQuLjAwMDAwMDAKLS0tIGEvYXBpLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS9jbGFzc2VzLwotKiovdGVzdC5jbGFzc2VzLwotKiovY2xhc3Nlcy8KLSoqL3VuaXR0ZXN0cy8KLS9iaW4vCmRpZmYgLS1naXQgYS9hcGkvLnByb2plY3QgYi9hcGkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjQ3MjkuLjAwMDAwMDAKLS0tIGEvYXBpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+YXBpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2FwaS9leGVjdXRpb24vYnVpbGQuZ3JhZGxlIGIvYXBpL2V4ZWN1dGlvbi9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjQ0MWQuLjAwMDAwMDAKLS0tIGEvYXBpL2V4ZWN1dGlvbi9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6ZnVuY3Rpb24nCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0KLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KZGlmZiAtLWdpdCBhL2FwaS9leGVjdXRpb24vcG9tLnhtbCBiL2FwaS9leGVjdXRpb24vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGIwZTViCi0tLSAvZGV2L251bGwKKysrIGIvYXBpL2V4ZWN1dGlvbi9wb20ueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZXhlY3V0aW9uPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IEFQSTogRXhlY3V0aW9uPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi44LjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXBpL2Z1bmN0aW9uL2J1aWxkLmdyYWRsZSBiL2FwaS9mdW5jdGlvbi9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YWEyNDMuLjAwMDAwMDAKLS0tIGEvYXBpL2Z1bmN0aW9uL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1kZXBlbmRlbmNpZXMgewotICAvLyBub25lCi0KLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KZGlmZiAtLWdpdCBhL2FwaS9mdW5jdGlvbi9wb20ueG1sIGIvYXBpL2Z1bmN0aW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyZTM4YgotLS0gL2Rldi9udWxsCisrKyBiL2FwaS9mdW5jdGlvbi9wb20ueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQVBJOiBGdW5jdGlvbjwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FwaS9ncmFwaC9idWlsZC5ncmFkbGUgYi9hcGkvZ3JhcGgvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTMxZDU3Li4wMDAwMDAwCi0tLSBhL2FwaS9ncmFwaC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6b3BsZXQnCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0KLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KLQotdGVzdCB7Ci0gIC8vIHRoaXMgcHJvamVjdCBsYWNrcyBub24tYWJzdHJhY3QgdGVzdCBjbGFzc2VzIGFuZCB0aGlzIHRhc2sgZmFpbHMgaWYgYXR0ZW1wdGVkIAotICBlbmFibGVkID0gZmFsc2UKLX0KZGlmZiAtLWdpdCBhL2FwaS9ncmFwaC9wb20ueG1sIGIvYXBpL2dyYXBoL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmYTNkZQotLS0gL2Rldi9udWxsCisrKyBiL2FwaS9ncmFwaC9wb20ueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQVBJOiBHcmFwaDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1vcGxldDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FwaS9vcGxldC9idWlsZC5ncmFkbGUgYi9hcGkvb3BsZXQvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTc1NzJkLi4wMDAwMDAwCi0tLSBhL2FwaS9vcGxldC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6ZnVuY3Rpb24nCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6ZXhlY3V0aW9uJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOndpbmRvdycKLSAgYWRkVGFyZ2V0RGlyQ29yZUV4dEphckRlcGVuZGVuY2llcyAnY29tcGlsZScKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvYXBpL29wbGV0L3BvbS54bWwgYi9hcGkvb3BsZXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGVmMzdlCi0tLSAvZGV2L251bGwKKysrIGIvYXBpL29wbGV0L3BvbS54bWwKQEAgLTAsMCArMSw1NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1vcGxldDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBBUEk6IE9wbGV0PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS13aW5kb3c8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hcGkvcG9tLnhtbCBiL2FwaS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MWM0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGkvcG9tLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IEFQSTwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmV4ZWN1dGlvbjwvbW9kdWxlPgorICAgIDxtb2R1bGU+ZnVuY3Rpb248L21vZHVsZT4KKyAgICA8bW9kdWxlPmdyYXBoPC9tb2R1bGU+CisgICAgPG1vZHVsZT5vcGxldDwvbW9kdWxlPgorICAgIDxtb2R1bGU+dG9wb2xvZ3k8L21vZHVsZT4KKyAgICA8bW9kdWxlPndpbmRvdzwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FwaS90b3BvbG9neS9idWlsZC5ncmFkbGUgYi9hcGkvdG9wb2xvZ3kvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzMzZmMzLi4wMDAwMDAwCi0tLSBhL2FwaS90b3BvbG9neS9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6ZXhlY3V0aW9uJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOmZ1bmN0aW9uJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOmdyYXBoJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOm9wbGV0JwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLS8vQnVpbGQgYSBqYXIgZmlsZSBjb250YWluaW5nIHRoZSBhcHBsaWNhdGlvbnMgdG8gdGVzdCB0aGUgQXBwbGljYXRpb25TZXJ2aWNlCi10YXNrIHRlc3RBcHBsaWNhdGlvbkphcnsKLSAgZG9MYXN0ewotICAgIGFudC5qYXIoZGVzdGZpbGU6ICIke2J1aWxkRGlyfS9saWIvdGVzdC9lZGdlbnQuYXBpLnRvcG9sb2d5LkFQUFMuVEVTVC5qYXIiKSB7Ci0gICAgICBzZXJ2aWNlKHR5cGU6ICdvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5zZXJ2aWNlcy5Ub3BvbG9neUJ1aWxkZXInKSB7Ci0gICAgICAgIHByb3ZpZGVyKGNsYXNzbmFtZTogJ29yZy5hcGFjaGUuZWRnZW50LnRlc3QudG9wb2xvZ3kuc2VydmljZXMuVGVzdEFwcGxpY2F0aW9ucyRBcHBPbmUnKQotICAgICAgICBwcm92aWRlcihjbGFzc25hbWU6ICdvcmcuYXBhY2hlLmVkZ2VudC50ZXN0LnRvcG9sb2d5LnNlcnZpY2VzLlRlc3RBcHBsaWNhdGlvbnMkQXBwVHdvJykKLSAgICAgICAgcHJvdmlkZXIoY2xhc3NuYW1lOiAnb3JnLmFwYWNoZS5lZGdlbnQudGVzdC50b3BvbG9neS5zZXJ2aWNlcy5UZXN0QXBwbGljYXRpb25zJEFwcFRocmVlJykKLSAgICAgIH0KLSAgICBmaWxlc2V0IChkaXI6ICIke2J1aWxkRGlyfS9jbGFzc2VzL3Rlc3QvIiwgaW5jbHVkZXM6ICcqKi8qVGVzdEFwcGxpY2F0aW9ucyRBcHAqLmNsYXNzJykKLSAgICB9Ci0gIH0KLX0KLQotdGVzdENsYXNzZXMuZGVwZW5kc09uIHRlc3RBcHBsaWNhdGlvbkphcgpkaWZmIC0tZ2l0IGEvYXBpL3RvcG9sb2d5L3BvbS54bWwgYi9hcGkvdG9wb2xvZ3kvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjhmYzUzCi0tLSAvZGV2L251bGwKKysrIGIvYXBpL3RvcG9sb2d5L3BvbS54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBBUEk6IFRvcG9sb2d5PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1vcGxldDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FwaS90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3RvcG9sb2d5L3BsdW1iaW5nL1BsdW1iaW5nU3RyZWFtcy13aXRoQ29tY3VycmVudE1hcFNpbmdsZU9wLkpBVkEgYi9hcGkvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90b3BvbG9neS9wbHVtYmluZy9QbHVtYmluZ1N0cmVhbXMtd2l0aENvbWN1cnJlbnRNYXBTaW5nbGVPcC5KQVZBCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDcwYWQwLi4wMDAwMDAwCi0tLSBhL2FwaS90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3RvcG9sb2d5L3BsdW1iaW5nL1BsdW1iaW5nU3RyZWFtcy13aXRoQ29tY3VycmVudE1hcFNpbmdsZU9wLkpBVkEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LnBsdW1iaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50Lm9wbGV0LnBsdW1iaW5nLkJhcnJpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQub3BsZXQucGx1bWJpbmcuSXNvbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5vcGxldC5wbHVtYmluZy5QcmVzc3VyZVJlbGlldmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50Lm9wbGV0LnBsdW1iaW5nLlVub3JkZXJlZElzb2xhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neVByb3ZpZGVyOwotCi0vKioKLSAqIFBsdW1iaW5nIHV0aWxpdGllcyBmb3Ige0BsaW5rIFRTdHJlYW19LgotICogTWV0aG9kcyB0aGF0IG1hbmlwdWxhdGUgdGhlIGZsb3cgb2YgdHVwbGVzIGluIGEgc3RyZWFtaW5nIHRvcG9sb2d5LAotICogYnV0IGFyZSBub3QgcGFydCBvZiB0aGUgbG9naWMgb2YgdGhlIGFwcGxpY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUGx1bWJpbmdTdHJlYW1zIHsKLSAgCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGEgYmxvY2tpbmcgZGVsYXkgYmV0d2VlbiB0dXBsZXMuCi0gICAgICogUmV0dXJuZWQgc3RyZWFtIGlzIHRoZSBpbnB1dCBzdHJlYW0gZGVsYXllZCBieSB7QGNvZGUgZGVsYXl9LgotICAgICAqIDxwPgotICAgICAqIERlbGF5cyBsZXNzIHRoYW4gMW1zZWMgYXJlIHRyYW5zbGF0ZWQgdG8gYSAwIGRlbGF5LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZnVuY3Rpb24gYWx3YXlzIGFkZHMgdGhlIHtAY29kZSBkZWxheX0gYW1vdW50IGFmdGVyIHJlY2VpdmluZwotICAgICAqIGEgdHVwbGUgYmVmb3JlIGZvcndhcmRpbmcgaXQuICAKLSAgICAgKiA8cD4KLSAgICAgKiBEb3duc3RyZWFtIHR1cGxlIHByb2Nlc3NpbmcgZGVsYXlzIHdpbGwgYWZmZWN0Ci0gICAgICogdGhlIG92ZXJhbGwgZGVsYXkgb2YgYSBzdWJzZXF1ZW50IHR1cGxlLgotICAgICAqIDxwPgotICAgICAqIGUuZy4sIHRoZSBpbnB1dCBzdHJlYW0gY29udGFpbnMgdHdvIHR1cGxlcyB0MSBhbmQgdDIgYW5kCi0gICAgICogdGhlIGRlbGF5IGlzIDEwMG1zLiAgVGhlIGZvcndhcmRpbmcgb2YgdDEgaXMgZGVsYXllZCBieSAxMDBtcy4KLSAgICAgKiBUaGVuIGlmIGEgZG93bnN0cmVhbSBwcm9jZXNzaW5nIGRlbGF5IG9mIDgwbXMgb2NjdXJzLCB0aGlzIGZ1bmN0aW9uCi0gICAgICogcmVjZWl2ZXMgdDIgODBtcyBhZnRlciBpdCBmb3J3YXJkZWQgdDEgYW5kIGl0IHdpbGwgZGVsYXkgYW5vdGhlcgotICAgICAqIDEwMG1zIGJlZm9yZSBmb3J3YXJkaW5nIHQyLiAgSGVuY2UgdGhlIG92ZXJhbGwgZGVsYXkgYmV0d2VlbiBmb3J3YXJkaW5nCi0gICAgICogdDEgYW5kIHQyIGlzIDE4MG1zLgotICAgICAqIFNlZSB7QGxpbmsgI2Jsb2NraW5nVGhyb3R0bGUobG9uZywgVGltZVVuaXQpIGJsb2NraW5nVGhyb3R0bGV9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gU3RyZWFtIHQKLSAgICAgKiBAcGFyYW0gZGVsYXkgQW1vdW50IG9mIHRpbWUgdG8gZGVsYXkgYSB0dXBsZS4KLSAgICAgKiBAcGFyYW0gdW5pdCBUaW1lIHVuaXQgZm9yIHtAY29kZSBkZWxheX0uCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJlYW0gdGhhdCB3aWxsIGJlIGRlbGF5ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVFN0cmVhbTxUPiBibG9ja2luZ0RlbGF5KFRTdHJlYW08VD4gc3RyZWFtLCBsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KSB7Ci0gICAgICAgIHJldHVybiBzdHJlYW0ubWFwKHQgLT4ge3RyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAodW5pdC50b01pbGxpcyhkZWxheSkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gcmV0dXJuIHQ7fSkgOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNYWludGFpbiBhIGNvbnN0YW50IGJsb2NraW5nIGRlbGF5IGJldHdlZW4gdHVwbGVzLgotICAgICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgdGhlIGlucHV0IHN0cmVhbSB0aHJvdHRsZWQgYnkge0Bjb2RlIGRlbGF5fS4KLSAgICAgKiA8cD4KLSAgICAgKiBEZWxheXMgbGVzcyB0aGFuIDFtc2VjIGFyZSB0cmFuc2xhdGVkIHRvIGEgMCBkZWxheS4KLSAgICAgKiA8cD4KLSAgICAgKiBTYW1wbGUgdXNlOgotICAgICAqIDxwcmU+e0Bjb2RlCi0gICAgICogVFN0cmVhbTxTdHJpbmc+IHN0cmVhbSA9IHRvcG9sb2d5LnN0cmluZ3MoImEiLCAiYiwgImMiKTsKLSAgICAgKiAvLyBDcmVhdGUgYSBzdHJlYW0gd2l0aCB0dXBsZXMgdGhyb3R0bGVkIHRvIDEgc2Vjb25kIGludGVydmFscy4KLSAgICAgKiBUU3RyZWFtPFN0cmluZz4gdGhyb3R0bGVkU3RyZWFtID0gYmxvY2tpbmdUaHJvdHRsZShzdHJlYW0sIDEsIFRpbWVVbml0LlNFQ09ORCk7Ci0gICAgICogLy8gcHJpbnQgb3V0IHRoZSB0aHJvdHRsZWQgdHVwbGVzIGFzIHRoZXkgYXJyaXZlCi0gICAgICogdGhyb3R0bGVkU3RyZWFtLnBlZWsodCAtPiBTeXN0ZW0ub3V0LnByaW50bG4obmV3IERhdGUoKSArICIgLSAiICsgdCkpOwotICAgICAqIH08L3ByZT4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZnVuY3Rpb24gYWRqdXN0cyBmb3IgZG93bnN0cmVhbSBwcm9jZXNzaW5nIGRlbGF5cy4KLSAgICAgKiBUaGUgZmlyc3QgdHVwbGUgaXMgbm90IGRlbGF5ZWQuICBJZiB7QGNvZGUgZGVsYXl9IGhhcyBhbHJlYWR5Ci0gICAgICogZWxhcHNlZCBzaW5jZSB0aGUgcHJpb3IgdHVwbGUgd2FzIGZvcndhcmRlZCwgdGhlIHR1cGxlIAotICAgICAqIGlzIGZvcndhcmRlZCBpbW1lZGlhdGVseS4KLSAgICAgKiBPdGhlcndpc2UsIGZvcndhcmRpbmcgdGhlIHR1cGxlIGlzIGRlbGF5ZWQgdG8gYWNoaWV2ZQotICAgICAqIGEge0Bjb2RlIGRlbGF5fSBhbW91bnQgc2luY2UgZm9yd2FyZGluZyB0aGUgcHJpb3IgdHVwbGUuCi0gICAgICogPHA+Ci0gICAgICogZS5nLiwgdGhlIGlucHV0IHN0cmVhbSBjb250YWlucyB0d28gdHVwbGVzIHQxIGFuZCB0MiBhbmQKLSAgICAgKiB0aGUgZGVsYXkgaXMgMTAwbXMuICBUaGUgZm9yd2FyZGluZyBvZiB0MSBpcyBkZWxheWVkIGJ5IDEwMG1zLgotICAgICAqIFRoZW4gaWYgYSBkb3duc3RyZWFtIHByb2Nlc3NpbmcgZGVsYXkgb2YgODBtcyBvY2N1cnMsIHRoaXMgZnVuY3Rpb24KLSAgICAgKiByZWNlaXZlcyB0MiA4MG1zIGFmdGVyIGl0IGZvcndhcmRlZCB0MSBhbmQgaXQgd2lsbCBvbmx5IGRlbGF5IGFub3RoZXIKLSAgICAgKiAyMG1zICgxMDBtcyAtIDgwbXMpIGJlZm9yZSBmb3J3YXJkaW5nIHQyLiAgCi0gICAgICogSGVuY2UgdGhlIG92ZXJhbGwgZGVsYXkgYmV0d2VlbiBmb3J3YXJkaW5nIHQxIGFuZCB0MiByZW1haW5zIDEwMG1zLgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4gdHVwbGUgdHlwZQotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIHN0cmVhbSB0byB0aHJvdHRsZQotICAgICAqIEBwYXJhbSBkZWxheSBBbW91bnQgb2YgdGltZSB0byBkZWxheSBhIHR1cGxlLgotICAgICAqIEBwYXJhbSB1bml0IFRpbWUgdW5pdCBmb3Ige0Bjb2RlIGRlbGF5fS4KLSAgICAgKiBAcmV0dXJuIHRoZSB0aHJvdHRsZWQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVFN0cmVhbTxUPiBibG9ja2luZ1Rocm90dGxlKFRTdHJlYW08VD4gc3RyZWFtLCBsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KSB7Ci0gICAgICAgIHJldHVybiBzdHJlYW0ubWFwKCBibG9ja2luZ1Rocm90dGxlKGRlbGF5LCB1bml0KSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIDxUPiBGdW5jdGlvbjxULFQ+IGJsb2NraW5nVGhyb3R0bGUobG9uZyBkZWxheSwgVGltZVVuaXQgdW5pdCkgewotICAgICAgICBsb25nW10gbmV4dFR1cGxlVGltZSA9IHsgMCB9OwotICAgICAgICByZXR1cm4gdCAtPiB7Ci0gICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaWYgKG5leHRUdXBsZVRpbWVbMF0gIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChub3cgPCBuZXh0VHVwbGVUaW1lWzBdKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAobmV4dFR1cGxlVGltZVswXSAtIG5vdyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0VHVwbGVUaW1lWzBdID0gbm93ICsgdW5pdC50b01pbGxpcyhkZWxheSk7Ci0gICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGEgYmxvY2tpbmcgZGVsYXkgYmVmb3JlIGZvcndhcmRpbmcgdGhlIGZpcnN0IHR1cGxlIGFuZAotICAgICAqIG5vIGRlbGF5IGZvciBzdWJzZXF1ZW50IHR1cGxlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBEZWxheXMgbGVzcyB0aGFuIDFtc2VjIGFyZSB0cmFuc2xhdGVkIHRvIGEgMCBkZWxheS4KLSAgICAgKiA8cD4KLSAgICAgKiBTYW1wbGUgdXNlOgotICAgICAqIDxwcmU+e0Bjb2RlCi0gICAgICogVFN0cmVhbTxTdHJpbmc+IHN0cmVhbSA9IHRvcG9sb2d5LnN0cmluZ3MoImEiLCAiYiwgImMiKTsKLSAgICAgKiAvLyBjcmVhdGUgYSBzdHJlYW0gd2hlcmUgdGhlIGZpcnN0IHR1cGxlIGlzIGRlbGF5ZWQgYnkgNSBzZWNvbmRzLiAKLSAgICAgKiBUU3RyZWFtPFN0cmluZz4gb25lU2hvdERlbGF5ZWRTdHJlYW0gPQotICAgICAqICAgICAgc3RyZWFtLm1hcCggYmxvY2tpbmdPbmVTaG90RGVsYXkoNSwgVGltZVVuaXQuU0VDT05EUykgKTsKLSAgICAgKiB9PC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtIDxUPiB0dXBsZSB0eXBlCi0gICAgICogQHBhcmFtIHN0cmVhbSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gZGVsYXkgQW1vdW50IG9mIHRpbWUgdG8gZGVsYXkgYSB0dXBsZS4KLSAgICAgKiBAcGFyYW0gdW5pdCBUaW1lIHVuaXQgZm9yIHtAY29kZSBkZWxheX0uCi0gICAgICogQHJldHVybiB0aGUgZGVsYXllZCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUU3RyZWFtPFQ+IGJsb2NraW5nT25lU2hvdERlbGF5KFRTdHJlYW08VD4gc3RyZWFtLCBsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KSB7Ci0gICAgICAgIHJldHVybiBzdHJlYW0ubWFwKCBibG9ja2luZ09uZVNob3REZWxheShkZWxheSwgdW5pdCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyA8VD4gRnVuY3Rpb248VCxUPiBibG9ja2luZ09uZVNob3REZWxheShsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KSB7Ci0gICAgICAgIGxvbmdbXSBpbml0aWFsRGVsYXkgPSB7IHVuaXQudG9NaWxsaXMoZGVsYXkpIH07Ci0gICAgICAgIHJldHVybiB0IC0+IHsKLSAgICAgICAgICAgIGlmIChpbml0aWFsRGVsYXlbMF0gIT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoaW5pdGlhbERlbGF5WzBdKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbml0aWFsRGVsYXlbMF0gPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0OwotICAgICAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVsaWV2ZSBwcmVzc3VyZSBvbiB1cHN0cmVhbSBwcm9jZXNzaW5nIGJ5IGRpc2NhcmRpbmcgdHVwbGVzLgotICAgICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB1cHN0cmVhbSBwcm9jZXNzaW5nIGlzIG5vdAotICAgICAqIGNvbnN0cmFpbmVkIGJ5IGFueSBkZWxheSBpbiBkb3duc3RyZWFtIHByb2Nlc3NpbmcsCi0gICAgICogZm9yIGV4YW1wbGUgYnkgYSBjb25uZWN0b3Igbm90IGJlaW5nIGFibGUgdG8gY29ubmVjdAotICAgICAqIHRvIGl0cyBleHRlcm5hbCBzeXN0ZW0uCi0gICAgICogPFA+Ci0gICAgICogQW55IGRvd25zdHJlYW0gcHJvY2Vzc2luZyBvZiB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGlzb2xhdGVkCi0gICAgICogZnJvbSB7QGNvZGUgc3RyZWFtfSBzbyB0aGF0IGFueSBzbG93IGRvd24gZG9lcyBub3QgYWZmZWN0IHtAY29kZSBzdHJlYW19LgotICAgICAqIFdoZW4gdGhlIGRvd25zdHJlYW0gcHJvY2Vzc2luZyBjYW5ub3Qga2VlcCB1cCB3aXRoIHJhdGUgb2YKLSAgICAgKiB7QGNvZGUgc3RyZWFtfSB0dXBsZXMgd2lsbCBiZSBkcm9wcGVkIGZyb20gcmV0dXJuZWQgc3RyZWFtLgotICAgICAqIDxCUj4KLSAgICAgKiBVcCB0byB7QGNvZGUgY291bnR9IG9mIHRoZSBtb3N0IHJlY2VudCB0dXBsZXMgcGVyIGtleSBmcm9tIHtAY29kZSBzdHJlYW19Ci0gICAgICogYXJlIG1haW50YWluZWQgd2hlbiBkb3duc3RyZWFtIHByb2Nlc3NpbmcgaXMgc2xvdywgYW55IG9sZGVyIHR1cGxlcwotICAgICAqIHRoYXQgaGF2ZSBub3QgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHJldHVybmVkIHN0cmVhbSB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgKiA8QlI+Ci0gICAgICogVHVwbGUgb3JkZXIgaXMgbWFpbnRhaW5lZCB3aXRoaW4gYSBwYXJ0aXRpb24gYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvCi0gICAgICogYmUgbWFpbnRhaW5lZCBhY3Jvc3MgcGFydGl0aW9ucy4KLSAgICAgKiA8L1A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSBTdHJlYW0gdG8gYmUgaXNvbGF0ZWQgZnJvbSBkb3duc3RyZWFtIHByb2Nlc3NpbmcuCi0gICAgICogQHBhcmFtIGtleUZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaW5nIHRoZSBrZXkgb2YgZWFjaCB0dXBsZS4KLSAgICAgKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgdHVwbGVzIHRvIG1haW50YWluIHdoZW4gZG93bnN0cmVhbSBwcm9jZXNzaW5nIGlzIGJhY2tpbmcgdXAuCi0gICAgICogQHJldHVybiBTdHJlYW0gdGhhdCBpcyBpc29sYXRlZCBmcm9tIGFuZCB0aHVzIHJlbGlldmVzIHByZXNzdXJlIG9uIHtAY29kZSBzdHJlYW19LgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4gVHVwbGUgdHlwZS4KLSAgICAgKiBAcGFyYW0gPEs+IEtleSB0eXBlLgotICAgICAqIEBzZWUgI2lzb2xhdGUoVFN0cmVhbSwgaW50KSBpc29sYXRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VCxLPiBUU3RyZWFtPFQ+IHByZXNzdXJlUmVsaWV2ZXIoVFN0cmVhbTxUPiBzdHJlYW0sIEZ1bmN0aW9uPFQsSz4ga2V5RnVuY3Rpb24sIGludCBjb3VudCkgewotICAgICAgICByZXR1cm4gc3RyZWFtLnBpcGUobmV3IFByZXNzdXJlUmVsaWV2ZXI8Pihjb3VudCwga2V5RnVuY3Rpb24pKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSXNvbGF0ZSB1cHN0cmVhbSBwcm9jZXNzaW5nIGZyb20gZG93bnN0cmVhbSBwcm9jZXNzaW5nLgotICAgICAqIDxCUj4KLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbWF5IHRocm93IHtAY29kZSBPdXRPZk1lbW9yeUV4Y2VwdGlvbnN9IAotICAgICAqIGlmIHRoZSBwcm9jZXNzaW5nIGFnYWluc3QgcmV0dXJuZWQgc3RyZWFtIGNhbm5vdCBrZWVwIHVwCi0gICAgICogd2l0aCB0aGUgYXJyaXZhbCByYXRlIG9mIHR1cGxlcyBvbiB7QGNvZGUgc3RyZWFtfS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHN0cmVhbSBTdHJlYW0gdG8gYmUgaXNvbGF0ZWQgZnJvbSBkb3duc3RyZWFtIHByb2Nlc3NpbmcuCi0gICAgICogQHBhcmFtIG9yZGVyZWQge0Bjb2RlIHRydWV9IHRvIG1haW50YWluIGFycml2YWwgb3JkZXIgb24gdGhlIHJldHVybmVkIHN0cmVhbSwKLSAgICAgKiB7QGNvZGUgZmFsc2V9IHRvIG5vdCBndWFyYW50ZWVkIGFycml2YWwgb3JkZXIuCi0gICAgICogQHJldHVybiBTdHJlYW0gdGhhdCBpcyBpc29sYXRlZCBmcm9tIHtAY29kZSBzdHJlYW19LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFRTdHJlYW08VD4gaXNvbGF0ZShUU3RyZWFtPFQ+IHN0cmVhbSwgYm9vbGVhbiBvcmRlcmVkKSB7Ci0gICAgICAgIHJldHVybiBzdHJlYW0ucGlwZSgKLSAgICAgICAgICAgICAgICBvcmRlcmVkID8gbmV3IElzb2xhdGU8VD4oKSA6IG5ldyBVbm9yZGVyZWRJc29sYXRlPFQ+KCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJc29sYXRlIHVwc3RyZWFtIHByb2Nlc3NpbmcgZnJvbSBkb3duc3RyZWFtIHByb2Nlc3NpbmcuCi0gICAgICogPFA+Ci0gICAgICogSWYgdGhlIHByb2Nlc3NpbmcgYWdhaW5zdCB0aGUgcmV0dXJuZWQgc3RyZWFtIGNhbm5vdCBrZWVwIHVwCi0gICAgICogd2l0aCB0aGUgYXJyaXZhbCByYXRlIG9mIHR1cGxlcyBvbiB7QGNvZGUgc3RyZWFtfSwgdXBzdHJlYW0KLSAgICAgKiBwcm9jZXNzaW5nIHdpbGwgYmxvY2sgdW50aWwgdGhlcmUgaXMgc3BhY2UgaW4gdGhlIHF1ZXVlIGJldHdlZW4KLSAgICAgKiB0aGUgc3RyZWFtcy4KLSAgICAgKiA8L1A+PFA+Ci0gICAgICogUHJvY2Vzc2luZyBvZiB0dXBsZXMgb2NjdXJzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVjZWl2ZWQuCi0gICAgICogPC9QPgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gc3RyZWFtIFN0cmVhbSB0byBiZSBpc29sYXRlZCBmcm9tIGRvd25zdHJlYW0gcHJvY2Vzc2luZy4KLSAgICAgKiBAcGFyYW0gcXVldWVDYXBhY2l0eSBzaXplIG9mIHRoZSBxdWV1ZSBiZXR3ZWVuIHtAY29kZSBzdHJlYW19IGFuZAotICAgICAqICAgICAgICB0aGUgcmV0dXJuZWQgc3RyZWFtLgotICAgICAqIEByZXR1cm4gU3RyZWFtIHRoYXQgaXMgaXNvbGF0ZWQgZnJvbSB7QGNvZGUgc3RyZWFtfS4KLSAgICAgKiBAc2VlICNwcmVzc3VyZVJlbGlldmVyKFRTdHJlYW0sIEZ1bmN0aW9uLCBpbnQpIHByZXNzdXJlUmVsaWV2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUU3RyZWFtPFQ+IGlzb2xhdGUoVFN0cmVhbTxUPiBzdHJlYW0sIGludCBxdWV1ZUNhcGFjaXR5KSB7Ci0gICAgICByZXR1cm4gc3RyZWFtLnBpcGUobmV3IElzb2xhdGU8VD4ocXVldWVDYXBhY2l0eSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGFuYWx5dGljcyBjb25jdXJyZW50bHkuCi0gICAgICogPFA+Ci0gICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY2FsbHMKLSAgICAgKiB7QGxpbmsgI2NvbmN1cnJlbnQoVFN0cmVhbSwgTGlzdCwgRnVuY3Rpb24pfSBhZnRlcgotICAgICAqIGNyZWF0aW5nIHtAY29kZSBwaXBlbGluZX0gYW5kIHtAY29kZSBjb21iaW5lcn0gZnVuY3Rpb25zCi0gICAgICogZnJvbSB0aGUgc3VwcGxpZWQge0Bjb2RlIG1hcHBlcnN9IGFuZCB7QGNvZGUgY29tYmluZXJ9IGFyZ3VtZW50cy4KLSAgICAgKiA8L1A+PFA+Ci0gICAgICogVGhhdCBpcywgaXQgaXMgbG9naWNhbGx5LCBpZiBub3QgZXhhY3RseSwgdGhlIHNhbWUgYXM6Ci0gICAgICogPHByZT57QGNvZGUKLSAgICAgKiBMaXN0PEZ1bmN0aW9uPFRTdHJlYW08VD4sVFN0cmVhbTxVPj4+IHBpcGVsaW5lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAqIGZvciAoRnVuY3Rpb248VCxVPiBtYXBwZXIgOiBtYXBwZXJzKQotICAgICAqICAgcGlwZWxpbmVzLmFkZChzIC0+IHMubWFwKG1hcHBlcikpOwotICAgICAqIGNvbmN1cnJlbnQoc3RyZWFtLCBwaXBlbGluZXMsIHMgLT4gcy5tYXAoY29tYmluZXIpKTsKLSAgICAgKiB9PC9wcmU+Ci0gICAgICogPC9QPgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4gVHVwbGUgdHlwZSBvbiBpbnB1dCBzdHJlYW0uCi0gICAgICogQHBhcmFtIDxVPiBUdXBsZSB0eXBlIGdlbmVyYXRlZCBieSBtYXBwZXJzLgotICAgICAqIEBwYXJhbSA8Uj4gVHVwbGUgdHlwZSBvZiB0aGUgcmVzdWx0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gaW5wdXQgc3RyZWFtCi0gICAgICogQHBhcmFtIG1hcHBlcnMgZnVuY3Rpb25zIHRvIGJlIHJ1biBjb25jdXJyZW50bHkuICBFYWNoIG1hcHBlciBNVVNUCi0gICAgICogICAgICAgICAgICAgICAgIHJldHVybiBhIG5vbi1udWxsIHJlc3VsdC4KLSAgICAgKiAgICAgICAgICAgICAgICAgQSBydW50aW1lIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGEgbnVsbCByZXN1bHQKLSAgICAgKiAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIGNvbWJpbmVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHJlc3VsdCB0dXBsZSBmcm9tIHRoZSBsaXN0IG9mCi0gICAgICogICAgICAgICAgICAgICAgIHJlc3VsdHMgZnJvbSB7QGNvZGUgbWFwcGVyc30uCi0gICAgICogICAgICAgICAgICAgICAgIFRoZSBpbnB1dCBsaXN0IG9yZGVyIGlzIDE6MSB3aXRoIHRoZSB7QGNvZGUgbWFwcGVyc30gbGlzdC4KLSAgICAgKiAgICAgICAgICAgICAgICAgSS5lLiwgbGlzdCBlbnRyeSBbMF0gaXMgdGhlIHJlc3VsdCBmcm9tIG1hcHBlcnNbMF0sCi0gICAgICogICAgICAgICAgICAgICAgIGxpc3QgZW50cnkgWzFdIGlzIHRoZSByZXN1bHQgZnJvbSBtYXBwZXJzWzFdLCBldGMuCi0gICAgICogQHJldHVybiByZXN1bHQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VCxVLFI+IFRTdHJlYW08Uj4gY29uY3VycmVudE1hcChUU3RyZWFtPFQ+IHN0cmVhbSwgTGlzdDxGdW5jdGlvbjxULFU+PiBtYXBwZXJzLCBGdW5jdGlvbjxMaXN0PFU+LFI+IGNvbWJpbmVyKSB7Ci0gICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHN0cmVhbSwgInN0cmVhbSIpOwotICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChtYXBwZXJzLCAibWFwcGVycyIpOwotICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjb21iaW5lciwgImNvbWJpbmVyIik7Ci0gICAgICAKLSAgICAgIExpc3Q8RnVuY3Rpb248VFN0cmVhbTxUPixUU3RyZWFtPFU+Pj4gcGlwZWxpbmVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICBmb3IgKEZ1bmN0aW9uPFQsVT4gbWFwcGVyIDogbWFwcGVycykgewotICAgICAgICBwaXBlbGluZXMuYWRkKHMgLT4gcy5tYXAobWFwcGVyKSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiBjb25jdXJyZW50KHN0cmVhbSwgcGlwZWxpbmVzLCBzIC0+IHMubWFwKGNvbWJpbmVyKSk7Ci0gICAgfQotICAgIAotICAgIC8vIFE6IGlzIHRoZXJlIGFueSB2YWx1ZSB0byB0aGlzIGltcGxlbWVudGF0aW9uIGFwcHJvYWNoPyAgT3IganVzdCBkaXNwb3NlIG9mIGl0PwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgc3RhdGljIDxULFUsUj4gVFN0cmVhbTxSPiBjb25jdXJyZW50TWFwU2luZ2xlT3AoVFN0cmVhbTxUPiBzdHJlYW0sIExpc3Q8RnVuY3Rpb248VCxVPj4gbWFwcGVycywgRnVuY3Rpb248TGlzdDxVPixSPiBjb21iaW5lcikgewotICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChzdHJlYW0sICJzdHJlYW0iKTsKLSAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobWFwcGVycywgIm1hcHBlcnMiKTsKLSAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoY29tYmluZXIsICJjb21iaW5lciIpOwotICAgICAgCi0gICAgICAvLyBJTklUSUFMIElNUEwgVE8gR0VUIFNUQVJURUQgLSB2YWxpZGF0ZSBpbnRlcmZhY2UgYW5kIHRlc3QKLSAgICAgIC8vIGV4cGxvcmUgYW4gaW1wbCB3aXRoIG5vIG5ldyBvcGxldHMKLSAgICAgIC8vCi0gICAgICAvLyBUaGlzIGlzIHRoZSBtb3N0IGxpZ2h0d2VpZ2h0IGltcGwgcG9zc2libGUgd3J0IG5vIGludGVybWVkaWF0ZSBzdHJlYW1zCi0gICAgICAvLyBpLmUuLCBhbGwgb2YgdGhlIHByb2Nlc3NpbmcgaXMgaGFuZGxlZCB3aXRoaW4gYSBzaW5nbGUgaW5qZWN0ZWQgbWFwKCkKLSAgICAgIC8vIAotICAgICAgLy8gVE9ETzogd2FudCB0byBjcmVhdGUgRXhlY3V0b3JTZXJ2aWNlIHVzaW5nIHByb3ZpZGVyJ3MgVGhyZWFkRmFjdG9yeSBzZXJ2aWNlLgotICAgICAgLy8gICAgICAgQ2FuJ3QgZ2V0IFJ1bnRpbWVTZXJ2aWNlc1N1cHBsaWVyIGZyb20gYSBzdHJlYW0uCi0gICAgICAvLwotICAgICAgLy8gTm90ZSwgd2UgaW1wb3NlIHRoaXMgIm5vbi1udWxsIG1hcHBlciByZXN1bHQiIHJlcXVpcmVtZW50IHNvIGFzCi0gICAgICAvLyB0byBlbmFibGUgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zIHRoYXQgbWlnaHQgYmUgYnVyZGVuZWQgaWYKLSAgICAgIC8vIG51bGwgcmVzdWx0cyB3ZXJlIGFsbG93ZWQuCi0gICAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gYmVsb3cgY291bGQgZWFzaWx5IGhhbmRsZSBudWxsIHJlc3VsdHMgdy9vCi0gICAgICAvLyBsb3Npbmcgc3luY2hyb25pemF0aW9uLCB3aXRoIHRoZSBjb21iaW5lciBuZWVkaW5nIHRvIGRlYWwgd2l0aAotICAgICAgLy8gYSBudWxsIHJlc3VsdCBpbiB0aGUgbGlzdCBpdCdzIGdpdmVuLgotICAgICAgCi0gICAgICBBdG9taWNSZWZlcmVuY2U8RXhlY3V0b3JTZXJ2aWNlPiBleGVjdXRvclJlZiA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOwotICAgICAgCi0gICAgICByZXR1cm4gc3RyZWFtLm1hcCh0dXBsZSAtPiB7Ci0gICAgICAgIGlmIChleGVjdXRvclJlZi5nZXQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgZXhlY3V0b3JSZWYuY29tcGFyZUFuZFNldChudWxsLCBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKE1hdGgubWluKG1hcHBlcnMuc2l6ZSgpLCAyMCkpKTsKLSAgICAgICAgfQotICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBleGVjdXRvclJlZi5nZXQoKTsKLSAgICAgICAgTGlzdDxVPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KENvbGxlY3Rpb25zLm5Db3BpZXMobWFwcGVycy5zaXplKCksIG51bGwpKTsKLSAgICAgICAgTGlzdDxGdXR1cmU8Pz4+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4obWFwcGVycy5zaXplKCkpOwotCi0gICAgICAgIC8vIFN1Ym1pdCBhIHRhc2sgZm9yIGVhY2ggbWFwcGVyIGludm9jYXRpb24KLSAgICAgICAgaW50IGNoID0gMDsKLSAgICAgICAgZm9yIChGdW5jdGlvbjxULFU+IG1hcHBlciA6IG1hcHBlcnMpIHsKLSAgICAgICAgICBmaW5hbCBpbnQgcmVzdWx0SW5keCA9IGNoKys7Ci0gICAgICAgICAgRnV0dXJlPD8+IGZ1dHVyZSA9IGV4ZWN1dG9yLnN1Ym1pdCgoKSAtPiB7Ci0gICAgICAgICAgICBVIHJlc3VsdCA9IG1hcHBlci5hcHBseSh0dXBsZSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1hcHBlciBpbmRleCAiK3Jlc3VsdEluZHgrIiByZXR1cm5lZCBudWxsIik7Ci0gICAgICAgICAgICByZXN1bHRzLnNldChyZXN1bHRJbmR4LCByZXN1bHQpOyAKLSAgICAgICAgICB9KTsKLSAgICAgICAgICBmdXR1cmVzLmFkZChmdXR1cmUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEF3YWl0IGNvbXBsZXRpb24gb2YgYWxsCi0gICAgICAgIGZvciAoRnV0dXJlPD8+IGZ1dHVyZSA6IGZ1dHVyZXMpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgZnV0dXJlLmdldCgpOwotICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibWFwcGVyIGludGVycnVwdGVkIiwgZSk7Ci0gICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJtYXBwZXIgdGhyZXciLCBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUnVuIHRoZSBjb21iaW5lcgotICAgICAgICBSIHJlc3VsdCA9IGNvbWJpbmVyLmFwcGx5KHJlc3VsdHMpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSk7Ci0gICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGFuYWx5dGljcyBjb25jdXJyZW50bHkuCi0gICAgICogPFA+Ci0gICAgICogUHJvY2VzcyBpbnB1dCB0dXBsZXMgb25lIGF0IGF0IHRpbWUsIGludm9raW5nIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBhbmFseXRpY3MgKHtAY29kZSBwaXBlbGluZXN9KSBjb25jdXJyZW50bHksIGNvbWJpbmUgdGhlIHJlc3VsdHMsCi0gICAgICogYW5kIHRoZW4gcHJvY2VzcyB0aGUgbmV4dCBpbnB1dCB0dXBsZSBpbiB0aGUgc2FtZSBtYW5uZXIuCi0gICAgICogPC9QPjxQPgotICAgICAqIExvZ2ljYWxseSwgaW5zdGVhZCBvZiBkb2luZyB0aGlzOgotICAgICAqIDxwcmU+e0Bjb2RlCi0gICAgICogc2Vuc29yUmVhZGluZ3M8VD4gLT4gQTFwaXBlbGluZSAtPiBBMnBpcGVsaW5lIC0+IEEzcGlwZWxpbmUgLT4gcmVzdWx0czxSPgotICAgICAqIH08L3ByZT4KLSAgICAgKiBjcmVhdGUgYSBncmFwaCB0aGF0J3MgbG9naWNhbGx5IGxpa2UgdGhpczoKLSAgICAgKiA8cHJlPntAY29kZQotICAgICAqIC0gCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgfC0+ICBBMXBpcGVsaW5lICAtPnwKLSAgICAgKiBzZW5zb3JSZWFkaW5nczxUPiAtPiB8LT4gIEEycGlwZWxpbmUgIC0+fCAtPiByZXN1bHQ8Uj4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8LT4gIEEzcGlwZWxpbmUgIC0+fAotICAgICAqIH08L3ByZT4KLSAgICAgKiA8L1A+PFA+Ci0gICAgICogVGhlIHR5cGljYWwgdXNlIGNhc2UgZm9yIHRoaXMgaXMgd2hlbiBhbiBhcHBsaWNhdGlvbiBoYXMgYSBjb2xsZWN0aW9uCi0gICAgICogb2YgaW5kZXBlbmRlbnQgYW5hbHl0aWNzIHRvIHBlcmZvcm0gb24gZWFjaCB0dXBsZSBhbmQgdGhlIGFuYWx5dGljcwotICAgICAqIGFyZSBzdWZmaWNpZW50bHkgbG9uZyBydW5uaW5nIHN1Y2ggdGhhdCBwZXJmb3JtaW5nIHRoZW0gY29uY3VycmVudGx5Ci0gICAgICogaXMgZGVzaXJlZC4KLSAgICAgKiA8L1A+PFA+Ci0gICAgICogTm90ZSwgdGhpcyBpcyBpbiBjb250cmFzdCB0byAicGFyYWxsZWwiIHN0cmVhbSBwcm9jZXNzaW5nLAotICAgICAqIHdoaWNoIGluIEphdmE4IFN0cmVhbXMgYW5kIG90aGVyIGNvbnRleHRzIG1lYW5zIHByb2Nlc3NpbmcgbXVsdGlwbGUKLSAgICAgKiB0dXBsZXMgaW4gcGFyYWxsZWwsIGVhY2ggb24gYSByZXBsaWNhdGVkIHByb2Nlc3NpbmcgcGlwZWxpbmUuCi0gICAgICogPC9QPjxQPgotICAgICAqIFRocmVhZHNhZmV0eSAtIG9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPnRoZSB0dXBsZXMgZnJvbSB7QGNvZGUgc3RyZWFtfSBhcmUgdGhyZWFkc2FmZTwvbGk+Ci0gICAgICogPGxpPnRoZSB7QGNvZGUgcGlwZWxpbmVzfSBkbyBub3QgbW9kaWZ5IHRoZSBpbnB1dCB0dXBsZXM8L2xpPgotICAgICAqIDxsaT50aGUge0Bjb2RlIHBpcGVsaW5lc30gcHJvdmlkZSB0aGVpciBvd24gc3luY2hyb25pemF0aW9uIGNvbnRyb2xzCi0gICAgICogICAgIHRvIHByb3RlY3QgY29uY3VycmVudCBtb2RpZmljYXRpb25zIG9mIHRoZSBpbnB1dCB0dXBsZXM8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPC9QPjxQPgotICAgICAqIExvZ2ljYWxseSwgYSB0aHJlYWQgaXMgYWxsb2NhdGVkIGZvciBlYWNoIG9mIHRoZSB7QGNvZGUgcGlwZWxpbmVzfS4KLSAgICAgKiBUaGUgYWN0dWFsIGRlZ3JlZSBvZiBjb25jdXJyZW5jeSBtYXkgYmUge0BsaW5rIFRvcG9sb2d5UHJvdmlkZXJ9IGRlcGVuZGVudC4KLSAgICAgKiA8L1A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIDxUPiBUdXBsZSB0eXBlIG9uIGlucHV0IHN0cmVhbS4KLSAgICAgKiBAcGFyYW0gPFU+IFR1cGxlIHR5cGUgZ2VuZXJhdGVkIGJ5IHBpcGVsaW5lcy4KLSAgICAgKiBAcGFyYW0gPFI+IFR1cGxlIHR5cGUgb2YgdGhlIHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBwaXBlbGluZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhZGQgYSBwaXBlbGluZSB0byB0aGUgdG9wb2xvZ3kuCi0gICAgICogICAgICAgICAgICAgICAgIEVhY2gge0Bjb2RlIHBpcGVsaW5lLmFwcGx5KCl9IGlzIGNhbGxlZCB3aXRoIHtAY29kZSBzdHJlYW19Ci0gICAgICogICAgICAgICAgICAgICAgIGFzIHRoZSBpbnB1dCwgeWllbGRpbmcgdGhlIHBpcGVsaW5lJ3MgcmVzdWx0IHN0cmVhbS4KLSAgICAgKiAgICAgICAgICAgICAgICAgRm9yIGVhY2ggaW5wdXQgdHVwbGUsIGEgcGlwZWxpbmUgTVVTVCBjcmVhdGUgZXhhY3RseSBvbmUgb3V0cHV0IHR1cGxlLgotICAgICAqICAgICAgICAgICAgICAgICBUdXBsZSBmbG93IGludG8gdGhlIHBpcGVsaW5lcyB3aWxsIGNlYXNlIGlmIHRoYXQgcmVxdWlyZW1lbnQKLSAgICAgKiAgICAgICAgICAgICAgICAgaXMgbm90IG1ldC4KLSAgICAgKiBAcGFyYW0gY29tYmluZXIgYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSByZXN1bHQgc3RyZWFtIGZyb20gYSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgICAgICAgd2hvc2UgdHVwbGVzIGFyZSB0aGUgbGlzdCBvZiBlYWNoIHBpcGVsaW5lJ3MgcmVzdWx0LgotICAgICAqICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgdHVwbGUgbGlzdCdzIG9yZGVyIGlzIDE6MSB3aXRoIHRoZSB7QGNvZGUgcGlwZWxpbmVzfSBsaXN0LgotICAgICAqICAgICAgICAgICAgICAgICBJLmUuLCBsaXN0IGVudHJ5IFswXSBpcyB0aGUgcmVzdWx0IGZyb20gcGlwZWxpbmVzWzBdLAotICAgICAqICAgICAgICAgICAgICAgICBsaXN0IGVudHJ5IFsxXSBpcyB0aGUgcmVzdWx0IGZyb20gcGlwZWxpbmVzWzFdLCBldGMuCi0gICAgICogQHJldHVybiByZXN1bHQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VCxVLFI+IFRTdHJlYW08Uj4gY29uY3VycmVudChUU3RyZWFtPFQ+IHN0cmVhbSwgTGlzdDxGdW5jdGlvbjxUU3RyZWFtPFQ+LFRTdHJlYW08VT4+PiBwaXBlbGluZXMsIEZ1bmN0aW9uPFRTdHJlYW08TGlzdDxVPj4sVFN0cmVhbTxSPj4gY29tYmluZXIpIHsKLSAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoc3RyZWFtLCAic3RyZWFtIik7Ci0gICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHBpcGVsaW5lcywgInBpcGVsaW5lcyIpOwotICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjb21iaW5lciwgImNvbWJpbmVyIik7Ci0gICAgICAKLSAgICAgIC8vIFN1bW1hcnkgb2Ygd2hhdCdzIGJlbG93OgotICAgICAgLy8gICAgICAgICAgIHwtPiBpc29sYXRlKDEpIC0+IHAxIC0+IHwKLSAgICAgIC8vIHN0cmVhbSAtPiB8LT4gaXNvbGF0ZSgxKSAtPiBwMiAtPiB8LT4gYmFycmllcigxMCkgLT4gY29tYmluZXIgCi0gICAgICAvLyAgICAgICAgICAgfC0+IGlzb2xhdGUoMSkgLT4gcDMgLT4gfAotICAgICAgLy8gICAgICAgICAgICAgICAgLiAuIC4KLQotICAgICAgaW50IGJhcnJpZXJRdWV1ZUNhcGFjaXR5ID0gMTA7ICAvLyBkb24ndCBwcmVjbHVkZSBwaXBlbGluZXMgZnJvbSBnZXR0aW5nIGFoZWFkIHNvbWUuCi0gICAgICAKLSAgICAgIC8vIEFkZCBjb25jdXJyZW50IChpc29sYXRlZCkgZmFub3V0cwotICAgICAgTGlzdDxUU3RyZWFtPFQ+PiBmYW5vdXRzID0gbmV3IEFycmF5TGlzdDw+KHBpcGVsaW5lcy5zaXplKCkpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXBlbGluZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGZhbm91dHMuYWRkKGlzb2xhdGUoc3RyZWFtLCAxKS50YWcoImNvbmN1cnJlbnQuaXNvbGF0ZWQtY2giK2kpKTsKLSAgICAgIAotICAgICAgLy8gQWRkIHBpcGVsaW5lcwotICAgICAgTGlzdDxUU3RyZWFtPFU+PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KHBpcGVsaW5lcy5zaXplKCkpOwotICAgICAgaW50IGNoID0gMDsKLSAgICAgIGZvciAoRnVuY3Rpb248VFN0cmVhbTxUPixUU3RyZWFtPFU+PiBwaXBlbGluZSA6IHBpcGVsaW5lcykgewotICAgICAgICByZXN1bHRzLmFkZChwaXBlbGluZS5hcHBseShmYW5vdXRzLmdldChjaCkpLnRhZygiY29uY3VycmVudC1jaCIrY2gpKTsKLSAgICAgICAgY2grKzsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gQWRkIHRoZSBiYXJyaWVyCi0gICAgICBUU3RyZWFtPExpc3Q8VT4+IGJhcnJpZXIgPSBiYXJyaWVyKHJlc3VsdHMsIGJhcnJpZXJRdWV1ZUNhcGFjaXR5KS50YWcoImNvbmN1cnJlbnQuYmFycmllciIpOwotICAgICAgCi0gICAgICAvLyBBZGQgdGhlIGNvbWJpbmVyCi0gICAgICByZXR1cm4gY29tYmluZXIuYXBwbHkoYmFycmllcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB0dXBsZSBzeW5jaHJvbml6YXRpb24gYmFycmllci4KLSAgICAgKiA8UD4KLSAgICAgKiBTYW1lIGFzIHtAY29kZSBiYXJyaWVyKG90aGVycywgMSl9Ci0gICAgICogPC9QPgotICAgICAqIEBzZWUgI2JhcnJpZXIoTGlzdCwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFRTdHJlYW08TGlzdDxUPj4gYmFycmllcihMaXN0PFRTdHJlYW08VD4+IHN0cmVhbXMpIHsKLSAgICAgIHJldHVybiBiYXJyaWVyKHN0cmVhbXMsIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdHVwbGUgc3luY2hyb25pemF0aW9uIGJhcnJpZXIuCi0gICAgICogPFA+Ci0gICAgICogQSBiYXJyaWVyIGhhcyBuIGlucHV0IHN0cmVhbXMgd2l0aCB0dXBsZSB0eXBlIHtAY29kZSBUfQotICAgICAqIGFuZCBvbmUgb3V0cHV0IHN0cmVhbSB3aXRoIHR1cGxlIHR5cGUge0Bjb2RlIExpc3Q8VD59LgotICAgICAqIE9uY2UgdGhlIGJhcnJpZXIgcmVjZWl2ZXMgb25lIHR1cGxlIG9uIGVhY2ggb2YgaXRzIGlucHV0IHN0cmVhbXMsCi0gICAgICogaXQgZ2VuZXJhdGVzIGFuIG91dHB1dCB0dXBsZSBjb250YWluaW5nIG9uZSB0dXBsZSBmcm9tIGVhY2ggaW5wdXQgc3RyZWFtLgotICAgICAqIEl0IHRoZW4gd2FpdHMgdW50aWwgaXQgaGFzIHJlY2VpdmVkIGFub3RoZXIgdHVwbGUgZnJvbSBlYWNoIGlucHV0IHN0cmVhbS4KLSAgICAgKiA8L1A+PFA+Ci0gICAgICogSW5wdXQgc3RyZWFtIDAncyB0dXBsZSBpcyBpbiB0aGUgb3V0cHV0IHR1cGxlJ3MgbGlzdFswXSwKLSAgICAgKiBzdHJlYW0gMSdzIHR1cGxlIGluIGxpc3RbMV0sIGFuZCBzbyBvbi4KLSAgICAgKiA8L1A+PFA+Ci0gICAgICogVGhlIGJhcnJpZXIncyBvdXRwdXQgc3RyZWFtIGlzIGlzb2xhdGVkIGZyb20gdGhlIGlucHV0IHN0cmVhbXMuCi0gICAgICogPC9QPjxQPgotICAgICAqIFRoZSBiYXJyaWVyIGhhcyBhIHF1ZXVlIG9mIHNpemUge0Bjb2RlIHF1ZXVlQ2FwYWNpdHl9IGZvciBlYWNoCi0gICAgICogaW5wdXQgc3RyZWFtLiAgV2hlbiBhIHR1cGxlIGZvciBhbiBpbnB1dCBzdHJlYW0gaXMgcmVjZWl2ZWQgaXQgaXMKLSAgICAgKiBhZGRlZCB0byBpdHMgcXVldWUuICBUaGUgc3RyZWFtIHdpbGwgYmxvY2sgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwuCi0gICAgICogPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIDxUPiBUeXBlIG9mIHRoZSB0dXBsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtcyB0aGUgbGlzdCBvZiBpbnB1dCBzdHJlYW1zCi0gICAgICogQHBhcmFtIHF1ZXVlQ2FwYWNpdHkgdGhlIHNpemUgb2YgZWFjaCBpbnB1dCBzdHJlYW0ncyBxdWV1ZQotICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKiBAc2VlIEJhcnJpZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUU3RyZWFtPExpc3Q8VD4+IGJhcnJpZXIoTGlzdDxUU3RyZWFtPFQ+PiBzdHJlYW1zLCBpbnQgcXVldWVDYXBhY2l0eSkgewotICAgICAgTGlzdDxUU3RyZWFtPFQ+PiBvdGhlcnMgPSBuZXcgQXJyYXlMaXN0PD4oc3RyZWFtcyk7Ci0gICAgICBUU3RyZWFtPFQ+IHMxID0gb3RoZXJzLnJlbW92ZSgwKTsKLSAgICAgIHJldHVybiBzMS5mYW5pbihuZXcgQmFycmllcjxUPihxdWV1ZUNhcGFjaXR5KSwgb3RoZXJzKTsKLSAgICB9Ci0gCi19CmRpZmYgLS1naXQgYS9hcGkvdG9wb2xvZ3kvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3RvcG9sb2d5L1BsdW1iaW5nVGVzdC5qYXZhIGIvYXBpL3RvcG9sb2d5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC90b3BvbG9neS9QbHVtYmluZ1Rlc3QuamF2YQppbmRleCA0YTM0N2VkLi42NDRhYzRmIDEwMDY0NAotLS0gYS9hcGkvdG9wb2xvZ3kvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3RvcG9sb2d5L1BsdW1iaW5nVGVzdC5qYXZhCisrKyBiL2FwaS90b3BvbG9neS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvUGx1bWJpbmdUZXN0LmphdmEKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAgICAgLy8gZGVsYXkgc3RyZWFtCiAgICAgICAgIHN0YXJ0cyA9IFBsdW1iaW5nU3RyZWFtcy5ibG9ja2luZ0RlbGF5KHN0YXJ0cywgMzAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgICAgICAKLSAgICAgICAgLy8gY2FsY3VsYXRlIGRpc3BsYXkKKyAgICAgICAgLy8gY2FsY3VsYXRlIGRlbGF5CiAgICAgICAgIHN0YXJ0cyA9IHN0YXJ0cy5tb2RpZnkodiAtPiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHYpOwogICAgICAgICAKICAgICAgICAgc3RhcnRzID0gc3RhcnRzLmZpbHRlcih2IC0+IHYgPj0gMzAwKTsKQEAgLTE2MSw2NyArMTYxLDI3IEBACiAgICAgfQogICAgIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByZXNzdXJlUmVsaWV2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVGltaW5nIHZhcmlhbmNlcyBvbiBzaGFyZWQgbWFjaGluZXMgY2FuIGNhdXNlIHRoaXMgdGVzdCB0byBmYWlsCi0JCWFzc3VtZVRydWUoIUJvb2xlYW4uZ2V0Qm9vbGVhbigiZWRnZW50LmJ1aWxkLmNpIikpOworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzc3VyZVJlbGlldmVyRHJvcCgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFRvcG9sb2d5IHRvcG9sb2d5ID0gbmV3VG9wb2xvZ3koKTsKICAgICAgICAgCi0gICAgICAgIFRTdHJlYW08VGltZUFuZElkPiByYXcgPSB0b3BvbG9neS5wb2xsKCgpIC0+IG5ldyBUaW1lQW5kSWQoKSwgMTAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgICAgIAorICAgICAgICAvLyBWZXJpZnkgdGhlIHByZXNzdXJlUmVsaWV2ZXIgZHJvcHMgYW5kIHJldGFpbnMgdGhlIG1vc3QgcmVjZW50IHdoZW4KKyAgICAgICAgLy8gYmFja3ByZXNzdXJlIGV4aXN0cy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGVyZSwgYWxsIHRoZSB0dXBsZXMgaGl0IHRoZSByZWxpZXZlciBhdCBvbmNlLCB0aGUgZG93bnN0cmVhbSBwcm9jZXNzaW5nIChvbmVTaG90RGVsYXkpCisgICAgICAgIC8vIGNhdXNlcyBhIGJhY2t1cCBjYXVzaW5nIHRoZSByZWxpZXZlcidzIHF1ZXVlIHRvIGJlY29tZSBmdWxsIGFuZCBkcm9wIHR1cGxlcy4KKyAgICAgICAgLy8gVGhlIGZpcnN0IHR1cGxlIHNob3VsZCBiZSBwcm9jZXNzZWQsIHRoZW4gdGhlIGxhc3QgKG1vc3QgcmVjZW50KSBOIChOPT1xdWV1ZSBkZXB0aCkuCiAgICAgICAgIAotICAgICAgICBUU3RyZWFtPFRpbWVBbmRJZD4gcHIgPSBQbHVtYmluZ1N0cmVhbXMucHJlc3N1cmVSZWxpZXZlcihyYXcsIEZ1bmN0aW9ucy51bnBhcnRpdGlvbmVkKCksIDUpOworICAgICAgICBTdHJpbmdbXSB0dXBsZXMgPSB7IkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCJ9OworICAgICAgICBTdHJpbmdbXSBleHBUdXBsZXMgPSB7IkEiLCAiRiIsICJHIiwgIkgifTsgIC8vIHdpdGggcXVldWUgZGVwdGggb2YgMworICAgICAgICBUU3RyZWFtPFN0cmluZz4gcmF3ID0gdG9wb2xvZ3kuc3RyaW5ncyh0dXBsZXMpOwogICAgICAgICAKLSAgICAgICAgLy8gaW5zZXJ0IGEgYmxvY2tpbmcgZGVsYXkgYWN0aW5nIGFzIGRvd25zdHJlYW0gb3BlcmF0b3IgdGhhdCBjYW5ub3Qga2VlcCB1cAotICAgICAgICBUU3RyZWFtPFRpbWVBbmRJZD4gc2xvdyA9IFBsdW1iaW5nU3RyZWFtcy5ibG9ja2luZ0RlbGF5KHByLCAyMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIFRTdHJlYW08U3RyaW5nPiBwciA9IFBsdW1iaW5nU3RyZWFtcy5wcmVzc3VyZVJlbGlldmVyKHJhdywgRnVuY3Rpb25zLnVucGFydGl0aW9uZWQoKSwgMyk7CiAgICAgICAgIAotICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGRlbGF5Ci0gICAgICAgIFRTdHJlYW08VGltZUFuZElkPiBzbG93TSA9IHNsb3cubW9kaWZ5KHYgLT4gbmV3IFRpbWVBbmRJZCh2KSk7CisgICAgICAgIFRTdHJlYW08U3RyaW5nPiBwcjIgPSBQbHVtYmluZ1N0cmVhbXMuYmxvY2tpbmdPbmVTaG90RGVsYXkocHIsIDEsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgICAgICAKLSAgICAgICAgLy8gQWxzbyBwcm9jZXNzIHJhdyB0aGF0IHNob3VsZCBiZSB1bmFmZmVjdGVkIGJ5IHRoZSBzbG93IHBhdGgKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IHByb2Nlc3NlZCA9IHJhdy5hc1N0cmluZygpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIENvbmRpdGlvbjxMb25nPiB0Y1Nsb3dDb3VudCA9IHRvcG9sb2d5LmdldFRlc3RlcigpLmF0TGVhc3RUdXBsZUNvdW50KHNsb3csIDIwKTsKLSAgICAgICAgQ29uZGl0aW9uPExpc3Q8VGltZUFuZElkPj4gdGNSYXcgPSB0b3BvbG9neS5nZXRUZXN0ZXIoKS5zdHJlYW1Db250ZW50cyhyYXcpOwotICAgICAgICBDb25kaXRpb248TGlzdDxUaW1lQW5kSWQ+PiB0Y1Nsb3cgPSB0b3BvbG9neS5nZXRUZXN0ZXIoKS5zdHJlYW1Db250ZW50cyhzbG93KTsKLSAgICAgICAgQ29uZGl0aW9uPExpc3Q8VGltZUFuZElkPj4gdGNTbG93TSA9IHRvcG9sb2d5LmdldFRlc3RlcigpLnN0cmVhbUNvbnRlbnRzKHNsb3dNKTsKLSAgICAgICAgQ29uZGl0aW9uPExpc3Q8U3RyaW5nPj4gdGNQcm9jZXNzZWQgPSB0b3BvbG9neS5nZXRUZXN0ZXIoKS5zdHJlYW1Db250ZW50cyhwcm9jZXNzZWQpOwotICAgICAgICBjb21wbGV0ZSh0b3BvbG9neSwgdGNTbG93Q291bnQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0Y1Byb2Nlc3NlZC5nZXRSZXN1bHQoKS5zaXplKCkgPiB0Y1Nsb3dNLmdldFJlc3VsdCgpLnNpemUoKSk7Ci0gICAgICAgIGZvciAoVGltZUFuZElkIGRlbGF5IDogdGNTbG93TS5nZXRSZXN1bHQoKSkKLSAgICAgICAgICAgIGFzc2VydFRydWUoImRlbGF5OiIrZGVsYXksIGRlbGF5Lm1zIDwgMzAwKTsKLQotICAgICAgICAvLyBNdXN0IG5vdCBsb3NlIGFueSB0dXBsZXMgaW4gdGhlIG5vbiByZWxpZXZpbmcgcGF0aAotICAgICAgICBTZXQ8VGltZUFuZElkPiB1bmlxID0gbmV3IEhhc2hTZXQ8Pih0Y1Jhdy5nZXRSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0Y1Jhdy5nZXRSZXN1bHQoKS5zaXplKCksIHVuaXEuc2l6ZSgpKTsKLQotICAgICAgICAvLyBNdXN0IG5vdCBsb3NlIGFueSB0dXBsZXMgaW4gdGhlIG5vbiByZWxpZXZpbmcgcGF0aAotICAgICAgICBTZXQ8U3RyaW5nPiB1bmlxUHJvY2Vzc2VkID0gbmV3IEhhc2hTZXQ8Pih0Y1Byb2Nlc3NlZC5nZXRSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0Y1Byb2Nlc3NlZC5nZXRSZXN1bHQoKS5zaXplKCksIHVuaXFQcm9jZXNzZWQuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyh1bmlxLnNpemUoKSwgdW5pcVByb2Nlc3NlZC5zaXplKCkpOwotICAgICAgICAgICAKLSAgICAgICAgLy8gTWlnaHQgbG9zZSB0dXBsZXMsIGJ1dCBtdXN0IG5vdCBoYXZlIHNlbmQgZHVwbGljYXRlcwotICAgICAgICB1bmlxID0gbmV3IEhhc2hTZXQ8Pih0Y1Nsb3cuZ2V0UmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModGNTbG93LmdldFJlc3VsdCgpLnNpemUoKSwgdW5pcS5zaXplKCkpOwotICAgIH0KLSAgICAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzc3VyZVJlbGlldmVyV2l0aEluaXRpYWxEZWxheSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFRvcG9sb2d5IHRvcG9sb2d5ID0gbmV3VG9wb2xvZ3koKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBUU3RyZWFtPFN0cmluZz4gcmF3ID0gdG9wb2xvZ3kuc3RyaW5ncygiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIik7Ci0gICAgICAgIAotICAgICAgICBUU3RyZWFtPFN0cmluZz4gcHIgPSBQbHVtYmluZ1N0cmVhbXMucHJlc3N1cmVSZWxpZXZlcihyYXcsIHYgLT4gMCwgMTAwKTsKLSAgICAgICAgCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBwcjIgPSBQbHVtYmluZ1N0cmVhbXMuYmxvY2tpbmdPbmVTaG90RGVsYXkocHIsIDUsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICAKLSAgICAgICAgQ29uZGl0aW9uPExvbmc+IHRjQ291bnQgPSB0b3BvbG9neS5nZXRUZXN0ZXIoKS50dXBsZUNvdW50KHByMiwgOCk7Ci0gICAgICAgIENvbmRpdGlvbjxMaXN0PFN0cmluZz4+IGNvbnRlbnRzID0gdG9wb2xvZ3kuZ2V0VGVzdGVyKCkuc3RyZWFtQ29udGVudHMocHIyLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIik7CisgICAgICAgIENvbmRpdGlvbjxMb25nPiB0Y0NvdW50ID0gdG9wb2xvZ3kuZ2V0VGVzdGVyKCkudHVwbGVDb3VudChwcjIsIGV4cFR1cGxlcy5sZW5ndGgpOworICAgICAgICBDb25kaXRpb248TGlzdDxTdHJpbmc+PiBjb250ZW50cyA9IHRvcG9sb2d5LmdldFRlc3RlcigpLnN0cmVhbUNvbnRlbnRzKHByMiwgZXhwVHVwbGVzKTsKICAgICAgICAgY29tcGxldGUodG9wb2xvZ3ksIHRjQ291bnQpOwogICAgICAgICAKICAgICAgICAgYXNzZXJ0VHJ1ZSh0Y0NvdW50LnZhbGlkKCkpOwpAQCAtMjI5LDYgKzE4OSwxMDIgQEAKICAgICB9CiAgICAgCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlc3N1cmVSZWxpZXZlck5vRHJvcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFRvcG9sb2d5IHRvcG9sb2d5ID0gbmV3VG9wb2xvZ3koKTsKKyAgICAgICAgCisgICAgICAgIC8vIFNhbWUgcGlwZWxpbmUgY29uZmlnIGFzIHRlc3RQcmVzc3VyZVJlbGlldmVyRHJvcCBidXQgdGhlIHJlbGlldmVyIHF1ZXVlIGlzCisgICAgICAgIC8vIGJpZyBlbm91Z2ggdG8gYXZvaWQgZHJvcHMKKyAgICAgICAgU3RyaW5nW10gdHVwbGVzID0geyJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgifTsKKyAgICAgICAgVFN0cmVhbTxTdHJpbmc+IHJhdyA9IHRvcG9sb2d5LnN0cmluZ3ModHVwbGVzKTsKKyAgICAgICAgCisgICAgICAgIFRTdHJlYW08U3RyaW5nPiBwciA9IFBsdW1iaW5nU3RyZWFtcy5wcmVzc3VyZVJlbGlldmVyKHJhdywgRnVuY3Rpb25zLnVucGFydGl0aW9uZWQoKSwgMTAwKTsKKyAgICAgICAgCisgICAgICAgIFRTdHJlYW08U3RyaW5nPiBwcjIgPSBQbHVtYmluZ1N0cmVhbXMuYmxvY2tpbmdPbmVTaG90RGVsYXkocHIsIDEsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAKKyAgICAgICAgQ29uZGl0aW9uPExvbmc+IHRjQ291bnQgPSB0b3BvbG9neS5nZXRUZXN0ZXIoKS50dXBsZUNvdW50KHByMiwgdHVwbGVzLmxlbmd0aCk7CisgICAgICAgIENvbmRpdGlvbjxMaXN0PFN0cmluZz4+IGNvbnRlbnRzID0gdG9wb2xvZ3kuZ2V0VGVzdGVyKCkuc3RyZWFtQ29udGVudHMocHIyLCB0dXBsZXMpOworICAgICAgICBjb21wbGV0ZSh0b3BvbG9neSwgdGNDb3VudCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRUcnVlKHRjQ291bnQudmFsaWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGVudHMudmFsaWQoKSk7CisgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZXNzdXJlUmVsaWV2ZXJDb250aW51b3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRpbWluZyB2YXJpYW5jZXMgb24gc2hhcmVkIG1hY2hpbmVzIGNhbiBjYXVzZSB0aGlzIHRlc3QgdG8gZmFpbAorCQkvL2Fzc3VtZVRydWUoIUJvb2xlYW4uZ2V0Qm9vbGVhbigiZWRnZW50LmJ1aWxkLmNpIikpOworCisJCS8vIFRyeSB0byB2ZXJpZnkgbW9yZSBjb250aW51b3VzIHJlbGlldmVyIGJlaGF2aW9yIGluc3RlYWQgb2YganVzdCB0aGUKKwkJLy8gdGhlIG90aGVyIHByZXNzdXJlIHJlbGlldmVyIHRlc3RzIHdoZXJlIHRoZSBiYWNrcHJlc3N1cmUgb25seSBleGlzdHMKKwkJLy8gYXQgdGhlIGJlZ2lubmluZy4KKwkJLy8KKwkJLy8gR2VuZXJhdGUgQCAxMDB0cHMsIGNvbnN1bWUgQCA1dHBzLiAgCisJCS8vIFdpdGggcmVsaWV2ZXIgZGVwdGg9MSwgcm91Z2hseSBzaG91bGQgcHJvY2VzcyBldmVyeSAyMHRoIHR1cGxlLCB3aXRoIGVzc2VudGlhbGx5CisJCS8vIG5vIGRlbGF5IGluIHRoZSBxdWV1ZSAoY2VydGFpbmx5IGxlc3MgdGhhbiBzYXkgNTAlIG9mIHRoZSBjb25zdW1lciBkZWxheSwgaGVuY2UgPCAwLjUgKiAyMDBtcykKKwkJCisgICAgICAgIFRvcG9sb2d5IHRvcG9sb2d5ID0gbmV3VG9wb2xvZ3koKTsKKworICAgICAgICBUU3RyZWFtPFRpbWVBbmRJZD4gcmF3ID0gdG9wb2xvZ3kucG9sbCgoKSAtPiBuZXcgVGltZUFuZElkKCksIDEwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAKKyAgICAgICAgVFN0cmVhbTxUaW1lQW5kSWQ+IHByID0gUGx1bWJpbmdTdHJlYW1zLnByZXNzdXJlUmVsaWV2ZXIocmF3LCBGdW5jdGlvbnMudW5wYXJ0aXRpb25lZCgpLCAxKTsKKyAgICAgICAgCisgICAgICAgIFRTdHJlYW08VGltZUFuZElkPiBzbG93ID0gUGx1bWJpbmdTdHJlYW1zLmJsb2NraW5nRGVsYXkocHIsIDIwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgCisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgZGVsYXkgKHF1ZXVlIHRpbWUgKyBjb25zdW1lciBwcm9jZXNzaW5nKQorICAgICAgICBUU3RyZWFtPFRpbWVBbmRJZD4gc2xvd00gPSBzbG93Lm1vZGlmeSh2IC0+IG5ldyBUaW1lQW5kSWQodikpOworICAgICAgICAKKyAgICAgICAgLy8gQWxzbyBwcm9jZXNzIHJhdyB0aGF0IHNob3VsZCBiZSB1bmFmZmVjdGVkIGJ5IHRoZSBzbG93IHBhdGgKKyAgICAgICAgVFN0cmVhbTxUaW1lQW5kSWQ+IHByb2Nlc3NlZCA9IHJhdy5maWx0ZXIodCAtPiB0cnVlKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBDb25kaXRpb248TG9uZz4gdGNTbG93TUNvdW50ID0gdG9wb2xvZ3kuZ2V0VGVzdGVyKCkuYXRMZWFzdFR1cGxlQ291bnQoc2xvd00sIDEwKTsKKyAgICAgICAgQ29uZGl0aW9uPExpc3Q8VGltZUFuZElkPj4gdGNTbG93TSA9IHRvcG9sb2d5LmdldFRlc3RlcigpLnN0cmVhbUNvbnRlbnRzKHNsb3dNKTsKKyAgICAgICAgQ29uZGl0aW9uPExpc3Q8VGltZUFuZElkPj4gdGNQcm9jZXNzZWQgPSB0b3BvbG9neS5nZXRUZXN0ZXIoKS5zdHJlYW1Db250ZW50cyhwcm9jZXNzZWQpOworICAgICAgICBjb21wbGV0ZSh0b3BvbG9neSwgdGNTbG93TUNvdW50KTsKKyAgICAgICAgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJ0ZXN0UHJlc3N1cmVSZWxpZXZlckNvbnRpbnVvdXMoKSBmYXN0Q250OiVkIHNsb3dDbnQ6JWQiLAorICAgICAgICAgICAgICAgIHRjUHJvY2Vzc2VkLmdldFJlc3VsdCgpLnNpemUoKSwgdGNTbG93TS5nZXRSZXN1bHQoKS5zaXplKCkpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzbG93OiAiK3RjU2xvd00uZ2V0UmVzdWx0KCkpOworCisgICAgICAgIC8vIE5vIGxvc3QgdHVwbGVzIGluIHRoZSBmYXN0IHBhdGggKHN1Y2Nlc3NpdmUgSWRzLCBzdGFydGluZyBAIDEpCisgICAgICAgIGFzc2VydEVxdWFscygiZmFzdHBhdGggdHVwbGVzIGRyb3BwZWQiLAorICAgICAgICAgICAgICAgIHRjUHJvY2Vzc2VkLmdldFJlc3VsdCgpLnNpemUoKSwKKyAgICAgICAgICAgICAgICB0Y1Byb2Nlc3NlZC5nZXRSZXN1bHQoKS5nZXQodGNQcm9jZXNzZWQuZ2V0UmVzdWx0KCkuc2l6ZSgpLTEpLmlkKTsKKworICAgICAgICAvLyBObyBkdXAgdHVwbGVzIGluIHRoZSBmYXN0IHBhdGgKKyAgICAgICAgU2V0PFRpbWVBbmRJZD4gdW5pcVJhdyA9IG5ldyBIYXNoU2V0PD4odGNQcm9jZXNzZWQuZ2V0UmVzdWx0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZhc3RwYXRoIHR1cGxlcyBkdXBsaWNhdGVkIiwgdGNQcm9jZXNzZWQuZ2V0UmVzdWx0KCkuc2l6ZSgpLCB1bmlxUmF3LnNpemUoKSk7CisKKyAgICAgICAgLy8gZmFzdHBhdGggY291bnQgc2hvdWxkIGJlIHJvdWdobHkgMjB4IHRoZSBzbG93IGRlbGF5ZWQvcmVsaWV2ZWQgY291bnQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmF3Q250OiIrdGNQcm9jZXNzZWQuZ2V0UmVzdWx0KCkuc2l6ZSgpKyIgc2xvd01DbnQ6Iit0Y1Nsb3dNLmdldFJlc3VsdCgpLnNpemUoKSwKKyAgICAgICAgICAgICAgICB0Y1Byb2Nlc3NlZC5nZXRSZXN1bHQoKS5zaXplKCkgPj0gMTUgKiArdGNTbG93TS5nZXRSZXN1bHQoKS5zaXplKCkpOworICAgICAgICAKKyAgICAgICAgLy8gc2xvdyBzaG91bGQgcHJvY2VzcyByb3VnaGx5IGV2ZXJ5IDIwdGggdHVwbGUuLi4gbm90IHN1Y2Nlc3NpdmUgb25lcworICAgICAgICBUaW1lQW5kSWQgcHJldklkID0gbnVsbDsKKyAgICAgICAgZm9yIChUaW1lQW5kSWQgaWQgOiB0Y1Nsb3dNLmdldFJlc3VsdCgpKSB7CisgICAgICAgICAgICBpZiAocHJldklkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgaGF2ZSBwcm9jZXNzZWQgdGhlIDFzdCB0dXBsZQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygic2xvdyBmaXJzdElkIiwgMSwgaWQuaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc2VlbXMgbGlrZSB0aGlzIGNvdWxkIGJlIHNlbnNpdGl2ZSB0byBob3N0IGxvYWQKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJzbG93IGlkcyBwcmV2SWQ6IitwcmV2SWQrIiBpZDoiK2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgaWQuaWQgPj0gcHJldklkLmlkICsgMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGlkLmlkIDw9IHByZXZJZC5pZCArIDI1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZJZCA9IGlkOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBldmVyeSBzbG93IHR1cGxlIHNob3VsZCBiZSBwcm9jZXNzZWQgbmVhciBpbnN0YW50YW5lb3VzbHkgLSBzaG91bGRuJ3Qgd2FpdAorICAgICAgICAvLyBsb25nIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgZm9yIChUaW1lQW5kSWQgaWQgOiB0Y1Nsb3dNLmdldFJlc3VsdCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzbG93IGRlbGF5cyBwcmV2SWQ6IitwcmV2SWQrIiBpZDoiK2lkLAorICAgICAgICAgICAgICAgICAgICBpZC5tcyA8PSAzMDApOyAgLy8gMjAwbXMgY29uc3VtZXIgcHJvY2Vzc2luZyArIHVwIHRvICU1MCBvZiB0aGF0IHdhaXRpbmcgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHZlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVmFsdmU8SW50ZWdlcj4gdmFsdmUgPSBuZXcgVmFsdmU8PigpOwogICAgICAgICBhc3NlcnRUcnVlKHZhbHZlLmlzT3BlbigpKTsKQEAgLTU2MSwxMCArNjE3LDYgQEAKICAgICAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbGxlbEJhbGFuY2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE1heSBuZWVkIHR3ZWFrIHZhbGlkYXRpb24gc2Vuc2l0aXZpdHkgb3IgYWRkIHRoaXM6Ci0gICAgICAgIC8vIFRpbWluZyB2YXJpYW5jZXMgb24gc2hhcmVkIG1hY2hpbmVzIGNhbiBjYXVzZSB0aGlzIHRlc3QgdG8gZmFpbAotICAgICAgICAvLyBhc3N1bWVUcnVlKCFCb29sZWFuLmdldEJvb2xlYW4oImVkZ2VudC5idWlsZC5jaSIpKTsKLQogICAgICAgICBUb3BvbG9neSB0b3AgPSBuZXdUb3BvbG9neSgidGVzdFBhcmFsbGVsQmFsYW5jZWQiKTsKICAgICAgICAgCiAgICAgICAgIC8vIGFycmFuZ2UgZm9yIGV2ZW4gY2hhbm5lbHMgdG8gcHJvY2VzcyB+MnggYXMgbWFueSBhcyBvZGQgY2hhbm5lbHMuCkBAIC01NzYsNiArNjI4LDcgQEAKICAgICAgICAgCiAgICAgICAgIGludCB3aWR0aCA9IDQ7CiAgICAgICAgIGludCB0dXBDbnQgPSA2MDsKKyAgICAgICAgaW50IGV4cEV2ZW5DaENudCA9IDIgKiAodHVwQ250IC8gMyk7ICAgLy8gZXZlbjoyLzNyZHMsIG9kZDoxLzNyZCAKICAgICAgICAgSW50ZWdlcltdIHJlc3VsdFR1cGxlcyA9IG5ldyBJbnRlZ2VyW3R1cENudF07CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHVwQ250OyBpKyspCiAgICAgICAgICAgcmVzdWx0VHVwbGVzW2ldID0gaTsKQEAgLTYxNiwxNyArNjY5LDE5IEBACiAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwTWluU2VyaWFsRHVyYXRpb249IitleHBNaW5TZXJpYWxEdXJhdGlvbisiIGFjdER1cmF0aW9uPSIrYWN0RHVyYXRpb24sIAogICAgICAgICAgICAgICBhY3REdXJhdGlvbiA8IDAuNSAqIGV4cE1pblNlcmlhbER1cmF0aW9uKTsKICAgICAgICAgCi0gICAgICAgIGludCBldmVuQ2hDb3VudHMgPSAwOwotICAgICAgICBpbnQgb2RkQ2hDb3VudHMgPSAwOworICAgICAgICAvLyBWZXJpZnkgdGhlIGJhbGFuY2luZyBzZWVtZWQgdG8gd29yay4KKyAgICAgICAgLy8gT24gbG9hZGVkIHN5c3RlbXMgd2UndmUgc2VlbiBlQ250OjM3IG9DbnQ6MjMuICBTZXR0bGUgZm9yIGV4cEV2ZW5DbnQgKy0gMTUlCisgICAgICAgIGludCB0aHJlc2hvbGRDbnQgPSAoaW50KSAoZXhwRXZlbkNoQ250ICogMC4xNSk7CisgICAgICAgIGludCBldmVuQ2hDbnQgPSAwOwogICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgd2lkdGg7IGNoKyspIHsKLSAgICAgICAgICBhc3NlcnRUcnVlKGNoQ291bnRzW2NoXS5nZXQoKSAhPSAwKTsKKyAgICAgICAgICBhc3NlcnRUcnVlKCJjaDoiK2NoLCBjaENvdW50c1tjaF0uZ2V0KCkgIT0gMCk7CiAgICAgICAgICAgaWYgKGNoICUgMiA9PSAwKQotICAgICAgICAgICAgZXZlbkNoQ291bnRzICs9IGNoQ291bnRzW2NoXS5nZXQoKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBvZGRDaENvdW50cyArPSBjaENvdW50c1tjaF0uZ2V0KCk7CisgICAgICAgICAgICBldmVuQ2hDbnQgKz0gY2hDb3VudHNbY2hdLmdldCgpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUob2RkQ2hDb3VudHMgPiAwLjQgKiBldmVuQ2hDb3VudHMKLSAgICAgICAgICAgICYmIG9kZENoQ291bnRzIDwgMC42ICogZXZlbkNoQ291bnRzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJldmVuQ2hDbnQ6JWQgZXhwRXZlbkNoQ250OiVkICstOiVkIiwgZXZlbkNoQ250LCBleHBFdmVuQ2hDbnQsIHRocmVzaG9sZENudCksCisgICAgICAgICAgICAgICAgZXZlbkNoQ250ID49IChleHBFdmVuQ2hDbnQgLSB0aHJlc2hvbGRDbnQpCisgICAgICAgICAgICAgICAgJiYgZXZlbkNoQ250IDw9IChleHBFdmVuQ2hDbnQgKyB0aHJlc2hvbGRDbnQpKTsgCiAgICAgfQogICAgIAogLy8gICAgQFRlc3QKZGlmZiAtLWdpdCBhL2FwaS90b3BvbG9neS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvVFN0cmVhbVRlc3QuamF2YSBiL2FwaS90b3BvbG9neS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvVFN0cmVhbVRlc3QuamF2YQppbmRleCA3NjI1NjY3Li45ZmFlNWVkIDEwMDY0NAotLS0gYS9hcGkvdG9wb2xvZ3kvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3RvcG9sb2d5L1RTdHJlYW1UZXN0LmphdmEKKysrIGIvYXBpL3RvcG9sb2d5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC90b3BvbG9neS9UU3RyZWFtVGVzdC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU2luazsKQEAgLTEzNSw3ICsxMzYsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgUGVlay4gVGhpcyB3aWxsIG9ubHkgd29yayB3aXRoIGFuIGVtYmVkZGVkIHNldHVwLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogQHRocm93cyBFeGNlcHRpb24gb24gZmFpbHVyZQogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFBlZWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTYwMCw3ICs2MDEsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgVW5pb24gd2l0aCBpdHNlbGYuCiAgICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBvbiBmYWlsdXJlCiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pb25XaXRoU2VsZigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNzQ1LDE0ICs3NDYsMjYgQEAKICAgICAgICAgICAgICAgICBUb3BvbG9neSB0ID0gbmV3VG9wb2xvZ3koKTsKICAgICAgICAgICAgICAgICBUU3RyZWFtPFN0cmluZz4gcyA9IHQuc3RyaW5ncygiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIik7CiAgICAgICAgICAgICAgICAgLy8gVGhyb3cgb24gdGhlIDh0aCB0dXBsZQotICAgICAgICAgICAgICAgIHMuc2luaygodHVwbGUpIC0+IHsgaWYgKCJoIi5lcXVhbHModHVwbGUpKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgVGVzdCBFeGNlcHRpb24iKTt9KTsKKyAgICAgICAgICAgICAgICBzLnNpbmsoKHR1cGxlKSAtPiB7IGlmICgiaCIuZXF1YWxzKHR1cGxlKSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1UV0UgRXhwZWN0ZWQgVGVzdCBFeGNlcHRpb24iKTt9KTsKICAgICAgICAgICAgICAgICAvLyBFeHBlY3QgNyB0dXBsZXMgb3V0IG9mIDgKICAgICAgICAgICAgICAgICBDb25kaXRpb248TG9uZz4gdGMgPSB0LmdldFRlc3RlcigpLnR1cGxlQ291bnQocywgNyk7Ci0gICAgICAgICAgICAgICAgY29tcGxldGUodCwgdGMpOworLy8gICAgICAgICAgICAgICAgY29tcGxldGUodCwgdGMpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKHQsIHRjKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1UV0UgY29tcGxldGUoKSB0aHJldyBlOiIrZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KLSAgICAgICAgd2FpdEZvckNvbXBsZXRpb24oY29tcGxldGVyLCBleGVjdXRpb25zKTsKKy8vICAgICAgICB3YWl0Rm9yQ29tcGxldGlvbihjb21wbGV0ZXIsIGV4ZWN1dGlvbnMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2FpdEZvckNvbXBsZXRpb24oY29tcGxldGVyLCBleGVjdXRpb25zKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTVRXRSB3YWl0Rm9yQ29tcGxldGlvbigpIHRocmV3IGU6IitlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC03NjIsMjQgKzc3NSw1OCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpVG9wb2xvZ3lQb2xsV2l0aEVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogSXQncyB1bmNsZWFyIGV4YWN0bHkgd2hhdCB0aGlzIHRlc3QgaXMgc3VwcG9zZWQgdG8gYWNoaWV2ZQorICAgICAgICAgKiAoaGVuY2UgdW5jbGVhciBob3cgdG8gZW5zdXJlIGl0cyBhY2hpZXZpbmcgaXQpLgorICAgICAgICAgKiBJcyBpdCBqdXN0IHRyeWluZyB0byB2ZXJpZnkgdGhhdCBhIGZhaWx1cmUgaW4gb25lIHRvcG9sb2d5L2pvYgorICAgICAgICAgKiBkb2Vzbid0IGFmZmVjdCB0aGUgZXhlY3V0aW9uIG9mIGFub3RoZXI/CisgICAgICAgICAqIAorICAgICAgICAgKiBUaGUgd2F5IHRoZSB0ZXN0IGlzIHdyaXR0ZW4gSSdtIG5vdCBzdXJlIHRoZXJlJ3MgYW55IGd1YXJhbnRlZQorICAgICAgICAgKiB0aGF0IHRoZSAiRXhwZWN0ZWQgRXhjZXB0aW9uIiB3aWxsIGJlIGdlbmVyYXRlZCB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgICogbnVtYmVyIG9mIHRpbWVzLgorICAgICAgICAgKiBJcyBpdCBwb3NzaWJsZSB0aGUgY29tcGxldGlvbiBjb25kaXRpb24gY291bGQgZ2V0IGV2YWx1YXRlZAorICAgICAgICAgKiB0cnVlIChoYXZpbmcgc2VlbiB0aGUgN3RoIHR1cGxlKSBiZWZvcmUgdGhlIDh0aCB0dXBsZSBpcyBnZW5lcmF0ZWQKKyAgICAgICAgICogYW5kIHByb2Nlc3NlZCBieSB0aGUgc2luayBmbiByYWlzaW5nIHRoZSBleGNlcHRpb24sIHJlc3VsdGluZyBpbgorICAgICAgICAgKiB0aGUgam9iIGJlaW5nIGNsb3NlZC4uLiBiZWZvcmUgdGhlIDh0aCBpcyBnZW5lcmF0ZWQgYW5kIHByb2Nlc3NlZD8KKyAgICAgICAgICogSSdtIGFsc28gc2VlaW5nIG1vcmUgIkV4cGVjdGVkIFRlc3QgRXhjZXB0aW9uIiB0cmFjZXMgdGhhbiBJIGV4cGVjdGVkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQW5ub3RhdGUgdGhpcyBhbmQgdGhlIE1QV0UgdGVzdCBhIGJpdCB0byBoZWxwIHVuZGVyc3RhbmQgd2hhdCB3ZSdyZSBzZWVpbmcKKyAgICAgICAgICogaW4gdGhlIG91dHB1dC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBleGVjdXRpb25zID0gNDsKICAgICAgICAgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZTxCb29sZWFuPiBjb21wbGV0ZXIgPSBuZXcgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZTw+KAogICAgICAgICAgICAgICAgIEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woZXhlY3V0aW9ucykpOworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGV4Y0NudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhlY3V0aW9uczsgaSsrKSB7CiAgICAgICAgICAgICBjb21wbGV0ZXIuc3VibWl0KCgpIC0+IHsKICAgICAgICAgICAgICAgICBUb3BvbG9neSB0ID0gbmV3VG9wb2xvZ3koKTsKICAgICAgICAgICAgICAgICBBdG9taWNMb25nIG4gPSBuZXcgQXRvbWljTG9uZygwKTsKICAgICAgICAgICAgICAgICBUU3RyZWFtPExvbmc+IHMgPSB0LnBvbGwoKCkgLT4gbi5pbmNyZW1lbnRBbmRHZXQoKSwgMTAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgICAgICAgICAgICAgLy8gVGhyb3cgb24gdGhlIDh0aCB0dXBsZQotICAgICAgICAgICAgICAgIHMuc2luaygodHVwbGUpIC0+IHsgaWYgKDggPT0gbi5nZXQoKSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIFRlc3QgRXhjZXB0aW9uIik7fSk7CisgICAgICAgICAgICAgICAgcy5zaW5rKCh0dXBsZSkgLT4geyBpZiAoOCA9PSBuLmdldCgpKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTVRQV0UgRXhwZWN0ZWQgVGVzdCBFeGNlcHRpb24gIyAiK2V4Y0NudC5pbmNyZW1lbnRBbmRHZXQoKSk7fSk7CiAgICAgICAgICAgICAgICAgLy8gRXhwZWN0IDcgdHVwbGVzIG91dCBvZiA4CiAgICAgICAgICAgICAgICAgQ29uZGl0aW9uPExvbmc+IHRjID0gdC5nZXRUZXN0ZXIoKS50dXBsZUNvdW50KHMsIDcpOwotICAgICAgICAgICAgICAgIGNvbXBsZXRlKHQsIHRjKTsKKy8vICAgICAgICAgICAgICBjb21wbGV0ZSh0LCB0Yyk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGUodCwgdGMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHJlY2VpdmluZyB0aGUgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIGhlcmUgKGFuZCBpdCBwZXJjb2xhdGVzIHRocm91Z2ggd2FpdEZvckNvbXBsZXRpb24KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNVFBXRSBjb21wbGV0ZSgpIHRocmV3IGU6IitlKTsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQotICAgICAgICB3YWl0Rm9yQ29tcGxldGlvbihjb21wbGV0ZXIsIGV4ZWN1dGlvbnMpOwotICAgIH0KKy8vICAgICAgd2FpdEZvckNvbXBsZXRpb24oY29tcGxldGVyLCBleGVjdXRpb25zKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhaXRGb3JDb21wbGV0aW9uKGNvbXBsZXRlciwgZXhlY3V0aW9ucyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1UUFdFIHdhaXRGb3JDb21wbGV0aW9uKCkgdGhyZXcgZToiK2UpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgIH0KICAgICAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RKb2luV2l0aFdpbmRvdygpIHRocm93cyBFeGNlcHRpb257CkBAIC04NTMsMTUgKzkwMCwyOSBAQAogICAgICAgICBDb25kaXRpb248TG9uZz4gdGMgPSB0LmdldFRlc3RlcigpLnR1cGxlQ291bnQoam9pbnNIYXBwZW5lZCwgMTAwKTsKICAgICAgICAgY29tcGxldGUodCwgdGMpOyAgICAgIAogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFRpbWVvdXRWYWx1ZShsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXRzKSB7CisgICAgICAgIC8vIHRyeSB0byBwcm90ZWN0IHRoZSB0ZXN0cyBmcm9tIHRpbWluZyBvdXQgcHJlbWF0dXJlbHkKKyAgICAgICAgLy8gaW4gdGhlIGZhY2Ugb2Ygb3ZlcmxvYWRlZC9zbG93IGJ1aWxkL3Rlc3Qgc2VydmVycy4KKyAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbigiZWRnZW50LmJ1aWxkLmNpIikpIHsKKyAgICAgICAgICAgIC8vIGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIGJhc2UgdGhlIGRlY2lzaW9uIG9mIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRpbWVvdXQgYW5kL29yIHVuaXRzCisgICAgICAgICAgICByZXR1cm4gdGltZW91dCAqIDI7ICAvLyB0cnkgdG8gbWluaW1pemUKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGltZW91dDsKKyAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgd2FpdEZvckNvbXBsZXRpb24oRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZTxCb29sZWFuPiBjb21wbGV0ZXIsIGludCBudW10YXNrcykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIGludCByZW1haW5pbmdUYXNrcyA9IG51bXRhc2tzOworICAgICAgICBsb25nIGdldEZ1dHVyZVRpbWVvdXQgPSA0OworICAgICAgICBUaW1lVW5pdCBnZXRGdXR1cmVUaW1lb3V0VW5pdHMgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgICAgICBnZXRGdXR1cmVUaW1lb3V0ID0gZ2V0VGltZW91dFZhbHVlKGdldEZ1dHVyZVRpbWVvdXQsIGdldEZ1dHVyZVRpbWVvdXRVbml0cyk7CiAgICAgICAgIHdoaWxlIChyZW1haW5pbmdUYXNrcyA+IDApIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRnV0dXJlPEJvb2xlYW4+IGNvbXBsZXRlZCA9IGNvbXBsZXRlci5wb2xsKDQsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgICAgIEZ1dHVyZTxCb29sZWFuPiBjb21wbGV0ZWQgPSBjb21wbGV0ZXIucG9sbChnZXRGdXR1cmVUaW1lb3V0LCBnZXRGdXR1cmVUaW1lb3V0VW5pdHMpOwogICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvbXBsZXRlciB0aW1lZCBvdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obmV3IFRpbWVvdXRFeGNlcHRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJDb21wbGV0ZXIgdGltZWQgb3V0OiAlZCVzIHRpbWVvdXQiLCBnZXRGdXR1cmVUaW1lb3V0LCBnZXRGdXR1cmVUaW1lb3V0VW5pdHMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtc2cpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuZXcgVGltZW91dEV4Y2VwdGlvbihtc2cpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZC5nZXQoKTsKZGlmZiAtLWdpdCBhL2FwaS90b3BvbG9neS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvVG9wb2xvZ3lUZXN0LmphdmEgYi9hcGkvdG9wb2xvZ3kvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3RvcG9sb2d5L1RvcG9sb2d5VGVzdC5qYXZhCmluZGV4IGNjMWMwNTkuLjAzM2JhYTkgMTAwNjQ0Ci0tLSBhL2FwaS90b3BvbG9neS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvVG9wb2xvZ3lUZXN0LmphdmEKKysrIGIvYXBpL3RvcG9sb2d5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC90b3BvbG9neS9Ub3BvbG9neVRlc3QuamF2YQpAQCAtMTM0LDIzICsxMzQsMjMgQEAKICAgICAgICAgICAgIGpvYiA9IGpmLmdldCgpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpvYi5TdGF0ZS5SVU5OSU5HLCBqb2IuZ2V0Q3VycmVudFN0YXRlKCkpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBzZXRQb2xsRnJlcXVlbmN5KHMsIDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIHNldFBvbGxGcmVxdWVuY3kocywgMTAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgICAgICAgICBjbnQuc2V0KDApOwotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMykpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMSkpOwogICAgICAgICAgICAgaW50IGN1ckNudCA9IGNudC5nZXQoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoImN1ckNudD0iK2N1ckNudCwgY3VyQ250ID49IDIwKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2V0UG9sbEZyZXF1ZW5jeShzLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgICAgIGNudC5zZXQoMCk7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzKSk7Ci0gICAgICAgICAgICBjdXJDbnQgPSBjbnQuZ2V0KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJjdXJDbnQ9IitjdXJDbnQsIGN1ckNudCA+PSAyICYmIGN1ckNudCA8PSA0KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImN1ckNudD0iK2N1ckNudCwgY3VyQ250ID49IDcwKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgc2V0UG9sbEZyZXF1ZW5jeShzLCAxMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgICAgICAgICBjbnQuc2V0KDApOwotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMykpOworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMSkpOwogICAgICAgICAgICAgY3VyQ250ID0gY250LmdldCgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiY3VyQ250PSIrY3VyQ250LCBjdXJDbnQgPj0gMjApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiY3VyQ250PSIrY3VyQ250LCBjdXJDbnQgPj0gNSAmJiBjdXJDbnQgPD0gMjApOworICAgICAgICAgICAgCisgICAgICAgICAgICBzZXRQb2xsRnJlcXVlbmN5KHMsIDEwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgY250LnNldCgwKTsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEpKTsKKyAgICAgICAgICAgIGN1ckNudCA9IGNudC5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImN1ckNudD0iK2N1ckNudCwgY3VyQ250ID49IDcwKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChqb2IgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL2FwaS93aW5kb3cvYnVpbGQuZ3JhZGxlIGIvYXBpL3dpbmRvdy9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjQ0MWQuLjAwMDAwMDAKLS0tIGEvYXBpL3dpbmRvdy9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6ZnVuY3Rpb24nCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0KLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KZGlmZiAtLWdpdCBhL2FwaS93aW5kb3cvcG9tLnhtbCBiL2FwaS93aW5kb3cvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ0MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBpL3dpbmRvdy9wb20ueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktd2luZG93PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IEFQSTogV2luZG93PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXBpL3dpbmRvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvd2luZG93L1dpbmRvd1Rlc3QuamF2YSBiL2FwaS93aW5kb3cvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3dpbmRvdy9XaW5kb3dUZXN0LmphdmEKaW5kZXggNDVkNGM2MS4uOThmMDRlYSAxMDA2NDQKLS0tIGEvYXBpL3dpbmRvdy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvd2luZG93L1dpbmRvd1Rlc3QuamF2YQorKysgYi9hcGkvd2luZG93L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC93aW5kb3cvV2luZG93VGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24uRnVuY3Rpb25zLnVucGFydGl0aW9uZWQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LndpbmRvdy5Qb2xpY2llcy5hbHdheXNJbnNlcnQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIApAQCAtMzUsNiArMzYsNyBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3I7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5CaUNvbnN1bWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LndpbmRvdy5JbnNlcnRpb25UaW1lTGlzdDsKQEAgLTI5Myw3ICsyOTUsNyBAQAogICAgICAgICAKICAgICAgICAgd2luZG93LnJlZ2lzdGVyU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoNSkpOwogICAgICAgICAKLSAgICAgICAgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyA4MDAwOworICAgICAgICBsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIDQwMDA7CiAgICAgICAgIExpc3Q8VGhyZWFkPiB0aHJlYWRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGludCBOVU1fVEhSRUFEUyA9IDEwOwogICAgICAgICAvLyBDcmVhdGUgMTAgdGhyZWFkcy4gRWFjaCBpbnNlcnRzIGF0IDEsMDAwIEh6CkBAIC0zNzUsNyArMzc3LDcgQEAKICAgICAgICAgICAgIHdpbmRvdy5pbnNlcnQoMSk7CiAgICAgICAgIH0sIDAsIDEwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogCi0gICAgICAgIFRocmVhZC5zbGVlcCgxMTAwMCk7CisgICAgICAgIFRocmVhZC5zbGVlcCg0MDAwKTsKICAgICAgICAgc2YuY2FuY2VsKHRydWUpOwogICAgICAgICBkb3VibGUgdG9sZXJhbmNlID0gLjA4OwogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtQmF0Y2hlcy5zaXplKCk7IGkrKyl7CkBAIC00MTUsNyArNDE3LDcgQEAKICAgICAgICAgCQl3aW5kb3cuaW5zZXJ0KGkpOwogICAgICAgICB9LCAwLCAxLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogCi0gICAgICAgIFRocmVhZC5zbGVlcCgxMTAwMCk7CisgICAgICAgIFRocmVhZC5zbGVlcCg0MDAwKTsKICAgICAgICAgc2YuY2FuY2VsKHRydWUpOwogICAgICAgICB0cnkgewogICAgICAgICAgIHNmLmdldCgpOwpAQCAtNDU3LDE5ICs0NTksMjIgQEAKICAgICAgICAgCiAgICAgICAgIHdpbmRvdy5yZWdpc3RlclNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZShuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDUpKTsKIAorICAgICAgICBBdG9taWNJbnRlZ2VyIGNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICAgICAgaW50IE1BWF9UVVBfQ05UID0gMzAwOwogICAgICAgICBTY2hlZHVsZWRGdXR1cmU8Pz4gc2YgPSBzZXMuc2NoZWR1bGVBdEZpeGVkUmF0ZShuZXcgUnVubmFibGUoKXsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGlmKGNvdW50IDwgMTAwMCl7Ci0gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5pbnNlcnQoY291bnQrKyk7CisgICAgICAgICAgICAgICAgaWYoY291bnQuZ2V0KCkgPCBNQVhfVFVQX0NOVCl7CisgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5pbnNlcnQoY291bnQuaW5jcmVtZW50QW5kR2V0KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICB9LCAwLCAxMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKIAotICAgICAgICBUaHJlYWQuc2xlZXAoMTEwMDApOworICAgICAgICBsb25nIGluc2VydE1zZWMgPSBNQVhfVFVQX0NOVCAqIDEwIC8qMTBtc2VjL3R1cCovOworICAgICAgICBUaHJlYWQuc2xlZXAoaW5zZXJ0TXNlYyArIDEwMDAvKmV4dHJhIHNlYyovKTsKICAgICAgICAgc2YuY2FuY2VsKHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgdGVzdCIsIE1BWF9UVVBfQ05ULCBjb3VudC5nZXQoKSk7CiAgICAgICAgIGludCBudW1UdXBsZXMgPSAwOwogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYmF0Y2hlcy5zaXplKCkgLSAxOyBpKyspewogICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBiYXRjaCA9IGJhdGNoZXMuZ2V0KGkpOwpAQCAtNDgwLDcgKzQ4NSw5IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIG51bVR1cGxlcyArPSBiYXRjaGVzLmdldChiYXRjaGVzLnNpemUoKSAtMSkuc2l6ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJOdW1iZXIgb2YgdHVwbGVzIHN1Ym1pdHRlZCAoMTAwMCkgIT0gbnVtYmVyIG9mIHR1cGxlcyBwcm9jZXNzZWQgaW4gYmF0Y2ggKCIgKyBudW1UdXBsZXMgKyAiKSIsIG51bVR1cGxlcyA9PSAxMDAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2YgYmF0Y2ggdHVwbGVzIiwgY291bnQuZ2V0KCksIG51bVR1cGxlcyk7CisgICAgICAgIGFzc2VydFRydWUoIk51bWJlciBvZiBiYXRjaGVzIGV4cDoiK01BWF9UVVBfQ05ULzEwMCsiIGdvdDoiK2JhdGNoZXMuc2l6ZSgpLAorICAgICAgICAgICAgICAgIHdpdGhpblRvbGVyYW5jZUFtdCgoZG91YmxlKU1BWF9UVVBfQ05ULzEwMCwgKGRvdWJsZSliYXRjaGVzLnNpemUoKSwgMSkpOyAvLyArLy0gMQogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0T25UaW1lRXZpY3Rpb25zKExpc3Q8TG9uZz4gZGlmZnMpIHsKQEAgLTQ5Nyw0ICs1MDQsMTAgQEAKICAgICAgICAgcmV0dXJuIChhY3R1YWwgPCBoaWdoQm91bmQgJiYgYWN0dWFsID4gbG93Qm91bmQpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3aXRoaW5Ub2xlcmFuY2VBbXQoZG91YmxlIGV4cGVjdGVkLCBEb3VibGUgYWN0dWFsLCBkb3VibGUgdG9sZXJhbmNlQW10KSB7CisgICAgICAgIGRvdWJsZSBsb3dCb3VuZCA9IGV4cGVjdGVkIC0gdG9sZXJhbmNlQW10OworICAgICAgICBkb3VibGUgaGlnaEJvdW5kID0gZXhwZWN0ZWQgKyB0b2xlcmFuY2VBbXQ7CisgICAgICAgIHJldHVybiAoYWN0dWFsIDw9IGhpZ2hCb3VuZCAmJiBhY3R1YWwgPj0gbG93Qm91bmQpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvYXBwcy8uY2xhc3NwYXRoIGIvYXBwcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM5MjkzLi4wMDAwMDAwCi0tLSBhL2FwcHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImlvdC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iaW90L3NyYy90ZXN0L2phdmEiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJydW50aW1lL3NyYy9tYWluL2phdmEiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJydW50aW1lL3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvZXh0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkpVTklUX0NPTlRBSU5FUi80Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2FwaSIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9jb25uZWN0b3JzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL3Byb3ZpZGVycyIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9zcGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvcnVudGltZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9hcHBzLy5wcm9qZWN0IGIvYXBwcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyZmM1NC4uMDAwMDAwMAotLS0gYS9hcHBzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+YXBwczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hcHBzL2lvdC9idWlsZC5ncmFkbGUgYi9hcHBzL2lvdC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNDIxODcuLjAwMDAwMDAKLS0tIGEvYXBwcy9pb3QvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOnRvcG9sb2d5JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczpwdWJzdWInCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOmlvdCcKLSAgCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICd0ZXN0Q29tcGlsZScsICc6cHJvdmlkZXJzOmRpcmVjdCcKLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KZGlmZiAtLWdpdCBhL2FwcHMvaW90L3BvbS54bWwgYi9hcHBzL2lvdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjExN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL2lvdC9wb20ueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBwcy1pb3Q8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQXBwczogSW9UPC9uYW1lPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtcHVic3ViPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXBwcy9wb20ueG1sIGIvYXBwcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODNlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL3BvbS54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHM8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQXBwczwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmlvdDwvbW9kdWxlPgorICAgIDxtb2R1bGU+cnVudGltZTwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FwcHMvcnVudGltZS9idWlsZC5ncmFkbGUgYi9hcHBzL3J1bnRpbWUvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWZiZTg1Li4wMDAwMDAwCi0tLSBhL2FwcHMvcnVudGltZS9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpydW50aW1lOmpvYnJlZ2lzdHJ5JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6cnVudGltZTphcHBzZXJ2aWNlJwotICAKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ3Rlc3RDb21waWxlJywgJzpwcm92aWRlcnM6ZGlyZWN0JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnJ1bnRpbWU6am14Y29udHJvbCcKLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KZGlmZiAtLWdpdCBhL2FwcHMvcnVudGltZS9wb20ueG1sIGIvYXBwcy9ydW50aW1lL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiYmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvcnVudGltZS9wb20ueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBwcy1ydW50aW1lPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IEFwcHM6IFJ1bnRpbWU8L25hbWU+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtam9icmVnaXN0cnk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWpteGNvbnRyb2w8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hcHBzL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hcHBzL3J1bnRpbWUvSm9iTW9uaXRvckFwcC5qYXZhIGIvYXBwcy9ydW50aW1lL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYXBwcy9ydW50aW1lL0pvYk1vbml0b3JBcHAuamF2YQppbmRleCAyYTkwY2MxLi5hZmU5NTc1IDEwMDY0NAotLS0gYS9hcHBzL3J1bnRpbWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hcHBzL3J1bnRpbWUvSm9iTW9uaXRvckFwcC5qYXZhCisrKyBiL2FwcHMvcnVudGltZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FwcHMvcnVudGltZS9Kb2JNb25pdG9yQXBwLmphdmEKQEAgLTE2MCw3ICsxNjAsNyBAQAogICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGpvYiB0byBjb21wbGV0ZQogICAgICAgICAgICAgbG9uZyBzdGFydFdhaXRpbmcgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIGZvciAobG9uZyB3YWl0Rm9yTWlsbGlzID0gQ29udHJvbHMuSk9CX0hPTERfQUZURVJfQ0xPU0VfU0VDUyAqIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXRGb3JNaWxsaXMgPCAwOworICAgICAgICAgICAgICAgICAgICB3YWl0Rm9yTWlsbGlzID49IDA7CiAgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JNaWxsaXMgLT0gMTAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKGpvYk1iZWFuLmdldEN1cnJlbnRTdGF0ZSgpID09IEpvYi5TdGF0ZS5DTE9TRUQpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvYmluYXJ5LXJlbGVhc2UvTElDRU5TRSBiL2JpbmFyeS1yZWxlYXNlL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTRiY2QuLjAwMDAwMDAKLS0tIGEvYmluYXJ5LXJlbGVhc2UvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgInt9IgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQge3l5eXl9IHtuYW1lIG9mIGNvcHlyaWdodCBvd25lcn0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUFQQUNIRSBFREdFTlQgU1VCQ09NUE9ORU5UUzoKLQotVGhpcyBBcGFjaGUgRWRnZW50IGJpbmFyeSByZWxlYXNlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aAotc2VwYXJhdGUgY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuICBZb3VyIHVzZSBvZiB0aGVzZQotY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzLgotCi1UaGUgYmluYXJ5IHJlbGVhc2UgaW5jbHVkZXMgc29tZSBiaW5hcnkgY29udGVudCB3aXRoIGFzc29jaWF0ZWQKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgKCJFUEwtMS4wIikgYW5kIAotQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoIkNEREwtMS4wIiBhbmQgQ0RETC0xLjEiKQotbGljZW5zZXMgYXMgbm90ZWQgYmVsb3cuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1leHQvICAgICMgY29tbW9uIGRlcGVuZGVuY2llcyBmb3IgYWxsIEVkZ2VudCBjb21wb25lbnRzCi0gIGdzb24tMi4yLjQuamFyICAgICAgICAgICAgICAgICAgICBjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuMi40Ci0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2dzb24tMi4yLjQuQUwtMi4wCi0gICAgICAgIAotICBtZXRyaWNzLWNvcmUtMy4xLjIuamFyICAgICAgICAgICAgaW8uZHJvcHdpemFyZC5tZXRyaWNzOm1ldHJpY3MtY29yZTozLjEuMgotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9tZXRyaWNzLWNvcmUtMy4xLjIuQUwtMi4wCi0gICAgICAgIAotICBzbGY0ai1hcGktMS43LjEyLmphciAgICAgICAgICAgICAgb3JnLnNsZjRqOnNsZjRqLWFwaToxLjcuMTIKLSAgc2xmNGotamRrMTQtMS43LjEyLmphcgotICAgICAgICBMSUNFTlNFOiBNSVQgICAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9zbGY0ai0xLjcuMTIuTUlUCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1hbmFseXRpY3MvbWF0aDMvZXh0LwotICBjb21tb25zLW1hdGgzLTMuNC4xLmphciAgICAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtbWF0aDM6My40LjEKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1tYXRoMy0zLjQuMS5BTC0yLjAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvbm5lY3RvcnMvaHR0cC9leHQKLSAgaHR0cGNsaWVudC00LjUuMS5qYXIgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNsaWVudDo0LjUuMQotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY2xpZW50LTQuNS4xLkFMLTIuMAotICAgICAgICAKLSAgaHR0cGNvcmUtNC40LjQuamFyICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNvcmU6NC40LjQKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNvcmUtNC40LjQuQUwtMi4wCi0gICAgICAgIAotICBjb21tb25zLWNvZGVjLTEuOS5qYXIgICAgICAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtY29kZWM6MS45Ci0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtY29kZWMtMS45LkFMLTIuMAotICAgICAgICAKLSAgY29tbW9ucy1sb2dnaW5nLTEuMi5qYXIgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLWxvZ2dpbmc6MS4yCi0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbG9nZ2luZy0xLjIuQUwtMi4wCi0gICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvbm5lY3RvcnMvaW90cC9leHQKLSAgd2F0c29uLWlvdC0wLjIuMi5qYXIgICAgICAgICAgICAgIGNvbS5pYm0ubWVzc2FnaW5nOndhdHNvbi1pb3Q6MC4yLjIKLSAgICAgICAgTElDRU5TRTogRVBMLTEuMCAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvd2F0c29uLWlvdC0wLjIuMi5FUEwtMS4wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IGJpbmFyeSBmb3JtIGNvbnRlbnQgaXMgaW5jbHVkZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL212bnJlcG9zaXRvcnkuY29tL2FydGlmYWN0L2NvbS5pYm0ubWVzc2FnaW5nL3dhdHNvbi1pb3QvMC4yLjIKLSAgICAgICAgCi0gIGNvbW1vbnMtY29kZWMtMS4xMC5qYXIgICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1jb2RlYzoxLjEwCi0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtY29kZWMtMS4xMC5BTC0yLjAKLSAgICAgICAgCi0gIGNvbW1vbnMtbGFuZzMtMy40LmphciAgICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1sYW5nMzozLjQKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1sYW5nMy0zLjQuQUwtMi4wCi0gICAgICAgIAotICBjb21tb25zLWxvZ2dpbmctMS4yLmphciAgICAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtbG9nZ2luZzoxLjIKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1sb2dnaW5nLTEuMi5BTC0yLjAKLSAgICAgICAgCi0gIGNvbW1vbnMtbmV0LTMuMy5qYXIgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1uZXQ6My4zCi0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbmV0LTMuMy5BTC0yLjAKLSAgICAgICAgCi0gIGdzb24tMi42LjEuamFyICAgICAgICAgICAgICAgICAgICBjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuNi4xCi0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2dzb24tMi42LjEuQUwtMi4wCi0gICAgICAgIAotICBodHRwY2xpZW50LTQuNS4xLmphciAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY2xpZW50OjQuNS4xCi0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2h0dHBjbGllbnQtNC41LjEuQUwtMi4wCi0gICAgICAgIAotICBodHRwY29yZS00LjQuMy5qYXIgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZTo0LjQuMwotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY29yZS00LjQuMy5BTC0yLjAKLSAgICAgICAgCi0gIGpvZGEtdGltZS0yLjkuMi5qYXIgICAgICAgICAgICAgICBqb2RhLXRpbWU6am9kYS10aW1lOjIuOS4yCi0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pvZGEtdGltZS0yLjkuMi5BTC0yLjAKLSAgICAgICAgCi0gIGxvZzRqLTEuMi4xNy5qYXIgICAgICAgICAgICAgICAgICBsb2c0ajpsb2c0ajoxLjIuMTcKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbG9nNGotMS4yLjE3LkFMLTIuMAotICAgICAgICAKLSAgb3JnLmVjbGlwc2UucGFoby5jbGllbnQubXF0dHYzLTEuMS4wLmphciAgb3JnLmVjbGlwc2UucGFobzpvcmcuZWNsaXBzZS5wYWhvLmNsaWVudC5tcXR0djM6MS4xLjAKLSAgICAgICAgTElDRU5TRTogRURMLTEuMCAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbXF0dHYzLTEuMS4wLkVETC0xLjAKLSAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY29ubmVjdG9ycy9rYWZrYS9leHQKLSAga2Fma2EtY2xpZW50cy0wLjguMi4yLmphciAgICAgICAgIG9yZy5hcGFjaGUua2Fma2E6a2Fma2EtY2xpZW50czowLjguMi4yCi0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2thZmthLWNsaWVudHMtMC44LjIuMi5BTC0yLjAKLSAgICAgICAgCi0gIGthZmthXzIuMTAtMC44LjIuMi5qYXIgICAgICAgICAgICBvcmcuYXBhY2hlLmthZmthOmthZmthXzIuMTA6MC44LjIuMgotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9rYWZrYS0yLjEwLTAuOC4yLjIuQUwtMi4wCi0gICAgICAgIAotICBsb2c0ai0xLjIuMTYuamFyICAgICAgICAgICAgICAgICAgbG9nNGo6bG9nNGo6MS4yLjE2Ci0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2xvZzRqLTEuMi4xNi5BTC0yLjAKLSAgICAgICAgCi0gIG1ldHJpY3MtY29yZS0yLjIuMC5qYXIgICAgICAgICAgICBjb20ueWFtbWVyLm1ldHJpY3M6bWV0cmljcy1jb3JlOjIuMi4wCi0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21ldHJpY3MtY29yZS0yLjIuMC5BTC0yLjAKLSAgICAgICAgCi0gIHNjYWxhLWxpYnJhcnktMi4xMC40LmphciAgICAgICAgICBvcmcuc2NhbGEtbGFuZzpzY2FsYS1saWJyYXJ5OjIuMTAuNAotICAgICAgICBMSUNFTlNFOiBCU0QgICAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9zY2FsYS1saWJyYXJ5LTIuMTAuNC5CU0QKLSAgICAgICAgCi0gIHprY2xpZW50LTAuMy5qYXIgICAgICAgICAgICAgICAgICBjb20uMTAxdGVjOnprY2xpZW50OjAuMwotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS96a2NsaWVudC0wLjMuQUwtMi4wCi0gICAgICAgIAotICB6b29rZWVwZXItMy40LjYuamFyICAgICAgICAgICAgICAgb3JnLmFwYWNoZS56b29rZWVwZXI6em9va2VlcGVyOjMuNC42Ci0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3pvb2tlZXBlci0zLjQuNi5BTC0yLjAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvbm5lY3RvcnMvbXF0dC9leHQKLSAgb3JnLmVjbGlwc2UucGFoby5jbGllbnQubXF0dHYzLTEuMS4wLmphciAgb3JnLmVjbGlwc2UucGFobzpvcmcuZWNsaXBzZS5wYWhvLmNsaWVudC5tcXR0djM6MS4xLjAKLSAgICAgICAgTElDRU5TRTogRURMLTEuMCAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbXF0dHYzLTEuMS4wLkVETC0xLjAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvbm5lY3RvcnMvZWRnZW50LmphdmF4LndlYnNvY2tldC9leHQKLSAgamF2YXgud2Vic29ja2V0LWFwaS0xLjAuamFyICAgICAgIGphdmF4LndlYnNvY2tldDpqYXZheC53ZWJzb2NrZXQtYXBpOjEuMAotICAgICAgICBMSUNFTlNFOiBDRERMLTEuMSAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qYXZheC53ZWJzb2NrZXQtYXBpLTEuMC5DRERMLTEuMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBiaW5hcnkgZm9ybSBjb250ZW50IGlzIGluY2x1ZGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9tdm5yZXBvc2l0b3J5LmNvbS9hcnRpZmFjdC9qYXZheC53ZWJzb2NrZXQvamF2YXgud2Vic29ja2V0LWFwaS8xLjAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LWNsaWVudC9leHQKLSAgamF2YXgtd2Vic29ja2V0LWNsaWVudC1pbXBsLTkuMy42LnYyMDE1MTEwNi5qYXIgIG9yZy5lY2xpcHNlLmpldHR5LndlYnNvY2tldDpqYXZheC13ZWJzb2NrZXQtY2xpZW50LWltcGw6OS4zLjYudjIwMTUxMTA2Ci0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamF2YXgtd2Vic29ja2V0LWNsaWVudC1pbXBsLTkuMy42LkFMLTIuMAotICAgICAgICAKLSAgamF2YXgud2Vic29ja2V0LWFwaS0xLjAuamFyICAgICAgICAgamF2YXgud2Vic29ja2V0OmphdmF4LndlYnNvY2tldC1hcGk6MS4wCi0gICAgICAgIExJQ0VOU0U6IENEREwtMS4xICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamF2YXgud2Vic29ja2V0LWFwaS0xLjAuQ0RETC0xLjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBiaW5hcnkgZm9ybSBjb250ZW50IGlzIGluY2x1ZGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL212bnJlcG9zaXRvcnkuY29tL2FydGlmYWN0L2phdmF4LndlYnNvY2tldC9qYXZheC53ZWJzb2NrZXQtYXBpLzEuMAotICAgICAgICAKLSAgamV0dHktaW8tOS4zLjYudjIwMTUxMTA2LmphciAgICAgICAgb3JnLmVjbGlwc2UuamV0dHkud2Vic29ja2V0OmphdmF4LXdlYnNvY2tldC1jbGllbnQtaW1wbDo5LjMuNi52MjAxNTExMDYKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1pby05LjMuNi5BTC0yLjAKLSAgICAgICAgCi0gIGpldHR5LXV0aWwtOS4zLjYudjIwMTUxMTA2LmphciAgICAgIG9yZy5lY2xpcHNlLmpldHR5LndlYnNvY2tldDpqYXZheC13ZWJzb2NrZXQtY2xpZW50LWltcGw6OS4zLjYudjIwMTUxMTA2ICAgICAgICAgICAgICAKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS11dGlsLTkuMy42LkFMLTIuMAotICAgICAgICAKLSAgd2Vic29ja2V0LWFwaS05LjMuNi52MjAxNTExMDYuamFyICAgb3JnLmVjbGlwc2UuamV0dHkud2Vic29ja2V0OmphdmF4LXdlYnNvY2tldC1jbGllbnQtaW1wbDo5LjMuNi52MjAxNTExMDYKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS93ZWJzb2NrZXQtYXBpLTkuMy42LkFMLTIuMAotICAgICAgICAKLSAgd2Vic29ja2V0LWNsaWVudC05LjMuNi52MjAxNTExMDYuamFyICBvcmcuZWNsaXBzZS5qZXR0eS53ZWJzb2NrZXQ6amF2YXgtd2Vic29ja2V0LWNsaWVudC1pbXBsOjkuMy42LnYyMDE1MTEwNgotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3dlYnNvY2tldC1jbGllbnQtOS4zLjYuQUwtMi4wCi0gICAgICAgIAotICB3ZWJzb2NrZXQtY29tbW9uLTkuMy42LnYyMDE1MTEwNi5qYXIgIG9yZy5lY2xpcHNlLmpldHR5LndlYnNvY2tldDpqYXZheC13ZWJzb2NrZXQtY2xpZW50LWltcGw6OS4zLjYudjIwMTUxMTA2Ci0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvd2Vic29ja2V0LWNvbW1vbi05LjMuNi5BTC0yLjAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvbnNvbGUvc2VydmVyL2V4dAotICBqYXZheC5zZXJ2bGV0LWFwaS0zLjEuMC5qYXIgICAgICAgIGphdmF4LnNlcnZsZXQ6amF2YXguc2VydmxldC1hcGk6My4xLjAKLSAgICAgICAgTElDRU5TRTogQ0RETC0xLjAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2phdmF4LnNlcnZsZXQtYXBpLTMuMS4wLkNEREwtMS4wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBiaW5hcnkgZm9ybSBjb250ZW50IGlzIGluY2x1ZGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vbXZucmVwb3NpdG9yeS5jb20vYXJ0aWZhY3QvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS8zLjEuMAotICAgICAgICAKLSAgamV0dHktaHR0cC05LjMuNi52MjAxNTExMDYuamFyICAgICBvcmcuZWNsaXBzZS5qZXR0eTpqZXR0eS1odHRwOjkuMy42LnYyMDE1MTEwNgotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktaHR0cC05LjMuNi5BTC0yLjAKLSAgICAgICAgCi0gIGpldHR5LWlvLTkuMy42LnYyMDE1MTEwNi5qYXIgICAgICAgb3JnLmVjbGlwc2UuamV0dHk6amV0dHktaW86OS4zLjYudjIwMTUxMTA2Ci0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1pby05LjMuNi5BTC0yLjAKLSAgICAgICAgCi0gIGpldHR5LXNlY3VyaXR5LTkuMy42LnYyMDE1MTEwNi5qYXIgb3JnLmVjbGlwc2UuamV0dHk6amV0dHktc2VjdXJpdHk6OS4zLjYudjIwMTUxMTA2Ci0gICAgICAgIExJQ0VOU0U6IEFMLTIuMCAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1zZWN1cml0eS05LjMuNi5BTC0yLjAKLSAgICAgICAgCi0gIGpldHR5LXNlcnZlci05LjMuNi52MjAxNTExMDYuamFyICAgb3JnLmVjbGlwc2UuamV0dHk6amV0dHktc2VydmVyOjkuMy42LnYyMDE1MTEwNgotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktc2VydmVyLTkuMy42LkFMLTIuMAotICAgICAgICAKLSAgamV0dHktc2VydmxldC05LjMuNi52MjAxNTExMDYuamFyICBvcmcuZWNsaXBzZS5qZXR0eTpqZXR0eS1zZXJ2bGV0OjkuMy42LnYyMDE1MTEwNgotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktc2VydmxldC05LjMuNi5BTC0yLjAKLSAgICAgICAgCi0gIGpldHR5LXV0aWwtOS4zLjYudjIwMTUxMTA2LmphciAgICAgb3JnLmVjbGlwc2UuamV0dHk6amV0dHktdXRpbDo5LjMuNi52MjAxNTExMDYKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LXV0aWwtOS4zLjYuQUwtMi4wCi0gICAgICAgIAotICBqZXR0eS13ZWJhcHAtOS4zLjYudjIwMTUxMTA2LmphciAgIG9yZy5lY2xpcHNlLmpldHR5OmpldHR5LXdlYmFwcDo5LjMuNi52MjAxNTExMDYKLSAgICAgICAgTElDRU5TRTogQUwtMi4wICAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LXdlYmFwcC05LjMuNi5BTC0yLjAKLSAgICAgICAgCi0gIGpldHR5LXhtbC05LjMuNi52MjAxNTExMDYuamFyICAgICAgb3JnLmVjbGlwc2UuamV0dHk6amV0dHkteG1sOjkuMy42LnYyMDE1MTEwNgotICAgICAgICBMSUNFTlNFOiBBTC0yLjAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHkteG1sLTkuMy42LkFMLTIuMAotICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb25zb2xlL3NlcnZsZXRzL2V4dAotICBqYXZheC5zZXJ2bGV0LWFwaS0zLjEuMC5qYXIgICAgICAgIGphdmF4LnNlcnZsZXQ6amF2YXguc2VydmxldC1hcGk6My4xLjAKLSAgICAgICAgTElDRU5TRTogQ0RETC0xLjAgICAgICAgICAgICBGb3IgZGV0YWlscywgc2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2phdmF4LnNlcnZsZXQtYXBpLTMuMS4wLkNEREwtMS4wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9tdm5yZXBvc2l0b3J5LmNvbS9hcnRpZmFjdC9qYXZheC5zZXJ2bGV0L2phdmF4LnNlcnZsZXQtYXBpLzMuMS4wCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb25zb2xlL3dlYmFwcHMKLSAgY29uc29sZS53YXIKLSAgICAgICAgVGhlIGZpbGUgYnVuZGxlcyBkMy1sZWdlbmQgd2hpY2ggaXMgYXZhaWxhYmxlIHVuZGVyIGEgTUlUIGxpY2Vuc2UuCi0gICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvZDMtbGVnZW5kLk1JVAotCi0gICAgICAgIFRoZSBmaWxlIGJ1bmRsZXMgcG9ydGlvbnMgb2YgZDMgd2hpY2ggaXMgYXZhaWxhYmxlIHVuZGVyIGEgQlNEIGxpY2Vuc2UuCi0gICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvZDMuQlNECi0KLSAgICAgICAgVGhlIGZpbGUgYnVuZGxlcyBwb3J0aW9ucyBvZiBkMy1zYW5rZXkgd2hpY2ggaXMgYXZhaWxhYmxlIHVuZGVyIGEgQlNEIGxpY2Vuc2UuCi0gICAgICAgIEZvciBkZXRhaWxzLCBzZWUgbGljZW5zZXMvZDMtc2Fua2V5LkJTRAotIAotICAgICAgICBUaGUgZmlsZSBidW5kbGVzIHBvcnRpb25zIG9mIGpxdWVyeS11aSB3aGljaCBpcyBhdmFpbGFibGUgdW5kZXIgYSBNSVQgbGljZW5zZS4KLSAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9qcXVlcnktdWkuTUlUCi0gCi0gICAgICAgIFRoZSBidW5kbGVkIGpxdWVyeS11aSBidW5kbGVzIGpxdWVyeSB3aGljaCBpcyBhdmFpbGFibGUgdW5kZXIgYSBNSVQgbGljZW5zZS4KLSAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9qcXVlcnkuTUlUCi0gICAgCi0gICAgICAgIFRoZSBidW5kbGVkIGpxdWVyeSBidW5kbGVzIFNpenpsZSB3aGljaCBpcyBhdmFpbGFibGUgdW5kZXIgYSBNSVQgbGljZW5zZS4KLSAgICAgICAgRm9yIGRldGFpbHMsIHNlZSBsaWNlbnNlcy9zaXp6bGUuTUlUCi0gICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYmluYXJ5LXJlbGVhc2UvTk9USUNFIGIvYmluYXJ5LXJlbGVhc2UvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQwOWUxLi4wMDAwMDAwCi0tLSBhL2JpbmFyeS1yZWxlYXNlL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLUFwYWNoZSBFZGdlbnQKLUNvcHlyaWdodCAyMDE2LTIwMTcgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLUFwYWNoZSBFZGdlbnQgaXMgY3VycmVudGx5IHVuZGVyZ29pbmcgSW5jdWJhdGlvbiBhdCB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgYnVuZGxlIGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotUG9ydGlvbnMgb2YgdGhpcyBidW5kbGUgd2VyZSBkZXZlbG9wZWQgYnkgSUJNIENvcnAuCi1Db3B5cmlnaHQgSUJNIENvcnAuIDIwMTUsIDIwMTYKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1BUEFDSEUgRURHRU5UIFNVQkNPTVBPTkVOVFM6Ci0KLVRoaXMgQXBhY2hlIEVkZ2VudCBiaW5hcnkgcmVsZWFzZSBpbmNsdWRlcyBhIG51bWJlciBvZiBzdWJjb21wb25lbnRzIHdpdGgKLXNlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiAgVGhlIGZvbGxvd2luZyBub3RpY2VzIGFwcGx5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZXh0LyAgICAjIGNvbW1vbiBkZXBlbmRlbmNpZXMgZm9yIGFsbCBFZGdlbnQgY29tcG9uZW50cwotICBtZXRyaWNzLWNvcmUtMy4xLjIuamFyICAgICAgICAgICAgaW8uZHJvcHdpemFyZC5tZXRyaWNzOm1ldHJpY3MtY29yZTozLjEuMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21ldHJpY3MtY29yZS0zLjEuMi5OT1RJQ0UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWFuYWx5dGljcy9tYXRoMy9leHQvCi0gIGNvbW1vbnMtbWF0aDMtMy40LjEuamFyICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1tYXRoMzozLjQuMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbWF0aDMtMy40LjEuTk9USUNFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb25uZWN0b3JzL2h0dHAvZXh0Ci0gIGh0dHBjbGllbnQtNC41LjEuamFyICAgICAgICAgICAgICBvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjbGllbnQ6NC41LjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY2xpZW50LTQuNS4xLk5PVElDRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGh0dHBjb3JlLTQuNC40LmphciAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjb3JlOjQuNC40Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNvcmUtNC40LjQuTk9USUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgY29tbW9ucy1jb2RlYy0xLjkuamFyICAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLWNvZGVjOjEuOQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtY29kZWMtMS45Lk5PVElDRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGNvbW1vbnMtbG9nZ2luZy0xLjIuamFyICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1sb2dnaW5nOjEuMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbG9nZ2luZy0xLjIuTk9USUNFCi0gICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvbm5lY3RvcnMvaW90cC9leHQKLSAgY29tbW9ucy1jb2RlYy0xLjEwLmphciAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLWNvZGVjOjEuMTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWNvZGVjLTEuMTAuTk9USUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgY29tbW9ucy1sYW5nMy0zLjQuamFyICAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLWxhbmczOjMuNAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbGFuZzMtMy40Lk5PVElDRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGNvbW1vbnMtbG9nZ2luZy0xLjIuamFyICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1sb2dnaW5nOjEuMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbG9nZ2luZy0xLjIuTk9USUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgY29tbW9ucy1uZXQtMy4zLmphciAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLW5ldDozLjMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLW5ldC0zLjMuTk9USUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgaHR0cGNsaWVudC00LjUuMS5qYXIgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNsaWVudDo0LjUuMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2h0dHBjbGllbnQtNC41LjEuTk9USUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgaHR0cGNvcmUtNC40LjMuamFyICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNvcmU6NC40LjMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY29yZS00LjQuMy5OT1RJQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBqb2RhLXRpbWUtMi45LjIuamFyICAgICAgICAgICAgICAgam9kYS10aW1lOmpvZGEtdGltZToyLjkuMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pvZGEtdGltZS0yLjkuMi5OT1RJQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBsb2c0ai0xLjIuMTcuamFyICAgICAgICAgICAgICAgICAgbG9nNGo6bG9nNGo6MS4yLjE3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbG9nNGotMS4yLjE3Lk5PVElDRQotICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb25uZWN0b3JzL2thZmthL2V4dAotICBrYWZrYS1jbGllbnRzLTAuOC4yLjIuamFyICAgICAgICAgb3JnLmFwYWNoZS5rYWZrYTprYWZrYS1jbGllbnRzOjAuOC4yLjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9rYWZrYS1jbGllbnRzLTAuOC4yLjIuTk9USUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAga2Fma2FfMi4xMC0wLjguMi4yLmphciAgICAgICAgICAgIG9yZy5hcGFjaGUua2Fma2E6a2Fma2FfMi4xMDowLjguMi4yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uva2Fma2FfMi4xMC0wLjguMi4yLk5PVElDRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGxvZzRqLTEuMi4xNi5qYXIgICAgICAgICAgICAgICAgICBsb2c0ajpsb2c0ajoxLjIuMTYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9sb2c0ai0xLjIuMTYuTk9USUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgbWV0cmljcy1jb3JlLTIuMi4wLmphciAgICAgICAgICAgIGNvbS55YW1tZXIubWV0cmljczptZXRyaWNzLWNvcmU6Mi4yLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9tZXRyaWNzLWNvcmUtMi4yLjAuTk9USUNFCi0gICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpbmFyeS1yZWxlYXNlL1JFQURNRSBiL2JpbmFyeS1yZWxlYXNlL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFlNzZkMy4uMDAwMDAwMAotLS0gYS9iaW5hcnktcmVsZWFzZS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1Vc2luZyBhbiBBcGFjaGUgRWRnZW50IGJpbmFyeSByZWxlYXNlIGJ1bmRsZQotCi1BcGFjaGUgRWRnZW50IGlzIHN1cHBvcnRlZCBvbiBzZXZlcmFsIEphdmEgdGFyZ2V0IHBsYXRmb3Jtcy4KLUZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBKQVZBX1NVUFBPUlQubWQgCi0KLVNlZSBHZXR0aW5nIFN0YXJ0ZWQgaHR0cHM6Ly9lZGdlbnQuYXBhY2hlLm9yZy9kb2NzL2VkZ2VudC1nZXR0aW5nLXN0YXJ0ZWQgZm9yCi1pbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGlzIGJpbmFyeSByZWxlYXNlIHRvIGRldmVsb3AgYXBwbGljYXRpb25zIHRoYXQKLXVzZSBFZGdlbnQuCi0KLUFwYWNoZSBFZGdlbnQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLgotVGhpcyBBcGFjaGUgRWRnZW50IGJpbmFyeSByZWxlYXNlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aAotc2VwYXJhdGUgY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuIEl0IGluY2x1ZGVzIHNvbWUgYmluYXJ5IGNvbnRlbnQKLXdpdGggYXNzb2NpYXRlZCBFUEwgYW5kIENEREwgbGljZW5zZXMuICBTZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KLQotQXBhY2hlIEVkZ2VudCBpcyBhbiBlZmZvcnQgdW5kZXJnb2luZyBpbmN1YmF0aW9uIGF0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSwKLXNwb25zb3JlZCBieSB0aGUgSW5jdWJhdG9yIFBNQy4gSW5jdWJhdGlvbiBpcyByZXF1aXJlZCBvZiBhbGwgbmV3bHkgYWNjZXB0ZWQKLXByb2plY3RzIHVudGlsIGEgZnVydGhlciByZXZpZXcgaW5kaWNhdGVzIHRoYXQgdGhlIGluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywKLWFuZCBkZWNpc2lvbiBtYWtpbmcgcHJvY2VzcyBoYXZlIHN0YWJpbGl6ZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIG90aGVyCi1zdWNjZXNzZnVsIEFTRiBwcm9qZWN0cy4gV2hpbGUgaW5jdWJhdGlvbiBzdGF0dXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgcmVmbGVjdGlvbgotb2YgdGhlIGNvbXBsZXRlbmVzcyBvciBzdGFiaWxpdHkgb2YgdGhlIGNvZGUsIGl0IGRvZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvamVjdAotaGFzIHlldCB0byBiZSBmdWxseSBlbmRvcnNlZCBieSB0aGUgQVNGLgpkaWZmIC0tZ2l0IGEvYmluYXJ5LXJlbGVhc2UvYXBhY2hlLW5vdGljZSBiL2JpbmFyeS1yZWxlYXNlL2FwYWNoZS1ub3RpY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ODQ5NjguLjAwMDAwMDAKLS0tIGEvYmluYXJ5LXJlbGVhc2UvYXBhY2hlLW5vdGljZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQXBhY2hlIEVkZ2VudAotQ29weXJpZ2h0IDIwMTYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLUFwYWNoZSBFZGdlbnQgaXMgY3VycmVudGx5IHVuZGVyZ29pbmcgSW5jdWJhdGlvbiBhdCB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9iaW5hcnktcmVsZWFzZS9hcGFjaGUtdjJfMC1saWNlbnNlIGIvYmluYXJ5LXJlbGVhc2UvYXBhY2hlLXYyXzAtbGljZW5zZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhZGEzZS4uMDAwMDAwMAotLS0gYS9iaW5hcnktcmVsZWFzZS9hcGFjaGUtdjJfMC1saWNlbnNlCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAie30iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCB7eXl5eX0ge25hbWUgb2YgY29weXJpZ2h0IG93bmVyfQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYmluYXJ5LXJlbGVhc2UvaWJtLWNvbnRyaWItbm90aWNlIGIvYmluYXJ5LXJlbGVhc2UvaWJtLWNvbnRyaWItbm90aWNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGRiYWE1Li4wMDAwMDAwCi0tLSBhL2JpbmFyeS1yZWxlYXNlL2libS1jb250cmliLW5vdGljZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUFwYWNoZSBFZGdlbnQKLUNvcHlyaWdodCAyMDE2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1BcGFjaGUgRWRnZW50IGlzIGN1cnJlbnRseSB1bmRlcmdvaW5nIEluY3ViYXRpb24gYXQgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZGV2ZWxvcGVkIGJ5IElCTSBDb3JwLgotQ29weXJpZ2h0IElCTSBDb3JwLiAyMDE1LCAyMDE2CmRpZmYgLS1naXQgYS9idWlsZC5ncmFkbGUgYi9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MGE1NGMuLjAwMDAwMDAKLS0tIGEvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsOTMwICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotIAotYXBwbHkgZnJvbTogJ2dyYWRsZS93cmFwcGVyLmdyYWRsZScKLWFwcGx5IGZyb206ICdncmFkbGUvb3RoZXIuZ3JhZGxlJwotCi1pbXBvcnQgb3JnLmdyYWRsZS5wbHVnaW5zLnNpZ25pbmcuU2lnbgotaW1wb3J0IGphdmEuaW8uQ29uc29sZQotIAotLyogQ29uZmlndXJlIHJvb3QgcHJvamVjdCAqLwotYWxscHJvamVjdHMgewotICBhcHBseSBwbHVnaW46ICdpZGVhJwotICBhcHBseSBwbHVnaW46ICdlY2xpcHNlJwotCi0gIHJlcG9zaXRvcmllcyB7Ci0gICAgbWF2ZW5DZW50cmFsKCkKLSAgfQotICAKLSAgcHJvamVjdC52ZXJzaW9uID0gYnVpbGRfdmVyc2lvbgotfQotCi1hcHBseSBmcm9tOiAnZ3JhZGxlL3JhdC5ncmFkbGUnCi0KLXJhdCB7Ci0gIGV4Y2x1ZGVzID0gWwotICAgICcqLnBhdGNoJywKLSAgICAnKiovLmNsYXNzcGF0aCcsCi0gICAgJyoqLy5jYWNoZS8qKicsCi0gICAgJyoqLy5naXQvKionLAotICAgICcqKi8uZ2l0aWdub3JlJywKLSAgICAnKiovLmdyYWRsZS8qKicsCi0gICAgJy5ncmFkbGUtd3JhcHBlci8qKicsICAvLyBoaXN0b3JpY2FsIGluc3RlYWQgb2YgZ3JhZGxlL3dyYXBwZXIKLSAgICAnKiovLmlkZWEvKionLAotICAgICcqKi8ucHJvamVjdCcsCi0gICAgJyoqLy5zZXR0aW5ncy8qKicsCi0gICAgJyoqL2Jpbi8qKicsICAgICAgICAgICAvLyBnZW5lcmF0ZWQgYnkgRWNsaXBzZSBidWlsZHMKLSAgICAnKiovYnVpbGQvKionLAotICAgICcqKi9NRVRBLUlORi9zZXJ2aWNlcy8qKicsCi0gICAgJyoqL1JFQURNRS5tZCcsCi0gICAgJ2V4dGVybmFsSmFycy8qKicsICAgICAvLyBnZW5lcmF0ZWQgYnkgc2V0dXBFeHRlcm5hbEphcnMgZm9yIEVjbGlwc2UgdXNlCi0gICAgJ2dyYWRsZXcnLAotICAgICdncmFkbGV3LmJhdCcsCi0gICAgJ0RFVkVMT1BNRU5ULm1kJywKLSAgICAnSkFWQV9TVVBQT1JULm1kJywKLSAgICAnQ09OVFJJQlVUT1JTJywgJy5tYWlsbWFwJywKLSAgICAnYmluYXJ5LXJlbGVhc2UvYXBhY2hlLW5vdGljZScsCi0gICAgJ2JpbmFyeS1yZWxlYXNlL2libS1jb250cmliLW5vdGljZScsCi0gICAgJ2Nvbm5lY3RvcnMvamRiYy9KZGJjU3RyZWFtc1Rlc3REYi8qKicsCi0gICAgJ2Nvbm5lY3RvcnMvamRiYy9kZXJieS5sb2cnLAotICAgICdjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzLyoqJywKLSAgICAnY29uc29sZS8qKi9qcy9leHQvKiovanF1ZXJ5LmpzJywgICAgICAgICAvLyBoYXMgaGVhZGVyIHcvTUlUIGxpY2Vuc2UgcmVmCi0gICAgJ2NvbnNvbGUvKiovanMvZXh0LyoqL2pxdWVyeS11aS5taW4uY3NzJywgLy8gaGFzIGhlYWRlciB3L01JVCBsaWNlbnNlIHJlZgotICAgICdjb25zb2xlLyoqL2pzL2V4dC8qKi9qcXVlcnktdWkubWluLmpzJywgIC8vIGhhcyBoZWFkZXIgdy9NSVQgbGljZW5zZSByZWYKLSAgICAnY29uc29sZS8qKi9qcy9leHQvKiovanF1ZXJ5LXVpLnN0cnVjdHVyZS5taW4uY3NzJywgLy8gaGFzIGhlYWRlciB3L01JVCBsaWNlbnNlIHJlZgotICAgICdjb25zb2xlLyoqL2pzL2V4dC8qKi9qcXVlcnktdWkudGhlbWUubWluLmNzcycsIC8vIGhhcyBoZWFkZXIgdy9NSVQgbGljZW5zZSByZWYKLSAgICAnY29uc29sZS8qKi9qcy9leHQvZDMubGVnZW5kLmpzJywgICAgICAgICAvLyBoYXMgaGVhZGVyIHcvTUlUIGxpY2Vuc2UgcmVmCi0gICAgJ2NvbnNvbGUvKiovanMvZXh0L2QzLm1pbi5qcycsICAgICAgICAgICAgLy8gbm8gaGVhZGVyLiBpbmNsdWRlZCBpbiBMSUNFTlNFCi0gICAgJ2NvbnNvbGUvKiovanMvZXh0L3NhbmtleV9lZGdlbnQuanMnLCAgICAgLy8gbm8gaGVhZGVyLiBpbmNsdWRlZCBpbiBMSUNFTlNFCi0gICAgJ2xpY2Vuc2VzL2QzLXNhbmtleS5CU0QnLCAgICAgICAgICAgICAgICAgLy8gT0ssIEJTRCAzLWNsYXVzZQotICAgICdsaWNlbnNlcy9kMy5CU0QnLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9LLCBCU0QgMy1jbGF1c2UKLSAgICAnbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamF2YXguc2VydmxldC1hcGktMy4xLjAuQ0RETC0xLjAnLCAgLy8gT0ssIG9ubHkgYmluYXJ5IGZvcm0gY29udGVudAotICAgICdsaWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qYXZheC53ZWJzb2NrZXQtYXBpLTEuMC5DRERMLTEuMScsICAvLyBPSywgb25seSBiaW5hcnkgZm9ybSBjb250ZW50Ci0gICAgJ2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21xdHR2My0xLjEuMC5FREwtMS4wJywgIC8vIE9LLCBFREwtMS4wCi0gICAgJ2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21xdHR2My0xLjEuMC5FREwtMS4wJywgIC8vIE9LLCBFREwtMS4wCi0gICAgJ2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3dhdHNvbi1pb3QtMC4yLjIuRVBMLTEuMCcsICAvLyBPSywgb25seSBiaW5hcnkgZm9ybSBjb250ZW50Ci0gICAgJ3NhbXBsZXMvKiovKi5wcm9wZXJ0aWVzJywKLSAgICAnc2FtcGxlcy8qKi8qLmNmZycsCi0gICAgJ3NjcmlwdHMvKiovKi5wcm9wZXJ0aWVzJywKLSAgICAnc2NyaXB0cy8qKi8qLmNmZycsCi0gICAgJ3NjcmlwdHMvY29ubmVjdG9ycy9qZGJjL3BlcnNvbmRhdGEudHh0JywKLSAgICAnc2NyaXB0cy9jb25uZWN0b3JzL2thZmthL1JFQURNRS1rYWZrYScsCi0gICAgJ3Rlc3QvKiovKi5wcm9wZXJ0aWVzJywKLSAgICAndGVzdC8qKi9kZXZpY2UuY2ZnJywKLSAgICAndGVzdC8qKi8qLnR4dCcsCi0gIF0KLX0KLQotYXBwbHkgcGx1Z2luOiAnamF2YScKLWphciB7Ci0gIGRlbGV0ZUFsbEFjdGlvbnMoKSAgLy8gQXZvaWQgY3JlYXRpbmcvc3RhZ2luZyBhbiBlbXB0eSBqYXIgZm9yIHRoZSAicm9vdCIKLX0KLWFwcGx5IHBsdWdpbjogJ3NpZ25pbmcnCi0KLQotZXh0IHsKLSAgY29tbWl0aGFzaF9lcnJvciA9ICcnCi0gIGNvbW1pdGhhc2ggPSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiAiZ2l0IHJldi1wYXJzZSAtLXNob3J0IEhFQUQiLmV4ZWN1dGUoKS50ZXh0LnRyaW0oKQotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBleHQuY29tbWl0aGFzaF9lcnJvciA9IGUKLSAgICAgIHJldHVybiAnJwotICAgIH0KLSAgfSgpCi0gIG5vdyA9IG5ldyBEYXRlKCkKLSAgRFNUQU1QID0gU3RyaW5nLmZvcm1hdCgnJXRZJTx0bSU8dGQnLCBub3cpCi0gIFRTVEFNUCA9IFN0cmluZy5mb3JtYXQoJyV0SCU8dE0nLCBub3cpCi0gIENPUFlSSUdIVF9ZRUFSID0gU3RyaW5nLmZvcm1hdCgnJXRZJywgbm93KQotICAKLSAgc25hcHNob3RJZCA9ICItU05BUFNIT1QtJHtEU1RBTVB9LSR7VFNUQU1QfSIKLSAgaWYgKFN5c3RlbS5wcm9wZXJ0aWVzWydlZGdlbnQuc25hcHNob3RJZCddICE9IG51bGwpIHsKLSAgICBzbmFwc2hvdElkID0gU3lzdGVtLnByb3BlcnRpZXNbJ2VkZ2VudC5zbmFwc2hvdElkJ10KLSAgfQotICAgICAgICAgICAgICAgICAgIAotICBleHRlcm5hbF9qYXJzX2RpciA9ICIkcm9vdFByb2plY3QucHJvamVjdERpci9leHRlcm5hbEphcnMvamF2YTgiCi0gIAotICB0YXJnZXRfZGlyID0gIiRkaXN0c0RpciIKLSAgdGFyZ2V0X2phdmE4X2RpciA9ICIkdGFyZ2V0X2Rpci9qYXZhOCIKLSAgdGFyZ2V0X2phdmE4X2V4dF9kaXIgPSAiJHRhcmdldF9qYXZhOF9kaXIvZXh0IgotICB0YXJnZXRfamF2YTdfZGlyID0gIiR0YXJnZXRfZGlyL2phdmE3IgotICB0YXJnZXRfYW5kcm9pZF9kaXIgPSAiJHRhcmdldF9kaXIvYW5kcm9pZCIKLSAgdGFyZ2V0X2RvY3NfZGlyID0gIiR0YXJnZXRfZGlyL2RvY3MiCi0gIHRhcmdldF9qYXZhZG9jX2RpciA9ICIkdGFyZ2V0X2RvY3NfZGlyL2phdmFkb2MiCi0gIHRhcmdldF9yZXBvcnRfZGlyID0gIiR0YXJnZXRfZGlyL3JlcG9ydHMiCi0gCi0gIC8vIHByb2plY3QgZ3JvdXBzIHdob3NlIGphcnMgYXJlIHRvIGJlIHBsYWNlZCBpbiB0YXJnZXRfamF2YThfbGliCi0gIC8vIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgIiR0YXJnZXRfamF2YThfZGlyLyRzaW1wbGVQcm9qZWN0R3JvdXAvJHByb2plY3QubmFtZS9saWIiCi0gIC8vICAgICAgICAgZS5nLiwgIiR0YXJnZXRfamF2YThfZGlyL2xpYiIgZm9yIGFwaS90b3BvbG9neQotICAvLyAgICAgICAgICIkdGFyZ2V0X2phdmE4X2Rpci9jb25uZWN0b3JzL2lvdHAvbGliIiBmb3IgY29ubmVjdG9ycy9pb3RwCi0gIC8vCi0gIHRhcmdldF9qYXZhOF9saWJfZ3JvdXBzID0gWyJhcGkiLCAicHJvdmlkZXJzIiwgInJ1bnRpbWUiLCAic3BpIl0KLSAgCi0gIC8vIFRPRE8gY2FuIHRoZXNlIGJlIGRlZHVjZWQgYnkgdGhlIGFic2VuY2Ugb2YgYSBidWlsZC5ncmFkbGUgZm9yIHRoZSBwcm9qZWN0PwotICBhZ2dyZWdhdG9yT25seVByb2plY3RzID0gWwotICAgICc6YW5kcm9pZCcsCi0gICAgJzphbmFseXRpY3MnLCAnOmFwaScsICc6YXBwcycsCi0gICAgJzpjb25uZWN0b3JzJywgJzpjb25zb2xlJywKLSAgICAnOnBsYXRmb3JtJywgJzpwcm92aWRlcnMnLAotICAgICc6cnVudGltZScsICc6c2FtcGxlcycsICc6c3BpJywKLSAgICAnOnRlc3QnLCAnOnV0aWxzJwotICBdCi0gIAotICBmaWx0ZXJlZFN1YnByb2plY3RzID0gc3VicHJvamVjdHMuZmluZEFsbCB7IAotICAgIHByb2plY3QgLT4gIWFnZ3JlZ2F0b3JPbmx5UHJvamVjdHMuY29udGFpbnMocHJvamVjdC5wYXRoKQotICB9Ci0gIAotICAvLyBFZGdlbnQgY29yZSBleHRlcm5hbCBkZXBlbmRlbmNpZXMKLSAgY29yZV9leHRfZGVwZW5kZW5jaWVzID0gWydjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuMi40JywKLSAgICAgICAgICAgICAgICAgICAnb3JnLnNsZjRqOnNsZjRqLWFwaToxLjcuMTInLAotICAgICAgICAgICAgICAgICAgICdpby5kcm9wd2l6YXJkLm1ldHJpY3M6bWV0cmljcy1jb3JlOjMuMS4yJ10KLSAgCi0gIC8vIEVkZ2VudCBTYW1wbGVzIGV4dGVybmFsIGRlcGVuZGVuY2llcwotICBzYW1wbGVzX2V4dF9kZXBlbmRlbmNpZXMgPSBbJ29yZy5zbGY0ajpzbGY0ai1qZGsxNDoxLjcuMTInXQotCi0gIC8vIEVkZ2VudCB0ZXN0cyBleHRlcm5hbCBkZXBlbmRlbmNpZXMKLSAgdGVzdF9jb21tb25fZGVwZW5kZW5jaWVzID0gWydvcmcuc2xmNGo6c2xmNGotamRrMTQ6MS43LjEyJ10KLSAgCi0gIGNvbW1vbl9leHRfZGVwZW5kZW5jaWVzID0gWwotICAgIGNvcmVfZXh0X2RlcGVuZGVuY2llcywKLSAgICBzYW1wbGVzX2V4dF9kZXBlbmRlbmNpZXMsCi0gICAgLy8gdGVzdF9jb21tb25fZGVwZW5kZW5jaWVzLCAvLyBvbWl0IGFzIHRlc3RzIGFyZW4ndCBpbmNsdWRlZCBpbiByZWxlYXNlIHRnegotICBdLmZsYXR0ZW4oKQotCi0gIGV4dC4ic2lnbmluZy5rZXlJZCIgPSBudWxsCi0gIGV4dC4ic2lnbmluZy5zZWNyZXRLZXlSaW5nRmlsZSIgPSBudWxsCi0gIGV4dC4ic2lnbmluZy5wYXNzd29yZCIgPSBudWxsCi19Ci0KLS8vIERlY2xhcmUgdGhlIGNvbW1vbl9leHRfZGVwZW5kZW5jaWVzIGFzIGRlcGVuZGVuY2llcyBvZiB0aGUgcm9vdCBwcm9qZWN0Ci0vLyB0byBlYXNpbHkgY29weSB0aGVtICh0aGVpciByZXNvbHZlZCBwYXRocykgdG8gdGhlIHRhcmdldCBkaXIKLWRlcGVuZGVuY2llcyB7Ci0gIGNvbXBpbGUgY29tbW9uX2V4dF9kZXBlbmRlbmNpZXMKLX0KLWV4dC5jb3B5Q29tbW9uRXh0SmFyc0ZuID0geyB0YXJnZXREaXIgLT4KLSAgY29weSB7Ci0gICAgZnJvbSBjb25maWd1cmF0aW9ucy5jb21waWxlLmZpbGVzCi0gICAgaW50byB0YXJnZXREaXIKLSAgfQotfQotdGFzayBzZXR1cENvbW1vbkV4dEphcnMgPDwgewotICBjb3B5Q29tbW9uRXh0SmFyc0ZuICIkZXh0ZXJuYWxfamFyc19kaXIvZXh0IgotfQotdGFzayBjb3B5Q29tbW9uRXh0SmFycyA8PCB7Ci0gIGNvcHlDb21tb25FeHRKYXJzRm4gdGFyZ2V0X2phdmE4X2V4dF9kaXIKLX0KLQotZGVmIFN0cmluZyBta0phck5hbWVGcm9tU3BlYyhTdHJpbmcgamFyU3BlYykgewotICAvLyBlLmcuICdjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuMi40JyA9PiBnc29uLTIuMi40LmphcgotICAvLyBlLmcuICdjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuMi40QGphcicgPT4gZ3Nvbi0yLjIuNC5qYXIKLSAgZGVmIHNmeCA9IGphclNwZWMuZW5kc1dpdGgoJ0BqYXInKSA/ICIiIDogJy5qYXInCi0gIHJldHVybiBqYXJTcGVjLnNwbGl0KCc6JylbMV0gKyAnLScgKyBqYXJTcGVjLnNwbGl0KCc6JylbMl0ucmVwbGFjZSgnQCcsJy4nKSArIHNmeAotfQotCi1kZWYgZ2V0UHJvamVjdEV4dERlcEZpbGVzKFByb2plY3QgcHJvaikgeyAvLyBwcm9qZWN0J3MgZGlyZWN0IGV4dCBkZXBzIGFuZCB0aGVpciB0cmFuc2l0aXZlIGRlcHMKLSAgLy8gVE9ETyBzdXNwZWN0IHRoaXMgaXMgcGlja2luZyB1cCBleHQgZGVwZW5kZW5jaWVzIG9mIHRyYW5zaXRpdmUgKipwcm9qZWN0KiogZGVwZW5kZW5jaWVzPz8/Ci0gIAotICAvLyBoYW5kbGUgZXh0IGphciBkZXBzIGV4cHJlc3NlZCB2aWEgImNvbXBpbGUgPGV4dGVybmFsLWRlcGVuZGVuY3ktc3BlYz4iCi0gIGRlZiBhbGxFeHREZXBGaWxlcyA9IHByb2ouY29uZmlndXJhdGlvbnMucnVudGltZS5maWxlcyB7IGl0IGluc3RhbmNlb2YgRXh0ZXJuYWxEZXBlbmRlbmN5IH0KLSAgCi0gIC8vIGhhbmRsZSBleHQgamFyIGRlcHMgZXhwcmVzc2VkIHZpYSBhZGRUYXJnZXREaXJFeHRKYXJEZXBlbmRlbmN5Ci0gIGFsbEV4dERlcEZpbGVzLmFkZEFsbCBwcm9qLmZpbGVzKHByb2ouZGlyZWN0VGFyZ2V0RGlyRXh0SmFyRGVwZW5kZW5jaWVzKQotICAKLSAgbG9nZ2VyLmluZm8gIiRwcm9qLnBhdGggYWxsRXh0RGVwRmlsZXM6ICIrYWxsRXh0RGVwRmlsZXMKLSAgcmV0dXJuIGFsbEV4dERlcEZpbGVzCi19Ci0gCi1kZWYgZ2V0UHJvamVjdE5vbkNvbW1vbkV4dERlcEZpbGVzKFByb2plY3QgcHJvaikgewotICAvLyBmaWx0ZXIgb3V0ICJjb21tb24iICh0YXJnZXRfamF2YThfZXh0X2RpcikgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzCi0gIGRlZiBjb21tb25FeHRKYXJOYW1lcyA9IGNvbW1vbl9leHRfZGVwZW5kZW5jaWVzLmNvbGxlY3QgewotICAgIG1rSmFyTmFtZUZyb21TcGVjIGl0Ci0gIH0KLSAgZGVmIGZpbHRlcmVkRXh0RGVwRmlsZXMgPSBnZXRQcm9qZWN0RXh0RGVwRmlsZXMocHJvaikuZmluZEFsbCB7Ci0gICAgISBjb21tb25FeHRKYXJOYW1lcy5jb250YWlucyhpdC5nZXROYW1lKCkpCi0gIH0KLSAgcmV0dXJuIGZpbHRlcmVkRXh0RGVwRmlsZXMKLX0KLQotZGVmIFN0cmluZyBta01hbmlmZXN0Q2xhc3NQYXRoKFByb2plY3QgcHJvaikgewotICAvLyBUaGUgbWFuaWZlc3QncyBjbGFzc3BhdGggbmVlZHMgdG8gaW5jbHVkZSB0aGUgcHJvamVjdCdzOgotICAvLyAtIGltbWVkaWF0ZS1vbmx5IGRlcGVuZGFudCBlZGdlbnQgamFycyAobm90IHRyYW5zaXRpdmUgYW5kIG5vdCB0aGVpciBleHQgZGVwcwotICAvLyAgIHNpbmNlIG91ciBwcm9qZWN0IGphcnMgYXJlIGJ1aWxkIHdpdGggYSBtYW5pZmVzdC1jbGFzc3BhdGggdGhhdAotICAvLyAgIGhhbmRsZXMgdGhlIHByb2plY3QncyAicHJpdmF0ZSIgZGVwZW5kZW5jaWVzKQotICAvLyAtIGltbWVkaWF0ZSBkZXBlbmRhbnQgZXh0ZXJuYWwgamFycyBhbmQgdGhlaXIgdHJhbnNpdGl2ZSBkZXBzIChzaW5jZQotICAvLyAgIHRoZXNlIGRvbid0IHNlZW0gdG8gaGF2ZSBhIG1hbmlmZXN0IGNsYXNzcGF0aCB0aGF0IHRha2VzIGNhcmUgb2YgdGhlaXIKLSAgLy8gICBkZXBlbmRlbmNpZXMpCi0gIC8vIC0gY29tbW9uX2V4dF9kZXBlbmRlbmNpZXMgamFycyB3aGVuIGRlY2xhcmVkIGFzIGRlcGVuZGVuY2llcwotICAvLwotICAvLyBwcm9qLmNvbmZpZ3VyYXRpb25zLnJ1bnRpbWUuZmlsZXMgKG1vc3RseSkgY2FwdHVyZXMgYWxsIG9mIHRoZSBhYm92ZQotICAvLyBzaW5jZSBkbyB0byBvdXIgcHJvamVjdCBidWlsZC5ncmFkbGUgdXNlIG9mIG91ciB2YXJpb3VzIGFkZCpEZXBlbmRlbmN5KCkuCi0KLSAgZGVmIGRlcEphcnMgPSBwcm9qLmNvbmZpZ3VyYXRpb25zLnJ1bnRpbWUuZmlsZXMKLSAgICAKLSAgLy8gYXNzdW1lIHRoYXQgYW55IGRlcHMgc3RpbGwgaW4gdGhlIGdyYWRsZSBjYWNoZSBhcmUgcHJvamVjdCBwcml2YXRlIGV4dCBkZXBzCi0gIC8vICh0aGF0IHdpbGwtZ2V0L2hhdmUtYmVlbiBjb3BpZWQgaW50byB0aGUgcHJvamVjdCdzIGV4dCBkaXIgaW4gdGhlIHRhcmdldGRpcikgCi0gIGRlZiBwcm9qRXh0RGlyID0gIiR0YXJnZXRfamF2YThfZGlyLyRwcm9qLnRhcmdldFJlbFByb2pFeHREaXIiCi0gIGRlcEphcnMgPSBkZXBKYXJzLmNvbGxlY3QgeyBmaWxlIC0+Ci0gICAgaWYgKGZpbGUudG9TdHJpbmcoKS5jb250YWlucygnLy5ncmFkbGUvY2FjaGVzLycpKSB7Ci0gICAgICByZXR1cm4gcHJvai5maWxlKCIkcHJvakV4dERpci8iK2ZpbGUuZ2V0TmFtZSgpKQotICAgIH0KLSAgICByZXR1cm4gZmlsZQotICB9Ci0gICAgCi0gIGRlZiBjcCA9IHByb2oubWtSZWxhdGl2ZVBhdGhzKGRlcEphcnMpLmpvaW4oJyAnKQotICBsb2dnZXIuaW5mbyAiJHByb2oucGF0aCBtYW5pZmVzdC1jbGFzc1BhdGg6ICRjcCIKLSAgcmV0dXJuIGNwCi19Ci0KLWdyYWRsZS50YXNrR3JhcGgud2hlblJlYWR5IHt0YXNrR3JhcGggLT4KLSAgaWYgKHRhc2tHcmFwaC5oYXNUYXNrKHRlc3QpKSB7Ci0gICAgcHJpbnRsbiAiXG5ISU5UczogVXNlIHRoZSAnLS10ZXN0cyA8dGVzdENsYXNzTmFtZVBhdHRlcm4+Wy48dGVzdE1ldGhvZE5hbWVQYXR0ZXJuPl0nIG9wdGlvbiB0byBzZWxlY3Qgc3BlY2lmaWMgdGVzdCBjbGFzc2VzIG9yIG1ldGhvZHMuIgotICAgIHByaW50bG4gIiAgICAuL2dyYWRsZXcgOmFwaTp0b3BvbG9neTp0ZXN0IC0tdGVzdHMgJypKc29uRnVuY3Rpb25zVGVzdCciCi0gICAgcHJpbnRsbiAiICAgIC4vZ3JhZGxldyA6YXBpOnRvcG9sb2d5OnRlc3QgLS10ZXN0cyAnKkpzb25GdW5jdGlvbnNUZXN0LnRlc3RCeXRlcyciCi0gICAgcHJpbnRsbiAiVXNlIHRoZSAnY2xlYW5UZXN0JyB0YXNrIHRvIGZvcmNlIGEgcmVydW4gb2YgYSBwcmV2aW91c2x5IHN1Y2Nlc3NmdWwgdGVzdCB0YXNrOiIKLSAgICBwcmludGxuICIgICAgLi9ncmFkbGV3IDphcGk6dG9wb2xvZ3k6Y2xlYW5UZXN0IDphcGk6dG9wb2xvZ3k6dGVzdCIKLSAgICBwcmludGxuICIgICAgLi9ncmFkbGV3IGNsZWFuVGVzdCB0ZXN0IgotICAgIHByaW50bG4gIiIKLSAgICBzbGVlcCAyCi0gIH0KLX0KLQotLyogQ29uZmlndXJlIHN1YnByb2plY3RzICovCi1zdWJwcm9qZWN0cyB7Ci0KLSAgLy8gaWdub3JlIGFnZ3JlZ2F0b3Igb25seSBwcm9qZWN0cyBzbyB3ZSBkb24ndCBhc3NlbWJsZSBlbXB0eSBqYXJzLCBldGMgZm9yIHRoZW0uCi0gIGlmIChhZ2dyZWdhdG9yT25seVByb2plY3RzLmNvbnRhaW5zKHByb2plY3QucGF0aCkpIHsKLSAgICByZXR1cm4KLSAgfQotICAKLSAgaWYoIXByb2plY3QuZ3JvdXAuZXF1YWxzKCJlZGdlbnQucGxhdGZvcm0iKSl7Ci0gIAlhcHBseSBwbHVnaW46ICdtYXZlbi1wdWJsaXNoJwotICB9Ci0gIGFwcGx5IHBsdWdpbjogJ2phdmEnCi0gIGFwcGx5IHBsdWdpbjogImphY29jbyIKLSAKLSAgaWYgKGJ1aWxkRmlsZS5pc0ZpbGUoKSAmJiAhYnVpbGRGaWxlLmV4aXN0cygpKSB7Ci0gICAgY29uZmlndXJhdGlvbnMuY3JlYXRlKCdkZWZhdWx0JykKLSAgICByZXR1cm4KLSAgfQotICAKLSAgZXh0LnNpbXBsZUdyb3VwTmFtZSA9IHByb2plY3QuZ3JvdXAucmVwbGFjZSgnZWRnZW50LicsICcnKSAvLyBlLmcuLCAnZWRnZW50LmFwaScgPT4gJ2FwaScKLQotICBleHQubWtSZWxhdGl2ZVBhdGhzID0geyBDb2xsZWN0aW9uIGZpbGVzIC0+Ci0gICAgLy8gbWFrZSBhbGwgZmlsZXMgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyBsaWIgZGlyIGluIHRhcmdldGRpcgotICAgIC8vIHdlbGwuLi4gdW5sZXNzIHRoaXMgaXMgZm9yIGEgd2FyLCB3aGljaCByZXNpZGVzIGluIHRoZSBncm91cCdzICJ3ZWJhcHBzIgotICAgIC8vIGRpciBpbnN0ZWFkIG9mIHByb2plY3QncyBsaWIgZGlyLiAgU2VlIDpjb25zb2xlOnNlcnZsZXRzIGJ1aWxkLmdyYWRsZS4KLSAgICBkZWYgcHJvakxpYkRpciA9IHByb2plY3QuZmlsZSgiJHRhcmdldF9qYXZhOF9kaXIvJHRhcmdldFJlbFByb2pMaWJEaXIiKQotICAgIGlmIChwcm9qZWN0LnBsdWdpbk1hbmFnZXIuaGFzUGx1Z2luKCd3YXInKSkgewotICAgICAgcHJvakxpYkRpciA9IHByb2plY3QuZmlsZSgiJHRhcmdldF9qYXZhOF9kaXIvJHByb2plY3Quc2ltcGxlR3JvdXBOYW1lL3dlYmFwcHMiKQotICAgIH0KLSAgICBmaWxlcy5jb2xsZWN0IHsgIHByb2pMaWJEaXIudG9QYXRoKCkucmVsYXRpdml6ZShpdC50b1BhdGgoKSkgfQotICB9Ci0KLSAgZXh0LnRhcmdldFJlbFByb2pEaXIgPSB7IFN0cmluZyBraW5kIC0+ICAvLyBraW5kOiAibGliIiwgImV4dCIKLSAgICAvLyB1c2UgdGFyZ2V0UmVsUHJvamVjdHtMaWIsRXh0fURpcgotICAgIC8vIGUuZy4sID0+ICAibGliIiBvciAiPGNvbXBvbmVudD4vPHN1YmNvbXBvbmVudD4vbGliIgotICAgIC8vIHRoZSBnZW5lcmFsIGNhc2UgbG9jYXRpb24KLSAgICBkZWYgcmVsUHJvakRpciA9ICIkc2ltcGxlR3JvdXBOYW1lLyRwcm9qZWN0Lm5hbWUvJGtpbmQiCi0gICAKLSAgICAvLyBzcGVjaWFsIGNhc2VzCi0gICAgaWYgKHRhcmdldF9qYXZhOF9saWJfZ3JvdXBzLmNvbnRhaW5zKHNpbXBsZUdyb3VwTmFtZSkpIHsKLSAgICAgIHJlbFByb2pEaXIgPSAiJGtpbmQiCi0gICAgfQotICAgIGVsc2UgaWYgKCdzYW1wbGVzJyA9PSBzaW1wbGVHcm91cE5hbWUpIHsKLSAgICAgIHJlbFByb2pEaXIgPSAic2FtcGxlcy8ka2luZCIKLSAgICB9Ci0gICAKLSAgICByZXR1cm4gcmVsUHJvakRpcgotICB9Ci0gIGV4dC50YXJnZXRSZWxQcm9qTGliRGlyID0gdGFyZ2V0UmVsUHJvakRpcignbGliJykKLSAgZXh0LnRhcmdldFJlbFByb2pFeHREaXIgPSB0YXJnZXRSZWxQcm9qRGlyKCdleHQnKQotICAKLSAgLy8gTi5CLiByZWdhcmRpbmcgdGhlIHZhcmlvdXMgYWRkKkRlcGVuZGVuY3koKSBtZXRob2RzCi0gIC8vCi0gIC8vIFRoZSBtZXRob2RzIG5lZWQgdG8gYmUgdXNlZCBpbiBwcm9qZWN0IGJ1aWxkLmdyYWRsZSAiZGVwZW5kZW5jaWVzIiBkZWNsYXJhdGlvbnMuCi0gIC8vIGUuZy4sCi0gIC8vICAgZGVwZW5kZW5jaWVzIHsKLSAgLy8gICAgIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knICMgTk9UIGNvbXBpbGUgcHJvamVjdCgnOmFwaTp0b3BvbG9neScpCi0gIC8vICAgICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdjb20uaWJtLm1lc3NhZ2luZzp3YXRzb24taW90OjAuMi4yJyAgIyBOT1QgY29tcGlsZSAnY29tLmlibS5tZXNzYWdpbmc6d2F0c29uLWlvdDowLjIuMicKLSAgLy8gICAgIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ29yZy5hcGFjaGUua2Fma2E6a2Fma2FfMi4xMDowLjguMi4yQGphcicKLSAgLy8gICAgIGFkZFRhcmdldERpckNvcmVFeHREZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIC8vICAgICBhZGRNeVRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICd0ZXN0Q29tcGlsZScKLSAgLy8gICAgIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi0gIC8vICAgfQotICAvLyAKLSAgLy8gVGhlc2UgbWV0aG9kcyBwbGF5IGEgcm9sZSBpbiB0aGUgcG9saWNpZXM6Ci0gIC8vIC0gRWRnZW50IHByb2plY3RzIGRlcGVuZCBvbiBvdGhlciBwcm9qZWN0J3MgamFycyBpbiB0aGUgdGFyZ2V0LWRpciwgbm90IHRoZWlyIGNsYXNzZXMKLSAgLy8gLSBFZGdlbnQgcHJvamVjdCBqYXJzIGhhdmUgYSBtYW5pZmVzdC1jbGFzc3BhdGggdGhhdCBoYW5kbGVzCi0gIC8vICAgdGhlIHByb2plY3QncyAicHJpdmF0ZSIgaW50ZXItcHJvamVjdCBkZXBlbmRlbmNpZXMKLSAgLy8gICBhcyB3ZWxsIGFzIHRoZSBwcm9qZWN0J3MgInByaXZhdGUiIGV4dGVybmFsIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMuCi0gIC8vIC0gV2UgYnVpbGQgYSB0YXJnZXQgZGlyIHRoYXQgaW5jbHVkZXMgdGhlIHByb2plY3QncyBqYXIgYXMgd2VsbCBhcwotICAvLyAgIHRoZSBwcm9qZWN0J3MgZXh0ZXJuYWwgZGVwZW5kZW5jeSBqYXJzCi0gIC8vIC0gVGhlIHRlc3RzIGNvbXBpbGUgYW5kIHJ1biBhZ2FpbnN0IHRoZSBwcm9qZWN0IGphcnMgaW4gdGhlIHRhcmdldCBkaXIKLSAgLy8gICAoYXMgZXh0ZXJuYWwvaW50ZWdyYXRpb24gdGVzdCBjb2RlIHdvdWxkKS4KLSAgLy8gLSBUaGUgc2FtcGxlcyBjb21waWxlIGFuZCBydW4gYWdhaW5zdCB0aGUgcHJvamVjdCBqYXJzIGluIHRoZSB0YXJnZXQgZGlyCi0gIC8vICAgKGFzIHVzZXIgY29kZSB3b3VsZCkuCi0gIAotICBleHQuZGlyZWN0VGFyZ2V0RGlyRXh0SmFyRGVwZW5kZW5jaWVzID0gW10gCi0KLSAgZXh0LmFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ID0geyBjb25maWcscHJvaiAtPgotICAgIC8vIGFkZCBhIGRlcGVuZGVuY3kgb24gYSBwcm9qZWN0J3MgamFyIGluIHRoZSB0YXJnZXQtZGlyCi0gICAgZGVmIGphclBhdGggPSBwcm9qZWN0KHByb2opLmphci5hcmNoaXZlUGF0aAotICAgIAotICAgIC8vIGFkZCB0aGUgamFyIGFzIGEgZGVwZW5kZW5jeSBhbmQgZW5zdXJlIGl0J3MgcHJlc2VudCB3aGVuIHdlIG5lZWQgaXQKLSAgICAvLyA/IHNjcmlwdCBlcnJvciB3aXRoOiBkZXBlbmRlbmNpZXMgeyAiJGNvbmZpZyIgZmlsZXMoamFyUGF0aCkgYnVpbHRCeSAiJHtwcm9qfTphc3NlbWJsZSIgfQotICAgIGRlcGVuZGVuY2llcyB7ICIkY29uZmlnIiBmaWxlcyhqYXJQYXRoKSB9Ci0gICAgZGVmIHRhc2sgPSAiJHtjb25maWd9SmF2YSIKLSAgICBpZiAoY29uZmlnID09ICJ0ZXN0Q29tcGlsZSIpIHsKLSAgICAgIHRhc2sgPSAiY29tcGlsZVRlc3RKYXZhIgotICAgIH0KLSAgICBlbHNlIGlmIChjb25maWcgPT0gInByb3ZpZGVkQ29tcGlsZSIpIHsKLSAgICAgIHRhc2sgPSAiY29tcGlsZUphdmEiCi0gICAgfQotICAgICIkdGFzayIgeyBkZXBlbmRzT24gIiR7cHJvan06YXNzZW1ibGUiIH0KLSAgfQotCi0gIGV4dC5hZGRNeVRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ID0geyBjb25maWcgLT4KLSAgICAvLyBhZGQgYSBkZXBlbmRlbmN5IG9uIG15IHByb2plY3QncyBqYXIgaW4gdGhlIHRhcmdldCBkaXIKLSAgICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeShjb25maWcsIHByb2plY3QucGF0aCkKLSAgfQotICAKLSAgZXh0LmFkZFRhcmdldERpckV4dEphckRlcGVuZGVuY3kgPSB7IGNvbmZpZyxqYXJOYW1lIC0+Ci0gICAgLy8gYWRkIGEgZGVwZW5kZW5jeSBvbiBhIHRhcmdldF9qYXZhOF9leHRfZGlyIGphck5hbWUKLSAgICAvLyByZWNvcmQgdGhlIGFkZGl0aW9uCi0gICAgZGVmIGphciA9ICIkdGFyZ2V0X2phdmE4X2V4dF9kaXIvJGphck5hbWUiCi0gICAgaWYgKCFkaXJlY3RUYXJnZXREaXJFeHRKYXJEZXBlbmRlbmNpZXMuY29udGFpbnMoamFyKSkgewotICAgICAgZGlyZWN0VGFyZ2V0RGlyRXh0SmFyRGVwZW5kZW5jaWVzLmFkZCBqYXIKLSAgICB9Ci0gICAgCi0gICAgLy8gYWRkIHRoZSBqYXIgYXMgYSBkZXBlbmRlbmN5Ci0gICAgZGVwZW5kZW5jaWVzIHsgIiRjb25maWciIGZpbGVzKGphcikgfQotICAgIGNvbXBpbGVKYXZhIHsgZGVwZW5kc09uICc6Y29weUNvbW1vbkV4dEphcnMnIH0KLSAgfQotICAKLSAgZXh0LmFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgPSB7IGNvbmZpZyAtPgotICAgIGNvcmVfZXh0X2RlcGVuZGVuY2llcy5jb2xsZWN0IHsgZGVwU3BlYyAtPgotICAgICAgbWtKYXJOYW1lRnJvbVNwZWMoZGVwU3BlYykKLSAgICB9LmVhY2ggeyBqYXJOYW1lIC0+Ci0gICAgICBhZGRUYXJnZXREaXJFeHRKYXJEZXBlbmRlbmN5IGNvbmZpZywgamFyTmFtZQotICAgIH0KLSAgfQotCi0gIGV4dC5hZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSA9IHsgY29uZmlnLGV4dGVybmFsRGVwU3BlYyAtPgotICAgIC8vIGZvciBkZWNsYXJpbmcgcHJvamVjdCBwcml2YXRlIGV4dGVybmFsIGRlcGVuZGVuY2llcwotICAgIC8vIGVuZHMgdXAgKHRyYW5zaXRpdmVseSkgY29weWluZyB0aGUgZGVwZW5kZW5jeSB0byB0aGUgcHJvamVjdCdzIGV4dCBkaXIKLSAgICBkZXBlbmRlbmNpZXMgeyAiJGNvbmZpZyIgZXh0ZXJuYWxEZXBTcGVjIH0KLSAgfQotCi0gIGV4dC5hZGRDb21waWxlVGVzdERlcGVuZGVuY2llcyA9IHsgU3RyaW5nLi4uIGRlcHMgLT4KLSAgICAvLyBhZGQgYSBkZXBlbmRlbmN5IG9uIG90aGVyIHByb2plY3QncyB0ZXN0Q2xhc3NlcwotICAgIGRlcHMuZWFjaCB7IGRlcCAtPgotICAgICAgZGVwZW5kZW5jaWVzIHsKLSAgICAgICAgdGVzdENvbXBpbGUgcHJvamVjdChkZXApLnNvdXJjZVNldHMudGVzdC5vdXRwdXQKLSAgICAgIH0KLSAgICAgIGNvbXBpbGVUZXN0SmF2YSB7Ci0gICAgICAgIGRlcGVuZHNPbiAiJHtkZXB9OnRlc3RDbGFzc2VzIgotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHNvdXJjZUNvbXBhdGliaWxpdHkgPSAnMS44JwotICB0YXJnZXRDb21wYXRpYmlsaXR5ID0gJzEuOCcKLQotICBkZWYgY29tcGlsZU9wdGlvbnMgPSB7Ci0gICAgb3B0aW9ucy5kZWJ1Z09wdGlvbnMuZGVidWdMZXZlbCA9ICdzb3VyY2UsbGluZXMsdmFycycKLSAgICBvcHRpb25zLnZlcmJvc2UgPSBsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKQotICAgIG9wdGlvbnMubGlzdEZpbGVzID0gbG9nZ2VyLmlzSW5mb0VuYWJsZWQoKQotICAgIG9wdGlvbnMuZGVwcmVjYXRpb24gPSB0cnVlCi0gICAgb3B0aW9ucy5lbmNvZGluZyA9ICdVVEYtOCcKLSAgfQotICBjb21waWxlSmF2YSB7Ci0gICAgY29uZmlndXJlIGNvbXBpbGVPcHRpb25zCi0gIH0KLSAgY29tcGlsZVRlc3RKYXZhIHsKLSAgICBjb25maWd1cmUgY29tcGlsZU9wdGlvbnMKLSAgfQotICAKLSAgZGVwZW5kZW5jaWVzIHsKLSAgICAvLyBjb21tb24gZGVwZW5kZW5jaWVzIGZvciB0ZXN0cwotICAgIHRlc3RDb21waWxlICdqdW5pdDpqdW5pdDo0LjEwJwotICAgIGFkZE15VGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ3Rlc3RDb21waWxlJwotICAgIGlmIChwcm9qZWN0LnBhdGggIT0gJzphcGk6ZnVuY3Rpb24nKSB7Ci0gICAgICBhZGRUYXJnZXREaXJFeHRKYXJEZXBlbmRlbmN5ICd0ZXN0UnVudGltZScsICdzbGY0ai1qZGsxNC0xLjcuMTIuamFyJwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8vIHRoZSBhZGQuLi4gaW5kdWNlcyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlbHNld2hlcmUgaW4gc2NyaXB0IHdoZW4gcHJvY2Vzc2luZyA6YXBpOmZ1bmN0aW9uOmphciA/Pz8KLSAgICAgIC8vIGNhbid0IGZpZ3VyZSBpdCBvdXQgYnV0IGNsZWFuaW5nIGRpcmVjdFRhcmdldERpckV4dEphckRlcGVuZGVuY2llcwotICAgICAgLy8gYXZvaWRzIGl0ID8/Py4uLiB3aXRoIHNlZW1pbmdseSBubyBvdGhlciBjb25zZXF1ZW5jZXMuCi0gICAgICBhZGRUYXJnZXREaXJFeHRKYXJEZXBlbmRlbmN5ICd0ZXN0UnVudGltZScsICdzbGY0ai1qZGsxNC0xLjcuMTIuamFyJwotICAgICAgcHJvamVjdC5kaXJlY3RUYXJnZXREaXJFeHRKYXJEZXBlbmRlbmNpZXMgPSBbXQotICAgIH0KLQotICAgIC8vIGNvbW1vbiBkZXBlbmRlbmNpZXMgZm9yIHNhbXBsZXMKLSAgICBpZiAocHJvamVjdC5wYXRoID09fiAnXjpzYW1wbGVzLionKSB7Ci0gICAgICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6cHJvdmlkZXJzOmRldmVsb3BtZW50JwotICAgICAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0KLSAgICAgIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnICAgICAgCi0gICAgICBhZGRUYXJnZXREaXJFeHRKYXJEZXBlbmRlbmN5ICdydW50aW1lJywgJ3NsZjRqLWpkazE0LTEuNy4xMi5qYXInCi0gICAgfQotICB9Ci0gIAotICBleHQuY29weVByb2plY3RFeHRKYXJzRm4gPSB7IHRhcmdldERpciAtPgotICAgIC8vIENvcHkgdGhlIHByb2plY3QgamFyJ3MgInByaXZhdGUiIGV4dGVybmFsIGRlcGVuZGVuY2llcyAodHJhbnNpdGl2ZWx5KQotICAgIC8vIGludG8gdGhlIHByb2plY3QncyBleHQgZGlyIGluIHRoZSB0YXJnZXQtZGlyLgotCi0gICAgLy8gSWYgb3VyIHByb2plY3QncyBqYXIgdGFzayBsYWNrcyBhbnkgYWN0aW9ucyAoZS5nLiwgcGxhdGZvcm06YW5kcm9pZCkKLSAgICAvLyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCi0gICAgaWYgKCFqYXIuYWN0aW9ucykKLSAgICAgIHJldHVybgotICAgIAotICAgIC8vIEZZSSB3ZSdyZSBnZXR0aW5nIG1vcmUgdHJhbnNpdGl2ZSBleHQgZGVwcyB0aGFuIHRoZSBhbnQgYnVpbGQKLSAgICAvLyBpbiBzb21lIGNhc2VzIC0gZS5nLiwgZm9yIHdhdHNvbiBpb3Qgd2UgImtuZXciIHdlIG9ubHkgbmVlZGVkIGEgc3Vic2V0Ci0gICAgLy8gb2YgYWxsIHdhdHNvbiBpb3QgZGVwcyBrbm93biB0byBtYXZlbgotICAgIAotICAgIGRlZiBwcm9qZWN0RXh0RGlyID0gcHJvamVjdC50YXJnZXRSZWxQcm9qRXh0RGlyCi0gICAgZGVmIG5vbkNvbW1vbkV4dEZpbGVzID0gZ2V0UHJvamVjdE5vbkNvbW1vbkV4dERlcEZpbGVzKHByb2plY3QpCi0gICAgbG9nZ2VyLmluZm8gIiRwcm9qZWN0LnBhdGggY29weWluZyBwcm9qRXh0RGVwRmlsZXMgamFyczogIitub25Db21tb25FeHRGaWxlcy5jb2xsZWN0IHsgaXQuZ2V0TmFtZSgpIH0KLSAgICBjb3B5IHsKLSAgICAgIGZyb20gbm9uQ29tbW9uRXh0RmlsZXMKLSAgICAgIGluY2x1ZGVFbXB0eURpcnMgPSBmYWxzZQotICAgICAgaW50byAiJHRhcmdldERpci8kcHJvamVjdEV4dERpciIKLSAgICB9Ci0gIH0KLSAgCi0gIGV4dC5jb3B5UHJvamVjdEV4dEphcnNGbjIgPSB7IHRhcmdldERpciAtPgotICAgIC8vIENvcHkgdGhlIHByb2plY3QgamFyJ3MgInByaXZhdGUiIGV4dGVybmFsIGRlcGVuZGVuY2llcyAodHJhbnNpdGl2ZWx5KQotICAgIC8vIGludG8gdGFyZ2V0LWRpci4KLSAgICAKLSAgICBkZWYgbm9uQ29tbW9uRXh0RmlsZXMgPSBnZXRQcm9qZWN0Tm9uQ29tbW9uRXh0RGVwRmlsZXMocHJvamVjdCkKLSAgICBsb2dnZXIuaW5mbyAiJHByb2plY3QucGF0aCBjb3B5aW5nIHByb2pFeHREZXBGaWxlcyBqYXJzOiAiK25vbkNvbW1vbkV4dEZpbGVzLmNvbGxlY3QgeyBpdC5nZXROYW1lKCkgfQotICAgIGNvcHkgewotICAgICAgZnJvbSBub25Db21tb25FeHRGaWxlcwotICAgICAgaW5jbHVkZUVtcHR5RGlycyA9IGZhbHNlCi0gICAgICBpbnRvICIkdGFyZ2V0RGlyIgotICAgIH0KLSAgfQotICAKLSAgdGFzayBzZXR1cFByb2plY3RFeHRKYXJzIDw8IHsKLSAgICAvLyBIZWxwZXIgZm9yIHNldHVwRXh0ZXJuYWxKYXJzIHRhc2sKLSAgICBjb3B5UHJvamVjdEV4dEphcnNGbiBleHRlcm5hbF9qYXJzX2RpcgotICB9Ci0KLSAgamFyIHsKLSAgICAvLyBhZGp1c3QgamFyIHRhc2sgY29uZmlnIGFuZCBhbHNvIGF1Z21lbnQgdGhlIHRhc2sgdG8gZG8gb3VyIGFkZGl0aW9uYWwgcHJvY2Vzc2luZwotICAgIAotICAgIC8vIGdlbmVyYXRlIHRoZSBwcm9qZWN0J3MgamFyIGludG8gdGhlIHRhcmdldCBkaXIgbG9jYXRpb24KLSAgICAvLyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBuYW1lIGFuZCBtYW5pZmVzdC4KLSAgICAvLyBUT0RPIC0gZ3JhZGxlL21hdmVuIGJlc3QgcHJhY3RpY2UgaGFzIHZlcnNpb24gaW4gamFybmFtZQotICAgIAotICAgIGFyY2hpdmVOYW1lID0gIiR7cHJvamVjdC5ncm91cH0uJHtwcm9qZWN0Lm5hbWV9LiR7ZXh0ZW5zaW9ufSIKLSAgICBpZiAoWyJqYXZheC53ZWJzb2NrZXQtY2xpZW50IiwgImphdmF4LndlYnNvY2tldC1zZXJ2ZXIiLCAiZWRnZW50LmphdmF4LndlYnNvY2tldCJdLmNvbnRhaW5zKHByb2plY3QubmFtZSkpIHsKLSAgICAgIGFyY2hpdmVOYW1lID0gIiR7cHJvamVjdC5uYW1lfS4ke2V4dGVuc2lvbn0iCi0gICAgfQotICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZSgiJHRhcmdldF9qYXZhOF9kaXIvIiArIHRhcmdldFJlbFByb2pMaWJEaXIpCi0KLSAgICBkb0ZpcnN0IHsKLSAgICAgIGNvbmZpZ3VyZSBqYXJPcHRpb25zCi0gICAgfQotICAgIAotICAgIGRvTGFzdCB7Ci0gICAgICBjb3B5UHJvamVjdEV4dEphcnNGbiB0YXJnZXRfamF2YThfZGlyCi0gICAgfQotICB9Ci0KLSAgZXh0Lmphck9wdGlvbnMgPSB7Ci0gICAgbWFuaWZlc3QgewotICAgICAgYXR0cmlidXRlcygKLSAgICAgICAgJ0ltcGxlbWVudGF0aW9uLVRpdGxlJzogIiR7LT4gYmFzZU5hbWV9IiwKLSAgICAgICAgJ0ltcGxlbWVudGF0aW9uLVZlbmRvcic6IGJ1aWxkX3ZlbmRvciwKLSAgICAgICAgLy8gVE9ETyBpbmNsdXNpb24gb2YgRFNUQU1QL1RTVEFNUCByZXN1bHRzIGluIHJlZ2VuZXJhdGlvbgotICAgICAgICAvLyBvZiBhIGphciB3aGVuIG5vbmUgb2YgaXRzIGNvbnRlbnRzL2RlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWQuCi0gICAgICAgIC8vIElmIHBvc3NpYmxlIHVzZSBhIGNhbm5lZCBEU1RBTVAvVFNUQU1QIGZvciBub24tInJlbGVhc2UiIHRhc2tzCi0gICAgICAgIC8vIHRvIG1ha2UgdGhlIGRldiBjeWNsZSBtb3JlIGVmZmljaWVudCBhdCB0aGUgZXhwZW5zZSBvZiB0aGUgVFNUQU1QLgotICAgICAgICAnSW1wbGVtZW50YXRpb24tVmVyc2lvbic6ICIke2NvbW1pdGhhc2h9LSR7RFNUQU1QfS0ke1RTVEFNUH0iLAotICAgICAgICAnQ2xhc3MtUGF0aCc6IG1rTWFuaWZlc3RDbGFzc1BhdGgocHJvamVjdCksCi0gICAgICApCi0gICAgfQotICAgIG1ldGFJbmYgewotICAgICAgd2l0aCggY29weVNwZWMgewotICAgICAgICByZW5hbWUgeyAnTElDRU5TRScgfQotICAgICAgICBmcm9tIHJvb3RQcm9qZWN0LmZpbGUoJ2JpbmFyeS1yZWxlYXNlL2FwYWNoZS12Ml8wLWxpY2Vuc2UnKQotICAgICAgfSkKLSAgICAgIHdpdGgoIGNvcHlTcGVjIHsKLSAgICAgICAgcmVuYW1lIHsgJ05PVElDRScgfQotICAgICAgICBmcm9tIHJvb3RQcm9qZWN0LmZpbGUoCi0gICAgICAgICAgcHJvamVjdHNXaXRoUHJlQXBhY2hlQ29udHJpYnMuY29udGFpbnMocHJvamVjdC5wYXRoKQotICAgICAgICAgICAgPyAnYmluYXJ5LXJlbGVhc2UvaWJtLWNvbnRyaWItbm90aWNlJwotICAgICAgICAgICAgOiAnYmluYXJ5LXJlbGVhc2UvYXBhY2hlLW5vdGljZScpCi0gICAgICB9KQotICAgIH0KLSAgfQotICAKLSAgZXh0LnByaW50RmlsZSA9IHsgcGF0aCAtPgotICAgIGFudC5jb25jYXQgeyBmaWxlc2V0KGZpbGU6IHBhdGgpIH0KLSAgfQotICBleHQuYWRqdXN0VGVzdDdDbGFzc3BhdGggPSBmYWxzZQotICAKLSAgdGFzayB0ZXN0U3VtbWFyeUZpbmFsaXplciA8PCB7Ci0gICAgZGVmIHRlc3RUYXNrID0gdGFza3MuZ2V0QnlOYW1lKCd0ZXN0JykKLSAgICBpZiAoU3lzdGVtLnByb3BlcnRpZXNbJ2VkZ2VudC5idWlsZC5jaSddICE9IG51bGwpIHsKLSAgICAgIHRlc3RUYXNrLmZhaWxlZFRlc3RSZXN1bHRQYXRocy5lYWNoIHsgcGF0aCAtPgotICAgICAgICBwcmludGxuIHBhdGgKLSAgICAgICAgcHJpbnRGaWxlIHBhdGgKLSAgICAgIH0KLSAgICB9Ci0gICAgZGVmIHJlc3VsdCA9IHRlc3RUYXNrLnN1bW1hcnlSZXN1bHQKLSAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgIGRlZiBkdXJhdGlvbiA9IFN0cmluZy5mb3JtYXQoJyUuM2ZzZWMnLCAocmVzdWx0LmVuZFRpbWUgLSByZXN1bHQuc3RhcnRUaW1lKSAvIDEwMDApCi0gICAgICBwcmludGxuICIkcHJvamVjdC5wYXRoICRkdXJhdGlvbiAkcmVzdWx0LnJlc3VsdFR5cGUgKCRyZXN1bHQudGVzdENvdW50IHRlc3RzLCAkcmVzdWx0LmZhaWxlZFRlc3RDb3VudCBmYWlsdXJlcywgJHJlc3VsdC5za2lwcGVkVGVzdENvdW50IHNraXBwZWQpIgotICAgIH0KLSAgfQotCi0gIHRlc3QgewotICAgIGZpbHRlciB7Ci0gICAgICBpbmNsdWRlVGVzdHNNYXRjaGluZyAnKlRlc3QnICAvLyBjYW4gb3ZlcnJpZGUgdmlhIC0tdGVzdHMgY29tbWFuZCBsaW5lIG9wdGlvbgotICAgIH0KLQotICAgIHN5c3RlbVByb3BlcnR5ICdlZGdlbnQudGVzdC50b3AuZGlyLmZpbGUucGF0aCcsIHJvb3RQcm9qZWN0LnByb2plY3REaXIKLSAgICBzeXN0ZW1Qcm9wZXJ0eSAnZWRnZW50LnRlc3Qucm9vdC5kaXInLCByb290UHJvamVjdC5wcm9qZWN0RGlyCi0gICAgc3lzdGVtUHJvcGVydHkgJ2VkZ2VudC5idWlsZC5jaScsIFN5c3RlbS5wcm9wZXJ0aWVzWydlZGdlbnQuYnVpbGQuY2knXQotICAgIAotICAgIC8vIHBhc3MgYWxvbmcgYW55IG9yZy5hcGFjaGUuZWRnZW50IHN5c3RlbSBwcm9wcwotICAgIHN5c3RlbVByb3BlcnRpZXMgU3lzdGVtLnByb3BlcnRpZXMuZmluZEFsbCB7IGl0LmtleS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLmVkZ2VudCIpIH0KLSAgICAKLSAgICB0ZXN0TG9nZ2luZyB7Ci0gICAgICBleGNlcHRpb25Gb3JtYXQgJ2Z1bGwnCi0gICAgICBzaG93U3RhbmRhcmRTdHJlYW1zID0gU3lzdGVtLnByb3BlcnRpZXNbJ2VkZ2VudC50ZXN0LnNob3dPdXRwdXQnXSAhPSBudWxsCi0gICAgfQotICAgIGJlZm9yZVN1aXRlIHsgZGVzYyAtPgotICAgICAgaWYgKCFkZXNjLnBhcmVudCkgeyAvLyB3aWxsIG1hdGNoIHRoZSBvdXRlcm1vc3Qgc3VpdGUKLSAgICAgICAgcHJpbnRsbiAiJHByb2plY3QucGF0aCB0ZXN0aW5nIC4uLiIKLSAgICAgIH0KLSAgICB9Ci0gICAgZXh0LmZhaWxlZFRlc3RSZXN1bHRQYXRocyA9IFtdCi0gICAgZXh0LnN1bW1hcnlSZXN1bHQgPSBudWxsCi0gICAgYWZ0ZXJTdWl0ZSB7IGRlc2MsIHJlc3VsdCAtPgotICAgICAgLy8gbWFrZSBmYWlsdXJlcyBpbiBlZGdlbnQuYnVpbGQuY2kgcnVucyBtb3JlIGRlYnVnZ2FibGUKLSAgICAgIC8vIHdpc2ggdGhlIGp1bml0IHhtbCBmaWxlcyBleGlzdGVkIGF0IHRoaXMgbW9tZW50IGJ1dCB0aGV5IGRvbid0Ci0gICAgICBpZiAoZGVzYy5wYXJlbnQgJiYgZGVzYy5jbGFzc05hbWUgIT0gbnVsbCkgeyAgLy8gaW5kaXZpZHVhbCB0ZXN0IGNsYXNzIHJlc3VsdAotICAgICAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgPT0gVGVzdFJlc3VsdC5SZXN1bHRUeXBlLkZBSUxVUkUpIHsKLSAgICAgICAgICBkZWYgcmVzdWx0RmlsZSA9ICIkdGVzdFJlc3VsdHNEaXIvdGVzdC9URVNULSR7ZGVzYy5jbGFzc05hbWV9LnhtbCIKLSAgICAgICAgICBwcmludGxuICJcbkZhaWxlZCB0ZXN0cnVuIHJlc3VsdHM6ICRyZXN1bHRGaWxlIgotICAgICAgICAgIGZhaWxlZFRlc3RSZXN1bHRQYXRocy5hZGQgcmVzdWx0RmlsZQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghZGVzYy5wYXJlbnQpIHsgLy8gcHJvamVjdCdzIG92ZXJhbGwgcmVzdWx0cwotICAgICAgICBzdW1tYXJ5UmVzdWx0ID0gcmVzdWx0IAotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGl6ZWRCeSAidGVzdFN1bW1hcnlGaW5hbGl6ZXIiIC8vIGEgZG9MYXN0IGlzbid0IGludm9rZWQgaWYgdGhlcmUncyBhIHRlc3QgZmFpbHVyZQotICAgIHJlcG9ydHMgewotICAgICAganVuaXRYbWwuZW5hYmxlZCA9IHRydWUgIC8vIGdlbmVyYXRlIGJ1aWxkL3Rlc3QtcmVzdWx0cy90ZXN0L1RFU1QtKi54bWwKLSAgICAgIC8vIGluZGl2aWR1YWwgPHByb2plY3Q+L2J1aWxkL3JlcG9ydHMganVuaXQvamFjb2NvIGh0bWwgcmVwb3J0cyBub3QgbmVlZGVkIHdpdGggYWdncmVnYXRlIHJlcG9ydAotICAgICAgaHRtbC5lbmFibGVkID0gU3lzdGVtLnByb3BlcnRpZXNbJ2VkZ2VudC50ZXN0LnByb2plY3QuaHRtbFJlcG9ydHMnXSAhPSBudWxsCi0gICAgfQotICAgIGRvRmlyc3QgewotICAgICAgLy8gVGhlIHByb2plY3QncyB0ZXN0cyBhcmUgc3VwcG9zZWQgdG8gcnVuIGFnYWluc3QgaXRzIHRhcmdldC1kaXIgamFyLgotICAgICAgLy8gV2UgbXVzdCByZW1vdmUgdGhlIHByb2plY3QncyAkYnVpbGREaXIve2NsYXNzZXMscmVzb3VyY2VzfS9tYWluCi0gICAgICAvLyBmcm9tIHRoZSBjbGFzc3BhdGggc28gdGhleSdyZSBub3QgdXNlZC4gIAotCi0gICAgICBjbGFzc3BhdGggPSBwcm9qZWN0LnNvdXJjZVNldHMudGVzdC5ydW50aW1lQ2xhc3NwYXRoCi0gICAgICBjbGFzc3BhdGggLT0gcHJvamVjdC5zb3VyY2VTZXRzLm1haW4ub3V0cHV0Ci0KLSAgICAgIC8vIEhtbS4uLiBmb3Igc29tZSByZWFzb24gdGhlIGNsYXNzcGF0aCAod2hlbiBwcmludGVkIGhlcmUpIGFsc28gaW5jbHVkZXMKLSAgICAgIC8vIHRoZSBwcm9qZWN0J3Mgc3JjIGJ1aWxkL2xpYnMvIGphciBhbmQgYnkgdGhlIGRlZmF1bHQgbmFtZQotICAgICAgLy8gKGUuZy4sIGJ1aWxkL2xpYnMvb3BsZXRzLTAuNC4xLmphcikgeWV0IHdlJ3ZlIGNvbmZpZ3VyZWQgdGhlIGphciB0YXNrCi0gICAgICAvLyB0byBnZW5lcmF0ZSB0aGUgamFyIGluIHRoZSB0YXJnZXQtZGlyIHdpdGggYSBkaWZmZXJlbnQgbmFtZS4gIAotICAgICAgLy8gSXQgYWxzbyBsYWNrcyB0aGF0IHRhcmdldC1kaXIgamFyIHdlIGFkZGVkIGFzIGEgZGVwZW5kZW5jeSAKLSAgICAgIC8vIHZpYSBhZGRNeVRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICd0ZXN0Q29tcGlsZScKLSAgICAgIC8vID8/PyAgCi0gICAgICAvLyBBZGp1c3QgYWNjb3JkaW5nbHkuCi0gICAgICAKLSAgICAgIGNsYXNzcGF0aCA9IGNsYXNzcGF0aC5maWx0ZXIgeyAhIGl0LnBhdGguc3RhcnRzV2l0aChwcm9qZWN0LmxpYnNEaXIucGF0aCkgfSAKLSAgICAgIGNsYXNzcGF0aCA9IGZpbGVzKHByb2plY3QuamFyLmFyY2hpdmVQYXRoKSArIGNsYXNzcGF0aAotICAgICAgCi0gICAgICBpZiAoYWRqdXN0VGVzdDdDbGFzc3BhdGgpIHsKLSAgICAgICAgLy8gQWRkIHNwZWNpYWwgamF2YTcgcHJvY2Vzc2luZy4uLiAob24gdG9wIG9mIHRoZSBvdGhlciB0ZXN0LmRvRmlyc3QgY2xhc3NwYXRoIG1hbmlwdWxhdGlvbnMpCi0gICAgICAKLSAgICAgICAgLy8gQ2hhbmdlIGZyb20gdXNpbmcgdGhlIG5vcm1hbCB0ZXN0IGNsYXNzZXMgZGlyIHRvIHRoZSBqYXZhNyB0ZXN0IGNsYXNzZXMgZGlyCi0gICAgICAgIGNsYXNzcGF0aCAtPSBmaWxlcyhzb3VyY2VTZXRzLnRlc3Qub3V0cHV0LmNsYXNzZXNEaXIpCi0gICAgICAgIGNsYXNzcGF0aCA9IGZpbGVzKHNvdXJjZVNldHMudGVzdC5vdXRwdXQuY2xhc3Nlc0Rpci50b1N0cmluZygpLnJlcGxhY2UoJ3Rlc3QnLCAnamF2YTdUZXN0JykpICsgY2xhc3NwYXRoCi0gICAgICAgIAotICAgICAgICAvLyBTb21lIG9mIHRoZSB0ZXN0cyBoYXZlIGRlcGVuZGVuY2llcyBvbiBvdGhlciB0ZXN0cywgYWRqdXN0IHRob3NlIGNsYXNzcGF0aHMgdG9vCi0gICAgICAgIGNsYXNzcGF0aCA9IGZpbGVzKGNsYXNzcGF0aC5jb2xsZWN0IHsgaXQudG9TdHJpbmcoKS5yZXBsYWNlKCdidWlsZC9jbGFzc2VzL3Rlc3QnLCAnYnVpbGQvY2xhc3Nlcy9qYXZhN1Rlc3QnKSB9KQotICAgICAgCi0gICAgICAgIC8vIFN3aXRjaCBmcm9tIGphdmE4IGphcnMgdG8gamF2YTcgamFycwotICAgICAgICBjbGFzc3BhdGggPSBmaWxlcyhjbGFzc3BhdGguY29sbGVjdCB7IGl0LnRvU3RyaW5nKCkucmVwbGFjZSgnamF2YTgnLCAnamF2YTcnKSB9KQotICAgICAgfQotICAgICAgbG9nZ2VyLmRlYnVnICIkcHJvamVjdC5wYXRoIHRlc3QuY2xhc3NwYXRoOiAiICsgY2xhc3NwYXRoLmNvbGxlY3QgeyBpdC50b1N0cmluZygpIH0KLSAgICB9Ci0gIH0KLSAgCi0gIGV4dC5qN1Rlc3RDbGFzc2VzRGlyID0gZmlsZSgiJHByb2plY3QuYnVpbGREaXIvY2xhc3Nlcy9qYXZhN1Rlc3QiKQotICAKLSAgdGFzayB0ZXN0N0FkanVzdFRlc3RUYXNrIDw8IHsKLSAgICBpZiAoISB0YXNrcy5nZXRCeU5hbWUoJ3Rlc3QnKS5lbmFibGVkCi0gICAgICAgIHx8IHVuc3VwcG9ydGVkSmF2YTdUZXN0UHJvamVjdHMuY29udGFpbnMocHJvamVjdC5wYXRoKQotICAgICAgICB8fCBzb3VyY2VTZXRzLnRlc3QuYWxsU291cmNlLmlzRW1wdHkoKSkgewotICAgICAgdGVzdC5lbmFibGVkID0gZmFsc2UKLSAgICAgIHJldHVybgotICAgIH0KLSAgICBhZGp1c3RUZXN0N0NsYXNzcGF0aCA9IHRydWUKLSAgICBpZiAoIWo3VGVzdENsYXNzZXNEaXIuZXhpc3RzKCkpIHsKLSAgICAgIC8vIGltcGxpY2l0IGRlcGVuZGVuY3k6IDpwbGF0Zm9ybTpqYXZhNzp0ZXN0N0NvbXBpbGUKLSAgICAgIGxvZ2dlci5lcnJvciAiIEVSUk9SOiBSdW4gdGhlIHRlc3Q3Q29tcGlsZSB0YXNrLiAgJGo3VGVzdENsYXNzZXNEaXIgZG9lcyBub3QgZXhpc3QuIgotICAgICAgdGhyb3cgbmV3IFRhc2tFeGVjdXRpb25FeGNlcHRpb24oKQotICAgIH0KLSAgICB0ZXN0IHsKLSAgICAgIHRlc3RDbGFzc2VzRGlyID0gajdUZXN0Q2xhc3Nlc0RpcgotICAgICAgb3V0cHV0cy51cFRvRGF0ZVdoZW4geyBmYWxzZSB9IC8vIGFsd2F5cyBydW4gLSB0YXNrIGlzIG5ldmVyICJ1cCB0byBkYXRlIgotICAgIH0KLSAgfQotCi0gIHRhc2sgdGVzdDdSdW4oKSB7Ci0gICAgZGVzY3JpcHRpb24gPSAiUnVuIHRoZSB0ZXN0N0NvbXBpbGUnZCB0ZXN0cyBhZ2FpbnN0IHRoZSBqYXZhNyB0YXJnZXQgamFycyAtIHJ1biBhZnRlciA6cGxhdGZvcm06amF2YTc6dGVzdDdDb21waWxlIGFuZCB3aXRoIEpBVkFfSE9NRT09amF2YTctVk0iCi0gICAgLy8gZndpdyB0cnlpbmcgdG8gbGV2ZXJhZ2UgOnBsYXRmb3JtOmphdmE3OmFudF90ZXN0Ny5ydW4gd2FzIHByb2JsZW1hdGljCi0gICAgCi0gICAgZGVwZW5kc09uICc6cGxhdGZvcm06amF2YTc6dmVyaWZ5SmF2YTdCdWlsdCcsIHRlc3Q3QWRqdXN0VGVzdFRhc2ssIHRlc3QKLSAgICAvLyBpbXBsaWNpdCBkZXBlbmRlbmN5OiA6cGxhdGZvcm06amF2YTc6dGVzdDdDb21waWxlCi0gICAgdGVzdC5tdXN0UnVuQWZ0ZXIgPSBbIHRlc3Q3QWRqdXN0VGVzdFRhc2ssICc6cGxhdGZvcm06amF2YTc6dmVyaWZ5SmF2YTdCdWlsdCcgXQotCi0gICAgb3V0cHV0cy51cFRvRGF0ZVdoZW4geyBmYWxzZSB9IC8vIGFsd2F5cyBydW4gLSBuZXZlciAidXAgdG8gZGF0ZSIKLSAgfQotCi0gIGFzc2VtYmxlLmRvTGFzdCB7Ci0gICAgLy8gYXVnbWVudCBhc3NlbWJsZSB3aXRoIG91ciBhZGRpdGlvbmFsIHRhcmdldCBkaXIgdXBkYXRlIHByb2Nlc3NpbmcKLSAgICAKLSAgICAvLyBDb3B5IFNSQyBpbnRvIHRhcmdldCBkaXIgd2hlbiBhcHByb3ByaWF0ZQotICAgIGlmIChwcm9qZWN0LnBhdGggPT1+ICdeOnNhbXBsZXMuKicpIHsKLSAgICAgIGNvcHkgewotICAgICAgICBmcm9tKHNvdXJjZVNldHMubWFpbi5hbGxTb3VyY2Uuc3JjRGlycykgeyBpbmNsdWRlICcqKi8qLmphdmEnIH0KLSAgICAgICAgaW50byAiJHRhcmdldF9qYXZhOF9kaXIvJHByb2plY3Quc2ltcGxlR3JvdXBOYW1lL3NyYy8kcHJvamVjdC5uYW1lL3NyYy9tYWluL2phdmEvIgotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgdGFzayBzb3VyY2VKYXIodHlwZTogSmFyKSB7Ci0gICAgLy8gYmFzZU5hbWUtYXBwZW5kaXgtdmVyc2lvbi1jbGFzc2lmaWVyLmV4dGVuc2lvbgotICAgIGZyb20gc291cmNlU2V0cy5tYWluLmFsbEphdmEKLSAgICBjbGFzc2lmaWVyID0gJ3NvdXJjZXMnCi0gIH0gIAotCi0gIC8vIHN1cHBvcnQgZm9yICdncmFkbGUgcHVibGlzaFRvTWF2ZW5Mb2NhbCcgZXRjIAotICAvLyBUT0RPIHB1Ymxpc2hpbmcgdGVzdC57ZnZ0LHN2dH0gYW5kIHNhbXBsZXMgLi4uIGRvZXNuJ3Qgc2VlbSBkZXNpcmFibGU/IGUuZy4sIHdlJ3JlIGV4Y2x1ZGluZyB0ZXN0LntmdnQsc3Z0fSBqYXJzIGZyb20gdGhlIHRnegotICBpZiAocHJvamVjdC5wbHVnaW5NYW5hZ2VyLmhhc1BsdWdpbigncHVibGlzaGluZycpKSB7Ci0gICAgcHVibGlzaGluZyB7Ci0gICAgICBwdWJsaWNhdGlvbnMgewotICAgICAgICBtYXZlbkphdmEoTWF2ZW5QdWJsaWNhdGlvbikgewotICAgICAgICAgIC8vIHNwZWNpZnkgZGVwZW5kZW5jaWVzIGxpa2U6IG9yZy5hcGFjaGUuZWRnZW50OmVkZ2VudC5hcGkudG9wb2xvZ3k6MC40LjAKLSAgICAgICAgICBncm91cElkID0gYnVpbGRfZ3JvdXAKLSAgICAgICAgICBhcnRpZmFjdElkID0gIiR7cHJvamVjdC5ncm91cH0uJHtwcm9qZWN0Lm5hbWV9IiAKLSAgICAgICAgICBhcnRpZmFjdCBzb3VyY2VKYXIKLSAgICAgICAgICBpZiAocHJvamVjdC5wbHVnaW5NYW5hZ2VyLmhhc1BsdWdpbignd2FyJykpIHsKLSAgICAgICAgICAgIGZyb20gY29tcG9uZW50cy53ZWIKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmcm9tIGNvbXBvbmVudHMuamF2YQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAgIAotfQotCi10YXNrIGNvcHlTY3JpcHRzKHR5cGU6IENvcHkpIHsKLSAgZGVzY3JpcHRpb24gPSAnQ29weSBzY3JpcHRzIHRvIHRhcmdldF9qYXZhOF9kaXInCi0gIGluY2x1ZGVFbXB0eURpcnMgPSBmYWxzZQotICBmcm9tKCJzY3JpcHRzLyIpIHsgaW5jbHVkZSAiKiovKiIgfQotICBpbnRvICIkdGFyZ2V0X2phdmE4X2Rpci9zY3JpcHRzLyIKLX0KLQotLy9DcmVhdGUgSnVuaXQgUmVwb3J0Ci0vLyBuZWVkIHRvIHNldHVwIGNsYXNzcGF0aCB0byBqdW5pdC9qYWNvY28gZm9yIGFudC5qdW5pdHJlcG9ydCB0YXNrCi1jb25maWd1cmF0aW9ucyB7Ci0gIGp1bml0TGlicwotfQotZGVwZW5kZW5jaWVzIHsgLy8gdmVyc2lvbnMgd2l0aCBncmFkbGUgMy4xCi0gIGp1bml0TGlicyAnb3JnLmFwYWNoZS5hbnQ6YW50LWp1bml0OjEuOS42JwotICBqdW5pdExpYnMgJ29yZy5hcGFjaGUuYW50OmFudC1qdW5pdDQ6MS45LjYnCi0gIGp1bml0TGlicyAnb3JnLmphY29jbzpvcmcuamFjb2NvLmFudDowLjcuNy4yMDE2MDYwNjA2MDYnCi19Ci0KLXRhc2sgY3JlYXRlSnVuaXRSZXBvcnQgPDwgewotICBkZXNjcmlwdGlvbiA9ICJHZW5lcmF0ZXMgYSBKdW5pdCByZXBvcnQgZnJvbSBhbGwgc3VicHJvamVjdHMgKHVzZSBhZnRlciAndGVzdCcpIgotCi0gIGFudC5kZWxldGUoZGlyOiAiJHt0YXJnZXRfcmVwb3J0X2Rpcn0vdGVzdHMiKQotICBhbnQudGFza2RlZihuYW1lOiAnanVuaXRyZXBvcnQnLAotICAgICAgICAgIGNsYXNzbmFtZTogJ29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlhNTFJlc3VsdEFnZ3JlZ2F0b3InLAotICAgICAgICAgIGNsYXNzcGF0aDogY29uZmlndXJhdGlvbnMuanVuaXRMaWJzLmFzUGF0aCkKLSAgYW50Lmp1bml0cmVwb3J0KHRvZGlyOiAnLi8nKSB7Ci0gICAgZmlsZXNldChkaXI6ICcuLycsIGluY2x1ZGVzOiAnKiovdGVzdC1yZXN1bHRzL3Rlc3QvVEVTVC0qLnhtbCcpCi0gICAgcmVwb3J0KGZvcm1hdDogJ2ZyYW1lcycsIHRvZGlyOiAiJHt0YXJnZXRfcmVwb3J0X2Rpcn0vdGVzdHMiKQotICB9Ci0gIGFudC5tb3ZlKGZpbGU6ICJURVNUUy1UZXN0U3VpdGVzLnhtbCIsIHRvZmlsZTogIiR7dGFyZ2V0X3JlcG9ydF9kaXJ9L1RFU1RTLVRlc3RTdWl0ZXMueG1sIikKLX0KLQotYXBwbHkgZnJvbTogJ2dyYWRsZS9qYWNvY28uZ3JhZGxlJwotYXBwbHkgZnJvbTogJ2dyYWRsZS9qYXZhZG9jLmdyYWRsZScKLQotdGFzayBhZGRWZXJzaW9uRG90VHh0IHsKLSAgZGVzY3JpcHRpb24gPSAnQWRkIHZlcnNpb24udHh0IGluIHRhcmdldF9kaXInCi0gIGRvTGFzdCB7Ci0gICAgZGVmIG1hcCA9IFsKLSAgICAgIERTVEFNUDogIiREU1RBTVAiLAotICAgICAgVFNUQU1QOiAiJFRTVEFNUCIsCi0gICAgICBjb21taXRoYXNoOiAiJGNvbW1pdGhhc2giLAotICAgICAgJ2NvbW1pdGhhc2guZXJyb3InOiAiJGNvbW1pdGhhc2hfZXJyb3IiLAotICAgICAgJ2VkZ2VudC52ZXJzaW9uJzogIiRidWlsZF92ZXJzaW9uIiwKLSAgICAgIF0KLSAgICBkZWYgZiA9IG5ldyBGaWxlKCIkdGFyZ2V0X2Rpci92ZXJzaW9uLnR4dCIpOwotICAgIGRlZiBkID0gbmV3IEZpbGUodGFyZ2V0X2Rpcik7Ci0gICAgaWYoICFkLmV4aXN0cygpICkgeyBkLm1rZGlycygpIH0KLSAgICBmLmNyZWF0ZU5ld0ZpbGUoKQotICAgIG1hcC5mb3JFYWNoIHsgayx2IC0+IGYuYXBwZW5kICIkaz0kdlxuIiB9Ci0gIH0KLX0KLQotdGFzayByZWxlYXNlVGFyR3oodHlwZTogVGFyKSB7Ci0gIGRlc2NyaXB0aW9uID0gJ0NyZWF0ZSBiaW5hcnkgcmVsZWFzZSB0Z3ogaW4gdGFyZ2V0X2RpcicKLSAgYXJjaGl2ZU5hbWUgPSAiYXBhY2hlLSR7YnVpbGRfbmFtZX0tJHtidWlsZF92ZXJzaW9ufS1pbmN1YmF0aW5nJHtzbmFwc2hvdElkfS1iaW4udGd6IgotICBjb21wcmVzc2lvbiA9IENvbXByZXNzaW9uLkdaSVAKLSAgZGVzdGluYXRpb25EaXIgPSBuZXcgRmlsZSgiJHt0YXJnZXRfZGlyfS8uLi9yZWxlYXNlLWVkZ2VudCIpCi0gIGR1cGxpY2F0ZXNTdHJhdGVneSAnZXhjbHVkZScKLSAgaW50byAiJHtidWlsZF9uYW1lfS0ke2J1aWxkX3ZlcnNpb259JHtzbmFwc2hvdElkfSIKLSAgLy8gbWFrZSBzb21lIHRoaW5ncyBmaXJzdCBpbiB0aGUgdGd6Ci0gIGZyb20gcm9vdFByb2plY3QuZmlsZSgnYmluYXJ5LXJlbGVhc2UvTElDRU5TRScpCi0gIGZyb20gcm9vdFByb2plY3QuZmlsZSgnYmluYXJ5LXJlbGVhc2UvTk9USUNFJykKLSAgaW50byAoJ2xpY2Vuc2VzJykgeyBmcm9tICdsaWNlbnNlcycgfQotICBmcm9tICdESVNDTEFJTUVSJywgJ0pBVkFfU1VQUE9SVC5tZCcKLSAgZnJvbSByb290UHJvamVjdC5maWxlKCdiaW5hcnktcmVsZWFzZS9SRUFETUUnKQotICBmcm9tICdSRUxFQVNFX05PVEVTJywgJ0NPTlRSSUJVVE9SUycKLSAgZnJvbSAiJHRhcmdldF9kaXIvdmVyc2lvbi50eHQiCi0gIGZyb20gdGFyZ2V0X2RpcgotICBleGNsdWRlICcqKi90ZXN0L3N2dC8nCi0gIGV4Y2x1ZGUgJyoqL2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LXNlcnZlci8nIC8vIGp1c3QgcGFydCBvZiB3c2NsaWVudCB0ZXN0IGhhcm5lc3MKLSAgZG9MYXN0IHsKLSAgICBhbnQuY2hlY2tzdW0gYWxnb3JpdGhtOiAnbWQ1JywgZmlsZTogYXJjaGl2ZVBhdGgKLSAgICBhbnQuY2hlY2tzdW0gYWxnb3JpdGhtOiAnc2hhLTUxMicsIGZpbGVleHQ6ICcuc2hhJywgZmlsZTogYXJjaGl2ZVBhdGgKLSAgICBwcmludGxuICJjcmVhdGVkICRkZXN0aW5hdGlvbkRpci8kYXJjaGl2ZU5hbWUiCi0gIH0KLX0gIAotCi10YXNrIHNyY1JlbGVhc2VUYXJHeih0eXBlOiBUYXIpIHsKLSAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlIHNvdXJjZSByZWxlYXNlIHRneiBpbiB0YXJnZXRfZGlyJwotICBhcmNoaXZlTmFtZSA9ICJhcGFjaGUtJHtidWlsZF9uYW1lfS0ke2J1aWxkX3ZlcnNpb259LWluY3ViYXRpbmcke3NuYXBzaG90SWR9LXNyYy50Z3oiCi0gIGNvbXByZXNzaW9uID0gQ29tcHJlc3Npb24uR1pJUAotICBkZXN0aW5hdGlvbkRpciA9IG5ldyBGaWxlKCIke3RhcmdldF9kaXJ9Ly4uL3JlbGVhc2UtZWRnZW50IikKLSAgZHVwbGljYXRlc1N0cmF0ZWd5ICdleGNsdWRlJwotICBpbnRvICIke2J1aWxkX25hbWV9LSR7YnVpbGRfdmVyc2lvbn0ke3NuYXBzaG90SWR9LXNyYyIKLSAgLy8gbWFrZSBzb21lIHRoaW5ncyBmaXJzdCBpbiB0aGUgdGd6Ci0gIGZyb20gJ0xJQ0VOU0UnLCAnTk9USUNFJwotICBmcm9tICdESVNDTEFJTUVSJywgJ0pBVkFfU1VQUE9SVC5tZCcKLSAgZnJvbSAnUkVMRUFTRV9OT1RFUycKLSAgZnJvbSAnUkVBRE1FJwotICBleGNsdWRlICdSRUFETUUubWQnCi0gIGZyb20gJ0RFVkVMT1BNRU5ULm1kJwotICBmcm9tICcuJwotICBleGNsdWRlICdLRVlTJwotICBleGNsdWRlICcuZ2l0JywgJy5ncmFkbGUnLCAnLnNldHRpbmdzJwotICBleGNsdWRlICcuZ3JhZGxlLXdyYXBwZXInLCAnZ3JhZGxldycsICdncmFkbGV3LmJhdCcKLSAgZXhjbHVkZSAnKiovYnVpbGQvJyAgICAgICAgICAgLy8gZ3JhZGxlIGdlbmVyYXRlZCBhcnRpZmFjdHMKLSAgZXhjbHVkZSAnKiovZXh0ZXJuYWxKYXJzLycgICAgLy8gZ3JhZGxlIGdlbmVyYXRlZCBhcnRpZmFjdHMgZm9yIGVjbGlwc2UKLSAgZXhjbHVkZSAnKiovYmluLycgICAgICAgICAgICAgLy8gZWNsaXBzZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzCi0gIGV4Y2x1ZGUgJyoqLyouY2xhc3MnICAgICAgICAgIC8vIGZpbmFsIGJhY2tzdG9wIGp1c3QgaW4gY2FzZQotICBleGNsdWRlICdjb25uZWN0b3JzL2pkYmMvZGVyYnkubG9nJyAgICAgICAgIC8vIHRlc3QgY3J1ZnQKLSAgZXhjbHVkZSAnY29ubmVjdG9ycy9qZGJjL0pkYmNTdHJlYW1zVGVzdERiJyAvLyB0ZXN0IGNydWZ0Ci0gIGRvTGFzdCB7Ci0gICAgYW50LmNoZWNrc3VtIGFsZ29yaXRobTogJ21kNScsIGZpbGU6IGFyY2hpdmVQYXRoCi0gICAgYW50LmNoZWNrc3VtIGFsZ29yaXRobTogJ3NoYS01MTInLCBmaWxlZXh0OiAnLnNoYScsIGZpbGU6IGFyY2hpdmVQYXRoCi0gICAgcHJpbnRsbiAiY3JlYXRlZCAkZGVzdGluYXRpb25EaXIvJGFyY2hpdmVOYW1lIgotICB9Ci19ICAKLQotZ3JhZGxlLnRhc2tHcmFwaC53aGVuUmVhZHkgeyB0YXNrR3JhcGggLT4KLSAgICBpZiAoZXh0LiJzaWduaW5nLnBhc3N3b3JkIj09bnVsbCAmJiB0YXNrR3JhcGguYWxsVGFza3MuYW55IHsgaXQgaW5zdGFuY2VvZiBTaWduIH0pIHsKLSAgICAgICAgLy8gVXNlIEphdmEgY29uc29sZSB0byByZWFkIGZyb20gdGhlIGNvbnNvbGUgKG5vIGdvb2QgZm9yIGEgQ0kgZW52aXJvbm1lbnQpCi0gICAgICAgIGRlZiBDb25zb2xlIGNvbnNvbGUgPSBTeXN0ZW0uY29uc29sZSgpCi0gICAgICAgIGNvbnNvbGUucHJpbnRmICJcblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIgKwotICAgICAgICAgICAgICAgICAgICAgICAiXG5XZSBoYXZlIHRvIHNpZ24gc29tZSB0aGluZ3MgaW4gdGhpcyBidWlsZC4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIlxuUGxlYXNlIGVudGVyIHlvdXIgc2lnbmluZyBkZXRhaWxzLlxuXG4iCi0gICAgICAgIGRlZiBpZCA9IFN5c3RlbS5lbnZbJ0dQR19JRCddCi0gICAgICAgIHRyeSB7IAotICAgICAgICAgIGRlZiB0bXBJZCA9IGNvbnNvbGUucmVhZExpbmUoIlBHUCBDb2RlIFNpZ25pbmcgS2V5IElkIChkZWZhdWx0OiAkaWQpOiAiKQotICAgICAgICAgIGlmICghdG1wSWQuaXNFbXB0eSgpKQotICAgICAgICAgICAgaWQgPSB0bXBJZAotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbigiWW91IG11c3QgcnVuICdzaWduQWxsIC0tbm8tZGFlbW9uJyIpCi0gICAgICAgIH0KLSAgICAgICAgZGVmIGZpbGUgPSBTeXN0ZW0uZW52WydHUEdfU0VDUklORyddCi0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICBmaWxlID0gIiR7U3lzdGVtLnByb3BlcnRpZXNbJ3VzZXIuaG9tZSddfS8uZ251cGcvc2VjcmluZy5ncGciCi0gICAgICAgIH0KLSAgICAgICAgZGVmIHRtcEZpbGUgPSBjb25zb2xlLnJlYWRMaW5lKCJQR1AgU2VjcmV0IEtleSBSaW5nIEZpbGUgKGRlZmF1bHQ6ICRmaWxlKTogIikKLSAgICAgICAgaWYgKCF0bXBGaWxlLmlzRW1wdHkoKSkgewotICAgICAgICAgIGZpbGUgPSB0bXBGaWxlCi0gICAgICAgIH0KLSAgICAgICAgZGVmIHBhc3N3b3JkID0gU3RyaW5nLnZhbHVlT2YoY29uc29sZS5yZWFkUGFzc3dvcmQoIlBHUCBQcml2YXRlIEtleSBQYXNzd29yZDogIikpCi0KLSAgICAgICAgYWxscHJvamVjdHMgeyBleHQuInNpZ25pbmcua2V5SWQiID0gaWQgfQotICAgICAgICBhbGxwcm9qZWN0cyB7IGV4dC4ic2lnbmluZy5zZWNyZXRLZXlSaW5nRmlsZSIgPSBmaWxlIH0KLSAgICAgICAgYWxscHJvamVjdHMgeyBleHQuInNpZ25pbmcucGFzc3dvcmQiID0gcGFzc3dvcmQgfQotCi0gICAgICAgIGNvbnNvbGUucHJpbnRmICJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIKLSAgICB9Ci19Ci0KLXRhc2sgc2lnbkFsbCh0eXBlOiBTaWduKSB7Ci0gICAgZGVzY3JpcHRpb249J1NpZ24gZXhpc3RpbmcgcmVsZWFzZSBhcnRpZmFjdHMgaW4gJHt0YXJnZXRfZGlyfS8uLi9yZWxlYXNlLWVkZ2VudCAocnVuIHNlcGFyZXRlbHkgYWZ0ZXIgInJlbGVhc2UiKScKLSAgICBmaWxlVHJlZSgiJHt0YXJnZXRfZGlyfS8uLi9yZWxlYXNlLWVkZ2VudCIpIHsKLSAgICAgICAgaW5jbHVkZSAnKiovKi50Z3onCi0gICAgfS5lYWNoIHsKLSAgICAgIHNpZ24gaXQKLSAgICB9Ci0gICAgb3V0cHV0cy51cFRvRGF0ZVdoZW4geyBmYWxzZSB9Ci0gICAgZG9GaXJzdCB7Ci0gICAgICBpZiAoZ2V0RmlsZXNUb1NpZ24oKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEdyYWRsZUV4Y2VwdGlvbigiTm8gYXJ0aWZhY3RzIHRvIHNpZ24uIFJ1biB0aGUgJ3JlbGVhc2UnIHRhc2sgZmlyc3QuIikKLSAgICAgIH0KLSAgICAgIC8vcHJpbnRsbiAiIyMjIGZpbGVzIHRvIHNpZ246ICIgKyBnZXRGaWxlc1RvU2lnbigpLmNvbGxlY3QgeyBpdC5uYW1lIH0uam9pbigiLCIpCi0gICAgfQotICAgIGRvTGFzdCB7Ci0gICAgICBwcmludGxuICJcbkNyZWF0ZWQgc2lnbmF0dXJlIGZpbGVzOiAiICsgZ2V0U2lnbmF0dXJlRmlsZXMoKS5jb2xsZWN0IHsgaXQubmFtZSB9LmpvaW4oIiwgIikKLSAgICB9Ci19Ci0KLWFzc2VtYmxlIHsKLSAgZGVzY3JpcHRpb24gPSAiQXNzZW1ibGUgZGlzdHJpYnV0aW9uIGFydGlmYWN0cyBhbmQgcG9wdWxhdGUgdGhlIHRhcmdldF9kaXIgd2l0aCBqYXJzLCBkb2MsIGV0Yy4gTGlrZSAnYnVpbGQnIHcvbyAndGVzdCciCi0gIGRlcGVuZHNPbiBmaWx0ZXJlZFN1YnByb2plY3RzLmFzc2VtYmxlLCBhZ2dyZWdhdGVKYXZhZG9jLCBjb3B5U2NyaXB0cwotICBhZ2dyZWdhdGVKYXZhZG9jLm11c3RSdW5BZnRlciBmaWx0ZXJlZFN1YnByb2plY3RzKi5hc3NlbWJsZQotfQotCi10YXNrIGFsbChkZXBlbmRzT246IGFzc2VtYmxlKSB7Ci0gIGRlc2NyaXB0aW9uID0gImFsaWFzIGZvciAnYXNzZW1ibGUnIgotfQotCi10YXNrIGNsZWFuQWxsKHR5cGU6IERlbGV0ZSkgewotICBkZXNjcmlwdGlvbiA9ICdjbGVhbiBhZ2dyZWdhdG9yJyAgLy8gInJlbGVhc2UgZGVwZW5kc09uIGNsZWFuIiBvbmx5IGRvZXMgdG9wLWxldmVsIGNsZWFuCi0gIGRlcGVuZHNPbiBjbGVhbiwgZmlsdGVyZWRTdWJwcm9qZWN0cyouY2xlYW4KLSAgLy8gcHVyZ2Ugb2xkIGFudCBidWlsZCBhcnRpZmFjdHMKLSAgZGVsZXRlICd0YXJnZXQnCi0gIGRlbGV0ZSAncmVwb3J0cycKLSAgZGVsZXRlIGZpbGVUcmVlKGRpcjogJy4nLCBpbmNsdWRlczpbJyoqL2NsYXNzZXMvJywgJyoqL3Rlc3QuY2xhc3Nlcy8nXSkKLSAgLy8gcmV0cm83IHByb2Nlc3NpbmcgY3J1ZnQgCi0gIGRlbGV0ZSBmaWxlVHJlZShkaXI6ICcuJywgaW5jbHVkZXM6WycqKi9jbGFzc2VzLmluLycsICcqKi9jbGFzc2VzLm91dC8nXSkgCi19Ci0KLXRhc2sgcmVsZWFzZSB7Ci0gIGRlc2NyaXB0aW9uID0gJ0Fzc2VtYmxlIGRpc3RyaWJ1dGlvbiBhcnRpZmFjdHMsIHBvcHVsYXRlIHRhcmdldF9kaXIsIGFuZCBjcmVhdGUgYSByZWxlYXNlIHRneicKLSAgZGVwZW5kc09uIGNsZWFuQWxsLCBhZGRWZXJzaW9uRG90VHh0LCBhc3NlbWJsZSwKLSAgICAgICAnOnBsYXRmb3JtOmphdmE3OmFkZEphdmE3VGFyZ2V0RGlyJywgJzpwbGF0Zm9ybTphbmRyb2lkOmFkZEFuZHJvaWRUYXJnZXREaXInLAotICAgICAgIHNyY1JlbGVhc2VUYXJHeiwgcmVsZWFzZVRhckd6Ci0gIGFkZFZlcnNpb25Eb3RUeHQubXVzdFJ1bkFmdGVyIGNsZWFuQWxsCi0gIGFzc2VtYmxlLm11c3RSdW5BZnRlciBhZGRWZXJzaW9uRG90VHh0Ci0gIHJlbGVhc2VUYXJHei5tdXN0UnVuQWZ0ZXIgYXNzZW1ibGUsJzpwbGF0Zm9ybTpqYXZhNzphZGRKYXZhN1RhcmdldERpcicsJzpwbGF0Zm9ybTphbmRyb2lkOmFkZEFuZHJvaWRUYXJnZXREaXInCi19Ci0KLXRhc2sgcmVwb3J0cyB7Ci0gIGRlc2NyaXB0aW9uID0gIkdlbmVyYXRlIEpVbml0IGFuZCBDb3ZlcmFnZSByZXBvcnRzIG9mIHByaW9yIHRlc3QgcnVuLiBVc2UgYWZ0ZXIgJ3Rlc3QnIgotICBkZXBlbmRzT24gY3JlYXRlSnVuaXRSZXBvcnQsIGphY29jb1Rlc3RSZXBvcnQKLX0KLQotdGFzayB0ZXN0N0FkanVzdEphY29jb1JlcG9ydCA8PCB7Ci0gIGphY29jb1Rlc3RSZXBvcnQudGVzdDdBZGp1c3RKYWNvY29SZXBvcnQgPSB0cnVlCi0gIGxvZ2dlci5saWZlY3ljbGUgIiMjIyBOT1RFOiBbV0lQXSB0ZXN0NyBqYWNvY28gcmVwb3J0aW5nICMjIyIKLX0KLQotdGFzayB0ZXN0N1JlcG9ydHMgewotICBkZXNjcmlwdGlvbiA9ICJHZW5lcmF0ZSBKVW5pdCBhbmQgQ292ZXJhZ2UgcmVwb3J0cyBvZiBwcmlvciB0ZXN0IHJ1bi4gVXNlIGFmdGVyICd0ZXN0N1J1biciCi0gIGRlcGVuZHNPbiBjcmVhdGVKdW5pdFJlcG9ydCwgdGVzdDdBZGp1c3RKYWNvY29SZXBvcnQsIGphY29jb1Rlc3RSZXBvcnQKLSAgamFjb2NvVGVzdFJlcG9ydC5tdXN0UnVuQWZ0ZXIgdGVzdDdBZGp1c3RKYWNvY29SZXBvcnQKLX0KLQotLy8gYnVpbGQ6IGluamVjdCB0ZXN0IHJlcG9ydCBnZW5lcmF0aW9uIGFuZCBqYXZhZG9jIGdlbmVyYXRpb24gKGZvciBlYXJseSBwcm9ibGVtIGRldGVjdGlvbikKLS8vIG1ha2UgJ2J1aWxkJyBsaWtlICJhbGwgdGVzdCByZXBvcnRzIgotYnVpbGQgewotICBkZXBlbmRzT24gZmlsdGVyZWRTdWJwcm9qZWN0cy5idWlsZCwgcmVwb3J0cwotICByZXBvcnRzLm11c3RSdW5BZnRlciBmaWx0ZXJlZFN1YnByb2plY3RzLmJ1aWxkIAotfQotCi10YXNrIHNldHVwRXh0ZXJuYWxKYXJzIHsKLSAgZGVzY3JpcHRpb24gPSAnQWRkIGFsbCBvZiB0aGUgZGVwZW5kYW50IGV4dGVybmFsIGphcnMgdG8gdGhlIHRhcmdldC1kaXIgKG1ha2UgYXZhaWxhYmxlIHRvIEVjbGlwc2UsIGV0YyknCi0gIGRlcGVuZHNPbiBzZXR1cENvbW1vbkV4dEphcnMsIGZpbHRlcmVkU3VicHJvamVjdHMuc2V0dXBQcm9qZWN0RXh0SmFycwotfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy8uY2xhc3NwYXRoIGIvY29ubmVjdG9ycy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFiZTYxLi4wMDAwMDAwCi0tLSBhL2Nvbm5lY3RvcnMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbi9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9uL3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tYW5kL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tYW5kL3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjc3Yvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNzdi9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZmlsZS9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZmlsZS9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iaHR0cC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iaHR0cC9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iaW90L3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJpb3Qvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImlvdHAvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpkYmMvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpkYmMvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImthZmthL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJrYWZrYS9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibXF0dC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibXF0dC9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHVic3ViL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwdWJzdWIvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcmlhbC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZWRnZW50LmphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamF2YXgud2Vic29ja2V0LWNsaWVudC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id3NjbGllbnQvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy90ZXN0L2phdmEiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqYXZheC53ZWJzb2NrZXQtY2xpZW50L3NyYy9tYWluL3Jlc291cmNlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2h0dHAvZXh0L2NvbW1vbnMtY29kZWMtMS45LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2h0dHAvZXh0L2NvbW1vbnMtbG9nZ2luZy0xLjIuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2Nvbm5lY3RvcnMvaHR0cC9leHQvaHR0cGNsaWVudC00LjUuMS5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9odHRwL2V4dC9odHRwY29yZS00LjQuNC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9pb3RwL2V4dC93YXRzb24taW90LTAuMi4yLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2lvdHAvZXh0L2NvbW1vbnMtbGFuZzMtMy40LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2lvdHAvZXh0L2NvbW1vbnMtY29kZWMtMS4xMC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9pb3RwL2V4dC9jb21tb25zLWxvZ2dpbmctMS4yLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2lvdHAvZXh0L2NvbW1vbnMtbmV0LTMuMy5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9pb3RwL2V4dC9odHRwY2xpZW50LTQuNS4xLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2lvdHAvZXh0L2h0dHBjb3JlLTQuNC4zLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2lvdHAvZXh0L2pvZGEtdGltZS0yLjkuMi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9pb3RwL2V4dC9vcmcuZWNsaXBzZS5wYWhvLmNsaWVudC5tcXR0djMtMS4xLjAuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2Nvbm5lY3RvcnMva2Fma2EvZXh0L2thZmthXzIuMTAtMC44LjIuMi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9rYWZrYS9leHQva2Fma2EtY2xpZW50cy0wLjguMi4yLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2thZmthL2V4dC9sb2c0ai0xLjIuMTYuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2Nvbm5lY3RvcnMva2Fma2EvZXh0L21ldHJpY3MtY29yZS0yLjIuMC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9rYWZrYS9leHQvc2NhbGEtbGlicmFyeS0yLjEwLjQuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2Nvbm5lY3RvcnMva2Fma2EvZXh0L3prY2xpZW50LTAuMy5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9rYWZrYS9leHQvem9va2VlcGVyLTMuNC42LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL21xdHQvZXh0L29yZy5lY2xpcHNlLnBhaG8uY2xpZW50Lm1xdHR2My0xLjEuMC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9qYXZheC53ZWJzb2NrZXQtY2xpZW50L2V4dC9qYXZheC13ZWJzb2NrZXQtY2xpZW50LWltcGwtOS4zLjYudjIwMTUxMTA2LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvZXh0L2phdmF4LndlYnNvY2tldC1hcGktMS4wLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvZXh0L2pldHR5LXV0aWwtOS4zLjYudjIwMTUxMTA2LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvZXh0L3dlYnNvY2tldC1hcGktOS4zLjYudjIwMTUxMTA2LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvZXh0L3dlYnNvY2tldC1jbGllbnQtOS4zLjYudjIwMTUxMTA2LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvZXh0L3dlYnNvY2tldC1jb21tb24tOS4zLjYudjIwMTUxMTA2LmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1zZXJ2ZXIvZXh0L2phdmF4LXdlYnNvY2tldC1zZXJ2ZXItaW1wbC05LjMuNi52MjAxNTExMDYuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LXNlcnZlci9leHQvamV0dHktaHR0cC05LjMuNi52MjAxNTExMDYuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LXNlcnZlci9leHQvamV0dHktaW8tOS4zLjYudjIwMTUxMTA2LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1zZXJ2ZXIvZXh0L2pldHR5LXNlY3VyaXR5LTkuMy42LnYyMDE1MTEwNi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9qYXZheC53ZWJzb2NrZXQtc2VydmVyL2V4dC9qZXR0eS1zZXJ2ZXItOS4zLjYudjIwMTUxMTA2LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1zZXJ2ZXIvZXh0L2pldHR5LXNlcnZsZXQtOS4zLjYudjIwMTUxMTA2LmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1zZXJ2ZXIvZXh0L2phdmF4LnNlcnZsZXQtYXBpLTMuMS4wLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1zZXJ2ZXIvZXh0L3dlYnNvY2tldC1zZXJ2ZXItOS4zLjYudjIwMTUxMTA2LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1zZXJ2ZXIvZXh0L3dlYnNvY2tldC1zZXJ2bGV0LTkuMy42LnYyMDE1MTEwNi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuSlVOSVRfQ09OVEFJTkVSLzQiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvYXBpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2V4dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9zcGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvcHJvdmlkZXJzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvLmdpdGlnbm9yZSBiL2Nvbm5lY3RvcnMvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNjEwNS4uMDAwMDAwMAotLS0gYS9jb25uZWN0b3JzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS9jbGFzc2VzLwotKiovdGVzdC5jbGFzc2VzLwotKiovY2xhc3Nlcy8KLSoqL3VuaXR0ZXN0cy8KLS9iaW4vCi1qZGJjL2RlcmJ5LmxvZwotamRiYy9KZGJjU3RyZWFtc1Rlc3REYgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy8ucHJvamVjdCBiL2Nvbm5lY3RvcnMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2MyMmUuLjAwMDAwMDAKLS0tIGEvY29ubmVjdG9ycy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbm5lY3RvcnM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9jb21tYW5kL2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvY29tbWFuZC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZWI0OGMuLjAwMDAwMDAKLS0tIGEvY29ubmVjdG9ycy9jb21tYW5kL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTp0b3BvbG9neScKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmNvbm5lY3RvcnM6Y29tbW9uJwotICAKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ3Rlc3RDb21waWxlJywgJzpwcm92aWRlcnM6ZGlyZWN0JwotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQotCi1hZGRDb21waWxlVGVzdERlcGVuZGVuY2llcyAnOmFwaTp0b3BvbG9neScsICc6cHJvdmlkZXJzOmRpcmVjdCcsICc6Y29ubmVjdG9yczpjb21tb24nCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2NvbW1hbmQvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvY29tbWFuZC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTQ2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2NvbW1hbmQvcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbWFuZDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25uZWN0b3JzOiBDb21tYW5kPC9uYW1lPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvY29tbWFuZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvY29tbWFuZC9ydW50aW1lL0NvbW1hbmRSZWFkZXIuamF2YSBiL2Nvbm5lY3RvcnMvY29tbWFuZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvY29tbWFuZC9ydW50aW1lL0NvbW1hbmRSZWFkZXIuamF2YQppbmRleCBlYzJiYzMxLi5iNjk5ZTgwIDEwMDY0NAotLS0gYS9jb25uZWN0b3JzL2NvbW1hbmQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL2NvbW1hbmQvcnVudGltZS9Db21tYW5kUmVhZGVyLmphdmEKKysrIGIvY29ubmVjdG9ycy9jb21tYW5kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy9jb21tYW5kL3J1bnRpbWUvQ29tbWFuZFJlYWRlci5qYXZhCkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNsb3NlUHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U3VwcGxpZXJJdGVyYXRvciA9PSBudWxsICYmIGNhblN0YXJ0KCkpIHsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjYW5TdGFydCgpKSB7CiAgICAgICAgICAgICAgICAgICBzdGFydCgpOyAvLyBhbmQgbG9vcC9yZXRyeQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvY29tbWFuZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvY29tbWFuZC9ydW50aW1lL0NvbW1hbmRXcml0ZXIuamF2YSBiL2Nvbm5lY3RvcnMvY29tbWFuZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvY29tbWFuZC9ydW50aW1lL0NvbW1hbmRXcml0ZXIuamF2YQppbmRleCBlMzMwOGRjLi5hYzU1ZTY5IDEwMDY0NAotLS0gYS9jb25uZWN0b3JzL2NvbW1hbmQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL2NvbW1hbmQvcnVudGltZS9Db21tYW5kV3JpdGVyLmphdmEKKysrIGIvY29ubmVjdG9ycy9jb21tYW5kL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy9jb21tYW5kL3J1bnRpbWUvQ29tbWFuZFdyaXRlci5qYXZhCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICBjbG9zZVByb2Nlc3MoKTsgLy8gYW5kIGxvb3AvcmV0cnkKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3VycmVudENvbnN1bWVyID09IG51bGwgJiYgY2FuU3RhcnQoKSkgeworICAgICAgICBlbHNlIGlmIChjYW5TdGFydCgpKSB7CiAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJTVEFSVElORyBmb3I6IHt9IiwgdmFsdWUpOwogICAgICAgICAgIHN0YXJ0KCk7ICAvLyBhbmQgbG9vcC9yZXRyeQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2NvbW1hbmQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvY29tbWFuZC9Db21tYW5kU3RyZWFtc1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvY29tbWFuZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9jb21tYW5kL0NvbW1hbmRTdHJlYW1zVGVzdC5qYXZhCmluZGV4IGUyYWQzYzcuLmJjOTZhZDIgMTAwNjQ0Ci0tLSBhL2Nvbm5lY3RvcnMvY29tbWFuZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9jb21tYW5kL0NvbW1hbmRTdHJlYW1zVGVzdC5qYXZhCisrKyBiL2Nvbm5lY3RvcnMvY29tbWFuZC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9jb21tYW5kL0NvbW1hbmRTdHJlYW1zVGVzdC5qYXZhCkBAIC00MSw4ICs0MSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kudGVzdGVyLkNvbmRpdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwotCiBwdWJsaWMgY2xhc3MgQ29tbWFuZFN0cmVhbXNUZXN0IGV4dGVuZHMgRGlyZWN0VG9wb2xvZ3lUZXN0QmFzZSB7CiAgICAgCiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBzdGRMaW5lcyA9IG5ldyBTdHJpbmdbXSB7CkBAIC0xNzYsOSArMTc0LDI0IEBACiAgICAgICBhc3NlcnROb3ROdWxsKHNpbmspOwogICAgICAgCiAgICAgICB0cnkgewotICAgICAgICAvLyBzdGFydCB0aGUgam9iLCBzbGVlcCBmb3IgYSBiaXQgKGF3YWl0IHRoZSB0aW1lb3V0KSB0aGVuIHZhbGlkYXRlIHNpbmsgb3V0cHV0Ci0gICAgICAgIENvbmRpdGlvbjw/PiBuZXZlciA9IHQuZ2V0VGVzdGVyKCkudHVwbGVDb3VudChzLCBMb25nLk1BWF9WQUxVRSk7Ci0gICAgICAgIHQuZ2V0VGVzdGVyKCkuY29tcGxldGUoZ2V0U3VibWl0dGVyKCksIG5ldyBKc29uT2JqZWN0KCksIG5ldmVyLCAzLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgLy8gY29tcGxldGUgd2hlbiB0aGUgc2luayBoYXMgZ2VuZXJhdGVkIHRoZSBleHBlY3RlZCByZXN1bHRzCisgICAgICAgIENvbmRpdGlvbjxPYmplY3Q+IHRjID0gbmV3IENvbmRpdGlvbjxPYmplY3Q+KCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmFsaWQoKSB7IAorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxlVXRpbC52YWxpZGF0ZUZpbGUodGVtcEZpbGUxLCBnZXRMaW5lcygpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHQoKSB7IHJldHVybiAidG9kby1maWxlcy1saW5lcyI7IH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBJZiB3ZSB0aW1lIG91dCwgc3RpbGwgdmFsaWRhdGUgY29udGVudCB0byBzZWUgd2hhdCB3ZSBkaWQgZ2V0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb21wbGV0ZSh0LCB0YywgMywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3QgdGltZSBvdXQiKTsKKyAgICAgICAgfQogCiAgICAgICAgIEZpbGVVdGlsLnZhbGlkYXRlRmlsZSh0ZW1wRmlsZTEsIGdldExpbmVzKCkpOwogICAgICAgfQpAQCAtMjI5LDExICsyNDIsMjUgQEAKICAgICAgIGFzc2VydE5vdE51bGwoc2luayk7CiAgICAgICAKICAgICAgIHRyeSB7Ci0gICAgICAgIC8vIHN0YXJ0IHRoZSBqb2IsIHNsZWVwIGZvciBhIGJpdCAoYXdhaXQgdGhlIHRpbWVvdXQpIHRoZW4gdmFsaWRhdGUgc2luayBvdXRwdXQKLSAgICAgICAgQ29uZGl0aW9uPD8+IG5ldmVyID0gdC5nZXRUZXN0ZXIoKS50dXBsZUNvdW50KHMsIExvbmcuTUFYX1ZBTFVFKTsKLSAgICAgICAgdC5nZXRUZXN0ZXIoKS5jb21wbGV0ZShnZXRTdWJtaXR0ZXIoKSwgbmV3IEpzb25PYmplY3QoKSwgbmV2ZXIsCi0gICAgICAgICAgICA2ICsgKChOVU1fUlVOUy0xKSAqIDEvKnJlc3RhcnQgZGVsYXkqLyksIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICAKKyAgICAgICAgLy8gY29tcGxldGUgd2hlbiB0aGUgc2luayBoYXMgZ2VuZXJhdGVkIHRoZSBleHBlY3RlZCByZXN1bHRzCisgICAgICAgIENvbmRpdGlvbjxPYmplY3Q+IHRjID0gbmV3IENvbmRpdGlvbjxPYmplY3Q+KCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmFsaWQoKSB7IAorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxlVXRpbC52YWxpZGF0ZUZpbGUodGVtcEZpbGUxLCBleHBMaW5lcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZXN1bHQoKSB7IHJldHVybiAidG9kby1maWxlcy1saW5lcyI7IH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBJZiB3ZSB0aW1lIG91dCwgc3RpbGwgdmFsaWRhdGUgY29udGVudCB0byBzZWUgd2hhdCB3ZSBkaWQgZ2V0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb21wbGV0ZSh0LCB0YywgNiArICgoTlVNX1JVTlMtMSkgKiAxLypyZXN0YXJ0IGRlbGF5Ki8pLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdCB0aW1lIG91dCIpOworICAgICAgICB9CisKICAgICAgICAgRmlsZVV0aWwudmFsaWRhdGVGaWxlKHRlbXBGaWxlMSwgZXhwTGluZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CiAgICAgICB9CiAgICAgICBmaW5hbGx5IHsKQEAgLTI0Miw3ICsyNjksNyBAQAogICAgIH0KICAgICAKICAgICBwcml2YXRlIFN0cmluZyBnZXRDbWRQYXRoKFN0cmluZyBjbWQpIHsKLSAgICAgIHJldHVybiBUZXN0UmVwb1BhdGguZ2V0UGF0aCgiY29ubmVjdG9ycyIsICJjb21tYW5kIiwgInNyYyIsICJ0ZXN0IiwgInNjcmlwdHMiLCBjbWQpOworICAgICAgcmV0dXJuIFRlc3RSZXBvUGF0aC5nZXRQYXRoKGNtZCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2NvbW1hbmQvc3JjL3Rlc3Qvc2NyaXB0cy9zaW5rY21kIGIvY29ubmVjdG9ycy9jb21tYW5kL3NyYy90ZXN0L3Jlc291cmNlcy9zaW5rY21kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL2NvbW1hbmQvc3JjL3Rlc3Qvc2NyaXB0cy9zaW5rY21kCnJlbmFtZSB0byBjb25uZWN0b3JzL2NvbW1hbmQvc3JjL3Rlc3QvcmVzb3VyY2VzL3NpbmtjbWQKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvY29tbW9uL2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvY29tbW9uL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmMTU1My4uMDAwMDAwMAotLS0gYS9jb25uZWN0b3JzL2NvbW1vbi9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JwotCi10ZXN0IHsKLSAgLy8gdGhpcyBwcm9qZWN0IGxhY2tzIHRlc3RzIGFuZCB0aGlzIHRhc2sgZmFpbHMgaWYgYXR0ZW1wdGVkIAotICBlbmFibGVkID0gZmFsc2UKLX0KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvY29tbW9uL3BvbS54bWwgYi9jb25uZWN0b3JzL2NvbW1vbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDkxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2NvbW1vbi9wb20ueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQ29ubmVjdG9yczogQ29tbW9uPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2NvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9jb21tb24vQ29ubmVjdG9yVGVzdEJhc2UuamF2YSBiL2Nvbm5lY3RvcnMvY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2NvbW1vbi9Db25uZWN0b3JUZXN0QmFzZS5qYXZhCmluZGV4IGY1MjMwYTkuLjgyYTcwYzAgMTAwNjQ0Ci0tLSBhL2Nvbm5lY3RvcnMvY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2NvbW1vbi9Db25uZWN0b3JUZXN0QmFzZS5qYXZhCisrKyBiL2Nvbm5lY3RvcnMvY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2NvbW1vbi9Db25uZWN0b3JUZXN0QmFzZS5qYXZhCkBAIC0yMywxMCArMjMsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudGVzdC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFRvcG9sb2d5VGVzdEJhc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKK2ltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS50ZXN0ZXIuQ29uZGl0aW9uOwogCiBwdWJsaWMgY2xhc3MgQ29ubmVjdG9yVGVzdEJhc2UgZXh0ZW5kcyBEaXJlY3RUb3BvbG9neVRlc3RCYXNlIHsKICAgICAKQEAgLTEwMiw1ICsxMDQsMjMgQEAKIAogICAgICAgICBzdXBlci5jb21wbGV0ZUFuZFZhbGlkYXRlKG9yZGVyZWQsIG1zZywgdCwgcywgc2VjVGltZW91dCwgZXhwZWN0ZWQpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIENvbmRpdGlvbjxPYmplY3Q+IG5ld1dhaXRUaW1lQ29uZGl0aW9uKGludCBzZWNvbmRzKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29uZGl0aW9uPE9iamVjdD4oKSB7CisgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3RhcnRUaW1lID0gMDsKKyAgICAgICAgICAgIHByaXZhdGUgbG9uZyBlbmRUaW1lID0gMDsKKyAgICAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkb25lID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lPT0wKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBlbmRUaW1lID0gc3RhcnRUaW1lICsgVGltZVVuaXQuU0VDT05EUy50b01pbGxpcyhzZWNvbmRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBkb25lID0gbm93ID49IGVuZFRpbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlc3VsdCgpIHsgcmV0dXJuIGRvbmU7IH0KKyAgICAgICAgfTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2NvbW1vbi9GaWxlVXRpbC5qYXZhIGIvY29ubmVjdG9ycy9jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvY29tbW9uL0ZpbGVVdGlsLmphdmEKaW5kZXggMGMzNmMwZi4uNDkwMjU0NCAxMDA2NDQKLS0tIGEvY29ubmVjdG9ycy9jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvY29tbW9uL0ZpbGVVdGlsLmphdmEKKysrIGIvY29ubmVjdG9ycy9jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvY29tbW9uL0ZpbGVVdGlsLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgpAQCAtMzksOCArNDAsOCBAQAogCiAgIC8qKgogICAgKiBDcmVhdGUgYSB0ZW1wIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGV4dGVuc2lvbiBhbmQgY29udGVudHMuCi0gICAqIEBwYXJhbSBuYW1lCi0gICAqIEBwYXJhbSBleHRlbnNpb24KKyAgICogQHBhcmFtIG5hbWUgZmlsZW5hbWUgcHJlZml4IAorICAgKiBAcGFyYW0gZXh0ZW5zaW9uIGZpbGVuYW1lIGV4dGVuc2lvbgogICAgKiBAcGFyYW0gbGluZXMgY29udGVudCBmb3IgdGhlIGZpbGUKICAgICogQHJldHVybiB7QGNvZGUgUGF0aH0gdG8gdGVtcCBmaWxlCiAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGZhaWx1cmUKQEAgLTY5LDkgKzcwLDExIEBACiAgICAqIFZhbGlkYXRlIHRoYXQgdGhlIGZpbGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb250ZW50LgogICAgKiBAcGFyYW0gcGF0aCBmaWxlIHRvIHZhbGlkYXRlCiAgICAqIEBwYXJhbSBsaW5lcyB0aGUgZXhwZWN0ZWQgY29udGVudAotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBvbiBmYWlsdXJlCisgICAqIEBwYXJhbSBzaWxlbnQgY29udHJvbCByZXR1cm4gdnMgdGhyb3cKKyAgICogQHJldHVybiBmYWxzZSBvbiBmYWlsdXJlIC0gb25seSBhcHBsaWNhYmxlIHdoZW4gc2lsZW50PT10cnVlCisgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGZhaWx1cmUgd2hlbiBzaWxlbnQ9PWZhbHNlCiAgICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVGaWxlKFBhdGggcGF0aCwgU3RyaW5nW10gbGluZXMpIHRocm93cyBFeGNlcHRpb24geworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVGaWxlKFBhdGggcGF0aCwgU3RyaW5nW10gbGluZXMsIGJvb2xlYW4gc2lsZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBMaXN0PFN0cmluZz4gYWN0TGluZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IAogICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCkBAIC04MSw4ICs4NCwyNiBAQAogICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKICAgICAgICAgYWN0TGluZXMuYWRkKGxpbmUpOwogICAgICAgfQotICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobGluZXMsIGFjdExpbmVzLnRvQXJyYXkobmV3IFN0cmluZ1thY3RMaW5lcy5zaXplKCldKSk7CisgICAgICBpZiAoIXNpbGVudCkKKyAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhsaW5lcywgYWN0TGluZXMudG9BcnJheShuZXcgU3RyaW5nW2FjdExpbmVzLnNpemUoKV0pKTsKKyAgICAgIGVsc2UgaWYgKCFBcnJheXMuZXF1YWxzKGxpbmVzLCBhY3RMaW5lcy50b0FycmF5KG5ldyBTdHJpbmdbYWN0TGluZXMuc2l6ZSgpXSkpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKCFzaWxlbnQpIHRocm93IGU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgCisgIC8qKgorICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBmaWxlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY29udGVudC4KKyAgICogQHBhcmFtIHBhdGggZmlsZSB0byB2YWxpZGF0ZQorICAgKiBAcGFyYW0gbGluZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQKKyAgICogQHRocm93cyBFeGNlcHRpb24gb24gZmFpbHVyZQorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRmlsZShQYXRoIHBhdGgsIFN0cmluZ1tdIGxpbmVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHZhbGlkYXRlRmlsZShwYXRoLCBsaW5lcywgZmFsc2UpOwogICB9CiAKIH0KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2NvbW1vbi9UZXN0UmVwb1BhdGguamF2YSBiL2Nvbm5lY3RvcnMvY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2NvbW1vbi9UZXN0UmVwb1BhdGguamF2YQppbmRleCBiYjNkYWY2Li4xNjJkMjY0IDEwMDY0NAotLS0gYS9jb25uZWN0b3JzL2NvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9jb21tb24vVGVzdFJlcG9QYXRoLmphdmEKKysrIGIvY29ubmVjdG9ycy9jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvY29tbW9uL1Rlc3RSZXBvUGF0aC5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnRlc3QuY29ubmVjdG9ycy5jb21tb247CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKIAogLyoqCiAgKiBVdGlsaXR5IGZvciB0ZXN0cyB0byBnZXQgdGhlIHBhdGggdG8gc29tZXRoaW5nIGluIHRoZSBsb2NhbCBnaXQgcmVwb3NpdG9yeS4KQEAgLTMzLDI5ICszMywxNyBAQAogICAgICAqIERlYWxzIHdpdGggaW1wbGljYXRpb25zIG9mIHRoZSBkaWZmZXJlbnQgZXhlY3V0aW9uIGNvbnRleHRzOgogICAgICAqIGVjbGlwc2UvanVuaXQgYW5kIGFudC9qdW5pdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdFByb2plY3QgdGhlIHByb2plY3QgKGUuZy4sICJjb25uZWN0b3JzIikgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgdGVzdCBiZWxvbmdzIHRvLgotICAgICAqIEBwYXJhbSBtb3JlIG1vcmUgY29tcG9uZW50cworICAgICAqIEBwYXJhbSBjbGFzc3BhdGhQYXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgYXBwbGljYXRpb25zIGNsYXNzcGF0aC4KICAgICAgKiBAcmV0dXJuIGFic29sdXRlIHBhdGggaW4gdGhlIHJlcG9zaXRvcnkKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKFN0cmluZyB0ZXN0UHJvamVjdCwgU3RyaW5nLi4uIG1vcmUpIHsKLSAgICAgICAgU3RyaW5nIHBhdGhTdHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7Ci0gICAgICAgIC8vIFVuZGVyIGVjbGlwc2UvanVuaXQ6IHBhdGggdG8gcHJvamVjdCBpbiByZXBvOiA8cmVwbz4vPHRlc3RQcm9qZWN0PgotICAgICAgICAvLyBVbmRlciBhbnQvanVuaXQ6IDxyZXBvPi88dGVzdFByb2plY3Q+Lzxwcm9qZWN0Pi91bml0dGVzdHMvdGVzdHJ1bnh4eHh4eHgKLSAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSA8cmVwbz4KLSAgICAgICAgUGF0aCBwYXRoID0gbmV3IEZpbGUocGF0aFN0cikudG9QYXRoKCk7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKHRlc3RQcm9qZWN0KSkgewotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0aCA9IHBhdGguZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0gd2hpbGUgKHBhdGggIT0gbnVsbCk7Ci0gICAgICAgIC8vIGFkZCB0aGUgY29tcG9uZW50cyB0byB0aGUgcmVwby1wYXRoCi0gICAgICAgIHBhdGggPSBwYXRoLnJlc29sdmUoUGF0aHMuZ2V0KHRlc3RQcm9qZWN0LCBtb3JlKSk7Ci0gICAgICAgIGlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgZG9lcyBub3QgZXhpc3Q6ICIrcGF0aCk7Ci0gICAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCk7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChTdHJpbmcgY2xhc3NwYXRoUGF0aCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHJlc291cmNlVXJsID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UoY2xhc3NwYXRoUGF0aCk7CisgICAgICAgICAgICBGaWxlIHJlc291cmNlID0gbmV3IEZpbGUocmVzb3VyY2VVcmwudG9VUkkoKSk7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBwYXRoIG9mIHJlc291cmNlOyAiICsgY2xhc3NwYXRoUGF0aCwgZSk7CisgICAgICAgIH0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvY3N2L2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvY3N2L2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwODE0Ny4uMDAwMDAwMAotLS0gYS9jb25uZWN0b3JzL2Nzdi9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JywgJzpjb25uZWN0b3JzOmNvbW1vbicKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvY3N2L3BvbS54bWwgYi9jb25uZWN0b3JzL2Nzdi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWRkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2Nzdi9wb20ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jc3Y8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQ29ubmVjdG9yczogQ1NWPC9uYW1lPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuZ3NvbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjguMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvZWRnZW50LmphdmF4LndlYnNvY2tldC9idWlsZC5ncmFkbGUgYi9jb25uZWN0b3JzL2VkZ2VudC5qYXZheC53ZWJzb2NrZXQvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTA2ZjA4Li4wMDAwMDAwCi0tLSBhL2Nvbm5lY3RvcnMvZWRnZW50LmphdmF4LndlYnNvY2tldC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWFyY2hpdmVzQmFzZU5hbWUgPSBwcm9qZWN0Lm5hbWUKLQotZGVwZW5kZW5jaWVzIHsKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnamF2YXgud2Vic29ja2V0OmphdmF4LndlYnNvY2tldC1hcGk6MS4wJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2ZpbGUvYnVpbGQuZ3JhZGxlIGIvY29ubmVjdG9ycy9maWxlL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwODE0Ny4uMDAwMDAwMAotLS0gYS9jb25uZWN0b3JzL2ZpbGUvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOnRvcG9sb2d5JwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotICAKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ3Rlc3RDb21waWxlJywgJzpwcm92aWRlcnM6ZGlyZWN0JwotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQotCi1hZGRDb21waWxlVGVzdERlcGVuZGVuY2llcyAnOmFwaTp0b3BvbG9neScsICc6cHJvdmlkZXJzOmRpcmVjdCcsICc6Y29ubmVjdG9yczpjb21tb24nCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2ZpbGUvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvZmlsZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTRkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2ZpbGUvcG9tLnhtbApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtZmlsZTwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25uZWN0b3JzOiBGaWxlPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLW9wbGV0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvZmlsZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9maWxlL0ZpbGVTdHJlYW1zVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2ZpbGUvRmlsZVN0cmVhbXNUZXN0LmphdmEKaW5kZXggODYzNjg4OC4uNTQyYTEzNyAxMDA2NDQKLS0tIGEvY29ubmVjdG9ycy9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2ZpbGUvRmlsZVN0cmVhbXNUZXN0LmphdmEKKysrIGIvY29ubmVjdG9ycy9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2ZpbGUvRmlsZVN0cmVhbXNUZXN0LmphdmEKQEAgLTMyLDcgKzMyLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuZmlsZS5GaWxlU3RyZWFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5CaUZ1bmN0aW9uOwpAQCAtMTg1LDE3ICsxODQsMjggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIHByaXZhdGUgU3RyaW5nW10gdG9VcHBlckNhc2UoU3RyaW5nW10gc3RycykgeworICAgICAgICBMaXN0PFN0cmluZz4gdWNzdHJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHMgOiBzdHJzKSB7CisgICAgICAgICAgICB1Y3N0cnMuYWRkKHMudG9VcHBlckNhc2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVjc3Rycy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworICAgIH0KKyAgICBwcml2YXRlIFN0cmluZ1tdIGNvbmNhdChTdHJpbmdbXSBhMSwgU3RyaW5nW10gYTIpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBzIDogYTEpIHJlcy5hZGQocyk7CisgICAgICAgIGZvciAoU3RyaW5nIHMgOiBhMikgcmVzLmFkZChzKTsKKyAgICAgICAgcmV0dXJuIHJlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRleHRGaWxlUmVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFRvcG9sb2d5IHQgPSBuZXdUb3BvbG9neSgidGVzdFRleHRGaWxlUmVhZGVyIik7CiAgICAgICAgIAogICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IGdldExpbmVzKCk7Ci0gICAgICAgIFN0cmluZ1tdIHVjTGluZXMgPSBTdHJlYW0ub2YobGluZXMpCi0gICAgICAgICAgICAgICAgLm1hcChsaW5lIC0+IGxpbmUudG9VcHBlckNhc2UoKSkKLSAgICAgICAgICAgICAgICAudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKLSAgICAgICAgU3RyaW5nW10gYWxsTGluZXMgPSBTdHJlYW0uY29uY2F0KFN0cmVhbS5vZihsaW5lcyksIFN0cmVhbS5vZih1Y0xpbmVzKSkKLSAgICAgICAgICAgICAgICAudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKKyAgICAgICAgU3RyaW5nW10gdWNMaW5lcyA9IHRvVXBwZXJDYXNlKGxpbmVzKTsKKyAgICAgICAgU3RyaW5nW10gYWxsTGluZXMgPSBjb25jYXQobGluZXMsIHVjTGluZXMpOwogICAgICAgICAKICAgICAgICAgUGF0aCB0ZW1wRmlsZTEgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRmlsZSgidGVzdDEiLCAidHh0IiwgbGluZXMpOwogICAgICAgICBQYXRoIHRlbXBGaWxlMiA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0MiIsICJ0eHQiLCB1Y0xpbmVzKTsKQEAgLTIxOCwxMSArMjI4LDggQEAKICAgICAgICAgVG9wb2xvZ3kgdCA9IG5ld1RvcG9sb2d5KCJ0ZXN0VGV4dEZpbGVSZWFkZXJQcm9ibGVtUGF0aHMiKTsKICAgICAgICAgCiAgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gZ2V0TGluZXMoKTsKLSAgICAgICAgU3RyaW5nW10gdWNMaW5lcyA9IFN0cmVhbS5vZihsaW5lcykKLSAgICAgICAgICAgICAgICAubWFwKGxpbmUgLT4gbGluZS50b1VwcGVyQ2FzZSgpKQotICAgICAgICAgICAgICAgIC50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwotICAgICAgICBTdHJpbmdbXSBhbGxMaW5lcyA9IFN0cmVhbS5jb25jYXQoU3RyZWFtLm9mKGxpbmVzKSwgU3RyZWFtLm9mKHVjTGluZXMpKQotICAgICAgICAgICAgICAgIC50b0FycmF5KFN0cmluZ1tdOjpuZXcpOworICAgICAgICBTdHJpbmdbXSB1Y0xpbmVzID0gdG9VcHBlckNhc2UobGluZXMpOworICAgICAgICBTdHJpbmdbXSBhbGxMaW5lcyA9IGNvbmNhdChsaW5lcywgdWNMaW5lcyk7CiAgICAgICAgIAogICAgICAgICBQYXRoIHRlbXBGaWxlMSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0MSIsICJ0eHQiLCBsaW5lcyk7CiAgICAgICAgIFBhdGggdGVtcEZpbGUyID0gRmlsZVV0aWwuY3JlYXRlVGVtcEZpbGUoInRlc3QyIiwgInR4dCIsIHVjTGluZXMpOwpAQCAtMjUwLDkgKzI1Nyw3IEBACiAgICAgICAgIFRvcG9sb2d5IHQgPSBuZXdUb3BvbG9neSgidGVzdFRleHRGaWxlUmVhZGVyUHJlUG9zdCIpOwogICAgICAgICAKICAgICAgICAgU3RyaW5nW10gbGluZXMgPSBnZXRMaW5lcygpOwotICAgICAgICBTdHJpbmdbXSB1Y0xpbmVzID0gU3RyZWFtLm9mKGxpbmVzKQotICAgICAgICAgICAgICAgIC5tYXAobGluZSAtPiBsaW5lLnRvVXBwZXJDYXNlKCkpCi0gICAgICAgICAgICAgICAgLnRvQXJyYXkoU3RyaW5nW106Om5ldyk7CisgICAgICAgIFN0cmluZ1tdIHVjTGluZXMgPSB0b1VwcGVyQ2FzZShsaW5lcyk7CiAgICAgICAgIAogICAgICAgICBQYXRoIHRlbXBGaWxlMSA9IEZpbGVVdGlsLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0MSIsICJ0eHQiLCBsaW5lcyk7CiAgICAgICAgIFBhdGggdGVtcEZpbGUyID0gRmlsZVV0aWwuY3JlYXRlVGVtcEZpbGUoInRlc3QyIiwgInR4dCIsIHVjTGluZXMpOwpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2ZpbGUvRmlsZVN0cmVhbXNUZXh0RmlsZVdyaXRlclRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvZmlsZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9maWxlL0ZpbGVTdHJlYW1zVGV4dEZpbGVXcml0ZXJUZXN0LmphdmEKaW5kZXggNTc2ZTY3Ny4uZmUzYjU0YSAxMDA2NDQKLS0tIGEvY29ubmVjdG9ycy9maWxlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2ZpbGUvRmlsZVN0cmVhbXNUZXh0RmlsZVdyaXRlclRlc3QuamF2YQorKysgYi9jb25uZWN0b3JzL2ZpbGUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvZmlsZS9GaWxlU3RyZWFtc1RleHRGaWxlV3JpdGVyVGVzdC5qYXZhCkBAIC0zNSw2ICszNSw5IEBACiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKQEAgLTgzLDYgKzg2LDE5IEBACiAgICAgcHVibGljIFN0cmluZ1tdIGdldExpbmVzKCkgewogICAgICAgICByZXR1cm4gc3RkTGluZXM7CiAgICAgfQorICAgIAorICAgIC8vIENvdmVyIGZvciBKYXZhOCBGaWxlcy5uZXdCdWZmZXJlZFJlYWRlcigpIGNvbnZlbmllbmNlIGZuCisgICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRSZWFkZXIgbmV3QnVmZmVyZWRSZWFkZXIoUGF0aCBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3QnVmZmVyZWRSZWFkZXIocGF0aCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIG5ld0J1ZmZlcmVkUmVhZGVyKFBhdGggcGF0aCwgQ2hhcnNldCBjcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBDaGFyc2V0RGVjb2RlciBkZWNvZGVyID0gY3MubmV3RGVjb2RlcigpOworICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihGaWxlcy5uZXdJbnB1dFN0cmVhbShwYXRoKSwgZGVjb2Rlcik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7CisgICAgICAgIH0KKwogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rmx1c2hDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTMwMSw2ICszMTcsOCBAQAogICAgICAgICAvLyBkZWZhdWx0IHdyaXRlciBwb2xpY3kKICAgICAgICAgVFNpbms8U3RyaW5nPiBzaW5rID0gRmlsZVN0cmVhbXMudGV4dEZpbGVXcml0ZXIocywgKCkgLT4gYmFzZVBhdGgudG9TdHJpbmcoKSk7CiAKKyAgICAgICAgLy8gbm90ZSwgd2l0aCBvbmx5IDQgdHVwbGVzLCBkZWZhdWx0IHBvbGljeSB3b24ndCBjeWNsZSAoZmluYWxpemUgdGhlIGN1ciBmaWxlKQorICAgICAgICAvLyB0byBtYWtlIHRoZSBleHBSZXN1bHRzIHByZXNlbnQgdW50aWwgam9iIHN0b3BzIChUTU8pCiAgICAgICAgIGNvbXBsZXRlQW5kVmFsaWRhdGVXcml0ZXIodCwgVE1PX1NFQywgYmFzZVBhdGgsIGV4cFJlc3VsdHMpOwogICAgICAgICAKICAgICAgICAgYXNzZXJ0Tm90TnVsbChzaW5rKTsKQEAgLTQyNyw2ICs0NDUsMTQgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbkFnZUJhc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoZSBtZWNoYW5pc21zIG9mIHRoaXMgdGVzdCBubyBsb25nZXIgd29yayB3aXRoIHRoZQorICAgICAgICAvLyByZWNlbnQgY2hhbmdlcyB0byBidW1wIHRoZSB0bW8gMnggd2hlbiBlZGdlbnQuYnVpbGQuY2k9dHJ1ZS4KKyAgICAgICAgLy8gU28gZGlzYWJsZSB3aGlsZSB3ZSBjb250aW51ZSB0byB3b3JrIG9uIHRoaXMuCisgICAgICAgIC8vCisgICAgICAgIC8vIFdpdGggdGhlIGdlbmVyYWwgY2hhbmdlcyBmb3IgY29tcGxldGlvbiBjb25kaXRpb24gY2hlY2tpbmcsCisgICAgICAgIC8vIEkgdGhpbmsgdGhpcyBoYXMgdGhlIGNoYW5jZSBvZiB3b3JraW5nIGFnYWluLgorLy8gICAgICAgIGFzc3VtZVRydWUoIUJvb2xlYW4uZ2V0Qm9vbGVhbigiZWRnZW50LmJ1aWxkLmNpIikpOworCiAgICAgICAgIFRvcG9sb2d5IHQgPSBuZXdUb3BvbG9neSgidGVzdFJldGFpbkFnZUJhc2VkIik7CiAgICAgICAgIAogICAgICAgICAvLyBlc3RhYmxpc2ggYSBiYXNlIHBhdGgKQEAgLTQzNiw5ICs0NjIsOCBAQAogICAgICAgICAKICAgICAgICAgLy8gYnVpbGQgZXhwZWN0ZWQgcmVzdWx0cwogICAgICAgICBpbnQga2VlcENudCA9IDI7ICAvLyBvbmx5IGtlZXAgdGhlIGxhc3QgbiBmaWxlcyB3aXRoIHRocm90dGxpbmcsIGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIFRNT19TRUMKICAgICAgICAgaW50IGFnZVNlYyA9IDU7Ci0gICAgICAgIGxvbmcgcGVyaW9kTXNlYyA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMSk7CisgICAgICAgIGxvbmcgcGVyaW9kTXNlYyA9IFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMSk7ICAvLyBhZ2UgcmV0ZW50aW9uIGNoZWNraW5nIHBlcmlvZAogICAgICAgICAvLyBuZXQgb25lIHR1cGxlIHBlciBmaWxlCiAgICAgICAgIExpc3Q8TGlzdDxTdHJpbmc+PiBleHBSZXN1bHRzID0gYnVpbGRFeHBSZXN1bHRzKGxpbmVzLCB0dXBsZSAtPiB0cnVlKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZWVwQ250OyBpKyspCkBAIC00NTMsOSArNDc4LDExIEBACiAgICAgICAgIC8vIFdpdGggNCB0dXBsZXMsIHRocm90dGxlRGVsYXk9MnNlYywgYW5kIGFnZVNlYz01CiAgICAgICAgIC8vIHQwPWFkZC1mMSwgdDEsIHQyPWFkZC1mMiwgdDMsIHQ0PWFkZC1mMywgdDUtcm0tZjEsIHQ2PWFkZC1mNCwgdDc9cm0tZjIsIHQ4LCB0OT1ybS1mMywgLi4uCiAgICAgICAgIC8vCi0gICAgICAgIC8vIFNvIHdlIHdhbnQgdG8gY2hlY2sgc29tZXdoZXJlIGFyb3VuZCB0OCAoYWZ0ZXIgdDcgYW5kIGRlZmluaXRlbHkgYmVmb3JlIHQ5KQotICAgICAgICAvLyBzbyBhbGwgNCBmaWxlcyB3ZXJlIGNyZWF0ZWQgYW5kIHRoZSBmaXJzdCAyIGhhdmUgYmVlbiBhZ2VkIG91dC4KLSAgICAgICAgLy8gd2l0aCBjb21wbGV0ZSBkZWxheSA9ICNmaWxlcy0xKnRocm90dGxlICsgVE1PX1NFQywgc2hvdWxkIGJlIDYrMiA9PSB0OC4KKyAgICAgICAgLy8gVGhlIGV4cGVjdGVkIHJlc3VsdHMgaGFwcGVuIHNvbWV3aGVyZSBhcm91bmQgdDggKGFmdGVyIHQ3IGFuZCBkZWZpbml0ZWx5IGJlZm9yZSB0OSksCisgICAgICAgIC8vIGFsbCA0IGZpbGVzIHdlcmUgY3JlYXRlZCBhbmQgdGhlIGZpcnN0IDIgaGF2ZSBiZWVuIGFnZWQgb3V0LgorICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGUgImNvbXBsZXRpb24gY29uZGl0aW9uIiBkb2Vzbid0IG1hbmFnZSB0byBnZXQgcnVuIGR1cmluZyB0aGF0IGludGVydmFsCisgICAgICAgIC8vIHRoZSB0ZXN0IHdpbGwgZmFpbCBldmVuIGlmIHRoZSBjb2RlIGlzIHdvcmtpbmcgZmluZS4gCiAgICAgICAgIAogICAgICAgICBpbnQgdGhyb3R0bGVTZWMgPSAyOwogICAgICAgICBUU3RyZWFtPFN0cmluZz4gcyA9IFBsdW1iaW5nU3RyZWFtcy5ibG9ja2luZ1Rocm90dGxlKApAQCAtNDg5LDcgKzUxNiw3IEBACiAgICAgICAgIAogICAgICAgICBJRmlsZVdyaXRlclBvbGljeTxTdHJpbmc+IHBvbGljeSA9IG5ldyBGaWxlV3JpdGVyUG9saWN5PFN0cmluZz4oCiAgICAgICAgICAgICAgICAgRmlsZVdyaXRlckZsdXNoQ29uZmlnLm5ld0ltcGxpY2l0Q29uZmlnKCksCi0gICAgICAgICAgICAgICAgRmlsZVdyaXRlckN5Y2xlQ29uZmlnLm5ld0NvdW50QmFzZWRDb25maWcoMTAwMCksCisgICAgICAgICAgICAgICAgRmlsZVdyaXRlckN5Y2xlQ29uZmlnLm5ld0NvdW50QmFzZWRDb25maWcoZXhwUmVzdWx0cy5nZXQoMCkuc2l6ZSgpKSwKICAgICAgICAgICAgICAgICBGaWxlV3JpdGVyUmV0ZW50aW9uQ29uZmlnLm5ld0ZpbGVDb3VudEJhc2VkQ29uZmlnKDEwKQogICAgICAgICAgICAgICAgICk7CiAgICAgICAgIEZpbGVTdHJlYW1zLnRleHRGaWxlV3JpdGVyKHMsICgpIC0+IGJhc2VQYXRoLnRvU3RyaW5nKCksICgpIC0+IHBvbGljeSk7CkBAIC01MTQsNyArNTQxLDcgQEAKICAgICAgICAgCiAgICAgICAgIElGaWxlV3JpdGVyUG9saWN5PFN0cmluZz4gcG9saWN5ID0gbmV3IEZpbGVXcml0ZXJQb2xpY3k8U3RyaW5nPigKICAgICAgICAgICAgICAgICBGaWxlV3JpdGVyRmx1c2hDb25maWcubmV3Q291bnRCYXNlZENvbmZpZygxKSwgIC8vIGV2ZXJ5IHR1cGxlCi0gICAgICAgICAgICAgICAgRmlsZVdyaXRlckN5Y2xlQ29uZmlnLm5ld0NvdW50QmFzZWRDb25maWcoMTAwMCksICAvLyBhbGwgaW4gMSBmaWxlCisgICAgICAgICAgICAgICAgRmlsZVdyaXRlckN5Y2xlQ29uZmlnLm5ld0NvdW50QmFzZWRDb25maWcoZXhwUmVzdWx0cy5nZXQoMCkuc2l6ZSgpKSwgIC8vIGFsbCBpbiAxIGZpbGUKICAgICAgICAgICAgICAgICBGaWxlV3JpdGVyUmV0ZW50aW9uQ29uZmlnLm5ld0ZpbGVDb3VudEJhc2VkQ29uZmlnKDEwKQogICAgICAgICAgICAgICAgICk7CiAgICAgICAgIEZpbGVTdHJlYW1zLnRleHRGaWxlV3JpdGVyKHMsICgpIC0+IGJhc2VQYXRoLnRvU3RyaW5nKCksICgpIC0+IHBvbGljeSk7CkBAIC01NDMsNyArNTcwLDcgQEAKICAgICAgICAgCiAgICAgICAgIElGaWxlV3JpdGVyUG9saWN5PFN0cmluZz4gcG9saWN5ID0gbmV3IEZpbGVXcml0ZXJQb2xpY3k8U3RyaW5nPigKICAgICAgICAgICAgICAgICBGaWxlV3JpdGVyRmx1c2hDb25maWcubmV3VGltZUJhc2VkQ29uZmlnKFRpbWVVbml0Lk1JTExJU0VDT05EUy50b01pbGxpcygyNTApKSwKLSAgICAgICAgICAgICAgICBGaWxlV3JpdGVyQ3ljbGVDb25maWcubmV3Q291bnRCYXNlZENvbmZpZygxMDAwKSwgIC8vIGFsbCBpbiAxIGZpbGUKKyAgICAgICAgICAgICAgICBGaWxlV3JpdGVyQ3ljbGVDb25maWcubmV3Q291bnRCYXNlZENvbmZpZyhleHBSZXN1bHRzLmdldCgwKS5zaXplKCkpLCAgLy8gYWxsIGluIDEgZmlsZQogICAgICAgICAgICAgICAgIEZpbGVXcml0ZXJSZXRlbnRpb25Db25maWcubmV3RmlsZUNvdW50QmFzZWRDb25maWcoMTApCiAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgRmlsZVN0cmVhbXMudGV4dEZpbGVXcml0ZXIocywgKCkgLT4gYmFzZVBhdGgudG9TdHJpbmcoKSwgKCkgLT4gcG9saWN5KTsKQEAgLTU3MCw3ICs1OTcsNyBAQAogICAgICAgICBJRmlsZVdyaXRlclBvbGljeTxTdHJpbmc+IHBvbGljeSA9IG5ldyBGaWxlV3JpdGVyUG9saWN5PFN0cmluZz4oCiAgICAgICAgICAgICAgICAgRmlsZVdyaXRlckZsdXNoQ29uZmlnLm5ld1ByZWRpY2F0ZUJhc2VkQ29uZmlnKAogICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUgLT4gdHVwbGUuc3RhcnRzV2l0aCgiMS0iKSB8fCB0dXBsZS5zdGFydHNXaXRoKCIzLSIpKSwKLSAgICAgICAgICAgICAgICBGaWxlV3JpdGVyQ3ljbGVDb25maWcubmV3Q291bnRCYXNlZENvbmZpZygxMDAwKSwgIC8vIGFsbCBpbiAxIGZpbGUKKyAgICAgICAgICAgICAgICBGaWxlV3JpdGVyQ3ljbGVDb25maWcubmV3Q291bnRCYXNlZENvbmZpZyhleHBSZXN1bHRzLmdldCgwKS5zaXplKCkpLCAgLy8gYWxsIGluIDEgZmlsZQogICAgICAgICAgICAgICAgIEZpbGVXcml0ZXJSZXRlbnRpb25Db25maWcubmV3RmlsZUNvdW50QmFzZWRDb25maWcoMTApCiAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgRmlsZVN0cmVhbXMudGV4dEZpbGVXcml0ZXIocywgKCkgLT4gYmFzZVBhdGgudG9TdHJpbmcoKSwgKCkgLT4gcG9saWN5KTsKQEAgLTY3Niw3ICs3MDMsOSBAQAogCiAgICAgICAgIC8vIGJ1aWxkIGV4cGVjdGVkIHJlc3VsdHMKICAgICAgICAgLy8gYSB0dXBsZSBiYXNlZCBjb25maWcgLyBwcmVkaWNhdGUuICBpbiB0aGlzIGNhc2Ugc2hvdWxkIGVuZCB1cCB3aXRoIDMgZmlsZXMuCi0gICAgICAgIFByZWRpY2F0ZTxTdHJpbmc+IGN5Y2xlSXQgPSB0dXBsZSAtPiB0dXBsZS5zdGFydHNXaXRoKCIxLSIpIHx8IHR1cGxlLnN0YXJ0c1dpdGgoIjMtIik7CisgICAgICAgIC8vIGZsdXNoIG9uIHRoZSBsYXN0IHR1cGxlIHRvbyB0byBlbnN1cmUgdGhlIHRlc3QgY29tcGxldGVzIGJlZm9yZSBUTU8uCisgICAgICAgIFByZWRpY2F0ZTxTdHJpbmc+IGN5Y2xlSXQgPSB0dXBsZSAtPiB0dXBsZS5zdGFydHNXaXRoKCIxLSIpIHx8IHR1cGxlLnN0YXJ0c1dpdGgoIjMtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0dXBsZS5lcXVhbHMobGluZXNbbGluZXMubGVuZ3RoLTFdKTsKICAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IGV4cFJlc3VsdHMgPSBidWlsZEV4cFJlc3VsdHMobGluZXMsIGN5Y2xlSXQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMywgZXhwUmVzdWx0cy5zaXplKCkpOwogCkBAIC04MTgsNyArODQ3LDcgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8PDw8PCBEdW1waW5nICIrZik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQYXRoIHBhdGggPSBmLnRvUGF0aCgpOwotICAgICAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKHBhdGgpKSB7CisgICAgICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3QnVmZmVyZWRSZWFkZXIocGF0aCkpIHsKICAgICAgICAgICAgICAgICBici5saW5lcygpLmZvckVhY2gobGluZSAtPiBTeXN0ZW0ub3V0LnByaW50bG4obGluZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04NDcsMzQgKzg3Niw1OSBAQAogICAgICAgICAgICAgUGF0aCBiYXNlUGF0aCwgTGlzdDxMaXN0PFQ+PiBleHBSZXN1bHRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBqdXN0IGxldCBpdCBydW4gdG8gdGhlIHRtbyBiZWZvcmUgd2UgY2hlY2sgdGhlIGZpbGUgY29udGVudHMKKyAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIHJpZ2h0IG51bWJlciBvZiBmaWxlcyBhbmQgY29udGVudCBvciB3ZSB0aW1lb3V0LgorICAgICAgICAgICAgLy8gKGRvbid0IHVzZSBhIHdhaXQtdGlsbC10bW8gc2NoZW1lIGFzIHRoYXQncyAidG9vIHNsb3ciIGVzcGVjaWFsbHkKKyAgICAgICAgICAgIC8vIHdoZW4gY29tcGxldGUoKSBhZGRzIGEgVE1PIG11bHRpcGxpZXIgd2hlbiBlZGdlbnQuYnVpbGQuY2k9dHJ1ZSkKICAgICAgICAgICAgIENvbmRpdGlvbjxPYmplY3Q+IHRjID0gbmV3IENvbmRpdGlvbjxPYmplY3Q+KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZhbGlkKCkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlc3VsdCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja0ZpbGVzKGJhc2VQYXRoLCBleHBSZXN1bHRzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlc3VsdCgpIHsgcmV0dXJuIGdldEFjdEZpbGVzKGJhc2VQYXRoKS5zaXplKCk7IH0KICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbXBsZXRlKHQsIHRjLCB0bW9TZWMsIFRpbWVVbml0LlNFQ09ORFMpOworCisgICAgICAgICAgICAvLyBpZiB3ZSB0aW1lIG91dCB3ZSBwcm9iYWJseSBuZWVkIHRvIGtub3cgd2hpY2ggZmlsZXMgYXJlIHByZXNlbnQgdG8gZGlhZ25vc2UKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29tcGxldGUodCwgdGMsIHRtb1NlYywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQgd2l0aCBleGNlcHRpb246ICIrZSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyAiK3QuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgLy8gcmlnaHQgbnVtYmVyIG9mIGZpbGVzPwotICAgICAgICAgICAgTGlzdDxQYXRoPiBhY3RGaWxlcyA9IGdldEFjdEZpbGVzKGJhc2VQYXRoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWN0RmlsZXM6ICIrYWN0RmlsZXMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdEZpbGVzLnRvU3RyaW5nKCksIGV4cFJlc3VsdHMuc2l6ZSgpLCBhY3RGaWxlcy5zaXplKCkpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBkbyB0aGUgZmlsZShzKSBoYXZlIHRoZSByaWdodCBjb250ZW50cz8KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwUmVzdWx0czogIitleHBSZXN1bHRzKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoTGlzdDxUPiBleHBGaWxlIDogZXhwUmVzdWx0cykgewotICAgICAgICAgICAgICAgIFBhdGggcGF0aCA9IGFjdEZpbGVzLmdldChpKyspOwotICAgICAgICAgICAgICAgIGNoZWNrQ29udGVudHMocGF0aCwgZXhwRmlsZS50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrRmlsZXMoYmFzZVBhdGgsIGV4cFJlc3VsdHMsIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgIGRlbGV0ZUFsbChiYXNlUGF0aCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgLy8gc2lsZW50PT10cnVlID0+IHJldHVybiBmYWxzZSBvbiBmYWlsOyBzaWxlbnQ9PWZhbHNlID0+IGFzc2VydHMvdGhyb3dzIG9uIGZhaWwKKyAgICBwcml2YXRlIDxUPiBib29sZWFuIGNoZWNrRmlsZXMoUGF0aCBiYXNlUGF0aCwgTGlzdDxMaXN0PFQ+PiBleHBSZXN1bHRzLCBib29sZWFuIHNpbGVudCkgeworCisgICAgICAgIC8vIHJpZ2h0IG51bWJlciBvZiBmaWxlcz8KKyAgICAgICAgTGlzdDxQYXRoPiBhY3RGaWxlcyA9IGdldEFjdEZpbGVzKGJhc2VQYXRoKTsKKyAgICAgICAgaWYgKCFzaWxlbnQpIFN5c3RlbS5vdXQucHJpbnRsbigiYWN0RmlsZXM6ICIrYWN0RmlsZXMpOworICAgICAgICBpZiAoIXNpbGVudCkgCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0RmlsZXMudG9TdHJpbmcoKSwgZXhwUmVzdWx0cy5zaXplKCksIGFjdEZpbGVzLnNpemUoKSk7CisgICAgICAgIGVsc2UgaWYgKGV4cFJlc3VsdHMuc2l6ZSgpICE9IGFjdEZpbGVzLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIC8vIGRvIHRoZSBmaWxlKHMpIGhhdmUgdGhlIHJpZ2h0IGNvbnRlbnRzPworICAgICAgICBpZiAoIXNpbGVudCkgU3lzdGVtLm91dC5wcmludGxuKCJleHBSZXN1bHRzOiAiK2V4cFJlc3VsdHMpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoTGlzdDxUPiBleHBGaWxlIDogZXhwUmVzdWx0cykgeworICAgICAgICAgICAgUGF0aCBwYXRoID0gYWN0RmlsZXMuZ2V0KGkrKyk7CisgICAgICAgICAgICBpZiAoIWNoZWNrQ29udGVudHMocGF0aCwgZXhwRmlsZS50b0FycmF5KG5ldyBTdHJpbmdbMF0pLCBzaWxlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAogICAgIHByaXZhdGUgdm9pZCBkZWxldGVBbGwoUGF0aCBiYXNlUGF0aCkgewogICAgICAgICBQYXRoIHBhcmVudCA9IGJhc2VQYXRoLmdldFBhcmVudCgpOwogICAgICAgICBTdHJpbmcgYmFzZUxlYWYgPSBiYXNlUGF0aC5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCk7CkBAIC04OTgsMjggKzk1MiwzOSBAQAogICAgICAgICByZXR1cm4gcGF0aHM7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGVja0NvbnRlbnRzKFBhdGggcGF0aCwgU3RyaW5nW10gbGluZXMpIHsKKyAgICAvLyBzaWxlbnQ9PXRydWUgPT4gcmV0dXJuIGZhbHNlIG9uIGZhaWw7IHNpbGVudD09ZmFsc2UgPT4gYXNzZXJ0cy90aHJvd3Mgb24gZmFpbAorICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0NvbnRlbnRzKFBhdGggcGF0aCwgU3RyaW5nW10gbGluZXMsIGJvb2xlYW4gc2lsZW50KSB7CiAgICAgICAgIGlmIChwYXRoLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiLnppcCIpKSB7Ci0gICAgICAgICAgY2hlY2taaXBDb250ZW50cyhwYXRoLCBsaW5lcyk7Ci0gICAgICAgICAgcmV0dXJuOworICAgICAgICAgIHJldHVybiBjaGVja1ppcENvbnRlbnRzKHBhdGgsIGxpbmVzLCBzaWxlbnQpOwogICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgZmlsZSAiK3BhdGgpOworICAgICAgICBpZiAoIXNpbGVudCkgU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZyBmaWxlICIrcGF0aCk7CiAgICAgICAgIGludCBsaW5lQ250ID0gMDsKLSAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKHBhdGgpKSB7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXdCdWZmZXJlZFJlYWRlcihwYXRoKSkgewogICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CiAgICAgICAgICAgICAgICAgKytsaW5lQ250OwogICAgICAgICAgICAgICAgIFN0cmluZyBhY3RMaW5lID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGg6IitwYXRoKyIgbGluZSAiK2xpbmVDbnQsIGxpbmUsIGFjdExpbmUpOworICAgICAgICAgICAgICAgIGlmICghc2lsZW50KQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGg6IitwYXRoKyIgbGluZSAiK2xpbmVDbnQsIGxpbmUsIGFjdExpbmUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFsaW5lLmVxdWFscyhhY3RMaW5lKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0TnVsbCgicGF0aDoiK3BhdGgrIiBsaW5lICIrbGluZUNudCsiIGV4cGVjdGVkIEVPRiIsIGJyLnJlYWRMaW5lKCkpOworICAgICAgICAgICAgaWYgKCFzaWxlbnQpCisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgicGF0aDoiK3BhdGgrIiBsaW5lICIrbGluZUNudCsiIGV4cGVjdGVkIEVPRiIsIGJyLnJlYWRMaW5lKCkpOworICAgICAgICAgICAgZWxzZSBpZiAobnVsbCAhPSBici5yZWFkTGluZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0TnVsbCgicGF0aDoiK3BhdGgrIiBsaW5lICIrbGluZUNudCsiIHVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gIitlLCBlKTsKKyAgICAgICAgICAgIGlmICghc2lsZW50KQorICAgICAgICAgICAgICAgIGFzc2VydE51bGwoInBhdGg6IitwYXRoKyIgbGluZSAiK2xpbmVDbnQrIiB1bmV4cGVjdGVkIElPRXhjZXB0aW9uICIrZSwgZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAKLSAgICBwcml2YXRlIHZvaWQgY2hlY2taaXBDb250ZW50cyhQYXRoIHBhdGgsIFN0cmluZ1tdIGxpbmVzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgZmlsZSAiK3BhdGgpOworICAgIC8vIHNpbGVudD09dHJ1ZSA9PiByZXR1cm4gZmFsc2Ugb24gZmFpbDsgc2lsZW50PT1mYWxzZSA9PiBhc3NlcnRzL3Rocm93cyBvbiBmYWlsCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrWmlwQ29udGVudHMoUGF0aCBwYXRoLCBTdHJpbmdbXSBsaW5lcywgYm9vbGVhbiBzaWxlbnQpIHsKKyAgICAgICAgaWYgKCFzaWxlbnQpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgZmlsZSAiK3BhdGgpOwogICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBwYXRoLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKTsKICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtICIuemlwIi5sZW5ndGgoKSk7CiAgICAgICAgIGludCBsaW5lQ250ID0gMDsKQEAgLTkzMCwxOCArOTk1LDMxIEBACiAgICAgICAgIHsKICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKTsKICAgICAgICAgICAKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cnlOYW1lLCBlbnRyeS5nZXROYW1lKCkpOworICAgICAgICAgIGlmICghc2lsZW50KQorICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cnlOYW1lLCBlbnRyeS5nZXROYW1lKCkpOworICAgICAgICAgIGVsc2UgaWYgKCFlbnRyeU5hbWUuZXF1YWxzKGVudHJ5LmdldE5hbWUoKSkpCisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcih6aW4sIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKICAgICAgICAgICAgICsrbGluZUNudDsKICAgICAgICAgICAgIFN0cmluZyBhY3RMaW5lID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygicGF0aDoiK3BhdGgrIiBsaW5lICIrbGluZUNudCwgbGluZSwgYWN0TGluZSk7CisgICAgICAgICAgICBpZiAoIXNpbGVudCkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGg6IitwYXRoKyIgbGluZSAiK2xpbmVDbnQsIGxpbmUsIGFjdExpbmUpOworICAgICAgICAgICAgZWxzZSBpZiAoIWxpbmUuZXF1YWxzKGFjdExpbmUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICB9Ci0gICAgICAgICAgYXNzZXJ0TnVsbCgicGF0aDoiK3BhdGgrIiBsaW5lICIrbGluZUNudCsiIGV4cGVjdGVkIEVPRiIsIGJyLnJlYWRMaW5lKCkpOworICAgICAgICAgIGlmICghc2lsZW50KQorICAgICAgICAgICAgICBhc3NlcnROdWxsKCJwYXRoOiIrcGF0aCsiIGxpbmUgIitsaW5lQ250KyIgZXhwZWN0ZWQgRU9GIiwgYnIucmVhZExpbmUoKSk7CisgICAgICAgICAgZWxzZSBpZiAobnVsbCAhPSBici5yZWFkTGluZSgpKQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBhc3NlcnROdWxsKCJwYXRoOiIrcGF0aCsiIGxpbmUgIitsaW5lQ250KyIgdW5leHBlY3RlZCBJT0V4Y2VwdGlvbiAiK2UsIGUpOworICAgICAgICAgICAgaWYgKCFzaWxlbnQpCisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgicGF0aDoiK3BhdGgrIiBsaW5lICIrbGluZUNudCsiIHVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gIitlLCBlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9odHRwL2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvaHR0cC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjg2MzYuLjAwMDAwMDAKLS0tIGEvY29ubmVjdG9ycy9odHRwL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTp0b3BvbG9neScKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnb3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY2xpZW50OjQuNS4xJwotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjb3JlOjQuNC40JwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotICAKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ3Rlc3RDb21waWxlJywgJzpwcm92aWRlcnM6ZGlyZWN0JwotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQotCi1hZGRDb21waWxlVGVzdERlcGVuZGVuY2llcyAnOmFwaTp0b3BvbG9neScsICc6cHJvdmlkZXJzOmRpcmVjdCcKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvaHR0cC9wb20ueG1sIGIvY29ubmVjdG9ycy9odHRwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNDVkNwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvaHR0cC9wb20ueG1sCkBAIC0wLDAgKzEsNjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1odHRwPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IENvbm5lY3RvcnM6IEhUVFA8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuNS4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuNC40PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2h0dHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvaHR0cC9IdHRwVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9odHRwL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2h0dHAvSHR0cFRlc3QuamF2YQppbmRleCAwNTExMTUwLi45ZjA4ODc5IDEwMDY0NAotLS0gYS9jb25uZWN0b3JzL2h0dHAvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvaHR0cC9IdHRwVGVzdC5qYXZhCisrKyBiL2Nvbm5lY3RvcnMvaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9odHRwL0h0dHBUZXN0LmphdmEKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgYmFzaWMgYXV0aGVudGljYXRpb24sIGZpcnN0IHdpdGggdmFsaWQgdXNlci9wYXNzd29yZAogICAgICAqIGFuZCB0aGVuIHdpdGggaW52YWxpZCAocmVzdWx0cyBpbiA0MDEpLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogQHRocm93cyBFeGNlcHRpb24gb24gZmFpbHVyZQogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljQXV0aGVudGljYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvaW90L2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvaW90L2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4NmQyNi4uMDAwMDAwMAotLS0gYS9jb25uZWN0b3JzL2lvdC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JwpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9pb3QvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvaW90L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhOWMxYgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvaW90L3BvbS54bWwKQEAgLTAsMCArMSw0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25uZWN0b3JzOiBJb1Q8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9pb3RwL2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvaW90cC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTIzOTAuLjAwMDAwMDAKLS0tIGEvY29ubmVjdG9ycy9pb3RwL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTp0b3BvbG9neScKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmNvbm5lY3RvcnM6aW90JwotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdjb20uaWJtLm1lc3NhZ2luZzp3YXRzb24taW90OjAuMi4yJwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotICAKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ3Rlc3RDb21waWxlJywgJzpwcm92aWRlcnM6ZGlyZWN0JwotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQotCi1hZGRDb21waWxlVGVzdERlcGVuZGVuY2llcyAnOmFwaTp0b3BvbG9neScsICc6cHJvdmlkZXJzOmRpcmVjdCcKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvaW90cC9wb20ueG1sIGIvY29ubmVjdG9ycy9pb3RwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzYmI3YwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvaW90cC9wb20ueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1pb3RwPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IENvbm5lY3RvcnM6IElvVFA8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5pYm0ubWVzc2FnaW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+d2F0c29uLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjAuMi4yPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2lvdHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL2lvdHAvSW90cEdXRGV2aWNlLmphdmEgYi9jb25uZWN0b3JzL2lvdHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL2lvdHAvSW90cEdXRGV2aWNlLmphdmEKaW5kZXggNzg2ZmQ1OS4uYmZlYmViYyAxMDA2NDQKLS0tIGEvY29ubmVjdG9ycy9pb3RwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy9pb3RwL0lvdHBHV0RldmljZS5qYXZhCisrKyBiL2Nvbm5lY3RvcnMvaW90cC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvaW90cC9Jb3RwR1dEZXZpY2UuamF2YQpAQCAtOTEsNyArOTEsNyBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMikgewogICAgIHJldHVybiBvMiA9PSB0aGlzIAotICAgICAgICB8fCBlcXVhbHMobzIgaW5zdGFuY2VvZiBJb3RwR1dEZXZpY2UgJiYgKChJb3RwR1dEZXZpY2UpbzIpLmZxRGV2aWNlSWQuZXF1YWxzKGZxRGV2aWNlSWQpKTsKKyAgICAgICAgfHwgKG8yIGluc3RhbmNlb2YgSW90cEdXRGV2aWNlICYmICgoSW90cEdXRGV2aWNlKW8yKS5mcURldmljZUlkLmVxdWFscyhmcURldmljZUlkKSk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LWNsaWVudC9idWlsZC5ncmFkbGUgYi9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzkxYzEwLi4wMDAwMDAwCi0tLSBhL2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LWNsaWVudC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWFyY2hpdmVzQmFzZU5hbWUgPSBwcm9qZWN0Lm5hbWUKLQotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmNvbm5lY3RvcnM6ZWRnZW50LmphdmF4LndlYnNvY2tldCcKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnb3JnLmVjbGlwc2UuamV0dHkud2Vic29ja2V0OmphdmF4LXdlYnNvY2tldC1jbGllbnQtaW1wbDo5LjMuNi52MjAxNTExMDYnCi0gIAotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qYXZheC53ZWJzb2NrZXQtY2xpZW50L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmVkZ2VudC5qYXZheC53ZWJzb2NrZXQuRWRnZW50U3NsQ29udGFpbmVyUHJvdmlkZXIgYi9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuZWRnZW50LmphdmF4LndlYnNvY2tldC5FZGdlbnRTc2xDb250YWluZXJQcm92aWRlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViZTg1OC4uMDAwMDAwMAotLS0gYS9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuZWRnZW50LmphdmF4LndlYnNvY2tldC5FZGdlbnRTc2xDb250YWluZXJQcm92aWRlcgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5hcGFjaGUuZWRnZW50LmphdmF4LndlYnNvY2tldC5pbXBsLkVkZ2VudFNzbENvbnRhaW5lclByb3ZpZGVySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LXNlcnZlci9idWlsZC5ncmFkbGUgYi9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1zZXJ2ZXIvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ3ZjVmLi4wMDAwMDAwCi0tLSBhL2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LXNlcnZlci9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWFyY2hpdmVzQmFzZU5hbWUgPSBwcm9qZWN0Lm5hbWUKLQotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmNvbm5lY3RvcnM6amF2YXgud2Vic29ja2V0LWNsaWVudCcKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnb3JnLmVjbGlwc2UuamV0dHkud2Vic29ja2V0OmphdmF4LXdlYnNvY2tldC1zZXJ2ZXItaW1wbDo5LjMuNi52MjAxNTExMDYnCi0gIAotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGJjLy5naXRpZ25vcmUgYi9jb25uZWN0b3JzL2pkYmMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDkwM2YxCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGJjLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACisjIHRlc3QgY3JlYXRlZCBzd2lsbAorZGVyYnkubG9nCisvSmRiY1N0cmVhbXNUZXN0RGIKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRiYy9idWlsZC5ncmFkbGUgYi9jb25uZWN0b3JzL2pkYmMvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVmOGMyLi4wMDAwMDAwCi0tLSBhL2Nvbm5lY3RvcnMvamRiYy9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICd0ZXN0Q29tcGlsZScsICc6cHJvdmlkZXJzOmRpcmVjdCcKLSAgCi0gIHRlc3RDb21waWxlIGZpbGVzKCIke1N5c3RlbS5lbnYuREVSQllfSE9NRX0vbGliL2RlcmJ5LmphciIpCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JywgJzpjb25uZWN0b3JzOmNvbW1vbicKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRiYy9wb20ueG1sIGIvY29ubmVjdG9ycy9qZGJjL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0MjI2NgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRiYy9wb20ueG1sCkBAIC0wLDAgKzEsMTExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtamRiYzwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25uZWN0b3JzOiBKREJDPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIFNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBtYWtlIHN1cmUgYW55IGRlcmJ5IGxvZyBpcyBjcmVhdGVkCisgICAgICAgICAgICAgICAgaW5zaWRlIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGFzIHdlbGwgYXMgcGFzcyBpbiBhIGxvY2F0aW9uIGZvcgorICAgICAgICAgICAgICAgIGNyZWF0aW5nIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgICAtLT4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPG5hbWU+amRiY1N0cmVhbXNUZXN0LnRtcGRpcjwvbmFtZT4KKyAgICAgICAgICAgICAgPHZhbHVlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2pkYmMtdGVzdC10bXA8L3ZhbHVlPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPG5hbWU+ZGVyYnkuc3RyZWFtLmVycm9yLmZpbGU8L25hbWU+CisgICAgICAgICAgICAgIDx2YWx1ZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kZXJieS5sb2c8L3ZhbHVlPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDwhLS0gaHR0cHM6Ly9tdm5yZXBvc2l0b3J5LmNvbS9hcnRpZmFjdC9vcmcuYXBhY2hlLmRlcmJ5L2RlcmJ5IC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5kZXJieTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmRlcmJ5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MTAuMTMuMS4xPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9qZGJjL0pkYmNTdHJlYW1zVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2pkYmMvSmRiY1N0cmVhbXNUZXN0LmphdmEKaW5kZXggYTE1YjlkOS4uYTI4NDM0MCAxMDA2NDQKLS0tIGEvY29ubmVjdG9ycy9qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2pkYmMvSmRiY1N0cmVhbXNUZXN0LmphdmEKKysrIGIvY29ubmVjdG9ycy9qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2pkYmMvSmRiY1N0cmVhbXNUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKQEAgLTMyLDQzICszMyw0NiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5qZGJjLkpkYmNTdHJlYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLlByZWRpY2F0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50ZXN0LmNvbm5lY3RvcnMuY29tbW9uLkNvbm5lY3RvclRlc3RCYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTaW5rOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kucGx1bWJpbmcuUGx1bWJpbmdTdHJlYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LnRlc3Rlci5Db25kaXRpb247CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIC8qKgogICogSmRiY1N0cmVhbXMgY29ubmVjdG9yIHRlc3RzLgogICogPHA+CiAgKiBUaGUgdGVzdHMgdXNlIEFwYWNoZSBFbWJlZGRlZCBEZXJieSBhcyB0aGUgYmFja2luZyBkYm1zLgotICogVGhlIE9yYWNsZSBKREsgaW5jbHVkZXMgRGVyYnkgaW4gJEpBVkFfSE9NRS9kYi4KLSAqIE1hbnVhbGx5IGluc3RhbGwgRGVyYnkgZm9yIG90aGVyIEpES3MgaWYgcmVxdWlyZWQuCi0gKiBBcnJhbmdlIGZvciB0aGUgY2xhc3NwYXRoIHRvIGJlIGNvbmZpZ3VyZWQgYnkgb25lIG9mOgotICogPHVsPgotICogPGxpPm1hbnVhbGx5IGFkZCBkZXJieS5qYXIgdG8gdGhlIGNsYXNzcGF0aDwvbGk+Ci0gKiA8bGk+c2V0IHRoZSBERVJCWV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlLiAgY29ubmVjdG9ycy9qZGJjL2J1aWxkLmdyYWRsZSBhZGRzIAotICogICAgICRERVJCWV9IT01FL2xpYi9kZXJieS5qYXIgdG8gdGhlIGNsYXNzcGF0aCB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLgotICogICAgIGUuZy4sIHRyeQotICogICAgIDx1bD4KLSAqICAgICAgIDxsaT4gZXhwb3J0IERFUkJZX0hPTUU9JEpBVkFfSE9NRS9kYjwvbGk+Ci0gKiAgICAgICA8bGk+IE9TWDogZXhwb3J0IERFUkJZX0hPTUU9YC91c3IvbGliZXhlYy9qYXZhX2hvbWVgL2RiCi0gKiAgICAgPC91bD4KLSAqICAgICA8L2xpPgotICogPC91bD4KKyAqIFRoZSBjb25uZWN0b3JzL2pkYmMvcG9tLnhtbCBpbmNsdWRlcyBhICJ0ZXN0IiBkZXBlbmRlbmN5IG9uIGRlcmJ5IAorICogc28gZXhlY3V0aW9uIG9mIHRoZSB0ZXN0IHZpYSBtYXZlbiBhdXRvbWF0aWFsbHkgcmV0cmlldmVzIGFuZCBhZGRzCisgKiB0aGUgZGVyYnkgamFyIHRvIHRoZSBjbGFzc3BhdGguICAKKyAqIFRoZSBwb20gYWxzbyBkZWZpbmVzIGpkYmNTdHJlYW1zVGVzdC50bXBkaXIgYW5kIHJlZGlyZWN0cyB0aGUgZGVyYnkubG9nIGxvY2F0aW9uLgorICogPHA+CisgKiBJZiBydW5uaW5nIHRoZSB0ZXN0IGZyb20gRWNsaXBzZSB5b3UgbWF5IGhhdmUgdG8gbWFudWFsbHkgYWRkIGRlcmJ5LmphcgorICogdG8gdGhlIHRlc3QncyBjbGFzc3BhdGguCisgKiBUaGUgT3JhY2xlIEpESyBpbmNsdWRlcyBEZXJieSBpbiAkSkFWQV9IT01FL2RiL2xpYi9kZXJieS5qYXIuCisgKiA8cD4KICAqIFRoZSB0ZXN0cyBhcmUgInNraXBwZWQiIGlmIHRoZSBkYm1zJ3MgamRiYyBkcml2ZXIgY2FuJ3QgYmUgZm91bmQuCiAgKi8KIHB1YmxpYyBjbGFzcyBKZGJjU3RyZWFtc1Rlc3QgIGV4dGVuZHMgQ29ubmVjdG9yVGVzdEJhc2UgewogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUNfVElNRU9VVCA9IDEwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEQl9OQU1FID0gIkpkYmNTdHJlYW1zVGVzdERiIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFUk5BTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUTVBESVJfUFJPUEVSVFlfTkFNRSA9ICJqZGJjU3RyZWFtc1Rlc3QudG1wZGlyIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE1QRElSID0gU3lzdGVtLmdldFByb3BlcnR5KFRNUERJUl9QUk9QRVJUWV9OQU1FLCAiIik7CisgICAgc3RhdGljIHsKKyAgICAgICAgaWYgKFRNUERJUi5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU3lzdGVtIHByb3BlcnR5IFwiIitUTVBESVJfUFJPUEVSVFlfTkFNRSsiXCIgaXMgbm90IHNldC4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREJfTkFNRSA9IFRNUERJUiArICIvSmRiY1N0cmVhbXNUZXN0RGIiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVU0VSTkFNRSA9ICJ0ZXN0IjsgLy8gY2FuJ3QgY29udGFpbiAiLiIKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFcgPSAibm9uZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxQZXJzb24+IHBlcnNvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBzdGF0aWMgewpAQCAtMTI0LDcgKzEyOCw3IEBACiAgICAgewogICAgICAgICAvLyBBdm9pZCBhIGNvbXBpbGUtdGltZSBkZXBlbmRlbmN5IHRvIHRoZSBqZGJjIGRyaXZlci4KICAgICAgICAgLy8gQXQgcnVudGltZSwgcmVxdWlyZSB0aGF0IHRoZSBjbGFzc3BhdGggY2FuIGZpbmQgaXQuCi0gICAgICAgIC8vIGUuZy4sIGJ1aWxkLnhtbCBhZGRzICRERVJCWV9IT01FL2xpYi9kZXJieS5qYXIgdG8gdGhlIHRlc3QgY2xhc3NwYXRoCisgICAgICAgIC8vIGUuZy4sIHBvbS54bWwgYWRkcyBkZXJieS5qYXIgdG8gdGhlIHRlc3QgY2xhc3NwYXRoCiAKICAgICAgICAgU3RyaW5nIERFUkJZX0RBVEFfU09VUkNFID0gIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERhdGFTb3VyY2UiOwogICAgIApAQCAtMTM0LDkgKzEzOCw2IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGaXggdGhlIHRlc3QgY2xhc3NwYXRoLiAiOwotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRlbnYoIkRFUkJZX0hPTUUiKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXNnICs9ICJERVJCWV9IT01FIG5vdCBzZXQuICI7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBtc2cgKz0gIkNsYXNzIG5vdCBmb3VuZDogIitlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwogICAgICAgICAgICAgYXNzdW1lVHJ1ZShmYWxzZSk7CkBAIC0yMzYsMTUgKzIzNywxOCBAQAogICAgICAgICByZXR1cm4gcmN2ZFBlcnNvbjsKICAgICB9CiAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTxQZXJzb24+IG5ld09kZElkUHJlZGljYXRlKCkgeworICAgIHByaXZhdGUgc3RhdGljIFByZWRpY2F0ZTxQZXJzb24+IG5ld09kZElkUHJlZGljYXRlKCkgewogICAgICAgICByZXR1cm4gKHBlcnNvbikgLT4gcGVyc29uLmlkICUgMiAhPSAwOwogICAgIH0KICAgICAKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBleHBlY3RlZFBlcnNvbnMoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTxQZXJzb24+IHByZWRpY2F0ZSwgTGlzdDxQZXJzb24+IHBlcnNvbnMpIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbnMuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAuZmlsdGVyKHByZWRpY2F0ZSkKLSAgICAgICAgICAgICAgICAubWFwKHBlcnNvbiAtPiBwZXJzb24udG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBleHBlY3RlZFBlcnNvbnMoUHJlZGljYXRlPFBlcnNvbj4gcHJlZGljYXRlLCBMaXN0PFBlcnNvbj4gcGVyc29ucykgeworICAgICAgICBMaXN0PFN0cmluZz4gZXhwUGVyc29ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFBlcnNvbiBwIDogcGVyc29ucykgeworICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS50ZXN0KHApKSB7CisgICAgICAgICAgICAgICAgZXhwUGVyc29ucy5hZGQocC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwUGVyc29uczsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNDYyLDYgKzQ2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25FeGNDbnQuaW5jcmVtZW50QW5kR2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgZXZlciBleHBlY3QgdG8gZ2V0IGhlcmUgaW4gdGhpcyBjYXNlCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFNldC5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgIGludCBpZCA9IHJlc3VsdFNldC5nZXRJbnQoImlkIik7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaXJzdE5hbWUgPSByZXN1bHRTZXQuZ2V0U3RyaW5nKCJmaXJzdG5hbWUiKTsKQEAgLTQ3MywxMCArNDc4LDIxIEBACiAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgVFN0cmVhbTxTdHJpbmc+IHJjdmQgPSByY3ZkUGVyc29uLm1hcChwZXJzb24gLT4gcGVyc29uLnRvU3RyaW5nKCkpOwogICAgICAgICAKKyAgICAgICAgLy8gQXdhaXQgY29tcGxldGlvbiBvbiBoYXZpbmcgcmVjZWl2ZWQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGV4Y2VwdGlvbi4KKyAgICAgICAgLy8gVGhlbiBhbHNvIHZlcmlmeSB0aGF0IG5vIG5vbi1leGNlcHRpb25hbCByZXN1bHRzIHdlcmUgcmVjZWl2ZWQuCisgICAgICAgIENvbmRpdGlvbjxPYmplY3Q+IHRjID0gbmV3IENvbmRpdGlvbjxPYmplY3Q+KCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmFsaWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGlvbkV4Y0NudC5nZXQoKSA9PSBleHBlY3RlZEV4Y0NudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzdWx0KCkgeyByZXR1cm4gZXhlY3V0aW9uRXhjQ250LmdldCgpOyB9CisgICAgICAgIH07CisgICAgICAgIENvbmRpdGlvbjxMaXN0PFN0cmluZz4+IHJjdmRDb250ZW50cyA9IHQuZ2V0VGVzdGVyKCkuc3RyZWFtQ29udGVudHMocmN2ZCwgZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CisgICAgICAgIAogICAgICAgICByY3ZkLnNpbmsodHVwbGUgLT4gU3lzdGVtLm91dC5wcmludGxuKAogICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIHJjdmQ6ICVzIiwgdC5nZXROYW1lKCksIHR1cGxlKSkpOwotICAgICAgICBjb21wbGV0ZUFuZFZhbGlkYXRlKCIiLCB0LCByY3ZkLCBTRUNfVElNRU9VVCwgZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CisgICAgICAgIGNvbXBsZXRlKHQsIHRjLCBTRUNfVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUyk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZXhlY3V0aW9uRXhjQ250IiwgZXhwZWN0ZWRFeGNDbnQsIGV4ZWN1dGlvbkV4Y0NudC5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoInJjdmQ6ICIrcmN2ZENvbnRlbnRzLmdldFJlc3VsdCgpLCByY3ZkQ29udGVudHMudmFsaWQoKSk7CiAgICAgfQogICAgIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2thZmthL2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMva2Fma2EvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDdiZWQ3Li4wMDAwMDAwCi0tLSBhL2Nvbm5lY3RvcnMva2Fma2EvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOnRvcG9sb2d5JwotICAKLSAgLy8gVGhlIHBvbSBmb3Iga2Fma2EgaW5jbHVkZXMgZGVwZW5kZW5jaWVzIHRoYXQgZG9uJ3QgbWFrZSBzZW5zZSBmb3IgdXMuCi0gIC8vIEluIGF0IGxlYXN0IG9uZSBjYXNlIGthZmthIGRlcGVuZGVuY2llcyBpbmNsdWRlIGEgc2xmNGogKmltcGxlbWVudGF0aW9uKiBqYXIKLSAgLy8gYW5kIHRoYXQgY29uZmxpY3RzIHdpdGggb3VyIHNhbXBsZXMnIGJpbmRpbmcgdG8gYSBwYXJ0aWN1bGFyCi0gIC8vIHZlcnNpb24gb2Ygc2xmNGogaW1wbGVtZW50YXRpb24uCi0gIC8vIFRoaXMgYWxsIHNlZW1zIGxpa2UgZmFsbG91dCBmcm9tLCBJIGJlbGlldmUsIHRoZSBrYWZrYSBqYXJzIGNvbnRhaW5pbmcKLSAgLy8gdGhlIGNvZGUgZm9yIHRoZWlyIGNsaSB0b29scyB0b28sIGFuZCBwb3NzaWJseSB0ZXN0cywgd2hpY2ggbmVlZCB0aGluZ3MgbGlrZToKLSAgLy8gICBzbGY0ai1sb2c0ajEyLCBzbmFwcHktamF2YSwgamxpbmUsIGpvcHQtc2ltcGxlLCBqdW5pdC0zLjguMQotICAvLwotICAvLyBTbyBhdCBsZWFzdCBmb3Igbm93LCBhdm9pZCB0cmFuc2l0aXZlIGFuZCBqdXN0IG1hdGNoIG91ciBhbnQgYmFzZWQgY29uZmlnCi0gIC8vCi0gIC8vIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ29yZy5hcGFjaGUua2Fma2E6a2Fma2FfMi4xMDowLjguMi4yJwotICAvLyBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdvcmcuYXBhY2hlLmthZmthOmthZmthLWNsaWVudHM6MC44LjIuMicKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnb3JnLmFwYWNoZS5rYWZrYTprYWZrYV8yLjEwOjAuOC4yLjJAamFyJwotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdvcmcuYXBhY2hlLmthZmthOmthZmthLWNsaWVudHM6MC44LjIuMkBqYXInCi0gIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ2xvZzRqOmxvZzRqOjEuMi4xNkBqYXInCi0gIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ2NvbS55YW1tZXIubWV0cmljczptZXRyaWNzLWNvcmU6Mi4yLjBAamFyJwotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdvcmcuc2NhbGEtbGFuZzpzY2FsYS1saWJyYXJ5OjIuMTAuNEBqYXInCi0gIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ2NvbS4xMDF0ZWM6emtjbGllbnQ6MC4zQGphcicKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnb3JnLmFwYWNoZS56b29rZWVwZXI6em9va2VlcGVyOjMuNC42QGphcicKLSAgCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JywgJzpjb25uZWN0b3JzOmNvbW1vbicKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMva2Fma2EvcG9tLnhtbCBiL2Nvbm5lY3RvcnMva2Fma2EvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQzYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9rYWZrYS9wb20ueG1sCkBAIC0wLDAgKzEsMTYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMta2Fma2E8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQ29ubmVjdG9yczogS2Fma2E8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDwhLS0KKyAgIFRoZSBwb20gZm9yIGthZmthIGluY2x1ZGVzIGRlcGVuZGVuY2llcyB0aGF0IGRvbid0IG1ha2Ugc2Vuc2UgZm9yIHVzLgorICAgSW4gYXQgbGVhc3Qgb25lIGNhc2Uga2Fma2EgZGVwZW5kZW5jaWVzIGluY2x1ZGUgYSBzbGY0aiAqaW1wbGVtZW50YXRpb24qIGphcgorICAgYW5kIHRoYXQgY29uZmxpY3RzIHdpdGggb3VyIHNhbXBsZXMnIGJpbmRpbmcgdG8gYSBwYXJ0aWN1bGFyCisgICB2ZXJzaW9uIG9mIHNsZjRqIGltcGxlbWVudGF0aW9uLgorICAgVGhpcyBhbGwgc2VlbXMgbGlrZSBmYWxsb3V0IGZyb20sIEkgYmVsaWV2ZSwgdGhlIGthZmthIGphcnMgY29udGFpbmluZworICAgdGhlIGNvZGUgZm9yIHRoZWlyIGNsaSB0b29scyB0b28sIGFuZCBwb3NzaWJseSB0ZXN0cywgd2hpY2ggbmVlZCB0aGluZ3MgbGlrZToKKyAgICAgc2xmNGotbG9nNGoxMiwgc25hcHB5LWphdmEsIGpsaW5lLCBqb3B0LXNpbXBsZSwganVuaXQtMy44LjEKKworICAgU28gYXQgbGVhc3QgZm9yIG5vdywgYXZvaWQgdHJhbnNpdGl2ZSBhbmQganVzdCBtYXRjaCBvdXIgYW50L2dyYWRsZSBiYXNlZAorICAgY29uZmlnLiAgSW5jbHVkZSBvbmx5IHRoZSBleGFjdCBkZXBlbmRlbmNpZXMgdGhhdCBvdXIga2Fma2EKKyAgIGRlcGVuZGVuY3kgcmVxdWlyZXMgdG8gZnVuY3Rpb24gcHJvcGVybHkuCisgICAtLT4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUua2Fma2E8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5rYWZrYV8yLjEwPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MC44LjIuMjwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIG5vdCB0cmFuc2l0aXZlIC0tPgorICAgICAgICAgIDxncm91cElkPio8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+KjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5rYWZrYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmthZmthLWNsaWVudHM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4wLjguMi4yPC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+IDwhLS0gbm90IHRyYW5zaXRpdmUgLS0+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjE2PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+IDwhLS0gbm90IHRyYW5zaXRpdmUgLS0+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20ueWFtbWVyLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIG5vdCB0cmFuc2l0aXZlIC0tPgorICAgICAgICAgIDxncm91cElkPio8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+KjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNjYWxhLWxhbmc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4xMC40PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+IDwhLS0gbm90IHRyYW5zaXRpdmUgLS0+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uMTAxdGVjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+emtjbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4wLjM8L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBub3QgdHJhbnNpdGl2ZSAtLT4KKyAgICAgICAgICA8Z3JvdXBJZD4qPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPio8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuem9va2VlcGVyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+em9va2VlcGVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My40LjY8L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBub3QgdHJhbnNpdGl2ZSAtLT4KKyAgICAgICAgICA8Z3JvdXBJZD4qPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPio8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2thZmthL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy9rYWZrYS9wYWNrYWdlLWluZm8uamF2YSBiL2Nvbm5lY3RvcnMva2Fma2Evc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL2thZmthL3BhY2thZ2UtaW5mby5qYXZhCmluZGV4IDNlMjc3MTcuLmI2MmFmMzYgMTAwNjQ0Ci0tLSBhL2Nvbm5lY3RvcnMva2Fma2Evc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL2thZmthL3BhY2thZ2UtaW5mby5qYXZhCisrKyBiL2Nvbm5lY3RvcnMva2Fma2Evc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL2thZmthL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiB1bmRlciB0aGUgTGljZW5zZS4KICovCiAvKioKLSAqIEFwYWNoZSBLYWZrYSBlbnRlcnByaXNlIG1lc3NpbmcgaHViIHN0cmVhbSBjb25uZWN0b3IuCisgKiBBcGFjaGUgS2Fma2EgZW50ZXJwcmlzZSBtZXNzYWdpbmcgaHViIHN0cmVhbSBjb25uZWN0b3IuCiAgKiA8cD4KICAqIFRoZSBjb25uZWN0b3IgdXNlcyBhbmQgaW5jbHVkZXMgY29tcG9uZW50cyBmcm9tIHRoZSBLYWZrYSAwLjguMi4yIHJlbGVhc2UuCiAgKiBJdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVzdGVkIGFnYWluc3Qga2Fma2FfMi4xMS0wLjEwLjEuMCBhbmQga2Fma2FfMi4xMS0wLjkuMC4wIHNlcnZlciBhcyB3ZWxsLgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9rYWZrYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9rYWZrYS9LYWZrYVN0cmVhbXNTa2lwTWVUZXN0LmphdmEgYi9jb25uZWN0b3JzL2thZmthL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2thZmthL0thZmthU3RyZWFtc1NraXBNZVRlc3QuamF2YQppbmRleCA3OGJkYzQ3Li5mYmM5YThjIDEwMDY0NAotLS0gYS9jb25uZWN0b3JzL2thZmthL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2thZmthL0thZmthU3RyZWFtc1NraXBNZVRlc3QuamF2YQorKysgYi9jb25uZWN0b3JzL2thZmthL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL2thZmthL0thZmthU3RyZWFtc1NraXBNZVRlc3QuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiAvKgotICogT3VyIGN1cnJlbnQgZ3JhZGxlIGRyaXZlbiB0ZXN0IGNvbmZpZyAodGVzdCBmaWx0ZXJpbmcgd2l0aAorICogT3VyIGN1cnJlbnQgbWF2ZW4vZ3JhZGxlIGRyaXZlbiB0ZXN0IGNvbmZpZyAodGVzdCBmaWx0ZXJpbmcgd2l0aAogICogaW5jbHVkZVRlc3RzTWF0Y2hpbmcgJypUZXN0JykgcmVzdWx0cyBpbiBmYWlsaW5nIGEgcHJvamVjdCdzCiAgKiB0ZXN0IHRhc2sgaWYgdGhlIHByb2plY3QgbGFja3MgYW55ICIqVGVzdCIgY2xhc3Nlcy4KICAqIApkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9tcXR0L2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvbXF0dC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMWQzMmUuLjAwMDAwMDAKLS0tIGEvY29ubmVjdG9ycy9tcXR0L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTp0b3BvbG9neScKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmNvbm5lY3RvcnM6aW90JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczpjb21tb24nCi0gIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ29yZy5lY2xpcHNlLnBhaG86b3JnLmVjbGlwc2UucGFoby5jbGllbnQubXF0dHYzOjEuMS4wJwotICAKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ3Rlc3RDb21waWxlJywgJzpwcm92aWRlcnM6ZGlyZWN0JwotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQotCi1hZGRDb21waWxlVGVzdERlcGVuZGVuY2llcyAnOmFwaTp0b3BvbG9neScsICc6cHJvdmlkZXJzOmRpcmVjdCcsICc6Y29ubmVjdG9yczpjb21tb24nCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL21xdHQvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvbXF0dC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMTkyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL21xdHQvcG9tLnhtbApAQCAtMCwwICsxLDEyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLW1xdHQ8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQ29ubmVjdG9yczogTVFUVDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5yYXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1yYXQtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmxpY2Vuc2UtY2hlY2s8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZXhjbHVkZXMgY29tYmluZS5jaGlsZHJlbj0iYXBwZW5kIj4KKyAgICAgICAgICAgIDxleGNsdWRlPnNyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvKi5jcnQ8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzLyoua2V5PC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy8qLnNybDwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPnNyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvKi5jc3I8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzLyoucDEyPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9tb3NxdWl0dG8tU1NMLmNvbmYudGVtcGxhdGU8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL21vc3F1aXR0by5vcmcuY3J0PC9leGNsdWRlPgorICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1pb3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnBhaG88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYWhvLmNsaWVudC5tcXR0djM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmczPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My40PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvbXF0dC9NcXR0U3RyZWFtc1Rlc3RNYW51YWwuamF2YSBiL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9tcXR0L01xdHRTdHJlYW1zVGVzdE1hbnVhbC5qYXZhCmluZGV4IDJhYjMyMGQuLjRlYWUxZjEgMTAwNjQ0Ci0tLSBhL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9tcXR0L01xdHRTdHJlYW1zVGVzdE1hbnVhbC5qYXZhCisrKyBiL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9tcXR0L01xdHRTdHJlYW1zVGVzdE1hbnVhbC5qYXZhCkBAIC0zOCw4ICszOCw4IEBACiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5tcXR0Lk1xdHRDb25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5tcXR0Lk1xdHRTdHJlYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLkJpRnVuY3Rpb247CkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICB9CiAgICAgCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlzdG9yZVBhdGgoU3RyaW5nIHN0b3JlTGVhZikgewotICAgICAgICByZXR1cm4gVGVzdFJlcG9QYXRoLmdldFBhdGgoImNvbm5lY3RvcnMiLCAibXF0dCIsICJzcmMiLCAidGVzdCIsICJrZXlzdG9yZXMiLCBzdG9yZUxlYWYpOworICAgICAgICByZXR1cm4gVGVzdFJlcG9QYXRoLmdldFBhdGgoImtleXN0b3Jlcy8iICsgc3RvcmVMZWFmKTsKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBNcXR0Q29uZmlnIG5ld0NvbmZpZyhTdHJpbmcgc2VydmVyVVJMLCBTdHJpbmcgY2xpZW50SWQpIHsKQEAgLTI5NSw2ICsyOTUsMTQgQEAKICAgICAgICAgY29tcGxldGVBbmRWYWxpZGF0ZShjbGllbnRJZCwgdG9wLCByY3ZkLCBtZ2VuLCBTRUNfVElNRU9VVCwgbXNncy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKICAgICB9CiAgICAgCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbXNnc0FzU3RyKFN0cmluZyB0b3BpYywgTGlzdDxTdHJpbmc+IG1zZ3MpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG1zZ3NBc1N0ciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBtc2dTdHIgOiBtc2dzKSB7CisgICAgICAgICAgICBtc2dzQXNTdHIuYWRkKG5ldyBNc2cobXNnU3RyLCB0b3BpYykudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1zZ3NBc1N0cjsKKyAgICB9CisgICAgCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY1B1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgVG9wb2xvZ3kgdG9wID0gbmV3VG9wb2xvZ3koInRlc3RHZW5lcmljUHVibGlzaCIpOwpAQCAtMzA2LDExICszMTQsNyBAQAogICAgICAgICAvLyBhbmQgdXNlIGEgZGlmZmVyZW50IHRvcGljCiAgICAgICAgIFN0cmluZyB0b3BpYyA9IGdldE1xdHRUb3BpY3MoKVswXSArICItR2VuZXJpYyI7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBtc2dzID0gY3JlYXRlTXNncyhtZ2VuLCB0b3BpYywgZ2V0TXNnMSgpLCBnZXRNc2cyKCkpOwotICAgICAgICBMaXN0PFN0cmluZz4gZXhwTXNnc0FzU3RyID0gCi0gICAgICAgICAgICAgICAgbXNncwotICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgIC5tYXAodCAtPiAobmV3IE1zZyh0LCB0b3BpYykpLnRvU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBleHBNc2dzQXNTdHIgPSBtc2dzQXNTdHIodG9waWMsIG1zZ3MpOwogCiAgICAgICAgIFRTdHJlYW08TXNnPiBzID0gUGx1bWJpbmdTdHJlYW1zLmJsb2NraW5nT25lU2hvdERlbGF5KAogICAgICAgICAgICAgICAgIHRvcC5jb2xsZWN0aW9uKG1zZ3MpLCBQVUJfREVMQVlfTVNFQywgVGltZVVuaXQuTUlMTElTRUNPTkRTKQpAQCAtNDkxLDE3ICs0OTUsMjQgQEAKICAgICAgICAgICAgICAgICB0b3AuY29sbGVjdGlvbihtc2dzKSwgUFVCX0RFTEFZX01TRUMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgICAgIAogICAgICAgICAvLyBDb2RlIGNvdmVyYWdlIHRlc3Q6IGluZHVjZSBjb25uZWN0aW9uIGZhaWx1cmUKLSAgICAgICAgLy8KLSAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgb25seSB0aGluZyB3ZSBjYW4gY2hlY2sgaXMgYW4gZXhwZWN0ZWQKLSAgICAgICAgLy8gcmVzdWx0IG9mIDAgbXNncyByZWNlaXZlZC4KICAgICAgICAgCiAgICAgICAgIE1xdHRDb25maWcgY29uZmlnID0gbmV3Q29uZmlnKCJ0Y3A6Ly9sb2NhbGhvc3Q6MzE5OTkiLCBjbGllbnRJZCk7CiAgICAgICAgIE1xdHRTdHJlYW1zIG1xdHQgPSBuZXcgTXF0dFN0cmVhbXModG9wLCAoKSAtPiBjb25maWcpOwogCiAgICAgICAgIG1xdHQucHVibGlzaChzLCB0b3BpYywgcW9zLCByZXRhaW4pOwotICAgICAgICBUU3RyZWFtPFN0cmluZz4gcmN2ZCA9IG1xdHQuc3Vic2NyaWJlKHRvcGljLCBxb3MpOwotCi0gICAgICAgIGNvbXBsZXRlQW5kVmFsaWRhdGUoY2xpZW50SWQsIHRvcCwgcmN2ZCwgbWdlbiwgU0VDX1RJTUVPVVQsIG5ldyBTdHJpbmdbMF0pOworICAgICAgICBUU3RyZWFtPFN0cmluZz4gcmN2ZCA9IG1xdHQuc3Vic2NyaWJlKHRvcGljLCBxb3MpOyAgLy8gcmN2IG5vdGhpbmcKKyAgICAgICAgCisgICAgICAgIC8vIGluIHRoaXMgY2FzZSB0aGVyZSdzIG5vIHVzZWZ1bCBjb25kaXRpb24gdGhhdCB3ZSBjYW4gY2hlY2sgZm9yCisgICAgICAgIC8vIHRvIHZhbGlkYXRlIHRoaXMgaXMgYmVoYXZpbmcgcHJvcGVybHkgb3RoZXIgdGhhbiB0aGUgY29ubmVjdG9yIGRvZXNuJ3QKKyAgICAgICAgLy8gYmxvdyB1cCBhbmQgdGhhdCBub3RoaW5nIGlzIHJjdmQsIHNvIGp1c3Qgd2FpdCBhIHNob3J0IHRpbWUKKyAgICAgICAgLy8gYmVmb3JlIHZlcmlmeWluZyBub3RoaW5nIHdhcyByY3ZkLgorICAgICAgICAvLyBEb24ndCB1c2UgdGhlIGNvbXBsZXRlKCkgVE1PIGZvciBzdWNjZXNzZnVsIHRlcm1pbmF0aW9uLgorICAgICAgICAKKyAgICAgICAgQ29uZGl0aW9uPExpc3Q8U3RyaW5nPj4gcmN2ZENvbnRlbnQgPSB0b3AuZ2V0VGVzdGVyKCkuc3RyZWFtQ29udGVudHMocmN2ZCwgbmV3IFN0cmluZ1swXSk7CisgICAgICAgIENvbmRpdGlvbjxPYmplY3Q+IHRjID0gbmV3V2FpdFRpbWVDb25kaXRpb24oMyk7CisgICAgICAgIAorICAgICAgICBjb21wbGV0ZSh0b3AsIHRjLCBTRUNfVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGFzc2VydFRydWUoInJjdmQ6ICIrcmN2ZENvbnRlbnQuZ2V0UmVzdWx0KCksIHJjdmRDb250ZW50LnZhbGlkKCkpOwogICAgIH0KICAgICAKICAgICBwcml2YXRlIFN0cmluZyByZXRhaW5UZXN0U2V0dXAoYm9vbGVhbiBpc1JldGFpbmVkLCBNc2dHZW5lcmF0b3IgbWdlbikgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC01NTAsMTEgKzU2MSw3IEBACiAgICAgICAgIAogICAgICAgICAvLyB2ZXJpZnkgdGhlIG5leHQgY29ubmVjdC9zdWJzY3JpYmUgW2RvZXNuJ3RdIHNlZXMgdGhlIHJldGFpbiBhbmQgdGhlbiBuZXcgbXNncwogICAgICAgICBMaXN0PFN0cmluZz4gbXNncyA9IGNyZWF0ZU1zZ3MobWdlbiwgdG9waWMsIGdldE1zZzEoKSwgZ2V0TXNnMigpKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4cE1zZ3NBc1N0ciA9IAotICAgICAgICAgICAgICAgIG1zZ3MKLSAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAubWFwKHQgLT4gKG5ldyBNc2codCwgdG9waWMpKS50b1N0cmluZygpKQotICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBMaXN0PFN0cmluZz4gZXhwTXNnc0FzU3RyID0gbXNnc0FzU3RyKHRvcGljLCBtc2dzKTsKICAgICAgICAgaWYgKGlzUmV0YWluZWQpCiAgICAgICAgICAgICBleHBNc2dzQXNTdHIuYWRkKDAsIChuZXcgTXNnKHJldGFpbmVkTXNnLCB0b3BpYykpLnRvU3RyaW5nKCkpOwogCkBAIC01OTIsMTEgKzU5OSw3IEBACiAgICAgICAgIAogICAgICAgICAvLyB2ZXJpZnkgdGhlIG5leHQgY29ubmVjdC9zdWJzY3JpYmUgW2RvZXNuJ3RdIHNlZXMgdGhlIHJldGFpbiBhbmQgdGhlbiBuZXcgbXNncwogICAgICAgICBMaXN0PFN0cmluZz4gbXNncyA9IGNyZWF0ZU1zZ3MobWdlbiwgdG9waWMsIGdldE1zZzEoKSwgZ2V0TXNnMigpKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4cE1zZ3NBc1N0ciA9IAotICAgICAgICAgICAgICAgIG1zZ3MKLSAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAubWFwKHQgLT4gKG5ldyBNc2codCwgdG9waWMpKS50b1N0cmluZygpKQotICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBMaXN0PFN0cmluZz4gZXhwTXNnc0FzU3RyID0gbXNnc0FzU3RyKHRvcGljLCBtc2dzKTsKICAgICAgICAgaWYgKGlzUmV0YWluZWQpCiAgICAgICAgICAgICBleHBNc2dzQXNTdHIuYWRkKDAsIChuZXcgTXNnKHJldGFpbmVkTXNnLCB0b3BpYykpLnRvU3RyaW5nKCkpOwogCkBAIC03OTYsNyArNzk5LDcgQEAKIC8vICAgICAgICBwcm9wVGVzdGVyLmFkZCgibXF0dC5wZXJzaXN0ZW5jZSIsICJzb21lLnBlcnNpc3RlbmNlLmNsYXNzbmFtZSIsCiAvLyAgICAgICAgICAgICAgICAoKSAtPiBjb25maWdSZWYuZ2V0KCkuZ2V0UGVyc2lzdGVuY2UoKSk7CiAgICAgICAgIHByb3BUZXN0ZXIuYWRkKCJtcXR0LnNlcnZlclVSTHMiLCAidGNwOi8vc29tZWhvc3Q6MTIzNCxzc2w6Ly9zb21laG9zdDo1Njc4IiwKLSAgICAgICAgICAgICAgICAoKSAtPiBTdHJpbmcuam9pbigiLCIsIGNvbmZpZ1JlZi5nZXQoKS5nZXRTZXJ2ZXJVUkxzKCkpKTsKKyAgICAgICAgICAgICAgICAoKSAtPiBTdHJpbmdVdGlscy5qb2luKGNvbmZpZ1JlZi5nZXQoKS5nZXRTZXJ2ZXJVUkxzKCksICIsIikpOwogICAgICAgICBwcm9wVGVzdGVyLmFkZCgibXF0dC5zdWJzY3JpYmVySWRsZVJlY29ubmVjdEludGVydmFsU2VjIiwgIjE0IiwgCiAgICAgICAgICAgICAgICAgKCkgLT4gKChJbnRlZ2VyKWNvbmZpZ1JlZi5nZXQoKS5nZXRTdWJzY3JpYmVySWRsZVJlY29ubmVjdEludGVydmFsKCkpLnRvU3RyaW5nKCkpOwogICAgICAgICBwcm9wVGVzdGVyLmFkZCgibXF0dC50cnVzdFN0b3JlIiwgInNvbWUvcGF0aC90cnVzdHN0b3JlIiwKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvUkVBRE1FIGIvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvUkVBRE1FCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL1JFQURNRQpyZW5hbWUgdG8gY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvUkVBRE1FCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NhLmNydCBiL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NhLmNydApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L2tleXN0b3Jlcy9jYS5jcnQKcmVuYW1lIHRvIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NhLmNydApkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L2tleXN0b3Jlcy9jYS5rZXkgYi9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jYS5rZXkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvY2Eua2V5CnJlbmFtZSB0byBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jYS5rZXkKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvY2Euc3JsIGIvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvY2Euc3JsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NhLnNybApyZW5hbWUgdG8gY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvY2Euc3JsCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NsaWVudC5jcnQgYi9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jbGllbnQuY3J0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NsaWVudC5jcnQKcmVuYW1lIHRvIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NsaWVudC5jcnQKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvY2xpZW50LmNzciBiL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NsaWVudC5jc3IKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvY2xpZW50LmNzcgpyZW5hbWUgdG8gY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvY2xpZW50LmNzcgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L2tleXN0b3Jlcy9jbGllbnQua2V5IGIvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvY2xpZW50LmtleQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L2tleXN0b3Jlcy9jbGllbnQua2V5CnJlbmFtZSB0byBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jbGllbnQua2V5CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NsaWVudC5wMTIgYi9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jbGllbnQucDEyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NsaWVudC5wMTIKcmVuYW1lIHRvIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NsaWVudC5wMTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L2tleXN0b3Jlcy9jbGllbnRLZXlTdG9yZS5qa3MgYi9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jbGllbnRLZXlTdG9yZS5qa3MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvY2xpZW50S2V5U3RvcmUuamtzCnJlbmFtZSB0byBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jbGllbnRLZXlTdG9yZS5qa3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L2tleXN0b3Jlcy9jbGllbnRUcnVzdFN0b3JlLmprcyBiL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NsaWVudFRydXN0U3RvcmUuamtzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NsaWVudFRydXN0U3RvcmUuamtzCnJlbmFtZSB0byBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jbGllbnRUcnVzdFN0b3JlLmprcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NyZWF0ZS1hbGwuc2ggYi9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jcmVhdGUtYWxsLnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NyZWF0ZS1hbGwuc2gKcmVuYW1lIHRvIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NyZWF0ZS1hbGwuc2gKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvbW9zcXVpdHRvLVNTTC5jb25mLnRlbXBsYXRlIGIvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvbW9zcXVpdHRvLVNTTC5jb25mLnRlbXBsYXRlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL21vc3F1aXR0by1TU0wuY29uZi50ZW1wbGF0ZQpyZW5hbWUgdG8gY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvbW9zcXVpdHRvLVNTTC5jb25mLnRlbXBsYXRlCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL21vc3F1aXR0by5vcmcuY3J0IGIvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvbW9zcXVpdHRvLm9yZy5jcnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvbW9zcXVpdHRvLm9yZy5jcnQKcmVuYW1lIHRvIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL21vc3F1aXR0by5vcmcuY3J0CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL3NlcnZlci5jcnQgYi9jb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9zZXJ2ZXIuY3J0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3Qva2V5c3RvcmVzL3NlcnZlci5jcnQKcmVuYW1lIHRvIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL3NlcnZlci5jcnQKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvc2VydmVyLmNzciBiL2Nvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL3NlcnZlci5jc3IKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbm5lY3RvcnMvbXF0dC9zcmMvdGVzdC9rZXlzdG9yZXMvc2VydmVyLmNzcgpyZW5hbWUgdG8gY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvc2VydmVyLmNzcgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L2tleXN0b3Jlcy9zZXJ2ZXIua2V5IGIvY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvc2VydmVyLmtleQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy9tcXR0L3NyYy90ZXN0L2tleXN0b3Jlcy9zZXJ2ZXIua2V5CnJlbmFtZSB0byBjb25uZWN0b3JzL21xdHQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9zZXJ2ZXIua2V5CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3BvbS54bWwgYi9jb25uZWN0b3JzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiMGY1NQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvcG9tLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25uZWN0b3JzPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+Y29tbWFuZDwvbW9kdWxlPgorICAgIDxtb2R1bGU+Y29tbW9uPC9tb2R1bGU+CisgICAgPG1vZHVsZT5jc3Y8L21vZHVsZT4KKyAgICA8bW9kdWxlPmZpbGU8L21vZHVsZT4KKyAgICA8bW9kdWxlPmh0dHA8L21vZHVsZT4KKyAgICA8bW9kdWxlPmlvdDwvbW9kdWxlPgorICAgIDxtb2R1bGU+aW90cDwvbW9kdWxlPgorICAgIDxtb2R1bGU+amRiYzwvbW9kdWxlPgorICAgIDxtb2R1bGU+a2Fma2E8L21vZHVsZT4KKyAgICA8bW9kdWxlPm1xdHQ8L21vZHVsZT4KKyAgICA8bW9kdWxlPnB1YnN1YjwvbW9kdWxlPgorICAgIDxtb2R1bGU+c2VyaWFsPC9tb2R1bGU+CisgICAgPG1vZHVsZT53ZWJzb2NrZXQ8L21vZHVsZT4KKyAgICA8bW9kdWxlPndlYnNvY2tldC1iYXNlPC9tb2R1bGU+CisgICAgPG1vZHVsZT53ZWJzb2NrZXQtamV0dHk8L21vZHVsZT4KKyAgICA8bW9kdWxlPndlYnNvY2tldC1taXNjPC9tb2R1bGU+CisgICAgPG1vZHVsZT53ZWJzb2NrZXQtc2VydmVyPC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9wdWJzdWIvYnVpbGQuZ3JhZGxlIGIvY29ubmVjdG9ycy9wdWJzdWIvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTg2ZDI2Li4wMDAwMDAwCi0tLSBhL2Nvbm5lY3RvcnMvcHVic3ViL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTp0b3BvbG9neScKLSAgYWRkVGFyZ2V0RGlyQ29yZUV4dEphckRlcGVuZGVuY2llcyAnY29tcGlsZScKLSAgCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICd0ZXN0Q29tcGlsZScsICc6cHJvdmlkZXJzOmRpcmVjdCcKLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KLQotYWRkQ29tcGlsZVRlc3REZXBlbmRlbmNpZXMgJzphcGk6dG9wb2xvZ3knLCAnOnByb3ZpZGVyczpkaXJlY3QnCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3B1YnN1Yi9wb20ueG1sIGIvY29ubmVjdG9ycy9wdWJzdWIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNjZGMxCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9wdWJzdWIvcG9tLnhtbApAQCAtMCwwICsxLDQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtcHVic3ViPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IENvbm5lY3RvcnM6IFB1YlN1YjwvbmFtZT4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9wdWJzdWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvcHVic3ViL1B1YlN1YlRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvcHVic3ViL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL3B1YnN1Yi9QdWJTdWJUZXN0LmphdmEKaW5kZXggOGMxMzNlNC4uZDYwZjBjMyAxMDA2NDQKLS0tIGEvY29ubmVjdG9ycy9wdWJzdWIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvcHVic3ViL1B1YlN1YlRlc3QuamF2YQorKysgYi9jb25uZWN0b3JzL3B1YnN1Yi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy9wdWJzdWIvUHViU3ViVGVzdC5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAgICAgLyoqCiAgICAgICogVGVzdCB3aXRob3V0IGEgcHViLXN1YiBzZXJ2aWNlIHNvIG5vCiAgICAgICogY3Jvc3Mgam9iIGNvbm5lY3Rpb25zIHdpbGwgYmUgbWFkZS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGZhaWx1cmUKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvc2VyaWFsL2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvc2VyaWFsL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4NmQyNi4uMDAwMDAwMAotLS0gYS9jb25uZWN0b3JzL3NlcmlhbC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JwpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9zZXJpYWwvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvc2VyaWFsL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmMDAxZQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvc2VyaWFsL3BvbS54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXNlcmlhbDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25uZWN0b3JzOiBTZXJpYWw8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dlYnNvY2tldC1iYXNlL3BvbS54bWwgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1iYXNlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhNDU2NAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0LWJhc2UvcG9tLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LWJhc2U8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQ29ubmVjdG9yczogV2Vic29ja2V0OiBCYXNlPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy93c2NsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvV2ViU29ja2V0Q2xpZW50LmphdmEgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1iYXNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9XZWJTb2NrZXRDbGllbnQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy93c2NsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvV2ViU29ja2V0Q2xpZW50LmphdmEKcmVuYW1lIHRvIGNvbm5lY3RvcnMvd2Vic29ja2V0LWJhc2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L1dlYlNvY2tldENsaWVudC5qYXZhCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dzY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9wYWNrYWdlLWluZm8uamF2YSBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0LWJhc2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L3BhY2thZ2UtaW5mby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIGNvbm5lY3RvcnMvd3NjbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L3BhY2thZ2UtaW5mby5qYXZhCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC1iYXNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9wYWNrYWdlLWluZm8uamF2YQppbmRleCBjMmNjMGNiLi5jNTA4NzU5IDEwMDY0NAotLS0gYS9jb25uZWN0b3JzL3dzY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9wYWNrYWdlLWluZm8uamF2YQorKysgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1iYXNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMTcsNiArMTcsNiBAQAogdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLyoqCi0gKiBXZWJTb2NrZXQgQ2xpZW50IENvbm5lY3RvciBBUEkgZm9yIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBtZXNzYWdlcyB0byBhIFdlYlNvY2tldCBTZXJ2ZXIuCisgKiBBIGdlbmVyaWMgV2ViU29ja2V0IENsaWVudCBDb25uZWN0b3IgQVBJIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgbWVzc2FnZXMgdG8gYSBXZWJTb2NrZXQgU2VydmVyLgogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMud3NjbGllbnQ7CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvUkVBRE1FIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQtamV0dHkvUkVBRE1FCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvUkVBRE1FCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC1qZXR0eS9SRUFETUUKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd2Vic29ja2V0LWpldHR5L3BvbS54bWwgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1qZXR0eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjc0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1qZXR0eS9wb20ueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQtamV0dHk8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogQ29ubmVjdG9yczogV2Vic29ja2V0OiBKZXR0eTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LW1pc2M8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eS53ZWJzb2NrZXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXZheC13ZWJzb2NrZXQtY2xpZW50LWltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj45LjMuNi52MjAxNTExMDY8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qYXZheC53ZWJzb2NrZXQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvamF2YXgvd2Vic29ja2V0L2ltcGwvRWRnZW50U3NsQ29udGFpbmVyUHJvdmlkZXJJbXBsLmphdmEgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1qZXR0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2phdmF4L3dlYnNvY2tldC9pbXBsL0VkZ2VudFNzbENvbnRhaW5lclByb3ZpZGVySW1wbC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9qYXZheC93ZWJzb2NrZXQvaW1wbC9FZGdlbnRTc2xDb250YWluZXJQcm92aWRlckltcGwuamF2YQpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQtamV0dHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9qYXZheC93ZWJzb2NrZXQvaW1wbC9FZGdlbnRTc2xDb250YWluZXJQcm92aWRlckltcGwuamF2YQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qYXZheC53ZWJzb2NrZXQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvamF2YXgvd2Vic29ja2V0L2ltcGwvcGFja2FnZS1pbmZvLmphdmEgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1qZXR0eS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2phdmF4L3dlYnNvY2tldC9pbXBsL3BhY2thZ2UtaW5mby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9qYXZheC93ZWJzb2NrZXQvaW1wbC9wYWNrYWdlLWluZm8uamF2YQpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQtamV0dHkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9qYXZheC93ZWJzb2NrZXQvaW1wbC9wYWNrYWdlLWluZm8uamF2YQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy93ZWJzb2NrZXQtamV0dHkvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuZWRnZW50LmphdmF4LndlYnNvY2tldC5FZGdlbnRTc2xDb250YWluZXJQcm92aWRlciBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0LWpldHR5L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmVkZ2VudC5qYXZheC53ZWJzb2NrZXQuRWRnZW50U3NsQ29udGFpbmVyUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzY2VjMgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0LWpldHR5L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmVkZ2VudC5qYXZheC53ZWJzb2NrZXQuRWRnZW50U3NsQ29udGFpbmVyUHJvdmlkZXIKQEAgLTAsMCArMSwxNyBAQAorIworIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworb3JnLmFwYWNoZS5lZGdlbnQuamF2YXgud2Vic29ja2V0LmltcGwuRWRnZW50U3NsQ29udGFpbmVyUHJvdmlkZXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy93ZWJzb2NrZXQtbWlzYy9wb20ueG1sIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQtbWlzYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YTIwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1taXNjL3BvbS54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1taXNjPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IENvbm5lY3RvcnM6IFdlYnNvY2tldDogTWlzYzwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmphdmF4LndlYnNvY2tldDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmF4LndlYnNvY2tldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvZWRnZW50LmphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2phdmF4L3dlYnNvY2tldC9FZGdlbnRTc2xDb250YWluZXJQcm92aWRlci5qYXZhIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQtbWlzYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2phdmF4L3dlYnNvY2tldC9FZGdlbnRTc2xDb250YWluZXJQcm92aWRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL2VkZ2VudC5qYXZheC53ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9qYXZheC93ZWJzb2NrZXQvRWRnZW50U3NsQ29udGFpbmVyUHJvdmlkZXIuamF2YQpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQtbWlzYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2phdmF4L3dlYnNvY2tldC9FZGdlbnRTc2xDb250YWluZXJQcm92aWRlci5qYXZhCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2VkZ2VudC5qYXZheC53ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9qYXZheC93ZWJzb2NrZXQvcGFja2FnZS1pbmZvLmphdmEgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1taXNjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvamF2YXgvd2Vic29ja2V0L3BhY2thZ2UtaW5mby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL2VkZ2VudC5qYXZheC53ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9qYXZheC93ZWJzb2NrZXQvcGFja2FnZS1pbmZvLmphdmEKcmVuYW1lIHRvIGNvbm5lY3RvcnMvd2Vic29ja2V0LW1pc2Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9qYXZheC93ZWJzb2NrZXQvcGFja2FnZS1pbmZvLmphdmEKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LXNlcnZlci9SRUFETUUgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1zZXJ2ZXIvUkVBRE1FCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL2phdmF4LndlYnNvY2tldC1zZXJ2ZXIvUkVBRE1FCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC1zZXJ2ZXIvUkVBRE1FCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dlYnNvY2tldC1zZXJ2ZXIvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0LXNlcnZlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTdjODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL3dlYnNvY2tldC1zZXJ2ZXIvcG9tLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25uZWN0b3JzOiBXZWJzb2NrZXQ6IFNlcnZlcjwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LWpldHR5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHkud2Vic29ja2V0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF2YXgtd2Vic29ja2V0LXNlcnZlci1pbXBsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+OS4zLjYudjIwMTUxMTA2PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd2Vic29ja2V0L3BvbS54bWwgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWM4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9wb20ueG1sCkBAIC0wLDAgKzEsMTE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IENvbm5lY3RvcnM6IFdlYnNvY2tldDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQtbWlzYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LWJhc2U8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qYXZheC53ZWJzb2NrZXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53ZWJzb2NrZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1odHRwPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eS53ZWJzb2NrZXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXZheC13ZWJzb2NrZXQtc2VydmVyLWltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvSnNyMzU2V2ViU29ja2V0Q2xpZW50LmphdmEgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L0pzcjM1NldlYlNvY2tldENsaWVudC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L0pzcjM1NldlYlNvY2tldENsaWVudC5qYXZhCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L0pzcjM1NldlYlNvY2tldENsaWVudC5qYXZhCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3BhY2thZ2UtaW5mby5qYXZhIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9wYWNrYWdlLWluZm8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3BhY2thZ2UtaW5mby5qYXZhCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3BhY2thZ2UtaW5mby5qYXZhCmluZGV4IDI3N2NlNWMuLmQ1OTBkMTQgMTAwNjQ0Ci0tLSBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvcGFja2FnZS1pbmZvLmphdmEKKysrIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMTcsNiArMTcsNiBAQAogdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLyoqCi0gKiBXZWJTb2NrZXQgQ2xpZW50IENvbm5lY3RvciBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIG1lc3NhZ2VzIHRvIGEgV2ViU29ja2V0IFNlcnZlci4KKyAqIEEgSlNSMzU2IGJhc2VkIFdlYlNvY2tldCBDbGllbnQgQ29ubmVjdG9yIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgbWVzc2FnZXMgdG8gYSBXZWJTb2NrZXQgU2VydmVyLgogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMud3NjbGllbnQuamF2YXgud2Vic29ja2V0OwpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9ydW50aW1lL1dlYlNvY2tldENsaWVudEJpbmFyeVJlY2VpdmVyLmphdmEgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3J1bnRpbWUvV2ViU29ja2V0Q2xpZW50QmluYXJ5UmVjZWl2ZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9ydW50aW1lL1dlYlNvY2tldENsaWVudEJpbmFyeVJlY2VpdmVyLmphdmEKcmVuYW1lIHRvIGNvbm5lY3RvcnMvd2Vic29ja2V0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvcnVudGltZS9XZWJTb2NrZXRDbGllbnRCaW5hcnlSZWNlaXZlci5qYXZhCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3J1bnRpbWUvV2ViU29ja2V0Q2xpZW50QmluYXJ5U2VuZGVyLmphdmEgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3J1bnRpbWUvV2ViU29ja2V0Q2xpZW50QmluYXJ5U2VuZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvcnVudGltZS9XZWJTb2NrZXRDbGllbnRCaW5hcnlTZW5kZXIuamF2YQpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9ydW50aW1lL1dlYlNvY2tldENsaWVudEJpbmFyeVNlbmRlci5qYXZhCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3J1bnRpbWUvV2ViU29ja2V0Q2xpZW50Q29ubmVjdG9yLmphdmEgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3J1bnRpbWUvV2ViU29ja2V0Q2xpZW50Q29ubmVjdG9yLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvcnVudGltZS9XZWJTb2NrZXRDbGllbnRDb25uZWN0b3IuamF2YQpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9ydW50aW1lL1dlYlNvY2tldENsaWVudENvbm5lY3Rvci5qYXZhCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3J1bnRpbWUvV2ViU29ja2V0Q2xpZW50UmVjZWl2ZXIuamF2YSBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvcnVudGltZS9XZWJTb2NrZXRDbGllbnRSZWNlaXZlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3J1bnRpbWUvV2ViU29ja2V0Q2xpZW50UmVjZWl2ZXIuamF2YQpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9ydW50aW1lL1dlYlNvY2tldENsaWVudFJlY2VpdmVyLmphdmEKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvcnVudGltZS9XZWJTb2NrZXRDbGllbnRTZW5kZXIuamF2YSBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvcnVudGltZS9XZWJTb2NrZXRDbGllbnRTZW5kZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9ydW50aW1lL1dlYlNvY2tldENsaWVudFNlbmRlci5qYXZhCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L3J1bnRpbWUvV2ViU29ja2V0Q2xpZW50U2VuZGVyLmphdmEKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd2Vic29ja2V0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9XZWJTb2NrZXRDbGllbnRDb25uZWN0VGVzdEhlbHBlci5qYXZhIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L1dlYlNvY2tldENsaWVudENvbm5lY3RUZXN0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4NzhmNwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9XZWJTb2NrZXRDbGllbnRDb25uZWN0VGVzdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC50ZXN0LmNvbm5lY3RvcnMud3NjbGllbnQuamF2YXgud2Vic29ja2V0OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud2Vic29ja2V0LkNsaWVudEVuZHBvaW50OworaW1wb3J0IGphdmF4LndlYnNvY2tldC5Db250YWluZXJQcm92aWRlcjsKK2ltcG9ydCBqYXZheC53ZWJzb2NrZXQuT25FcnJvcjsKK2ltcG9ydCBqYXZheC53ZWJzb2NrZXQuU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC53ZWJzb2NrZXQuV2ViU29ja2V0Q29udGFpbmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5jb21wb25lbnQuTGlmZUN5Y2xlOworCitAQ2xpZW50RW5kcG9pbnQgCitwdWJsaWMgY2xhc3MgV2ViU29ja2V0Q2xpZW50Q29ubmVjdFRlc3RIZWxwZXIgeworICAKKyAgQE9uRXJyb3IKKyAgcHVibGljIHZvaWQgb25FcnJvcihTZXNzaW9uIGNsaWVudCwgVGhyb3dhYmxlIHQpIHsKKyAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuYWJsZSB0byBjb25uZWN0IHRvIFdlYlNvY2tldCBzZXJ2ZXI6ICIrdC5nZXRNZXNzYWdlKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGNvbm5lY3RUb1NlcnZlcihQcm9wZXJ0aWVzIGNvbmZpZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVmVyaWZ5IHdlIGNhbiBjcmVhdGUgYSByZWFsIHdlYnNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIuCisgICAgLy8KKyAgICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIGluc3RlYWQgb2YgYSBzaW1wbGUgc29ja2V0IGNvbm5lY3QKKyAgICAvLyBiZWNhdXNlIGluIGF0IGxlYXN0IG9uZSBsb2NhdGlvbiwgdGhlIHdlYnNvY2tldCBjb25uZWN0L3VwZ3JhZGUKKyAgICAvLyBmYWlscyB3aXRoOiBleHBlY3RpbmcgMTAxIGdvdCA0MDMgKEZvcmJpZGRlbikuCisgICAgLy8gVGhlcmUncyBzb21ldGhpbmcgYWJvdXQgdGhhdCBsb2NhdGlvbiB0aGF0J3Mgbm90CisgICAgLy8gYWxsb3dpbmcgYSB3ZWJzb2NrZXQgdG8gYmUgY3JlYXRlZCB0byB0aGUgKHB1YmxpYykgc2VydmVyLgorICAgIC8vIEV2ZXJ5dGhpbmcgd29ya3MgZmluZSBmcm9tIG90aGVyIGxvY2F0aW9ucy4KKyAgICAvLworICAgIFN0cmluZyB3c1VyaSA9IGNvbmZpZy5nZXRQcm9wZXJ0eSgid3MudXJpIik7CisgICAgVVJJIHVyaSA9IG5ldyBVUkkod3NVcmkpOworICAgIFdlYlNvY2tldENvbnRhaW5lciBjb250YWluZXIgPSBDb250YWluZXJQcm92aWRlci5nZXRXZWJTb2NrZXRDb250YWluZXIoKTsKKyAgICB0cnkgeworICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gY29udGFpbmVyLmNvbm5lY3RUb1NlcnZlcihXZWJTb2NrZXRDbGllbnRDb25uZWN0VGVzdEhlbHBlci5jbGFzcywgIHVyaSk7CisgICAgICBzZXNzaW9uLmNsb3NlKCk7CisgICAgfQorICAgIGZpbmFsbHkgeworICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIExpZmVDeWNsZSkgeworICAgICAgICAoKExpZmVDeWNsZSljb250YWluZXIpLnN0b3AoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L1dlYlNvY2tldENsaWVudEdsb2JhbFRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9XZWJTb2NrZXRDbGllbnRHbG9iYWxUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L1dlYlNvY2tldENsaWVudEdsb2JhbFRlc3QuamF2YQpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L1dlYlNvY2tldENsaWVudEdsb2JhbFRlc3QuamF2YQppbmRleCA1YmJlZDc4Li45NjUxYjE5IDEwMDY0NAotLS0gYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvV2ViU29ja2V0Q2xpZW50R2xvYmFsVGVzdC5qYXZhCisrKyBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9XZWJTb2NrZXRDbGllbnRHbG9iYWxUZXN0LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIC8qKgogICogV2ViU29ja2V0Q2xpZW50IGNvbm5lY3RvciBnbG9iYWxpemF0aW9uIHRlc3RzLgogICovCisvL0BJZ25vcmUoIlRoZXJlIHNlZW0gdG8gYmUgaXNzdWVzIHdpdGggU1NMIHJlbGF0ZWQgdGVzdHMiKQogcHVibGljIGNsYXNzIFdlYlNvY2tldENsaWVudEdsb2JhbFRlc3QgZXh0ZW5kcyBXZWJTb2NrZXRDbGllbnRUZXN0IHsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZ2xvYmFsU3RyMSA9ICLkuIAiOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBnbG9iYWxTdHIyID0gIuS6jCI7CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvV2ViU29ja2V0Q2xpZW50VGVzdC5qYXZhIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L1dlYlNvY2tldENsaWVudFRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvV2ViU29ja2V0Q2xpZW50VGVzdC5qYXZhCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvV2ViU29ja2V0Q2xpZW50VGVzdC5qYXZhCmluZGV4IDBhODVjZmIuLmIyNTZiZmUgMTAwNjQ0Ci0tLSBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9XZWJTb2NrZXRDbGllbnRUZXN0LmphdmEKKysrIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L1dlYlNvY2tldENsaWVudFRlc3QuamF2YQpAQCAtMjAsMTMgKzIwLDEzIEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCi1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKQEAgLTQyLDExICs0MiwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5Lmpzb24uSnNvbkZ1bmN0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5wbHVtYmluZy5QbHVtYmluZ1N0cmVhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kudGVzdGVyLkNvbmRpdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKIAorLy9ASWdub3JlKCJUaGVyZSBzZWVtIHRvIGJlIGlzc3VlcyB3aXRoIFNTTCByZWxhdGVkIHRlc3RzIikKIHB1YmxpYyBjbGFzcyBXZWJTb2NrZXRDbGllbnRUZXN0IGV4dGVuZHMgQ29ubmVjdG9yVGVzdEJhc2UgewogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTRUNfVE1PID0gNTsKICAgICBXZWJTb2NrZXRTZXJ2ZXJFY2hvIHdzU2VydmVyOwpAQCAtMTQyLDcgKzE0NCw3IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgU3RyaW5nIGdldFN0b3JlUGF0aChTdHJpbmcgc3RvcmVMZWFmKSB7Ci0gICAgICAgIHJldHVybiBUZXN0UmVwb1BhdGguZ2V0UGF0aCgiY29ubmVjdG9ycyIsICJ3c2NsaWVudC1qYXZheC53ZWJzb2NrZXQiLCAic3JjIiwgInRlc3QiLCAia2V5c3RvcmVzIiwgc3RvcmVMZWFmKTsKKyAgICAgICAgcmV0dXJuIFRlc3RSZXBvUGF0aC5nZXRQYXRoKCJrZXlzdG9yZXMvIiArIHN0b3JlTGVhZik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTU5NSw5ICs1OTcsMTkgQEAKICAgICAgICAgcyA9IFBsdW1iaW5nU3RyZWFtcy5ibG9ja2luZ09uZVNob3REZWxheShzLCAyLCBUaW1lVW5pdC5TRUNPTkRTKTsKICAgICAgICAgd3NDbGllbnQuc2VuZFN0cmluZyhzKTsKICAgICAgICAgCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiByY3ZkID0gd3NDbGllbnQucmVjZWl2ZVN0cmluZygpOworICAgICAgICBUU3RyZWFtPFN0cmluZz4gcmN2ZCA9IHdzQ2xpZW50LnJlY2VpdmVTdHJpbmcoKTsgIC8vIHJjdiBub3RoaW5nCiAgICAgICAgIAotICAgICAgICBjb21wbGV0ZUFuZFZhbGlkYXRlKCIiLCB0LCByY3ZkLCBTRUNfVE1PLCBuZXcgU3RyaW5nWzBdKTsgIC8vcmN2IG5vdGhpbmcKKyAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHRoZXJlJ3Mgbm8gdXNlZnVsIGNvbmRpdGlvbiB0aGF0IHdlIGNhbiBjaGVjayBmb3IKKyAgICAgICAgLy8gdG8gdmFsaWRhdGUgdGhpcyBpcyBiZWhhdmluZyBwcm9wZXJseSBvdGhlciB0aGFuIHRoZSBjb25uZWN0b3IgZG9lc24ndAorICAgICAgICAvLyBibG93IHVwIGFuZCB0aGF0IG5vdGhpbmcgaXMgcmN2ZCwgc28ganVzdCB3YWl0IGEgc2hvcnQgdGltZQorICAgICAgICAvLyBiZWZvcmUgdmVyaWZ5aW5nIG5vdGhpbmcgd2FzIHJjdmQuCisgICAgICAgIC8vIERvbid0IHVzZSB0aGUgY29tcGxldGUoKSBUTU8gZm9yIHN1Y2Nlc3NmdWwgdGVybWluYXRpb24uCisgICAgICAgIAorICAgICAgICBDb25kaXRpb248TGlzdDxTdHJpbmc+PiByY3ZkQ29udGVudCA9IHQuZ2V0VGVzdGVyKCkuc3RyZWFtQ29udGVudHMocmN2ZCwgbmV3IFN0cmluZ1swXSk7CisgICAgICAgIENvbmRpdGlvbjxPYmplY3Q+IHRjID0gbmV3V2FpdFRpbWVDb25kaXRpb24oMyk7CisgICAgICAgIAorICAgICAgICBjb21wbGV0ZSh0LCB0YywgU0VDX1RNTywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGFzc2VydFRydWUoInJjdmQ6ICIrcmN2ZENvbnRlbnQuZ2V0UmVzdWx0KCksIHJjdmRDb250ZW50LnZhbGlkKCkpOwogICAgIH0KICAgICAKICAgICBAVGVzdApAQCAtNjc0LDkgKzY4NiwxOSBAQAogICAgICAgICBzID0gUGx1bWJpbmdTdHJlYW1zLmJsb2NraW5nT25lU2hvdERlbGF5KHMsIDIsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgICAgICB3c0NsaWVudC5zZW5kU3RyaW5nKHMpOwogICAgICAgICAKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IHJjdmQgPSB3c0NsaWVudC5yZWNlaXZlU3RyaW5nKCk7CisgICAgICAgIFRTdHJlYW08U3RyaW5nPiByY3ZkID0gd3NDbGllbnQucmVjZWl2ZVN0cmluZygpOyAgLy8gcmN2IG5vdGhpbmcKICAgICAgICAgCi0gICAgICAgIGNvbXBsZXRlQW5kVmFsaWRhdGUoIiIsIHQsIHJjdmQsIFNFQ19UTU8sIG5ldyBTdHJpbmdbMF0pOyAvLyByY3Ygbm90aGluZworICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhlcmUncyBubyB1c2VmdWwgY29uZGl0aW9uIHRoYXQgd2UgY2FuIGNoZWNrIGZvcgorICAgICAgICAvLyB0byB2YWxpZGF0ZSB0aGlzIGlzIGJlaGF2aW5nIHByb3Blcmx5IG90aGVyIHRoYW4gdGhlIGNvbm5lY3RvciBkb2Vzbid0CisgICAgICAgIC8vIGJsb3cgdXAgYW5kIHRoYXQgbm90aGluZyBpcyByY3ZkLCBzbyBqdXN0IHdhaXQgYSBzaG9ydCB0aW1lCisgICAgICAgIC8vIGJlZm9yZSB2ZXJpZnlpbmcgbm90aGluZyB3YXMgcmN2ZC4KKyAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSBjb21wbGV0ZSgpIFRNTyBmb3Igc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbi4KKyAgICAgICAgCisgICAgICAgIENvbmRpdGlvbjxMaXN0PFN0cmluZz4+IHJjdmRDb250ZW50ID0gdC5nZXRUZXN0ZXIoKS5zdHJlYW1Db250ZW50cyhyY3ZkLCBuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgQ29uZGl0aW9uPE9iamVjdD4gdGMgPSBuZXdXYWl0VGltZUNvbmRpdGlvbigzKTsKKyAgICAgICAgCisgICAgICAgIGNvbXBsZXRlKHQsIHRjLCBTRUNfVE1PLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmN2ZDogIityY3ZkQ29udGVudC5nZXRSZXN1bHQoKSwgcmN2ZENvbnRlbnQudmFsaWQoKSk7CiAgICAgfQogICAgIAogICAgIEBUZXN0CkBAIC03MzIsMjcgKzc1NCwzMSBAQAogICAgICAgICBzID0gUGx1bWJpbmdTdHJlYW1zLmJsb2NraW5nT25lU2hvdERlbGF5KHMsIDIsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgICAgICB3c0NsaWVudC5zZW5kU3RyaW5nKHMpOwogICAgICAgICAKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IHJjdmQgPSB3c0NsaWVudC5yZWNlaXZlU3RyaW5nKCk7CisgICAgICAgIFRTdHJlYW08U3RyaW5nPiByY3ZkID0gd3NDbGllbnQucmVjZWl2ZVN0cmluZygpOyAgLy8gcmN2IG5vdGhpbmcKICAgICAgICAgCi0gICAgICAgIGNvbXBsZXRlQW5kVmFsaWRhdGUoIiIsIHQsIHJjdmQsIFNFQ19UTU8sIG5ldyBTdHJpbmdbMF0pOyAgLy9yY3Ygbm90aGluZworICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhlcmUncyBubyB1c2VmdWwgY29uZGl0aW9uIHRoYXQgd2UgY2FuIGNoZWNrIGZvcgorICAgICAgICAvLyB0byB2YWxpZGF0ZSB0aGlzIGlzIGJlaGF2aW5nIHByb3Blcmx5IG90aGVyIHRoYW4gdGhlIGNvbm5lY3RvciBkb2Vzbid0CisgICAgICAgIC8vIGJsb3cgdXAgYW5kIHRoYXQgbm90aGluZyBpcyByY3ZkLCBzbyBqdXN0IHdhaXQgYSBzaG9ydCB0aW1lCisgICAgICAgIC8vIGJlZm9yZSB2ZXJpZnlpbmcgbm90aGluZyB3YXMgcmN2ZC4KKyAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSBjb21wbGV0ZSgpIFRNTyBmb3Igc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbi4KKyAgICAgICAgCisgICAgICAgIENvbmRpdGlvbjxMaXN0PFN0cmluZz4+IHJjdmRDb250ZW50ID0gdC5nZXRUZXN0ZXIoKS5zdHJlYW1Db250ZW50cyhyY3ZkLCBuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgQ29uZGl0aW9uPE9iamVjdD4gdGMgPSBuZXdXYWl0VGltZUNvbmRpdGlvbigzKTsKKyAgICAgICAgCisgICAgICAgIGNvbXBsZXRlKHQsIHRjLCBTRUNfVE1PLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmN2ZDogIityY3ZkQ29udGVudC5nZXRSZXN1bHQoKSwgcmN2ZENvbnRlbnQudmFsaWQoKSk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBza2lwVGVzdElmQ2FudENvbm5lY3QoUHJvcGVydGllcyBjb25maWcpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgd3NVcmkgPSBjb25maWcuZ2V0UHJvcGVydHkoIndzLnVyaSIpOwotICAgICAgICAvLyBTa2lwIHRlc3RzIGlmIHRoZSBXZWJTb2NrZXQgc2VydmVyIGNhbid0IGJlIGNvbnRhY3RlZC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSSSB1cmkgPSBuZXcgVVJJKHdzVXJpKTsKLSAgICAgICAgICAgIGludCBwb3J0ID0gdXJpLmdldFBvcnQoKTsKLSAgICAgICAgICAgIGlmIChwb3J0ID09IC0xKQotICAgICAgICAgICAgICAgIHBvcnQgPSB1cmkuZ2V0U2NoZW1lKCkuZXF1YWxzKCJ3cyIpID8gODAgOiA0NDM7Ci0gICAgICAgICAgICBTb2NrZXQgcyA9IG5ldyBTb2NrZXQoKTsKLSAgICAgICAgICAgIHMuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3ModXJpLmdldEhvc3QoKSwgcG9ydCksIDUqMTAwMC8qY24tdGltZW91dC1tc2VjKi8pOwotICAgICAgICAgICAgcy5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gY29ubmVjdCB0byBXZWJTb2NrZXQgc2VydmVyICIrd3NVcmkrIiA6ICIrZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGFzc3VtZVRydWUoZmFsc2UpOwotICAgICAgICB9CisgICAgICBTdHJpbmcgd3NVcmkgPSBjb25maWcuZ2V0UHJvcGVydHkoIndzLnVyaSIpOworICAgICAgdHJ5IHsKKyAgICAgICAgICBXZWJTb2NrZXRDbGllbnRDb25uZWN0VGVzdEhlbHBlci5jb25uZWN0VG9TZXJ2ZXIoY29uZmlnKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gY29ubmVjdCB0byBXZWJTb2NrZXQgc2VydmVyICIrd3NVcmkrIiA6ICIrZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJza2lwVGVzdElmQ2FudENvbm5lY3QoKTogU0tJUFBJTkcgVEVTVCIpOworICAgICAgICAgIGFzc3VtZVRydWUoZmFsc2UpOworICAgICAgfQogICAgIH0KICAgICAKICAgICBAVGVzdApAQCAtODQ2LDkgKzg3MiwxOSBAQAogICAgICAgICAgICAgcyA9IFBsdW1iaW5nU3RyZWFtcy5ibG9ja2luZ09uZVNob3REZWxheShzLCAyLCBUaW1lVW5pdC5TRUNPTkRTKTsKICAgICAgICAgICAgIHdzQ2xpZW50LnNlbmRTdHJpbmcocyk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIFRTdHJlYW08U3RyaW5nPiByY3ZkID0gd3NDbGllbnQucmVjZWl2ZVN0cmluZygpOworICAgICAgICAgICAgVFN0cmVhbTxTdHJpbmc+IHJjdmQgPSB3c0NsaWVudC5yZWNlaXZlU3RyaW5nKCk7ICAvLyByY3Ygbm90aGluZwogICAgICAgICAgICAgCi0gICAgICAgICAgICBjb21wbGV0ZUFuZFZhbGlkYXRlKCIiLCB0LCByY3ZkLCBTRUNfVE1PLCBuZXcgU3RyaW5nWzBdKTsgIC8vcmN2IG5vdGhpbmcKKyAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSB0aGVyZSdzIG5vIHVzZWZ1bCBjb25kaXRpb24gdGhhdCB3ZSBjYW4gY2hlY2sgZm9yCisgICAgICAgICAgICAvLyB0byB2YWxpZGF0ZSB0aGlzIGlzIGJlaGF2aW5nIHByb3Blcmx5IG90aGVyIHRoYW4gdGhlIGNvbm5lY3RvciBkb2Vzbid0CisgICAgICAgICAgICAvLyBibG93IHVwIGFuZCB0aGF0IG5vdGhpbmcgaXMgcmN2ZCwgc28ganVzdCB3YWl0IGEgc2hvcnQgdGltZQorICAgICAgICAgICAgLy8gYmVmb3JlIHZlcmlmeWluZyBub3RoaW5nIHdhcyByY3ZkLgorICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSBjb21wbGV0ZSgpIFRNTyBmb3Igc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbi4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ29uZGl0aW9uPExpc3Q8U3RyaW5nPj4gcmN2ZENvbnRlbnQgPSB0LmdldFRlc3RlcigpLnN0cmVhbUNvbnRlbnRzKHJjdmQsIG5ldyBTdHJpbmdbMF0pOworICAgICAgICAgICAgQ29uZGl0aW9uPE9iamVjdD4gdGMgPSBuZXdXYWl0VGltZUNvbmRpdGlvbigzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29tcGxldGUodCwgdGMsIFNFQ19UTU8sIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgicmN2ZDogIityY3ZkQ29udGVudC5nZXRSZXN1bHQoKSwgcmN2ZENvbnRlbnQudmFsaWQoKSk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICBzc2xQcm9wcy5yZXN0b3JlKCk7CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvV2ViU29ja2V0U2VydmVyRWNoby5qYXZhIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L1dlYlNvY2tldFNlcnZlckVjaG8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvV2ViU29ja2V0U2VydmVyRWNoby5qYXZhCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29ubmVjdG9ycy93c2NsaWVudC9qYXZheC93ZWJzb2NrZXQvV2ViU29ja2V0U2VydmVyRWNoby5qYXZhCmluZGV4IGQ2YzliZGUuLjllMDY1MWUgMTAwNjQ0Ci0tLSBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25uZWN0b3JzL3dzY2xpZW50L2phdmF4L3dlYnNvY2tldC9XZWJTb2NrZXRTZXJ2ZXJFY2hvLmphdmEKKysrIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Nvbm5lY3RvcnMvd3NjbGllbnQvamF2YXgvd2Vic29ja2V0L1dlYlNvY2tldFNlcnZlckVjaG8uamF2YQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgU3RyaW5nIGdldFN0b3JlUGF0aChTdHJpbmcgc3RvcmVMZWFmKSB7Ci0gICAgICAgIHJldHVybiBUZXN0UmVwb1BhdGguZ2V0UGF0aCgiY29ubmVjdG9ycyIsICJ3c2NsaWVudC1qYXZheC53ZWJzb2NrZXQiLCAic3JjIiwgInRlc3QiLCAia2V5c3RvcmVzIiwgc3RvcmVMZWFmKTsKKyAgICAgICAgcmV0dXJuIFRlc3RSZXBvUGF0aC5nZXRQYXRoKCJrZXlzdG9yZXMvIiArIHN0b3JlTGVhZik7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy90ZXN0L2tleXN0b3Jlcy9SRUFETUUgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL1JFQURNRQpzaW1pbGFyaXR5IGluZGV4IDc5JQpyZW5hbWUgZnJvbSBjb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvdGVzdC9rZXlzdG9yZXMvUkVBRE1FCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL1JFQURNRQppbmRleCA0NDE5YzIzLi40NjZkNDBmIDEwMDY0NAotLS0gYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvdGVzdC9rZXlzdG9yZXMvUkVBRE1FCisrKyBiL2Nvbm5lY3RvcnMvd2Vic29ja2V0L3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZXMvUkVBRE1FCkBAIC0xLDUgKzEsMjIgQEAKICMhL2Jpbi9zaAogCisjCisjICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKICMgVGhlIHRlc3QncyBrZXkgYW5kIHRydXN0IHN0b3JlcyBhcmUgY3JlYXRlZCBhcyBmb2xsb3dzLgogIyBUaGV5IGhhdmUgdGhlIHBhc3N3b3JkICJwYXNzdzByZCIuCiAKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy90ZXN0L2tleXN0b3Jlcy9jbGllbnRLZXlTdG9yZS5qa3MgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NsaWVudEtleVN0b3JlLmprcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NsaWVudEtleVN0b3JlLmprcwpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jbGllbnRLZXlTdG9yZS5qa3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NsaWVudFRydXN0U3RvcmUuamtzIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9jbGllbnRUcnVzdFN0b3JlLmprcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL3Rlc3Qva2V5c3RvcmVzL2NsaWVudFRydXN0U3RvcmUuamtzCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2NsaWVudFRydXN0U3RvcmUuamtzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L3NyYy90ZXN0L2tleXN0b3Jlcy9zZXJ2ZXJLZXlTdG9yZS5qa3MgYi9jb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL3NlcnZlcktleVN0b3JlLmprcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL3Rlc3Qva2V5c3RvcmVzL3NlcnZlcktleVN0b3JlLmprcwpyZW5hbWUgdG8gY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9zZXJ2ZXJLZXlTdG9yZS5qa3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL3Rlc3Qva2V5c3RvcmVzL3NlcnZlclRydXN0U3RvcmUuamtzIGIvY29ubmVjdG9ycy93ZWJzb2NrZXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2tleXN0b3Jlcy9zZXJ2ZXJUcnVzdFN0b3JlLmprcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29ubmVjdG9ycy93c2NsaWVudC1qYXZheC53ZWJzb2NrZXQvc3JjL3Rlc3Qva2V5c3RvcmVzL3NlcnZlclRydXN0U3RvcmUuamtzCnJlbmFtZSB0byBjb25uZWN0b3JzL3dlYnNvY2tldC9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL3NlcnZlclRydXN0U3RvcmUuamtzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L2J1aWxkLmdyYWRsZSBiL2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjODRkYy4uMDAwMDAwMAotLS0gYS9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOmNvbW1vbicKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmNvbm5lY3RvcnM6d3NjbGllbnQnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOmVkZ2VudC5qYXZheC53ZWJzb2NrZXQnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICd0ZXN0Q29tcGlsZScsICc6Y29ubmVjdG9yczpqYXZheC53ZWJzb2NrZXQtY2xpZW50JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOmNvbm5lY3RvcnM6amF2YXgud2Vic29ja2V0LXNlcnZlcicKLSAgCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JywgJzpjb25uZWN0b3JzOmNvbW1vbicKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvd3NjbGllbnQvYnVpbGQuZ3JhZGxlIGIvY29ubmVjdG9ycy93c2NsaWVudC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODZkMjYuLjAwMDAwMDAKLS0tIGEvY29ubmVjdG9ycy93c2NsaWVudC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0gIAotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAndGVzdENvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JywgJzpwcm92aWRlcnM6ZGlyZWN0JwpkaWZmIC0tZ2l0IGEvY29uc29sZS8uY2xhc3NwYXRoIGIvY29uc29sZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmE1YTljLi4wMDAwMDAwCi0tLSBhL2NvbnNvbGUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZlci9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmVyL3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzZXJ2bGV0cy9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2NvbnNvbGUvc2VydmVyL2V4dC9qZXR0eS1odHRwLTkuMy42LnYyMDE1MTEwNi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29uc29sZS9zZXJ2ZXIvZXh0L2pldHR5LWlvLTkuMy42LnYyMDE1MTEwNi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29uc29sZS9zZXJ2ZXIvZXh0L2pldHR5LXNlY3VyaXR5LTkuMy42LnYyMDE1MTEwNi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29uc29sZS9zZXJ2ZXIvZXh0L2pldHR5LXNlcnZlci05LjMuNi52MjAxNTExMDYuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2NvbnNvbGUvc2VydmVyL2V4dC9qZXR0eS1zZXJ2bGV0LTkuMy42LnYyMDE1MTEwNi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29uc29sZS9zZXJ2ZXIvZXh0L2pldHR5LXV0aWwtOS4zLjYudjIwMTUxMTA2LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25zb2xlL3NlcnZlci9leHQvamV0dHktd2ViYXBwLTkuMy42LnYyMDE1MTEwNi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29uc29sZS9zZXJ2ZXIvZXh0L2pldHR5LXhtbC05LjMuNi52MjAxNTExMDYuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2NvbnNvbGUvc2VydmVyL2V4dC9qYXZheC5zZXJ2bGV0LWFwaS0zLjEuMC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuSlVOSVRfQ09OVEFJTkVSLzQiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvZXh0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL3V0aWxzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvbnNvbGUvLmdpdGlnbm9yZSBiL2NvbnNvbGUvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4ZmU0NC4uMDAwMDAwMAotLS0gYS9jb25zb2xlLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS9jbGFzc2VzLwotKiovdGVzdC5jbGFzc2VzLwotKiovY2xhc3Nlcy8KLSoqL3VuaXR0ZXN0cy8KLS9iaW4vCmRpZmYgLS1naXQgYS9jb25zb2xlLy5wcm9qZWN0IGIvY29uc29sZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkZjQ1ZC4uMDAwMDAwMAotLS0gYS9jb25zb2xlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29uc29sZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb25zb2xlL3BvbS54bWwgYi9jb25zb2xlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1NmZiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUvcG9tLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29uc29sZTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25zb2xlPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+c2VydmVyPC9tb2R1bGU+CisgICAgPG1vZHVsZT5zZXJ2bGV0czwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmVyL2J1aWxkLmdyYWRsZSBiL2NvbnNvbGUvc2VydmVyL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlYmMxNC4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZlci9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ29yZy5lY2xpcHNlLmpldHR5OmpldHR5LWh0dHA6OS4zLjYudjIwMTUxMTA2JwotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdvcmcuZWNsaXBzZS5qZXR0eTpqZXR0eS1pbzo5LjMuNi52MjAxNTExMDYnCi0gIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ29yZy5lY2xpcHNlLmpldHR5OmpldHR5LXNlY3VyaXR5OjkuMy42LnYyMDE1MTEwNicKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnb3JnLmVjbGlwc2UuamV0dHk6amV0dHktc2VydmVyOjkuMy42LnYyMDE1MTEwNicKLSAgYWRkUHJvamVjdEV4dERlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnb3JnLmVjbGlwc2UuamV0dHk6amV0dHktc2VydmxldDo5LjMuNi52MjAxNTExMDYnCi0gIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ29yZy5lY2xpcHNlLmpldHR5OmpldHR5LXV0aWw6OS4zLjYudjIwMTUxMTA2JwotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdvcmcuZWNsaXBzZS5qZXR0eTpqZXR0eS13ZWJhcHA6OS4zLjYudjIwMTUxMTA2JwotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICdvcmcuZWNsaXBzZS5qZXR0eTpqZXR0eS14bWw6OS4zLjYudjIwMTUxMTA2JwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotICAKLSAgLy8gVE9ETyBydW50aW1lIGRlcGVuZHNPbiAiOmNvbnNvbGU6c2VydmxldHMiICA/Pz8gIAotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19CmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZlci9wb20ueG1sIGIvY29uc29sZS9zZXJ2ZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzU1MjY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS9zZXJ2ZXIvcG9tLnhtbApAQCAtMCwwICsxLDE1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbnNvbGU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25zb2xlLXNlcnZlcjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBDb25zb2xlOiBTZXJ2ZXI8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD4ke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fS88L3RhcmdldFBhdGg+CisgICAgICA8L3Jlc291cmNlPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8IS0tICBidW5kbGUgdGhlIGxpY2Vuc2VzIG9mIHRoZSBhcnRpZmFjdHMgd2UgYXJlIGJ1bmRsaW5nIC0tPgorICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS8uLi8uLi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPHRhcmdldFBhdGg+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vTUVUQS1JTkYvbGljZW5zZXM8L3RhcmdldFBhdGg+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDxwbHVnaW5zPgorICAgICAgPCEtLQorICAgICAgICBDb3B5IHRoZSBzZXJ2bGV0cy53YXIgaW50byB0aGUgYnVpbGQgb3V0cHV0IHNvIGl0IGlzIGVtYmVkZGVkIGFzCisgICAgICAgIHJlc291cmNlIGludG8gdGhlIGphci4KKyAgICAgIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1yZXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgPCEtLSAgQnVuZGxlIHRoZXNlIGRlcGVuZGVuY2llcyBpbiB0aGUgamFyLgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IG1haW50YWluIHRoZSBjb3JyZXNwb25kaW5nIGluZm8gaWYgeW91CisgICAgICAgICAgICAgICAgICBhZGQvcmVtb3ZlIGFydGlmYWN0cyBvciBjaGFuZ2UgdGhlaXIgdmVyc2lvbnM6CisgICAgICAgICAgICAgICAgICAgIC0gZW50cnkgaW4gc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UKKyAgICAgICAgICAgICAgICAgICAgLSBlbnRyeSBpbiBzcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFIHdoZW4gYXBwcm9wcmlhdGUgICAgICAgICAgICAgICAgICAgIAorIAorICAgICAgICAgICAgICAgICAgU2VlIGNvbnNvbGUvc2VydmxldHMgYW5kIGl0cyBwb20sTElDRU5TRSxOT1RJQ0UuCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IG1haW50YWluIHRoZSBpbmZvIGluIHRoaXMgcHJvamVjdCdzCisgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHBsYXRmb3Jtcy9qYXZhNyBmaWxlcy4KKyAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29uc29sZS1zZXJ2bGV0czwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vcmVzb3VyY2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZGVzdEZpbGVOYW1lPnNlcnZsZXRzLndhcjwvZGVzdEZpbGVOYW1lPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHktaW88L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VjdXJpdHk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHktdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHkteG1sPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjcuMTI8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLQorICAgICAgICBUaGlzIGFydGlmYWN0IGlzIG5lZWRlZCBieSB0aGUgbWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW4KKyAgICAgICAgYnkgbWFya2luZyB0aGlzIGRlcGVuZGVuY3kgb3B0aW9uYWwsIGl0IGlzIG5vdCBpbmNsdWRlZAorICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIGFydGlmYWN0LCBidXQgTWF2ZW4gZW5zdXJlcyBpdCBpcyBidWlsdAorICAgICAgICBwcmlvciB0byB0aGlzIG1vZHVsZS4KKyAgICAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbnNvbGUtc2VydmxldHM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2NvbnNvbGUvc2VydmVyL0h0dHBTZXJ2ZXIuamF2YSBiL2NvbnNvbGUvc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2ZXIvSHR0cFNlcnZlci5qYXZhCmluZGV4IDU4NDRhZWIuLjMwMjIwMGQgMTAwNjQ0Ci0tLSBhL2NvbnNvbGUvc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2ZXIvSHR0cFNlcnZlci5qYXZhCisrKyBiL2NvbnNvbGUvc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2ZXIvSHR0cFNlcnZlci5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2ZXI7CiAKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW47Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuSGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuU2VydmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5TZXJ2ZXJDb25uZWN0b3I7CkBAIC0yOSw2ICsyNyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5TZXJ2bGV0Q29udGV4dEhhbmRsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkud2ViYXBwLldlYkFwcENvbnRleHQ7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKIHB1YmxpYyBjbGFzcyBIdHRwU2VydmVyIHsKIAogCS8qKgpAQCAtNDYsOCArNDYsNiBAQAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWJBcHBDb250ZXh0IFdFQkFQUCA9IG5ldyBXZWJBcHBDb250ZXh0KCk7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEh0dHBTZXJ2ZXIgSU5TVEFOQ0UgPSBuZXcgSHR0cFNlcnZlcigpOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIElOSVRJQUxJWkVEID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb25zb2xlV2FyTm90Rm91bmRNZXNzYWdlID0gIAotICAgIAkJCSJjb25zb2xlLndhciBub3QgZm91bmQuICBSdW4gJ2FudCcgZnJvbSB0aGUgdG9wIGxldmVsIGVkZ2VudCBkaXJlY3RvcnksIG9yICdhbnQnIGZyb20gJ2NvbnNvbGUvc2VydmxldHMnIHRvIGNyZWF0ZSBjb25zb2xlLndhciB1bmRlciB0aGUgd2ViYXBwcyBkaXJlY3RvcnkuIjsKICAgICB9CiAKICAgICAvKioKQEAgLTcxLDI0ICs2OSwxNCBAQAogICAgICAgICAgICAgU2VydmxldENvbnRleHRIYW5kbGVyIGNvbnRleHRNZXRyaWNzID0gbmV3IFNlcnZsZXRDb250ZXh0SGFuZGxlcihTZXJ2bGV0Q29udGV4dEhhbmRsZXIuU0VTU0lPTlMpOwogICAgICAgICAgICAgY29udGV4dE1ldHJpY3Muc2V0Q29udGV4dFBhdGgoIi9tZXRyaWNzIik7CiAgICAgICAgICAgICBTZXJ2ZXJVdGlsIHNVdGlsID0gbmV3IFNlcnZlclV0aWwoKTsKLSAgICAgICAgICAgIFN0cmluZyBjb21tYW5kV2FyRmlsZVBhdGggPSBzVXRpbC5nZXRBYnNvbHV0ZVdhckZpbGVQYXRoKCJjb25zb2xlLndhciIpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmRXYXJGaWxlUGF0aC5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIAkvLyBjaGVjayBpZiB3ZSBhcmUgb24gRWNsaXBzZSwgaWYgRWNsaXBzZSBjYW4ndCBmaW5kIGl0LCBpdCBwcm9iYWJseSBkb2VzIG5vdCBleGlzdAotICAgICAgICAgICAgCS8vIHJ1bm5pbmcgb24gRWNsaXBzZSwgbG9vayBmb3IgdGhlIGVjbGlwc2Ugd2FyIGZpbGUgcGF0aAotICAgICAgICAgICAgCVByb3RlY3Rpb25Eb21haW4gcHJvdGVjdGlvbkRvbWFpbiA9IEh0dHBTZXJ2ZXIuY2xhc3MuZ2V0UHJvdGVjdGlvbkRvbWFpbigpOwotICAgICAgICAgICAgCVN0cmluZyBlY2xpcHNlV2FyRmlsZVBhdGggPSBzVXRpbC5nZXRFY2xpcHNlV2FyRmlsZVBhdGgocHJvdGVjdGlvbkRvbWFpbiwgImNvbnNvbGUud2FyIik7Ci0gICAgICAgICAgICAJaWYgKCFlY2xpcHNlV2FyRmlsZVBhdGguZXF1YWxzKCIiKSkgeyAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAkJSHR0cFNlcnZlckhvbGRlci5XRUJBUFAuc2V0V2FyKGVjbGlwc2VXYXJGaWxlUGF0aCk7Ci0gICAgICAgICAgICAJfSBlbHNlIHsKLSAgICAgICAgICAgIAkJdGhyb3cgbmV3IEV4Y2VwdGlvbihIdHRwU2VydmVySG9sZGVyLmNvbnNvbGVXYXJOb3RGb3VuZE1lc3NhZ2UpOwotICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIEZpbGUgc2VydmxldHNKYXJGaWxlID0gc1V0aWwuZ2V0V2FyRmlsZVBhdGgoKTsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0c0phckZpbGUuZXhpc3RzKCkpeworICAgICAgICAgICAgCUh0dHBTZXJ2ZXJIb2xkZXIuV0VCQVBQLnNldFdhcihzZXJ2bGV0c0phckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIAlIdHRwU2VydmVySG9sZGVyLldFQkFQUC5zZXRXYXIoY29tbWFuZFdhckZpbGVQYXRoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgV0FSIGFyY2hpdmUgaW4gIiArIHNlcnZsZXRzSmFyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICB9CiAKLQotICAgICAgICAgICAgCi0gICAgICAgICAgICBIdHRwU2VydmVySG9sZGVyLldFQkFQUC5hZGRBbGlhc0NoZWNrKG5ldyBBbGxvd1N5bUxpbmtBbGlhc0NoZWNrZXIoKSk7IAorICAgICAgICAgICAgSHR0cFNlcnZlckhvbGRlci5XRUJBUFAuYWRkQWxpYXNDaGVjayhuZXcgQWxsb3dTeW1MaW5rQWxpYXNDaGVja2VyKCkpOwogICAgICAgICAgICAgQ29udGV4dEhhbmRsZXJDb2xsZWN0aW9uIGNvbnRleHRzID0gbmV3IENvbnRleHRIYW5kbGVyQ29sbGVjdGlvbigpOwogICAgICAgICAgICAgY29udGV4dHMuc2V0SGFuZGxlcnMobmV3IEhhbmRsZXJbXSB7IGNvbnRleHRKb2JzLCBjb250ZXh0TWV0cmljcywgSHR0cFNlcnZlckhvbGRlci5XRUJBUFAgfSk7CiAgICAgICAgICAgICBIdHRwU2VydmVySG9sZGVyLkpFVFRZU0VSVkVSLnNldEhhbmRsZXIoY29udGV4dHMpOwpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25zb2xlL3NlcnZlci9TZXJ2ZXJVdGlsLmphdmEgYi9jb25zb2xlL3NlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2NvbnNvbGUvc2VydmVyL1NlcnZlclV0aWwuamF2YQppbmRleCA1MDAyZDVkLi5mOGM2ZmRlIDEwMDY0NAotLS0gYS9jb25zb2xlL3NlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2NvbnNvbGUvc2VydmVyL1NlcnZlclV0aWwuamF2YQorKysgYi9jb25zb2xlL3NlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2NvbnNvbGUvc2VydmVyL1NlcnZlclV0aWwuamF2YQpAQCAtMTksMTcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5jb25zb2xlLnNlcnZlcjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0UmVzdWx0OwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKLWltcG9ydCBqYXZhLm5pby5maWxlLlNpbXBsZUZpbGVWaXNpdG9yOwotaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS5pby4qOwogCiBwdWJsaWMgY2xhc3MgU2VydmVyVXRpbCB7CiAKQEAgLTM3LDkwICsyNyw1OCBAQAogCSAqICBUaGUgcHVibGljIGNvbnN0cnVjdG9yIG9mIHRoaXMgdXRpbGl0eSBjbGFzcyBmb3IgdXNlIGJ5IHRoZSBIdHRwU2VydmVyIGNsYXNzLgogCSAqLwogICAgIHB1YmxpYyBTZXJ2ZXJVdGlsKCkgewotCi0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIGphciBmaWxlIGZvciB0aGlzIHBhY2thZ2UKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgamFyIGZpbGUgb2YgdGhpcyBwYWNrYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0UHJvdGVjdGlvbkRvbWFpbigpLmdldENvZGVTb3VyY2UoKS5nZXRMb2NhdGlvbigpLmdldFBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwYXJlbnQncyBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBqYXIgZmlsZS4KLSAgICAgKiBAcmV0dXJuIGEgRmlsZSBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2V0VG9wRGlyRmlsZVBhdGgoKSB7Ci0gICAgICAgIFN0cmluZyB0b3BEaXJQcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KCJlZGdlbnQudGVzdC50b3AuZGlyLmZpbGUucGF0aCIpOwotICAgICAgICBpZiAodG9wRGlyUHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHRvcERpclByb3ApOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGdldFBhdGgoKSk7Ci0gICAgICAgIHJldHVybiBqYXJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgIndlYmFwcHMiIGRpcmVjdG9yeQogICAgICAqIEByZXR1cm4gYSBGaWxlIG9iamVjdCBvciBudWxsIGlmIHRoZSAid2ViYXBwcyIgZGlyZWN0b3J5IGlzIG5vdCBmb3VuZAogICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBnZXRXYXJGaWxlUGF0aCgpIHsKLSAgICAgICAgTGlzdDxGaWxlPiBmb3VuZEZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlcy53YWxrRmlsZVRyZWUoZ2V0VG9wRGlyRmlsZVBhdGgoKS50b1BhdGgoKSwgbmV3IFNpbXBsZUZpbGVWaXNpdG9yPFBhdGg+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgcHJlVmlzaXREaXJlY3RvcnkoUGF0aCBkaXIsIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXIuZW5kc1dpdGgoIndlYmFwcHMiKSkgewotICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRmlsZXMuYWRkKGRpci50b0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKyAgICBwdWJsaWMgRmlsZSBnZXRXYXJGaWxlUGF0aCgpIHsKKyAgICAgICAgRmlsZSB3YXIgPSBuZXcgRmlsZSgidGFyZ2V0L3dhci1yZXNvdXJjZXMvc2VydmxldHMud2FyIik7CisgICAgICAgIGlmKCF3YXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIC8vIEV2ZW50dWFsbHkgY3JlYXRlIHRoZSBkaXJlY3RvcnkgZm9yIHNlcnZpbmcgdGhlIHdhci4KKyAgICAgICAgICAgIGlmKCF3YXIuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgaWYoIXdhci5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBhdCAiICsgd2FyLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgIC8vIGVuZCBvZiBmaWxlIHNlYXJjaGluZworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEdW1wIHRoZSBzZXJ2bGV0LndhciBpbnRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IFNlcnZlclV0aWwuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL3Jlc291cmNlcy9zZXJ2bGV0cy53YXIiKTsKKyAgICAgICAgICAgICAgICBpZihzdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCByZXNvdXJjZSAnL3Jlc291cmNlcy9zZXJ2bGV0cy53YXInIGZyb20gY2xhc3NwYXRoLiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCByZWFkQnl0ZXM7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICAgICAgICAgIGZpbGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh3YXIpOworICAgICAgICAgICAgICAgIHdoaWxlICgocmVhZEJ5dGVzID0gc3RyZWFtLnJlYWQoYnVmZmVyKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVPdXRwdXRTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCByZWFkQnl0ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGR1bXAgcmVzb3VyY2UgJ3Jlc291cmNlcy9zZXJ2bGV0cy53YXInIGZyb20gY2xhc3NwYXRoLiIsIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZihzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZS4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihmaWxlT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChmb3VuZEZpbGVzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZm91bmRGaWxlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvb2tzIGZvciB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoIG9mIHRoZSBuYW1lIG9mIHRoZSB3YXJGaWxlTmFtZSBhcmd1bWVudAotICAgICAqIEBwYXJhbSB3YXJGaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgd2FyIGZpbGUgdG8gZmluZCB0aGUgYWJzb2x1dGUgcGF0aCB0bwotICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHdhckZpbGVOYW1lIGFyZ3VtZW50IGFzIGEgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVdhckZpbGVQYXRoKFN0cmluZyB3YXJGaWxlTmFtZSkgewotICAgICAgICBGaWxlIHdhckZpbGVQYXRoID0gZ2V0V2FyRmlsZVBhdGgoKTsKLSAgICAgICAgaWYgKHdhckZpbGVQYXRoICE9IG51bGwpIHsKLSAgICAgICAgCUZpbGUgd2FyRmlsZSA9IG5ldyBGaWxlKHdhckZpbGVQYXRoLmdldEFic29sdXRlUGF0aCgpICsgIi8iICsgd2FyRmlsZU5hbWUpOwotICAgICAgICAJaWYgKHdhckZpbGUuZXhpc3RzKCkpIHsgICAgICAgIAkKLSAgICAgICAgCQlyZXR1cm4gd2FyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgIAkJcmV0dXJuICIiOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvb2tzIGZvciB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoIG9mIHRoZSBuYW1lIG9mIHRoZSB3YXJGaWxlTmFtZSBhcmd1bWVudCB3aGVuIHJ1bm5pbmcgZnJvbSBFY2xpcHNlCi0gICAgICogQHBhcmFtIHBEb21haW4gdGhlIFByb3RlY3Rpb25Eb21haW4gdG8gdXNlIHRvIGdldCB0aGUgc291cmNlJ3MgbG9jYXRpb24KLSAgICAgKiBAcGFyYW0gd2FyRmlsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHdhciBmaWxlIHRvIGZpbmQgdGhlIGFic29sdXRlIHBhdGggdG8KLSAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB3YXJGaWxlTmFtZSBhcmd1bWVudCBhcyBhIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWNsaXBzZVdhckZpbGVQYXRoKFByb3RlY3Rpb25Eb21haW4gcERvbWFpbiwgU3RyaW5nIHdhckZpbGVOYW1lKSB7Ci0gICAgICAgIFVSTCBsb2NhdGlvbiA9IHBEb21haW4uZ2V0Q29kZVNvdXJjZSgpLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIEZpbGUgdG9wRWRnZW50ID0gbmV3IEZpbGUobG9jYXRpb24uZ2V0UGF0aCgpKS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBGaWxlIHdhckZpbGUgPSBuZXcgRmlsZSh0b3BFZGdlbnQsICIuL3RhcmdldC9qYXZhOC9jb25zb2xlL3dlYmFwcHMvIiArd2FyRmlsZU5hbWUpOwotICAgICAgICBpZiAod2FyRmlsZS5leGlzdHMoKSkgewotICAgICAgICAJcmV0dXJuIHdhckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlyZXR1cm4gIiI7Ci0gICAgICAgIH0KLQkKKworICAgICAgICByZXR1cm4gd2FyOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2ZXIvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFIGIvY29uc29sZS9zZXJ2ZXIvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMGUxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlL3NlcnZlci9zcmMvbWFpbi9yZW1vdGUtcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UKQEAgLTAsMCArMSw0MiBAQAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBUEFDSEUgRURHRU5UIFNVQkNPTVBPTkVOVFM6CisKK1RoaXMgYmluYXJ5IGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aCBzZXBhcmF0ZQorY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuICBZb3VyIHVzZSBvZiB0aGlzIGJpbmFyeQoraXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTGljZW5zZTogQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAKK0ZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvYXBhY2hlLWxpY2Vuc2UtdmVyc2lvbi0yLjAudHh0CisKK2dzb24gKGNvbS5nb29nbGUuY29kZS5nc29uOmdzb246Mi4yLjQpCittZXRyaWNzLWNvcmUgKGlvLmRyb3B3aXphcmQubWV0cmljczptZXRyaWNzLWNvcmU6My4xLjIpCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xpY2Vuc2U6IE1JVAorCitqcXVlcnkgKG9yZy53ZWJqYXJzOmpxdWVyeToxLjExLjIpCisgICAgRm9yIGRldGFpbHMsIHNlZSBNRVRBLUlORi9saWNlbnNlcy9qcXVlcnktMV8xMV8yLU1JVC50eHQuCisKK2pxdWVyeS11aSAob3JnLndlYmphcnM6anF1ZXJ5LXVpOjEuMTEuNCkKKyAgICBGb3IgZGV0YWlscywgc2VlIE1FVEEtSU5GL2xpY2Vuc2VzL2pxdWVyeS11aS0xXzExXzQtTUlULnR4dC4KKworZDMubGVnZW5kLmpzIChpbmNsdWRlZCBpbnNpZGUgdGhlIHJlc291cmNlcy9zZXJ2bGV0cy53YXIhL2pzL2V4dC9kMy5sZWdlbmQvZDMubGVnZW5kLmpzKQorICAgIGh0dHBzOi8vZ2lzdC5naXRodWJ1c2VyY29udGVudC5jb20vWkpPTlNTT04vMzkxODM2OS9yYXcvYmY5YmNlNmI2OGEzYjcwZjg3NDUwZjE1NTQzNmNhNGE4NGFmMWJhNC9kMy5sZWdlbmQuanMKKyAgICBXaXRoIEVkZ2VudCBzcGVjaWZpYyBtb2RpZmljYXRpb25zLgorICAgIEZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvZDMubGVnZW5kLU1JVC50eHQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xpY2Vuc2U6IEJTRCAzLUNsYXVzZQorCitkMyAob3JnLndlYmphcnMuYm93ZXI6ZDM6My4zLjkpCisgICAgRm9yIGRldGFpbHMsIHNlZSBNRVRBLUlORi9saWNlbnNlcy9kMy0zXzNfOS1CU0QudHh0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMaWNlbnNlOiBCU0QgMi1DbGF1c2UKKworZDMtcGx1Z2lucy1zYW5rZXkgKG9yZy53ZWJqYXJzLmJvd2VyOmQzLXBsdWdpbnMtc2Fua2V5OjEuMS4wKQorICAgIEZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvZDMtcGx1Z2lucy1zYW5rZXktMV8xXzAtQlNELnR4dC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2ZXIvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UgYi9jb25zb2xlL3NlcnZlci9zcmMvbWFpbi9yZW1vdGUtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzllN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS9zZXJ2ZXIvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKQEAgLTAsMCArMSwyOCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZGV2ZWxvcGVkIGJ5IElCTSBDb3JwLgorQ29weXJpZ2h0IElCTSBDb3JwLiAyMDE1LCAyMDE2CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQVBBQ0hFIEVER0VOVCBTVUJDT01QT05FTlRTOgorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoIHNlcGFyYXRlCitjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gIFRoZSBmb2xsb3dpbmcgbm90aWNlcyBhcHBseS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWV0cmljcy1jb3JlIChpby5kcm9wd2l6YXJkLm1ldHJpY3M6bWV0cmljcy1jb3JlOjMuMS4yKQorCitNZXRyaWNzCitDb3B5cmlnaHQgMjAxMC0yMDEzIENvZGEgSGFsZSBhbmQgWWFtbWVyLCBJbmMuCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29kYSBIYWxlIGFuZCBZYW1tZXIsIEluYy4KKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBKU1ItMTY2IHByb2plY3QgKFRocmVhZExvY2FsUmFuZG9tLAorU3RyaXBlZDY0LCBMb25nQWRkZXIpIHdpdGggdGhlIGZvbGxvd2luZyBjb21tZW50czoKKworICAgICAgICAgIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICAgICAgICAgIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICAgICAgICAgIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2NvbnNvbGUvc2VydmVyL0h0dHBTZXJ2ZXJUZXN0LmphdmEgYi9jb25zb2xlL3NlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29uc29sZS9zZXJ2ZXIvSHR0cFNlcnZlclRlc3QuamF2YQppbmRleCAzZWNjNTEwLi40NmJkNTExIDEwMDY0NAotLS0gYS9jb25zb2xlL3NlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29uc29sZS9zZXJ2ZXIvSHR0cFNlcnZlclRlc3QuamF2YQorKysgYi9jb25zb2xlL3NlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29uc29sZS9zZXJ2ZXIvSHR0cFNlcnZlclRlc3QuamF2YQpAQCAtNDYsNyArNDYsNyBAQAogICAgICAgICAJCWFzc2VydEVxdWFscygiIiwgIiIpOwogICAgICAgICAJfQogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAJaWYgKHdhck5vdEZvdW5kRXhjZXB0aW9uVGhyb3duID09IGZhbHNlKSB7CisgICAgICAgIAlpZiAoIXdhck5vdEZvdW5kRXhjZXB0aW9uVGhyb3duKSB7CiAgICAgICAgIAkJYXNzZXJ0Tm90TnVsbCgiSHR0cFNlcnZlciBnZXRJbnN0YW5jZSBpcyBudWxsIiwgbXlIdHRwU2VydmVyKTsKICAgICAgICAgCX0gZWxzZSB7CiAgICAgICAgIAkJYXNzZXJ0TnVsbCgiSHR0cFNlcnZlciBnZXRJbnN0YW5jZSBpcyBudWxsIGJlY2F1c2UgY29uc29sZS53YXIgY291bGQgbm90IGJlIGZvdW5kIiwgbXlIdHRwU2VydmVyKTsKQEAgLTY3LDE0ICs2NywxMyBAQAogICAgICAgICAJCWFzc2VydEVxdWFscygiIiwgIiIpOwogICAgICAgICAJfQogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAJaWYgKHdhck5vdEZvdW5kRXhjZXB0aW9uVGhyb3duID09IGZhbHNlKSB7CisgICAgICAgIAlpZiAoKCF3YXJOb3RGb3VuZEV4Y2VwdGlvblRocm93bikgJiYgKG15SHR0cFNlcnZlciAhPSBudWxsKSl7CiAgICAgICAgICAgICAgICAgbXlIdHRwU2VydmVyLnN0YXJ0U2VydmVyKCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShteUh0dHBTZXJ2ZXIuaXNTZXJ2ZXJTdGFydGVkKCkpOwogICAgICAgICAJfSBlbHNlIHsKICAgICAgICAgCQlhc3NlcnROdWxsKCJIdHRwU2VydmVyIGdldEluc3RhbmNlIGlzIG51bGwgYmVjYXVzZSBjb25zb2xlLndhciBjb3VsZCBub3QgYmUgZm91bmQiLCBteUh0dHBTZXJ2ZXIpOwogICAgICAgICAJfQogICAgICAgICB9Ci0KICAgICB9CiAKICAgICBAVGVzdApAQCAtOTAsNyArODksNyBAQAogICAgICAgICAJCWFzc2VydEVxdWFscygiIiwgIiIpOwogICAgICAgICAJfQogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAJaWYgKHdhck5vdEZvdW5kRXhjZXB0aW9uVGhyb3duID09IGZhbHNlKSB7CisJCQlpZiAoKCF3YXJOb3RGb3VuZEV4Y2VwdGlvblRocm93bikgJiYgKG15SHR0cFNlcnZlciAhPSBudWxsKSl7CiAgICAgICAgICAgICAgICAgbXlIdHRwU2VydmVyLnN0YXJ0U2VydmVyKCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobXlIdHRwU2VydmVyLmlzU2VydmVyU3RvcHBlZCgpKTsKICAgICAgICAgCX0gZWxzZSB7CkBAIC0xMTIsNyArMTExLDcgQEAKICAgICAgICAgCQlhc3NlcnRFcXVhbHMoIiIsICIiKTsKICAgICAgICAgCX0KICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgCWlmICh3YXJOb3RGb3VuZEV4Y2VwdGlvblRocm93biA9PSBmYWxzZSkgeworCQkJaWYgKCghd2FyTm90Rm91bmRFeGNlcHRpb25UaHJvd24pICYmIChteUh0dHBTZXJ2ZXIgIT0gbnVsbCkpewogICAgICAgICAJCWFzc2VydEVxdWFscygiL2NvbnNvbGUiLCBteUh0dHBTZXJ2ZXIuZ2V0Q29uc29sZUNvbnRleHRQYXRoKCkpOwogICAgICAgICAJfSBlbHNlIHsKICAgICAgICAgCQlhc3NlcnROdWxsKCJIdHRwU2VydmVyIGdldEluc3RhbmNlIGlzIG51bGwgYmVjYXVzZSBjb25zb2xlLndhciBjb3VsZCBub3QgYmUgZm91bmQiLCBteUh0dHBTZXJ2ZXIpOwpAQCAtMTM1LDcgKzEzNCw3IEBACiAgICAgICAgIAkJYXNzZXJ0RXF1YWxzKCIiLCAiIik7CiAgICAgICAgIAl9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIAlpZiAod2FyTm90Rm91bmRFeGNlcHRpb25UaHJvd24gPT0gZmFsc2UpIHsKKwkJCWlmICgoIXdhck5vdEZvdW5kRXhjZXB0aW9uVGhyb3duKSAmJiAobXlIdHRwU2VydmVyICE9IG51bGwpKXsKICAgICAgICAgICAgICAgICBteUh0dHBTZXJ2ZXIuc3RhcnRTZXJ2ZXIoKTsKICAgICAgICAgICAgICAgICBpbnQgcG9ydE51bSA9IG15SHR0cFNlcnZlci5nZXRDb25zb2xlUG9ydE51bWJlcigpOwogICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0ID0gbXlIdHRwU2VydmVyLmdldENvbnNvbGVDb250ZXh0UGF0aCgpOwpAQCAtMTU5LDcgKzE1OCw3IEBACiAgICAgICAgIAkJYXNzZXJ0RXF1YWxzKCIiLCAiIik7CiAgICAgICAgIAl9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIAlpZiAod2FyTm90Rm91bmRFeGNlcHRpb25UaHJvd24gPT0gZmFsc2UpIHsKKwkJCWlmICgoIXdhck5vdEZvdW5kRXhjZXB0aW9uVGhyb3duKSAmJiAobXlIdHRwU2VydmVyICE9IG51bGwpKXsKICAgICAgICAgICAgICAgICBteUh0dHBTZXJ2ZXIuc3RhcnRTZXJ2ZXIoKTsKICAgICAgICAgICAgICAgICBpbnQgcG9ydE51bSA9IG15SHR0cFNlcnZlci5nZXRDb25zb2xlUG9ydE51bWJlcigpOwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoInRoZSBwb3J0IG51bWJlciBpcyBub3QgaW4gaW50ZWdlciByYW5nZTogIiArIEludGVnZXIudG9TdHJpbmcocG9ydE51bSksCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvY29uc29sZS9zZXJ2ZXIvU2VydmVyVXRpbFRlc3QuamF2YSBiL2NvbnNvbGUvc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25zb2xlL3NlcnZlci9TZXJ2ZXJVdGlsVGVzdC5qYXZhCmluZGV4IDdkZmM4NTUuLmNlYTBhYzQgMTAwNjQ0Ci0tLSBhL2NvbnNvbGUvc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25zb2xlL3NlcnZlci9TZXJ2ZXJVdGlsVGVzdC5qYXZhCisrKyBiL2NvbnNvbGUvc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9jb25zb2xlL3NlcnZlci9TZXJ2ZXJVdGlsVGVzdC5qYXZhCkBAIC0zNyw3ICszNyw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGF0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFNlcnZlclV0aWwgc2VydmVyVXRpbCA9IG5ldyBTZXJ2ZXJVdGlsKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkdldCBBYnNvbHV0ZVdhckZpbGVQYXRoIGlzIG51bGwiLCBzZXJ2ZXJVdGlsLmdldEFic29sdXRlV2FyRmlsZVBhdGgoImNvbnNvbGUud2FyIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJHZXQgQWJzb2x1dGVXYXJGaWxlUGF0aCBpcyBudWxsIiwgc2VydmVyVXRpbC5nZXRXYXJGaWxlUGF0aCgpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvUkVBRE1FIGIvY29uc29sZS9zZXJ2bGV0cy9SRUFETUUKaW5kZXggMTQ0YjBjZC4uZGJjYmJmMiAxMDA2NDQKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy9SRUFETUUKKysrIGIvY29uc29sZS9zZXJ2bGV0cy9SRUFETUUKQEAgLTYsMTYgKzYsMyBAQAogCiBzZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvZDMubGVnZW5kLmpzOiAKIE9idGFpbmVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9qaWV0ZXIvZDMtbGVnZW5kL2Jsb2IvbWFzdGVyL2QzLmxlZ2VuZC5qcwotCi1zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvZDMubWluLmpzOiAKLU9idGFpbmVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy9yZWxlYXNlcy90YWcvdjMuNS45Ci0KLXNlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9zYW5rZXlfZWRnZW50LmpzOiAKLU9yaWdpbmFsbHkgb2J0YWluZWQgc2Fua2V5LmpzIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zYW5rZXkKLU1vZGlmaWVkIGl0IGFuZCByZW5hbWVkIGl0IHRvIHNhbmtleV9lZGdlbnQuanMKLQotc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tOgotT2J0YWluZWQgZnJvbTogaHR0cDovL2pxdWVyeXVpLmNvbSAoc2VsZWN0ICdDdXN0b20gRG93bmxvYWQnKQotCi1zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vZXh0ZXJuYWwvanF1ZXJ5L2pxdWVyeS5qczoKLU9idGFpbmVkIGZyb206IGh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS8KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvYnVpbGQuZ3JhZGxlIGIvY29uc29sZS9zZXJ2bGV0cy9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmE2NzIuLjAwMDAwMDAKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRpc3RzRGlyTmFtZSA9ICd3ZWJhcHBzJwotCi1wbHVnaW5zLmFwcGx5ICd3YXInCi0KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdwcm92aWRlZENvbXBpbGUnLCAnOnV0aWxzOnN0cmVhbXNjb3BlJwotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAncHJvdmlkZWRDb21waWxlJywgJ2phdmF4LnNlcnZsZXQ6amF2YXguc2VydmxldC1hcGk6My4xLjAnCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ3Byb3ZpZGVkQ29tcGlsZScKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQotCi13YXIgewotICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoIiR0YXJnZXRfamF2YThfZGlyLyRwcm9qZWN0LnNpbXBsZUdyb3VwTmFtZS93ZWJhcHBzIikKLSAgYXJjaGl2ZU5hbWUgJ2NvbnNvbGUud2FyJwotICBmcm9tIGZpbGUoJ3dlYmFwcF9jb250ZW50L2h0bWwnKQotICBpbnRvKCdyZXNvdXJjZXMnKSB7Ci0gICAgZnJvbSBmaWxlKCd3ZWJhcHBfY29udGVudC9yZXNvdXJjZXMnKQotICB9Ci0gIGludG8oJ2pzJykgewotICAgIGZyb20gZmlsZSgnd2ViYXBwX2NvbnRlbnQvanMnKQotICB9Ci0gIHdlYlhtbCA9IGZpbGUoJ3dlYmFwcF9jb250ZW50L1dFQi1JTkYvY29uc29sZS54bWwnKQotICAKLSAgZG9GaXJzdCB7Ci0gICAgY29uZmlndXJlIGphck9wdGlvbnMKLSAgfQotfQotCi10ZXN0Q2xhc3Nlcy5kZXBlbmRzT24gd2FyCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3BvbS54bWwgYi9jb25zb2xlL3NlcnZsZXRzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkMDFlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUvc2VydmxldHMvcG9tLnhtbApAQCAtMCwwICsxLDE3NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbnNvbGU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25zb2xlLXNlcnZsZXRzPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IENvbnNvbGU6IFNlcnZsZXRzPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8IS0tIEFkZCB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCB0aGUgZXh0ZXJuYWwgcmVzb3VyY2VzIHdlcmUgdW5wYWNrZWQgdG8gdGhlIGJ1aWxkIC0tPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXJlc291cmNlcy9NRVRBLUlORi9yZXNvdXJjZXMvd2ViamFyczwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259L2pzL2V4dDwvdGFyZ2V0UGF0aD4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgICA8IS0tICBidW5kbGUgdGhlIGxpY2Vuc2VzIG9mIHRoZSBhcnRpZmFjdHMgd2UgYXJlIGJ1bmRsaW5nIC0tPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS8uLi8uLi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPHRhcmdldFBhdGg+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS9NRVRBLUlORi9saWNlbnNlczwvdGFyZ2V0UGF0aD4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnJhdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLXJhdC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+bGljZW5zZS1jaGVjazwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxleGNsdWRlcyBjb21iaW5lLmNoaWxkcmVuPSJhcHBlbmQiPgorICAgICAgICAgICAgPCEtLSBUT0RPOiBTdGlsbCBnb3Qgb25lIHVubGljZW5zZWQgZmlsZSBpbiB0aGVyZSAuLi4gLS0+CisgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvbWFpbi93ZWJhcHAvanMvZXh0LyoqPC9leGNsdWRlPgorICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD51bnBhY2stanMtZGVwczwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8IS0tICBCdW5kbGUgdGhlc2UgZGVwZW5kZW5jaWVzIGluIHRoZSB3YXIuCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgWW91IG11c3QgbWFpbnRhaW4gdGhlIGNvcnJlc3BvbmRpbmcgaW5mbyBpZiB5b3UKKyAgICAgICAgICAgICAgICAgIGFkZC9yZW1vdmUgYXJ0aWZhY3RzIG9yIGNoYW5nZSB0aGVpciB2ZXJzaW9uczoKKyAgICAgICAgICAgICAgICAgICAgLSBlbnRyeSBpbiBzcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAtIGVudHJ5IGluIHNyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9OT1RJQ0Ugd2hlbiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IG1haW50YWluIHRoZSBpbmZvIGluIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgICBjb25zb2xlL3NlcnZlciBmaWxlcyBiZWNhdXNlIGl0IGJ1bmRsZXMgdGhpcyB3YXIuIAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBZb3UgbXVzdCBtYWludGFpbiB0aGUgaW5mbyBpbiB0aGlzIHByb2plY3QncworICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBwbGF0Zm9ybXMvamF2YTcgZmlsZXMuCisgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy53ZWJqYXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anF1ZXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xMS4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+TUVUQS1JTkYvcmVzb3VyY2VzL3dlYmphcnMvKiovanF1ZXJ5Lm1pbi5qczwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy53ZWJqYXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anF1ZXJ5LXVpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xMS40PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+TUVUQS1JTkYvcmVzb3VyY2VzL3dlYmphcnMvKiovaW1hZ2VzLyoucG5nLE1FVEEtSU5GL3Jlc291cmNlcy93ZWJqYXJzLyoqLyoubWluLio8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcud2ViamFycy5ib3dlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmQzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4zLjk8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1yZXNvdXJjZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz5NRVRBLUlORi9yZXNvdXJjZXMvd2ViamFycy8qKi8qKi5taW4uKjwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy53ZWJqYXJzLmJvd2VyPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZDMtcGx1Z2lucy1zYW5rZXk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXJlc291cmNlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPk1FVEEtSU5GL3Jlc291cmNlcy93ZWJqYXJzLyoqLyouY3NzLE1FVEEtSU5GL3Jlc291cmNlcy93ZWJqYXJzLyoqLyouanM8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPCEtLSBEb3dubG9hZCBKYXZhU2NyaXB0IGZvcm0gR2l0SHViIC0tPgorICAgICAgPCEtLXBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUubWF2ZW4tZG93bmxvYWQtcGx1Z2luPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5kb3dubG9hZC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmdldC1kMy1sZWdlbmQtanM8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXJlc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPndnZXQ8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9aSk9OU1NPTi8zOTE4MzY5L3Jhdy9iZjliY2U2YjY4YTNiNzBmODc0NTBmMTU1NDM2Y2E0YTg0YWYxYmE0L2QzLmxlZ2VuZC5qczwvdXJsPgorICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvcmVzb3VyY2VzL3dlYmphcnMvZDMubGVnZW5kLzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICA8b3V0cHV0RmlsZU5hbWU+ZDMubGVnZW5kLmpzPC9vdXRwdXRGaWxlTmFtZT4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4tLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDwhLS0gIEluY2x1ZGVkIHRvIGVuYWJsZSAibXZuIHRvbWNhdDpydW4iIGFuZCBoYXZlIGEgcnVubmluZworICAgICAgICAgICAgICBjb25zb2xlIHNlcnZlciB3aXRob3V0IHVzaW5nIHRoZSBzZXJ2ZXIgamFyLgorICAgICAgICAtLT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnRvbWNhdDctbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLXN0cmVhbXNjb3BlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4xLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25zb2xlL3NlcnZsZXRzL0NvbnNvbGVKb2JTZXJ2bGV0LmphdmEgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2bGV0cy9Db25zb2xlSm9iU2VydmxldC5qYXZhCmluZGV4IGQxYjFmYjkuLjk0YmM5MTMgMTAwNjQ0Ci0tLSBhL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25zb2xlL3NlcnZsZXRzL0NvbnNvbGVKb2JTZXJ2bGV0LmphdmEKKysrIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2NvbnNvbGUvc2VydmxldHMvQ29uc29sZUpvYlNlcnZsZXQuamF2YQpAQCAtNTAsMzIgKzUwLDMxIEBACiAgICAgICAgIGJvb2xlYW4gam9ic0luZm8gPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiBqb2JHcmFwaCA9IGZhbHNlOwogICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZyxTdHJpbmdbXT4gZW50cnkgOiBwYXJhbWV0ZXJNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5lcXVhbHMoImpvYnNJbmZvIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoImpvYnNJbmZvIi5lcXVhbHMoZW50cnkuZ2V0S2V5KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWxzID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxzWzBdLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyh2YWxzWzBdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JzSW5mbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5nZXRLZXkoKS5lcXVhbHMoImpvYmdyYXBoIikpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJqb2JncmFwaCIuZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdmFscyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsc1swXS5lcXVhbHMoInRydWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHModmFsc1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iR3JhcGggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuZ2V0S2V5KCkuZXF1YWxzKCJqb2JJZCIpKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiam9iSWQiLmVxdWFscyhlbnRyeS5nZXRLZXkoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGlkcyA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYklkID0gaWRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKIAotICAgICAgICBTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgc2J1Zi5hcHBlbmQoIio6aW50ZXJmYWNlPSIpOwogICAgICAgICBzYnVmLmFwcGVuZChPYmplY3ROYW1lLnF1b3RlKCJvcmcuYXBhY2hlLmVkZ2VudC5leGVjdXRpb24ubWJlYW5zLkpvYk1YQmVhbiIpKTsKICAgICAgICAgc2J1Zi5hcHBlbmQoIix0eXBlPSIpOwogICAgICAgICBzYnVmLmFwcGVuZChPYmplY3ROYW1lLnF1b3RlKCJqb2IiKSk7CiAgICAgICAgIAotICAgICAgICBpZiAoIWpvYklkLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKCFqb2JJZC5pc0VtcHR5KCkpIHsKICAgICAgICAgCXNidWYuYXBwZW5kKCIsaWQ9Iik7CiAgICAgICAgIAlzYnVmLmFwcGVuZChPYmplY3ROYW1lLnF1b3RlKGpvYklkKSk7CiAgICAgICAgIH0gCkBAIC05MCwxMyArODksMTYgQEAKICAgICAgICAgU3RyaW5nIGpzb25TdHJpbmcgPSAiIjsKICAgICAgICAgaWYgKGpvYnNJbmZvKSB7CiAgICAgICAgIAlqc29uU3RyaW5nID0gSm9iVXRpbC5nZXRKb2JzSW5mbyhqb2JPYmpOYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChqb2JHcmFwaCAmJiAhKGpvYklkLmVxdWFscygiIikpICYmICEoam9iSWQuZXF1YWxzKCJ1bmRlZmluZWQiKSkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChqb2JHcmFwaCAmJiAhKGpvYklkLmlzRW1wdHkoKSkgJiYgISgidW5kZWZpbmVkIi5lcXVhbHMoam9iSWQpKSkgewogICAgICAgICAgICAganNvblN0cmluZyA9IEpvYlV0aWwuZ2V0Sm9iR3JhcGgoam9iT2JqTmFtZSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIpOwogICAgICAgICByZXNwb25zZS5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLSAgICAgICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkud3JpdGUoanNvblN0cmluZyk7Ci0gICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkud3JpdGUoanNvblN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgICAgICB9CiAJfQkJCiB9CmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2bGV0cy9Kb2JVdGlsLmphdmEgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2bGV0cy9Kb2JVdGlsLmphdmEKaW5kZXggZmJkNDQ5ZC4uOGNlZTAwMyAxMDA2NDQKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2NvbnNvbGUvc2VydmxldHMvSm9iVXRpbC5qYXZhCisrKyBiL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25zb2xlL3NlcnZsZXRzL0pvYlV0aWwuamF2YQpAQCAtNDAsMTQgKzQwLDE0IEBACiAKIGZpbmFsIGNsYXNzIEpvYlV0aWwgewogCQotCXN0YXRpYyBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKKwlwcml2YXRlIHN0YXRpYyBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSm9iVXRpbC5jbGFzcyk7CiAKIAlzdGF0aWMgU3RyaW5nIGdldEpvYnNJbmZvKE9iamVjdE5hbWUgam9iT2JqTmFtZSkgewogICAgICAgICBTZXQ8T2JqZWN0SW5zdGFuY2U+IGpvYkluc3RhbmNlcyA9IG1CZWFuU2VydmVyLnF1ZXJ5TUJlYW5zKGpvYk9iak5hbWUsIG51bGwpOwogICAgICAgICAKICAgICAgICAgSXRlcmF0b3I8T2JqZWN0SW5zdGFuY2U+IGpvYkl0ZXJhdG9yID0gam9iSW5zdGFuY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBqc29uID0gbmV3IFN0cmluZ0J1ZmZlcigiWyIpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGpzb24gPSBuZXcgU3RyaW5nQnVpbGRlcigiWyIpOwogICAgICAgICBpbnQgY291bnRlciA9IDA7CiAgICAgICAgIHdoaWxlIChqb2JJdGVyYXRvci5oYXNOZXh0KCkpIHsKICAgICAgICAgCWlmIChjb3VudGVyID4gMCkgewpAQCAtNTUsNDcgKzU1LDQzIEBACiAgICAgICAgIAl9CiAgICAgICAgIAlPYmplY3RJbnN0YW5jZSBqb2JJbnN0YW5jZSA9IGpvYkl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgIE9iamVjdE5hbWUgam9iT2JqZWN0TmFtZSA9IGpvYkluc3RhbmNlLmdldE9iamVjdE5hbWUoKTsKLSAgICAgICAgICAgIE1CZWFuSW5mbyBtQmVhbkluZm8gPSBudWxsOworICAgICAgICAgICAgTUJlYW5JbmZvIG1CZWFuSW5mbzsKIAkJCXRyeSB7CiAJCQkJbUJlYW5JbmZvID0gbUJlYW5TZXJ2ZXIuZ2V0TUJlYW5JbmZvKGpvYk9iamVjdE5hbWUpOwogCQkJfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB8IEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gfCBSZWZsZWN0aW9uRXhjZXB0aW9uIGUpIHsKIAkJCSAgICBsb2dnZXIuZXJyb3IoIkV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgZ2V0dGluZyBNQmVhbkluZm8iLCBlKTsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uIGNhdWdodCB3aGlsZSBnZXR0aW5nIE1CZWFuSW5mbyIsIGUpOwogCQkJfQogICAgICAgICAgICAgCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogR2V0IHRoZSBuYW1lcyBvZiBhbGwgdGhlIGF0dHJpYnV0ZXMKICAgICAgICAgICAgICAqLwotCQkJICAgICAgICAgICAgCi0JCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4gKCk7CisJCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PD4gKCk7CiAJICAgIAlmb3IgKE1CZWFuQXR0cmlidXRlSW5mbyBhdHRyaWJ1dGVJbmZvIDogbUJlYW5JbmZvLmdldEF0dHJpYnV0ZXMoKSkgewogCSAgICAJCQluYW1lcy5hZGQoYXR0cmlidXRlSW5mby5nZXROYW1lKCkpOwogCSAgICAJfQogCSAgICAJLy8gbm93IGNvbnN0cnVjdCB0aGUgam9iIGpzb24gYW5kIGFkZCBpdCB0byB0aGUgc3RyaW5nIGJ1ZmZlcgotCSAgICAJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJICAgIAlTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCSAgICAJcy5hcHBlbmQoIntcIiIpOwotCSAgICAJSXRlcmF0b3I8U3RyaW5nPiBpdCA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JICAgIAl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkgICAgCQlTdHJpbmcgYXR0ciA9IGl0Lm5leHQoKTsKLQkgICAgCQlzLmFwcGVuZChhdHRyKTsKLQkgICAgCQlzLmFwcGVuZCgiXCI6XCIiKTsKLQkgICAgCQl0cnkgewotCQkJCQlzLmFwcGVuZCgoU3RyaW5nKW1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShqb2JPYmplY3ROYW1lLCBhdHRyKSk7Ci0JCQkJfSBjYXRjaCAoQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gfCBJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIAorCQkJZm9yIChTdHJpbmcgYXR0ciA6IG5hbWVzKSB7CisJCQkJcy5hcHBlbmQoYXR0cik7CisJCQkJcy5hcHBlbmQoIlwiOlwiIik7CisJCQkJdHJ5IHsKKwkJCQkJcy5hcHBlbmQoKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKGpvYk9iamVjdE5hbWUsIGF0dHIpKTsKKwkJCQl9IGNhdGNoIChBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiB8IEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24KIAkJCQkJCXwgTUJlYW5FeGNlcHRpb24gfCBSZWZsZWN0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkgICAgbG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGFjY2Vzc2luZyBNQmVhbiIsIGUpOworCQkJCQlsb2dnZXIuZXJyb3IoIkV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgYWNjZXNzaW5nIE1CZWFuIiwgZSk7CiAJCQkJfQotCSAgICAJCXMuYXBwZW5kKCJcIixcIiIpOwotCSAgICAJfQorCQkJCXMuYXBwZW5kKCJcIixcIiIpOworCQkJfQogCSAgICAJLy8gcmVtb3ZlIHRoZSB0cmFpbGluZyAsXAogCSAgICAJcy5kZWxldGVDaGFyQXQocy5sZW5ndGgoKS0xKTsKIAkgICAgCXMuZGVsZXRlQ2hhckF0KHMubGVuZ3RoKCktMSk7Ci0JICAgIAlqc29uLmFwcGVuZChzLnRvU3RyaW5nKCkgKyAifSIpOworCSAgICAJanNvbi5hcHBlbmQocy50b1N0cmluZygpKS5hcHBlbmQoIn0iKTsKIAkgICAgCWNvdW50ZXIrKzsKICAgICAgICAgfQogICAgICAgICBqc29uLmFwcGVuZCgiXSIpOwotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9IGpzb24udG9TdHJpbmcoKTsKLQkJCi0JCXJldHVybiBqc29uU3RyaW5nOworICAgICAgICByZXR1cm4ganNvbi50b1N0cmluZygpOwogCX0KIAkKIAlzdGF0aWMgU3RyaW5nIGdldEpvYkdyYXBoKE9iamVjdE5hbWUgam9iT2JqTmFtZSkgewpAQCAtMTA5LDI4ICsxMDUsMjggQEAKICAgICAgICAgU3RyaW5nIGdTbmFwc2hvdCA9ICIiOwogICAgICAgICBpZiAoam9iSW5zdGFuY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgT2JqZWN0TmFtZSBqb2JPYmplY3ROYW1lID0gam9iSW5zdGFuY2UuZ2V0T2JqZWN0TmFtZSgpOwotICAgICAgICAgICAgTUJlYW5JbmZvIG1CZWFuSW5mbyA9IG51bGw7CisgICAgICAgICAgICBNQmVhbkluZm8gbUJlYW5JbmZvOwogCQkJdHJ5IHsKIAkJCQltQmVhbkluZm8gPSBtQmVhblNlcnZlci5nZXRNQmVhbkluZm8oam9iT2JqZWN0TmFtZSk7CiAJCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHwgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB8IFJlZmxlY3Rpb25FeGNlcHRpb24gZSkgewogCQkJICAgIGxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIGNhdWdodCB3aGlsZSBnZXR0aW5nIE1CZWFuSW5mbyIsIGUpOworCQkJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGdldHRpbmcgTUJlYW5JbmZvIiwgZSk7CiAJCQl9CisKIAkgICAgCS8qCiAJICAgIAkgKiBOb3cgZ2V0IHRoZSBncmFwaCBmb3IgdGhlIGpvYgogCSAgICAJICovCi0JICAgIAlTZXQ8U3RyaW5nPiBvcGVyYXRpb25zID0gbmV3IEhhc2hTZXQ8U3RyaW5nPiAoKTsKIAkgICAgCWZvciAoTUJlYW5PcGVyYXRpb25JbmZvIG9wZXJhdGlvbkluZm86IG1CZWFuSW5mby5nZXRPcGVyYXRpb25zKCkpIHsKLQkgICAgCQlvcGVyYXRpb25zLmFkZChvcGVyYXRpb25JbmZvLmdldE5hbWUoKSk7CiAJICAgIAkJaWYgKG9wZXJhdGlvbkluZm8uZ2V0TmFtZSgpLmVxdWFscygiZ3JhcGhTbmFwc2hvdCIpKSB7CiAJICAgIAkJCXRyeSB7CiAJCQkJCQlnU25hcHNob3QgPSAoU3RyaW5nKSBtQmVhblNlcnZlci5pbnZva2Uoam9iT2JqZWN0TmFtZSwgImdyYXBoU25hcHNob3QiLG51bGwsIG51bGwpOwotCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZ1NuYXBzaG90KTsKIAkJCQkJfSBjYXRjaCAoSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB8IFJlZmxlY3Rpb25FeGNlcHRpb24gfCBNQmVhbkV4Y2VwdGlvbiBlKSB7CiAJCQkJCSAgICBsb2dnZXIuZXJyb3IoIkV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgaW52b2tpbmcgb3BlcmF0aW9uIG9uIE1CZWFuIiwgZSk7Ci0JCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGludm9raW5nIG9wZXJhdGlvbiBvbiBNQmVhbiIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CiAJICAgIAkJfQogCSAgICAJfQotCX0KKwkgICAgfQogCQlyZXR1cm4gZ1NuYXBzaG90OwogCX0KIH0KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25zb2xlL3NlcnZsZXRzL01ldHJpY3NHc29uLmphdmEgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2bGV0cy9NZXRyaWNzR3Nvbi5qYXZhCmluZGV4IDdiYTYwYjcuLjdmMjlkZTEgMTAwNjQ0Ci0tLSBhL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25zb2xlL3NlcnZsZXRzL01ldHJpY3NHc29uLmphdmEKKysrIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2NvbnNvbGUvc2VydmxldHMvTWV0cmljc0dzb24uamF2YQpAQCAtMjQsMTIgKzI0LDE3IEBACiAKIHB1YmxpYyBjbGFzcyBNZXRyaWNzR3NvbiB7CiAKLQlwdWJsaWMgU3RyaW5nIGpvYklkID0gbnVsbDsKLQlwdWJsaWMgQXJyYXlMaXN0PE9wZXJhdG9yPiBvcHMgPSBuZXcgQXJyYXlMaXN0PE9wZXJhdG9yPigpOworICAgIHByaXZhdGUgU3RyaW5nIGpvYklkID0gbnVsbDsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxPcGVyYXRvcj4gb3BzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCiAJY2xhc3MgT3BlcmF0b3IgewotCQlTdHJpbmcgb3BJZCA9IG51bGw7Ci0JCUFycmF5TGlzdDxPcE1ldHJpYz4gbWV0cmljcyA9IG51bGw7CisJCWZpbmFsIFN0cmluZyBvcElkOworCQlmaW5hbCBBcnJheUxpc3Q8T3BNZXRyaWM+IG1ldHJpY3M7CisJCU9wZXJhdG9yKFN0cmluZyBuYW1lKSB7CisJCSAgICBvcElkID0gbmFtZTsKKwkJICAgIG1ldHJpY3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJICAgIE1ldHJpY3NHc29uLnRoaXMuYWRkT3AodGhpcyk7CisJCX0KIAl9CiAJCiAJY2xhc3MgT3BNZXRyaWMgewpAQCAtNTgsNyArNjMsNyBAQAogCQkKIAkJSXRlcmF0b3I8T3BlcmF0b3I+IG9wc0l0ZXJhdG9yID0gdGhpcy5vcHMuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKG9wc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT3BlcmF0b3Igb3AgPSAoT3BlcmF0b3IpIG9wc0l0ZXJhdG9yLm5leHQoKTsKKwkJCU9wZXJhdG9yIG9wID0gb3BzSXRlcmF0b3IubmV4dCgpOwogCQkJaWYgKGdldE9wSWQob3ApLmVxdWFscyhvcElkKSkgewogCQkJCXJldHVybiBvcDsKIAkJCX0KQEAgLTc3LDcgKzgyLDcgQEAKIAkJCiAJCUl0ZXJhdG9yPE9wZXJhdG9yPiBvcHNJdGVyYXRvciA9IHRoaXMub3BzLml0ZXJhdG9yKCk7CiAJCXdoaWxlIChvcHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9wZXJhdG9yIG9wID0gKE9wZXJhdG9yKSBvcHNJdGVyYXRvci5uZXh0KCk7CisJCQlPcGVyYXRvciBvcCA9IG9wc0l0ZXJhdG9yLm5leHQoKTsKIAkJCWlmIChnZXRPcElkKG9wKS5lcXVhbHMob3BJZCkpIHsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KQEAgLTk3LDggKzEwMiw0IEBACiAJCXJldHVybiB0aGVPcC5tZXRyaWNzOwogCX0KIAkKLQlwdWJsaWMgdm9pZCBzZXRPcE1ldHJpY3MoT3BlcmF0b3IgdGhlT3AsIEFycmF5TGlzdDxPcE1ldHJpYz4gdGhlTWV0cmljcykgewotCQl0aGVPcC5tZXRyaWNzID0gdGhlTWV0cmljczsKLQl9Ci0JCiB9CmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2bGV0cy9NZXRyaWNzVXRpbC5qYXZhIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2NvbnNvbGUvc2VydmxldHMvTWV0cmljc1V0aWwuamF2YQppbmRleCBiY2E2Y2M2Li4zZDc0MzM4IDEwMDY0NAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvY29uc29sZS9zZXJ2bGV0cy9NZXRyaWNzVXRpbC5qYXZhCisrKyBiL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9jb25zb2xlL3NlcnZsZXRzL01ldHJpY3NVdGlsLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2bGV0czsKIAogaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKQEAgLTQyLDEzICs0MSwxMyBAQAogCiBmaW5hbCBjbGFzcyBNZXRyaWNzVXRpbCB7CiAJCi0Jc3RhdGljIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOworCXByaXZhdGUgc3RhdGljIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihNZXRyaWNzVXRpbC5jbGFzcyk7CiAKIAlzdGF0aWMgSXRlcmF0b3I8T2JqZWN0SW5zdGFuY2U+IGdldENvdW50ZXJPYmplY3RJdGVyYXRvcihTdHJpbmcgam9iSWQpIHsKIAkJT2JqZWN0TmFtZSBjb3VudGVyT2JqTmFtZSA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYnVmLmFwcGVuZCgiKjpqb2JJZD0iICsgam9iSWQpOworCQlTdHJpbmdCdWlsZGVyIHNidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlzYnVmLmFwcGVuZCgiKjpqb2JJZD0iKS5hcHBlbmQoam9iSWQpOwogCQlzYnVmLmFwcGVuZCgiLHR5cGU9bWV0cmljLmNvdW50ZXJzLCoiKTsKIAogICAgICAgICAvLyBpLmUsIGVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQ6am9iSWQ9Sk9CLTAsb3BJZD1PUF80LG5hbWU9VHVwbGVSYXRlTWV0ZXIuZWRnZW50Lm9wbGV0LkpPQl8wLk9QXzQsdHlwZT1tZXRyaWMubWV0ZXJzCkBAIC02NCw4ICs2Myw4IEBACiAJc3RhdGljIEl0ZXJhdG9yPE9iamVjdEluc3RhbmNlPiBnZXRNZXRlck9iamVjdEl0ZXJhdG9yKFN0cmluZyBqb2JJZCkgewogCQlPYmplY3ROYW1lIG1ldGVyT2JqTmFtZSA9IG51bGw7CiAJCQkKLQkJCVN0cmluZ0J1ZmZlciBzYnVmMSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNidWYxLmFwcGVuZCgiKjpqb2JJZD0iICsgam9iSWQpOworCQkJU3RyaW5nQnVpbGRlciBzYnVmMSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlzYnVmMS5hcHBlbmQoIio6am9iSWQ9IikuYXBwZW5kKGpvYklkKTsKIAkJCXNidWYxLmFwcGVuZCgiLHR5cGU9bWV0cmljLm1ldGVycywqIik7CiAKIAkJCXRyeSB7CkBAIC04MiwyMSArODEsMTkgQEAKIAkKIAlzdGF0aWMgTWV0cmljc0dzb24gZ2V0QXZhaWxhYmxlTWV0cmljc0ZvckpvYihTdHJpbmcgam9iSWQsIEl0ZXJhdG9yPE9iamVjdEluc3RhbmNlPiBtZXRlckl0ZXJhdG9yLCBJdGVyYXRvcjxPYmplY3RJbnN0YW5jZT4gY291bnRlckl0ZXJhdG9yKSB7CiAJCU1ldHJpY3NHc29uIGdzb25Kb2IgPSBuZXcgTWV0cmljc0dzb24oKTsKLQkJQXJyYXlMaXN0PE9wZXJhdG9yPiBjb3VudGVyT3BzID0gbmV3IEFycmF5TGlzdDxPcGVyYXRvcj4oKTsKIAkJZ3NvbkpvYi5zZXRKb2JJZChqb2JJZCk7CiAJCXdoaWxlIChtZXRlckl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQXJyYXlMaXN0PE9wTWV0cmljPiBtZXRyaWNzID0gbnVsbDsKLQkJCU9iamVjdEluc3RhbmNlIG1ldGVySW5zdGFuY2UgPSAoT2JqZWN0SW5zdGFuY2UpbWV0ZXJJdGVyYXRvci5uZXh0KCk7CisJCQlPYmplY3RJbnN0YW5jZSBtZXRlckluc3RhbmNlID0gbWV0ZXJJdGVyYXRvci5uZXh0KCk7CiAJCQlPYmplY3ROYW1lIG1PYmpOYW1lID0gbWV0ZXJJbnN0YW5jZS5nZXRPYmplY3ROYW1lKCk7IAogCQkJU3RyaW5nIG9wTmFtZSA9IG1PYmpOYW1lLmdldEtleVByb3BlcnR5KCJvcElkIik7CiAKLQkJCU9wZXJhdG9yIGFuT3AgPSBudWxsOwogCQkJCWlmICghb3BOYW1lLmVxdWFscygiIikpIHsKLQkJCQkJTUJlYW5JbmZvIG1CZWFuSW5mbyA9IG51bGw7CisJCQkJCU1CZWFuSW5mbyBtQmVhbkluZm87CiAJCQkJCXRyeSB7CiAJCQkJCQltQmVhbkluZm8gPSBtQmVhblNlcnZlci5nZXRNQmVhbkluZm8obU9iak5hbWUpOwogCQkJCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHwgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB8IFJlZmxlY3Rpb25FeGNlcHRpb24gZSkgewogCQkJCQkgICAgbG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGdldHRpbmcgTUJlYW5JbmZvIiwgZSk7CisJCQkJCSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uIGNhdWdodCB3aGlsZSBnZXR0aW5nIE1CZWFuSW5mbyIsIGUpOwogCQkJCQl9CiAKIAkJCSAgICAJZm9yIChNQmVhbkF0dHJpYnV0ZUluZm8gYXR0cmlidXRlSW5mbyA6IG1CZWFuSW5mby5nZXRBdHRyaWJ1dGVzKCkpIHsKQEAgLTExMiwzMiArMTA5LDI3IEBACiAJICAgIAkJCQl9CiAJCSAgICAJCQkKIAkJICAgIAkJCS8vIGlmIHRoZSBvcCBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXRyaWMgaXMgbm90IGluIHRoZSBqb2IgYWRkIGl0Ci0JCSAgICAJCQlpZiAoIWdzb25Kb2IuaXNPcEluSm9iKG9wTmFtZSkpIHsKLQkJCQkJCSAgICBhbk9wID0gZ3NvbkpvYi5uZXcgT3BlcmF0b3IoKTsKLQkJCQkJCSAgICBnc29uSm9iLmFkZE9wKGFuT3ApOwotCQkJCQkJICAgIGFuT3Aub3BJZCA9IG9wTmFtZTsKLQkJCQkJCSAgICBjb3VudGVyT3BzLmFkZChhbk9wKTsKLQkJCQkJCSAgICBtZXRyaWNzID0gbmV3IEFycmF5TGlzdDxPcE1ldHJpYz4oKTsKLQkJICAgIAkJCX0gCi0JCSAgICAJCQltZXRyaWNzLmFkZChhTWV0cmljKTsKKwkJICAgIAkJCU9wZXJhdG9yIHRoZU9wID0gZ3NvbkpvYi5nZXRPcChvcE5hbWUpOworCQkgICAgCQkJaWYgKHRoZU9wID09IG51bGwpIHsKKwkJCQkJCSAgICB0aGVPcCA9IGdzb25Kb2IubmV3IE9wZXJhdG9yKG9wTmFtZSk7CisJCSAgICAJCQl9CisJCSAgICAJCQl0aGVPcC5tZXRyaWNzLmFkZChhTWV0cmljKTsKIAkJCSAgICAJfQotCQkJICAgIAlnc29uSm9iLnNldE9wTWV0cmljcyhhbk9wLCBtZXRyaWNzKTsKIAkJCQl9CiAJCX0KIAogCQl3aGlsZSAoY291bnRlckl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQXJyYXlMaXN0PE9wTWV0cmljPiBtZXRyaWNzID0gbnVsbDsKLQkJCU9iamVjdEluc3RhbmNlIGNvdW50ZXJJbnN0YW5jZSA9IChPYmplY3RJbnN0YW5jZSljb3VudGVySXRlcmF0b3IubmV4dCgpOworCQkJT2JqZWN0SW5zdGFuY2UgY291bnRlckluc3RhbmNlID0gY291bnRlckl0ZXJhdG9yLm5leHQoKTsKIAkJCU9iamVjdE5hbWUgY09iak5hbWUgPSBjb3VudGVySW5zdGFuY2UuZ2V0T2JqZWN0TmFtZSgpOwogCQkJU3RyaW5nIG9wTmFtZTEgPSBjT2JqTmFtZS5nZXRLZXlQcm9wZXJ0eSgib3BJZCIpOwogCi0JCQlPcGVyYXRvciBhbk9wID0gbnVsbDsKIAkJCWlmICghb3BOYW1lMS5lcXVhbHMoIiIpKSB7Ci0JCQlNQmVhbkluZm8gbUJlYW5JbmZvID0gbnVsbDsKKwkJCU1CZWFuSW5mbyBtQmVhbkluZm87CiAJCQl0cnkgewogCQkJCW1CZWFuSW5mbyA9IG1CZWFuU2VydmVyLmdldE1CZWFuSW5mbyhjT2JqTmFtZSk7CiAJCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHwgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB8IFJlZmxlY3Rpb25FeGNlcHRpb24gZSkgewogCQkJICAgIGxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIGNhdWdodCB3aGlsZSBnZXR0aW5nIE1CZWFuSW5mbyIsIGUpOworCQkJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGdldHRpbmcgTUJlYW5JbmZvIiwgZSk7CiAJCQl9CiAKIAkgICAgCWZvciAoTUJlYW5BdHRyaWJ1dGVJbmZvIGF0dHJpYnV0ZUluZm8gOiBtQmVhbkluZm8uZ2V0QXR0cmlidXRlcygpKSB7CkBAIC0xNTIsMTYgKzE0NCw5IEBACiAJCQkJfQogICAgIAkJCU9wZXJhdG9yIHRoZU9wID0gZ3NvbkpvYi5nZXRPcChvcE5hbWUxKTsKIAkJCQlpZiAodGhlT3AgPT0gbnVsbCkgewotCQkJCQlhbk9wID0gZ3NvbkpvYi5uZXcgT3BlcmF0b3IoKTsKLQkJCQkJZ3NvbkpvYi5hZGRPcChhbk9wKTsKLQkJCQkJYW5PcC5vcElkID0gb3BOYW1lMTsKLQkJCQkJbWV0cmljcyA9IG5ldyBBcnJheUxpc3Q8T3BNZXRyaWM+KCk7Ci0JCQkJCWdzb25Kb2Iuc2V0T3BNZXRyaWNzKGFuT3AsIG1ldHJpY3MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGdldCB0aGUgb3AKLQkJCQkJbWV0cmljcyA9IHRoZU9wLm1ldHJpY3M7CisgICAgICAgICAgICAgICAgICAgIHRoZU9wID0gZ3NvbkpvYi5uZXcgT3BlcmF0b3Iob3BOYW1lMSk7CiAJCQkJfQotICAgIAkJCW1ldHJpY3MuYWRkKGFNZXRyaWMpOworICAgIAkJCXRoZU9wLm1ldHJpY3MuYWRkKGFNZXRyaWMpOwogCSAgICAJfQogCQkJfQogCQl9CkBAIC0xNzIsNyArMTU3LDcgQEAKIAkKIAkvKioKIAkgKiBHZXQgYWxsIHRoZSByYXRlIG1ldHJpY3MsIGkuZSwgb25lIG1pbnV0ZSByYXRlLCBmaWZ0ZWVuIG1pbnV0ZSByYXRlLCBtZWFuIHJhdGUsIGV0YyAgZm9yIGEgam9iCi0JICogQHBhcmFtIGpvYiBpZCAoZS5nLCAiSk9CXzAiKQorCSAqIEBwYXJhbSBqb2JJZCBpZCAoZS5nLCAiSk9CXzAiKQogCSAqIAogCSAqIEByZXR1cm4gIGFsbCBtZXRyaWNzIGZvciB0aGlzIGpvYiBpZiB0aGVyZSBhcmUgYW55CiAJICovCkBAIC0xODIsMjEgKzE2NywyMCBAQAogCQkKIAkJSXRlcmF0b3I8T2JqZWN0SW5zdGFuY2U+IG1ldGVySXRlcmF0b3IgPSBNZXRyaWNzVXRpbC5nZXRNZXRlck9iamVjdEl0ZXJhdG9yKGpvYklkKTsKIAkJd2hpbGUgKG1ldGVySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBcnJheUxpc3Q8T3BNZXRyaWM+IG1ldHJpY3MgPSBudWxsOwotCQkJT2JqZWN0SW5zdGFuY2UgbWV0ZXJJbnN0YW5jZSA9IChPYmplY3RJbnN0YW5jZSltZXRlckl0ZXJhdG9yLm5leHQoKTsKKwkJCU9iamVjdEluc3RhbmNlIG1ldGVySW5zdGFuY2UgPSBtZXRlckl0ZXJhdG9yLm5leHQoKTsKIAkJCU9iamVjdE5hbWUgbU9iak5hbWUgPSBtZXRlckluc3RhbmNlLmdldE9iamVjdE5hbWUoKTsKIAkJCS8vaS5lLCBlZGdlbnQucHJvdmlkZXJzLmRldmVsb3BtZW50OmpvYklkPUpPQi0wLG9wSWQ9T1BfNCxuYW1lPVR1cGxlUmF0ZU1ldGVyLmVkZ2VudC5vcGxldC5KT0JfMC5PUF80LHR5cGU9bWV0cmljLm1ldGVycwogCQkJU3RyaW5nIGpvYk5hbWUgPSBtT2JqTmFtZS5nZXRLZXlQcm9wZXJ0eSgiam9iSWQiKTsKIAkJCVN0cmluZyBvcE5hbWUgPSBtT2JqTmFtZS5nZXRLZXlQcm9wZXJ0eSgib3BJZCIpOwotCQkJT3BlcmF0b3IgYW5PcCA9IG51bGw7CiAKIAkJCWlmIChqb2JJZC5lcXVhbHMoam9iTmFtZSkpIHsKLQkJCQlNQmVhbkluZm8gbUJlYW5JbmZvID0gbnVsbDsKKwkJCQlNQmVhbkluZm8gbUJlYW5JbmZvOwogCQkJCiAJCQkJdHJ5IHsKIAkJCQkJbUJlYW5JbmZvID0gbUJlYW5TZXJ2ZXIuZ2V0TUJlYW5JbmZvKG1PYmpOYW1lKTsKIAkJCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHwgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB8IFJlZmxlY3Rpb25FeGNlcHRpb24gZSkgewogCQkJCSAgICBsb2dnZXIuZXJyb3IoIkV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgZ2V0dGluZyBNQmVhbkluZm8iLCBlKTsKKwkJCQkgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgZ2V0dGluZyBNQmVhbkluZm8iLCBlKTsKIAkJCQl9CiAJCQkJCiAJCSAgICAJZm9yIChNQmVhbkF0dHJpYnV0ZUluZm8gYXR0cmlidXRlSW5mbyA6IG1CZWFuSW5mby5nZXRBdHRyaWJ1dGVzKCkpIHsKQEAgLTIxMCwzNSArMTk0LDI4IEBACiAJCQkJCQkJfCBSZWZsZWN0aW9uRXhjZXB0aW9uIGUpIHsKIAkJCQkJICAgIGxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIGNhdWdodCB3aGlsZSBhY2Nlc3NpbmcgTUJlYW4iLCBlKTsKICAgICAJCQkJfQotCQkJCQkgaWYgKCFnc29uSm9iLmlzT3BJbkpvYihvcE5hbWUpKSB7Ci0JCQkJCSAgICBhbk9wID0gZ3NvbkpvYi5uZXcgT3BlcmF0b3IoKTsKLQkJCQkJICAgIGdzb25Kb2IuYWRkT3AoYW5PcCk7Ci0JCQkJCSAgICBhbk9wLm9wSWQgPSBvcE5hbWU7Ci0JCQkJCSAgICBtZXRyaWNzID0gbmV3IEFycmF5TGlzdDxPcE1ldHJpYz4oKTsKLQkJCQkJICAgIGdzb25Kb2Iuc2V0T3BNZXRyaWNzKGFuT3AsIG1ldHJpY3MpOwotCQkJCQkgfSBlbHNlIHsKLQkJCQkJCWFuT3AgPSBnc29uSm9iLmdldE9wKG9wTmFtZSk7Ci0JCQkJCQltZXRyaWNzID0gYW5PcC5tZXRyaWNzOworCQkJCQkgT3BlcmF0b3IgdGhlT3AgPSBnc29uSm9iLmdldE9wKG9wTmFtZSk7CisJCQkJCSBpZiAodGhlT3AgPT0gbnVsbCkgeworCQkJCQkgICAgdGhlT3AgPSBnc29uSm9iLm5ldyBPcGVyYXRvcihvcE5hbWUpOwogCQkJCQkgfQotCQkJCQkgbWV0cmljcy5hZGQoYU1ldHJpYyk7CisJCQkJCSB0aGVPcC5tZXRyaWNzLmFkZChhTWV0cmljKTsKIAkJICAgIAl9CiAJCQl9CiAJCX0KIAkJCiAJCUl0ZXJhdG9yPE9iamVjdEluc3RhbmNlPiBjb3VudGVySXRlcmF0b3IgPSBNZXRyaWNzVXRpbC5nZXRDb3VudGVyT2JqZWN0SXRlcmF0b3Ioam9iSWQpOwogCQl3aGlsZSAoY291bnRlckl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQXJyYXlMaXN0PE9wTWV0cmljPiBtZXRyaWNzID0gbnVsbDsKLQkJCU9iamVjdEluc3RhbmNlIGNvdW50ZXJJbnN0YW5jZSA9IChPYmplY3RJbnN0YW5jZSljb3VudGVySXRlcmF0b3IubmV4dCgpOworCQkJT2JqZWN0SW5zdGFuY2UgY291bnRlckluc3RhbmNlID0gY291bnRlckl0ZXJhdG9yLm5leHQoKTsKIAkJCU9iamVjdE5hbWUgY09iak5hbWUgPSBjb3VudGVySW5zdGFuY2UuZ2V0T2JqZWN0TmFtZSgpOwogCQkJU3RyaW5nIG9wTmFtZTEgPSBjT2JqTmFtZS5nZXRLZXlQcm9wZXJ0eSgib3BJZCIpOwogCi0JCQlPcGVyYXRvciBhbk9wID0gbnVsbDsKIAkJCWlmICghb3BOYW1lMS5lcXVhbHMoIiIpKSB7Ci0JCQlNQmVhbkluZm8gbUJlYW5JbmZvID0gbnVsbDsKKwkJCU1CZWFuSW5mbyBtQmVhbkluZm87CiAJCQl0cnkgewogCQkJCW1CZWFuSW5mbyA9IG1CZWFuU2VydmVyLmdldE1CZWFuSW5mbyhjT2JqTmFtZSk7CiAJCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHwgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB8IFJlZmxlY3Rpb25FeGNlcHRpb24gZSkgewogCQkJICAgIGxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIGNhdWdodCB3aGlsZSBnZXR0aW5nIE1CZWFuSW5mbyIsIGUpOworCQkJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGdldHRpbmcgTUJlYW5JbmZvIiwgZSk7CiAJCQl9CiAKIAkgICAgCWZvciAoTUJlYW5BdHRyaWJ1dGVJbmZvIGF0dHJpYnV0ZUluZm8gOiBtQmVhbkluZm8uZ2V0QXR0cmlidXRlcygpKSB7CkBAIC0yNTMsMTYgKzIzMCw5IEBACiAJCQkJfQogICAgIAkJCU9wZXJhdG9yIHRoZU9wID0gZ3NvbkpvYi5nZXRPcChvcE5hbWUxKTsKIAkJCQlpZiAodGhlT3AgPT0gbnVsbCkgewotCQkJCQlhbk9wID0gZ3NvbkpvYi5uZXcgT3BlcmF0b3IoKTsKLQkJCQkJZ3NvbkpvYi5hZGRPcChhbk9wKTsKLQkJCQkJYW5PcC5vcElkID0gb3BOYW1lMTsKLQkJCQkJbWV0cmljcyA9IG5ldyBBcnJheUxpc3Q8T3BNZXRyaWM+KCk7Ci0JCQkJCWdzb25Kb2Iuc2V0T3BNZXRyaWNzKGFuT3AsIG1ldHJpY3MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGdldCB0aGUgb3AKLQkJCQkJbWV0cmljcyA9IHRoZU9wLm1ldHJpY3M7CisJCQkJCXRoZU9wID0gZ3NvbkpvYi5uZXcgT3BlcmF0b3Iob3BOYW1lMSk7CiAJCQkJfQotICAgIAkJCW1ldHJpY3MuYWRkKGFNZXRyaWMpOworICAgIAkJCXRoZU9wLm1ldHJpY3MuYWRkKGFNZXRyaWMpOwogCSAgICAJfQogCQkJfQogCQl9CkBAIC0yNzQsMjkgKzI0NCwyNyBAQAogCQlNZXRyaWNzR3NvbiBnc29uSm9iID0gbmV3IE1ldHJpY3NHc29uKCk7CiAJCWdzb25Kb2Iuc2V0Sm9iSWQoam9iSWQpOwogCQlTdHJpbmdbXSBkZXNpcmVkUGFydHMgPSBtZXRyaWNOYW1lLnNwbGl0KCIsIik7Ci0JCVN0cmluZ1tdIG5hbWVBID0gbmV3IFN0cmluZ1syXTsKIAkJU3RyaW5nIGRlc05hbWUgPSAiIjsKIAkJaWYgKCFkZXNpcmVkUGFydHNbMF0uZXF1YWxzKCIiKSkgewotCQkJbmFtZUEgPSBkZXNpcmVkUGFydHNbMF0uc3BsaXQoIjoiKTsKKwkJCVN0cmluZ1tdIG5hbWVBID0gZGVzaXJlZFBhcnRzWzBdLnNwbGl0KCI6Iik7CiAJCQlkZXNOYW1lID0gbmFtZUFbMV07CiAJCX0KIAkJCiAJCXdoaWxlIChtZXRyaWNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUFycmF5TGlzdDxPcE1ldHJpYz4gbWV0cmljcyA9IG51bGw7Ci0JCQlPYmplY3RJbnN0YW5jZSBtZXRlckluc3RhbmNlID0gKE9iamVjdEluc3RhbmNlKW1ldHJpY0l0ZXJhdG9yLm5leHQoKTsKKwkJCU9iamVjdEluc3RhbmNlIG1ldGVySW5zdGFuY2UgPSBtZXRyaWNJdGVyYXRvci5uZXh0KCk7CiAJCQlPYmplY3ROYW1lIG1PYmpOYW1lID0gbWV0ZXJJbnN0YW5jZS5nZXRPYmplY3ROYW1lKCk7CiAJCQkvL2kuZSwgZWRnZW50LnByb3ZpZGVycy5kZXZlbG9wbWVudDpqb2JJZD1KT0ItMCxvcElkPU9QXzQsbmFtZT1UdXBsZVJhdGVNZXRlci5lZGdlbnQub3BsZXQuSk9CXzAuT1BfNCx0eXBlPW1ldHJpYy5tZXRlcnMKIAkJCVN0cmluZyBqb2JOYW1lID0gbU9iak5hbWUuZ2V0S2V5UHJvcGVydHkoImpvYklkIik7CiAJCQlTdHJpbmcgb3BOYW1lID0gbU9iak5hbWUuZ2V0S2V5UHJvcGVydHkoIm9wSWQiKTsKLQkJCU9wZXJhdG9yIGFuT3AgPSBudWxsOwogCiAJCQlpZiAoam9iSWQuZXF1YWxzKGpvYk5hbWUpKSB7Ci0JCQkJTUJlYW5JbmZvIG1CZWFuSW5mbyA9IG51bGw7CisJCQkJTUJlYW5JbmZvIG1CZWFuSW5mbzsKIAkJCQogCQkJCXRyeSB7CiAJCQkJCW1CZWFuSW5mbyA9IG1CZWFuU2VydmVyLmdldE1CZWFuSW5mbyhtT2JqTmFtZSk7CiAJCQkJfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB8IEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gfCBSZWZsZWN0aW9uRXhjZXB0aW9uIGUpIHsKIAkJCQkgICAgbG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGdldHRpbmcgTUJlYW5JbmZvIiwgZSk7CisJCQkJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGdldHRpbmcgTUJlYW5JbmZvIiwgZSk7CiAJCQkJfQogCQkJCQogCQkgICAgCWZvciAoTUJlYW5BdHRyaWJ1dGVJbmZvIGF0dHJpYnV0ZUluZm8gOiBtQmVhbkluZm8uZ2V0QXR0cmlidXRlcygpKSB7CkBAIC0zMTEsMzggKzI3OSwzMSBAQAogCQkJCQkJCQl8IFJlZmxlY3Rpb25FeGNlcHRpb24gZSkgewogCQkJCQkJICAgIGxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIGNhdWdodCB3aGlsZSBhY2Nlc3NpbmcgTUJlYW4iLCBlKTsKIAkJCQkJCX0KLSAgICAJCQkJCWlmICghZ3NvbkpvYi5pc09wSW5Kb2Iob3BOYW1lKSkgewotICAgIAkJCQkJICAgIGFuT3AgPSBnc29uSm9iLm5ldyBPcGVyYXRvcigpOwotICAgIAkJCQkJICAgIGdzb25Kb2IuYWRkT3AoYW5PcCk7Ci0gICAgCQkJCQkgICAgYW5PcC5vcElkID0gb3BOYW1lOwotICAgIAkJCQkJICAgIG1ldHJpY3MgPSBuZXcgQXJyYXlMaXN0PE9wTWV0cmljPigpOwotICAgIAkJCQkJICAgIGdzb25Kb2Iuc2V0T3BNZXRyaWNzKGFuT3AsIG1ldHJpY3MpOwotICAgIAkJCQkJfSBlbHNlIHsKLSAgICAJCQkJCQlhbk9wID0gZ3NvbkpvYi5nZXRPcChvcE5hbWUpOwotICAgIAkJCQkJCW1ldHJpY3MgPSBhbk9wLm1ldHJpY3M7CisgICAgCQkJCQlPcGVyYXRvciB0aGVPcCA9IGdzb25Kb2IuZ2V0T3Aob3BOYW1lKTsKKyAgICAJCQkJCWlmICh0aGVPcCA9PSBudWxsKSB7CisgICAgCQkJCQkgICAgdGhlT3AgPSBnc29uSm9iLm5ldyBPcGVyYXRvcihvcE5hbWUpOwogICAgIAkJCQkJfQotCSAgICAJCQkJIG1ldHJpY3MuYWRkKGFNZXRyaWMpOworCSAgICAJCQkJIHRoZU9wLm1ldHJpY3MuYWRkKGFNZXRyaWMpOwogCSAgICAJCQkgfQogCQkgICAgCX0KIAkJCX0KIAkJfQogCQkKIAkJd2hpbGUgKGNvdW50ZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUFycmF5TGlzdDxPcE1ldHJpYz4gbWV0cmljcyA9IG51bGw7Ci0JCQlPYmplY3RJbnN0YW5jZSBjb3VudGVySW5zdGFuY2UgPSAoT2JqZWN0SW5zdGFuY2UpY291bnRlckl0ZXJhdG9yLm5leHQoKTsKKwkJCU9iamVjdEluc3RhbmNlIGNvdW50ZXJJbnN0YW5jZSA9IGNvdW50ZXJJdGVyYXRvci5uZXh0KCk7CiAJCQlPYmplY3ROYW1lIGNPYmpOYW1lID0gY291bnRlckluc3RhbmNlLmdldE9iamVjdE5hbWUoKTsKIAkJCVN0cmluZyBqb2JOYW1lMSA9IGNPYmpOYW1lLmdldEtleVByb3BlcnR5KCJqb2JJZCIpOwogCQkJU3RyaW5nIG9wTmFtZTEgPSBjT2JqTmFtZS5nZXRLZXlQcm9wZXJ0eSgib3BJZCIpOwogCQkJCiAKLQkJCU9wZXJhdG9yIGFuT3AgPSBudWxsOwogCQkJaWYgKGpvYklkLmVxdWFscyhqb2JOYW1lMSkpIHsKLQkJCQlNQmVhbkluZm8gbUJlYW5JbmZvID0gbnVsbDsKKwkJCQlNQmVhbkluZm8gbUJlYW5JbmZvOwogCQkJCiAJCQkJdHJ5IHsKIAkJCQkJbUJlYW5JbmZvID0gbUJlYW5TZXJ2ZXIuZ2V0TUJlYW5JbmZvKGNPYmpOYW1lKTsKIAkJCQl9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHwgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB8IFJlZmxlY3Rpb25FeGNlcHRpb24gZSkgewogCQkJCSAgICBsb2dnZXIuZXJyb3IoIkV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgZ2V0dGluZyBNQmVhbkluZm8iLCBlKTsKKwkJCQkgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgZ2V0dGluZyBNQmVhbkluZm8iLCBlKTsKIAkJCQl9CiAJCQkJCiAJCSAgICAJZm9yIChNQmVhbkF0dHJpYnV0ZUluZm8gYXR0cmlidXRlSW5mbyA6IG1CZWFuSW5mby5nZXRBdHRyaWJ1dGVzKCkpIHsKQEAgLTM1OCwxNyArMzE5LDExIEBACiAJCQkJCQkJCXwgUmVmbGVjdGlvbkV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkgICAgbG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGFjY2Vzc2luZyBNQmVhbiIsIGUpOwogCQkJCQkJfQotICAgIAkJCQkJaWYgKCFnc29uSm9iLmlzT3BJbkpvYihvcE5hbWUxKSkgewotICAgIAkJCQkJICAgIGFuT3AgPSBnc29uSm9iLm5ldyBPcGVyYXRvcigpOwotICAgIAkJCQkJICAgIGdzb25Kb2IuYWRkT3AoYW5PcCk7Ci0gICAgCQkJCQkgICAgYW5PcC5vcElkID0gb3BOYW1lMTsKLSAgICAJCQkJCSAgICBtZXRyaWNzID0gbmV3IEFycmF5TGlzdDxPcE1ldHJpYz4oKTsKLSAgICAJCQkJCSAgICBnc29uSm9iLnNldE9wTWV0cmljcyhhbk9wLCBtZXRyaWNzKTsKLSAgICAJCQkJCX0gZWxzZSB7Ci0gICAgCQkJCQkJYW5PcCA9IGdzb25Kb2IuZ2V0T3Aob3BOYW1lMSk7Ci0gICAgCQkJCQkJbWV0cmljcyA9IGFuT3AubWV0cmljczsKKyAgICAJCQkJCU9wZXJhdG9yIHRoZU9wID0gZ3NvbkpvYi5nZXRPcChvcE5hbWUxKTsKKyAgICAJCQkJCWlmICh0aGVPcCA9PSBudWxsKSB7CisgICAgCQkJCQkgICAgdGhlT3AgPSBnc29uSm9iLm5ldyBPcGVyYXRvcihvcE5hbWUxKTsKICAgICAJCQkJCX0KLQkgICAgCQkJCSBtZXRyaWNzLmFkZChhTWV0cmljKTsKKwkgICAgCQkJCSB0aGVPcC5tZXRyaWNzLmFkZChhTWV0cmljKTsKIAkgICAgCQkJIH0KIAkJICAgIAl9CiAJCQl9CmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRSBiL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDNjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRQpAQCAtMCwwICsxLDQyIEBACisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FQQUNIRSBFREdFTlQgU1VCQ09NUE9ORU5UUzoKKworVGhpcyBiaW5hcnkgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoIHNlcGFyYXRlCitjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gIFlvdXIgdXNlIG9mIHRoaXMgYmluYXJ5CitpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMAorRm9yIGRldGFpbHMsIHNlZSBNRVRBLUlORi9saWNlbnNlcy9hcGFjaGUtbGljZW5zZS12ZXJzaW9uLTIuMC50eHQKKworZ3NvbiAoY29tLmdvb2dsZS5jb2RlLmdzb246Z3NvbjoyLjIuNCkKK21ldHJpY3MtY29yZSAoaW8uZHJvcHdpemFyZC5tZXRyaWNzOm1ldHJpY3MtY29yZTozLjEuMikKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTGljZW5zZTogTUlUCisKK2pxdWVyeSAob3JnLndlYmphcnM6anF1ZXJ5OjEuMTEuMikKKyAgICBGb3IgZGV0YWlscywgc2VlIE1FVEEtSU5GL2xpY2Vuc2VzL2pxdWVyeS0xXzExXzItTUlULnR4dC4KKworanF1ZXJ5LXVpIChvcmcud2ViamFyczpqcXVlcnktdWk6MS4xMS40KQorICAgIEZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvanF1ZXJ5LXVpLTFfMTFfNC1NSVQudHh0LgorCitkMy5sZWdlbmQuanMgKHNyYy9tYWluL3dlYmFwcC9qcy9leHQvZDMubGVnZW5kL2QzLmxlZ2VuZC5qcykKKyAgICBodHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1pKT05TU09OLzM5MTgzNjkvcmF3L2JmOWJjZTZiNjhhM2I3MGY4NzQ1MGYxNTU0MzZjYTRhODRhZjFiYTQvZDMubGVnZW5kLmpzCisgICAgV2l0aCBFZGdlbnQgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucy4KKyAgICBGb3IgZGV0YWlscywgc2VlIE1FVEEtSU5GL2xpY2Vuc2VzL2QzLmxlZ2VuZC1NSVQudHh0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMaWNlbnNlOiBCU0QgMy1DbGF1c2UKKworZDMgKG9yZy53ZWJqYXJzLmJvd2VyOmQzOjMuMy45KQorICAgIEZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvZDMtM18zXzktQlNELnR4dC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTGljZW5zZTogQlNEIDItQ2xhdXNlCisKK2QzLXBsdWdpbnMtc2Fua2V5IChvcmcud2ViamFycy5ib3dlcjpkMy1wbHVnaW5zLXNhbmtleToxLjEuMCkKKyAgICBGb3IgZGV0YWlscywgc2VlIE1FVEEtSU5GL2xpY2Vuc2VzL2QzLXBsdWdpbnMtc2Fua2V5LTFfMV8wLUJTRC50eHQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOWU3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCkBAIC0wLDAgKzEsMjggQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGRldmVsb3BlZCBieSBJQk0gQ29ycC4KK0NvcHlyaWdodCBJQk0gQ29ycC4gMjAxNSwgMjAxNgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FQQUNIRSBFREdFTlQgU1VCQ09NUE9ORU5UUzoKKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aCBzZXBhcmF0ZQorY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuICBUaGUgZm9sbG93aW5nIG5vdGljZXMgYXBwbHkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21ldHJpY3MtY29yZSAoaW8uZHJvcHdpemFyZC5tZXRyaWNzOm1ldHJpY3MtY29yZTozLjEuMikKKworTWV0cmljcworQ29weXJpZ2h0IDIwMTAtMjAxMyBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvZGEgSGFsZSBhbmQgWWFtbWVyLCBJbmMuCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgSlNSLTE2NiBwcm9qZWN0IChUaHJlYWRMb2NhbFJhbmRvbSwKK1N0cmlwZWQ2NCwgTG9uZ0FkZGVyKSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWVudHM6CisKKyAgICAgICAgICBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAgICAgICAgICBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAgICAgICAgICBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGFhMWQxCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8d2ViLWFwcCB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZQorICAgICAgICAgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiCisgICAgICAgICB2ZXJzaW9uPSIzLjEiPgorCisgIDxzZXJ2bGV0PgorICAgIDxkaXNwbGF5LW5hbWU+Q29uc29sZSBBcHBsaWNhdGlvbjwvZGlzcGxheS1uYW1lPgorICAgIDxzZXJ2bGV0LW5hbWU+Q29uc29sZVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmVkZ2VudC5jb25zb2xlLnNlcnZsZXRzLkNvbnNvbGVTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICA8L3NlcnZsZXQ+CisKKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPkNvbnNvbGVTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9jb25zb2xlPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgPHNlcnZsZXQ+CisgICAgPGRpc3BsYXktbmFtZT5Kb2IgTGlzdGluZyBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+CisgICAgPHNlcnZsZXQtbmFtZT5Db25zb2xlSm9iU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmxldHMuQ29uc29sZUpvYlNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgIDwvc2VydmxldD4KKworICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+Q29uc29sZUpvYlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+L2pvYnM8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKworICA8c2VydmxldD4KKyAgICA8ZGlzcGxheS1uYW1lPk1ldHJpY3MgTGlzdGluZyBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+CisgICAgPHNlcnZsZXQtbmFtZT5Db25zb2xlTWV0cmljc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmVkZ2VudC5jb25zb2xlLnNlcnZsZXRzLkNvbnNvbGVNZXRyaWNzU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgPC9zZXJ2bGV0PgorCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5Db25zb2xlTWV0cmljc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+L21ldHJpY3M8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKworICA8d2VsY29tZS1maWxlLWxpc3Q+CisgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+CisgIDwvd2VsY29tZS1maWxlLWxpc3Q+CisKKzwvd2ViLWFwcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQ4ZGZjCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApAQCAtMCwwICsxLDEzNCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgorPGh0bWwgeG1sOmxhbmc9ImVuLXVzIj4KKzxoZWFkPgorICAgIDx0aXRsZT5BcGFjaGUgRWRnZW50IENvbnNvbGU8L3RpdGxlPgorCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ianMvZXh0L2pxdWVyeS11aS8xLjExLjQvanF1ZXJ5LXVpLm1pbi5jc3MiPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImpzL2V4dC9qcXVlcnktdWkvMS4xMS40L2pxdWVyeS11aS50aGVtZS5taW4uY3NzIj4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJqcy9leHQvanF1ZXJ5LXVpLzEuMTEuNC9qcXVlcnktdWkuc3RydWN0dXJlLm1pbi5jc3MiPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InJlc291cmNlcy9jc3MvbWFpbi5jc3MiPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InJlc291cmNlcy9jc3MvbWV0cmljcy5jc3MiPgorICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0icmVzb3VyY2VzL2ltYWdlcy9mYXZpY29uLnBuZyIvPgorPC9oZWFkPgorCis8Ym9keT4KKzxkaXYgcm9sZT0ibWFpbiI+CisgICAgPGRpdiBzdHlsZT0nbWFyZ2luLWxlZnQ6MTVweDsgZmxvYXQ6bGVmdDsnPgorICAgICAgICA8aW1nIGhlaWdodD0nODEnIHdpZHRoPScxNzgnIHRhYmluZGV4PTAgYWx0PSJBcGFjaGUgRWRnZW50IGxvZ28iIHRpdGxlPSJBcGFjaGUgRWRnZW50IGxvZ28iCisgICAgICAgICAgICAgc3JjPSJyZXNvdXJjZXMvaW1hZ2VzL2FwYWNoZV9lZGdlbnQucG5nIi8+CisgICAgPC9kaXY+CisgICAgPGRpdiBzdHlsZT0nZmxvYXQ6bGVmdDttYXJnaW4tdG9wOiAzMHB4OyBmb250LXNpemU6IDEuMmVtOyBtYXJnaW4tbGVmdDogMzIwcHg7Jz4KKyAgICAgICAgPGxhYmVsIHRhYmluZGV4PTA+VG9wb2xvZ3kgR3JhcGg8L2xhYmVsPgorICAgIDwvZGl2PgorICAgIDxkaXYgY2xhc3M9InRvcENvbnRyb2xzIiBzdHlsZT0nbWFyZ2luLWxlZnQ6IDMwcHg7Y2xlYXI6Ym90aDsnPgorICAgICAgICA8bGFiZWwgZm9yPSJqb2JzIiBjbGFzcz0iam9ic0xhYmVsIj5Kb2I6PC9sYWJlbD4KKyAgICAgICAgPHNlbGVjdCBpZD0iam9icyI+PC9zZWxlY3Q+CisgICAgPC9kaXY+CisgICAgPGRpdiBpZD0nc3RhdGVJbWcnIHRhYmluZGV4PTAKKyAgICAgICAgIHN0eWxlPSJmbG9hdDpsZWZ0OyBkaXNwbGF5Om5vbmU7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1sZWZ0OiA1cHg7IG1hcmdpbi1yaWdodDogMTBweDsiPgorICAgICAgICA8ZGl2IGNsYXNzPSJoaWRkZW4iPkpvYiBzdGF0ZSwgcHJlc3MgdGhlIEVudGVyIGtleSB0byBkaXNwbGF5IHRoZSBqb2Igc3RhdGUgaW5mb3JtYXRpb24gaW4gYSB0YWJsZTwvZGl2PgorICAgICAgICA8aW1nIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgYWx0PSJqb2Igc3RhdGUiIHNyYz0icmVzb3VyY2VzL2ltYWdlcy9zdGF0ZS5wbmciLz4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJ0b3BDb250cm9scyI+CisgICAgICAgIDxsYWJlbCBmb3I9ImxheWVycyIgY2xhc3M9ImxheWVyc0xhYmVsIj5WaWV3IGJ5OjwvbGFiZWw+CisgICAgICAgIDxzZWxlY3QgdGl0bGU9InZpZXcgYnkiIGlkPSJsYXllcnMiPgorICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ic3RhdGljIj5TdGF0aWMgZmxvdzwvb3B0aW9uPgorICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZmxvdyI+VHVwbGUgY291bnQ8L29wdGlvbj4KKyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Im9wbGV0Q29sb3IiPk9wbGV0IGtpbmQ8L29wdGlvbj4KKyAgICAgICAgPC9zZWxlY3Q+CisKKyAgICAgICAgPGRpdiBpZD0idGFnc0RpdiIgc3R5bGU9InZpc2liaWxpdHk6aGlkZGVuO21hcmdpbi10b3A6IDVweDsiPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9J2NoZWNrYm94JyBpZD0nc2hvd1RhZ3MnIGNoZWNrZWQvPgorICAgICAgICAgICAgPGxhYmVsIGZvcj0nc2hvd1RhZ3MnPlNob3cgdGFnczo8L2xhYmVsPgorICAgICAgICAgICAgPGRpdj4KKworICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdjaGVja2JveCcgaWQ9J3Nob3dBbGxUYWdzJyBjaGVja2VkLz4KKyAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSdzaG93QWxsVGFncyc+U2hvdyBhbGwgdGFnczo8L2xhYmVsPgorICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9InRhZ0RpYWxvZ0J0biIgdHlwZT0nYnV0dG9uJyBkaXNhYmxlZD5TZWxlY3QgaW5kaXZpZHVhbCB0YWdzIC4uLjwvYnV0dG9uPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGlkPSJkaWFsb2ciIHRpdGxlPSJTZWxlY3Qgb25lIG9yIG1vcmUgdGFncyI+CisgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idGFncyIgY2xhc3M9InRhZ3NMYWJlbCI+VGFnOjwvbGFiZWw+CisgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0idGFncyIgbXVsdGlwbGU+PC9zZWxlY3Q+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0idG9wQ29udHJvbHMiPgorICAgICAgICA8bGFiZWwgY2xhc3M9InJlZnJlc2hMYWJlbCIgdGFiaW5kZXg9MD5SZWZyZXNoIGludGVydmFsOjwvbGFiZWw+CisgICAgICAgIDxpbnB1dCBhcmlhLWxhYmVsPSdSZWZyZXNoIGludGVydmFsJyBuYW1lPSdyZWZyZXNoSW50ZXJ2YWwnIGlkPSJyZWZyZXNoSW50ZXJ2YWwiIHN0eWxlPSd3aWR0aDogNDBweDsnCisgICAgICAgICAgICAgICB0eXBlPSJudW1iZXIiIG1pbj0iMyIgbWF4PSIyMCIgc3RlcD0iMSIgdmFsdWU9IjUiLz4KKyAgICAgICAgPGxhYmVsIHRpdGxlPSJzZWNvbmRzIiB0YWJpbmRleD0wIHN0eWxlPSdtYXJnaW4tbGVmdDogNXB4OyBtYXJnaW4tcmlnaHQ6IDEwcHg7Jz5zZWNvbmRzPC9sYWJlbD4KKyAgICAgICAgPGJ1dHRvbiBpZD0idG9nZ2xlVGltZXIiIHRpdGxlPSdQYXVzZSBncmFwaCcgdHlwZT0iYnV0dG9uIj5QYXVzZSBncmFwaDwvYnV0dG9uPgorICAgIDwvZGl2PgorCisgICAgPGRpdiBzdHlsZT0nd2lkdGg6IDM3MHB4OyBtYXJnaW4tbGVmdDogMzBweDsgY2xlYXI6Ym90aDsnPgorICAgICAgICA8ZGl2IGlkPSJzaG93QWxsIiB0YWJpbmRleD0wPgorICAgICAgICAgICAgPGRpdj5WaWV3IGFsbCBvcGxldCBwcm9wZXJ0aWVzPC9kaXY+CisgICAgICAgICAgICA8ZGl2IHN0eWxlPSdmb250LXNpemU6IDAuOTVlbSc+KG9wZW5zIGEgbmV3IHdpbmRvdyk8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgaWQ9ImdyYXBoTGVnZW5kIiBzdHlsZT0naGVpZ2h0OiA2MDBweDsgd2lkdGg6IDM0MHB4Oyc+PC9kaXY+CisgICAgPC9kaXY+CisgICAgPGRpdiBpZD0iY2hhcnQiIHN0eWxlPSJmbG9hdDpyaWdodDsgbWFyZ2luLXJpZ2h0OiAxMDBweDsgbWFyZ2luLXRvcDogLTYwMHB4OyI+CisgICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPkxvYWRpbmcgZ3JhcGggLi4uPC9kaXY+CisgICAgPC9kaXY+CisKKworICAgIDxkaXYgaWQ9Im1ldHJpY3NEaXYiIHN0eWxlPSJjbGVhcjpib3RoO2Rpc3BsYXk6bm9uZTttYXJnaW4tbGVmdDogMzBweDsiPgorICAgICAgICA8ZGl2PgorICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJtZXRyaWNzVGl0bGUiPk1ldHJpY3M8L2xhYmVsPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibWV0cmljc0NvbnRyb2xzIj4KKyAgICAgICAgICAgIDxsYWJlbCBmb3I9J21ldHJpY3MnIGNsYXNzPSJtZXRyaWNzTGFiZWwiPk1ldHJpY3M6PC9sYWJlbD4KKyAgICAgICAgICAgIDxzZWxlY3QgaWQ9Im1ldHJpY3MiPjwvc2VsZWN0PgorICAgICAgICAgICAgPHNwYW4gaWQ9InJhdGVVbml0Ij48L3NwYW4+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgY2xhc3M9Im1ldHJpY3NDb250cm9scyI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSdtQ2hhcnRUeXBlJyBjbGFzcz0iY2hhcnRUeXBlTGFiZWwiPkNoYXJ0IHR5cGU6PC9sYWJlbD4KKyAgICAgICAgICAgIDxzZWxlY3QgaWQ9Im1DaGFydFR5cGUiPgorICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J2JhckNoYXJ0JyBzZWxlY3RlZD5CYXIgY2hhcnQ8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSdsaW5lQ2hhcnQnIHNlbGVjdGVkPkxpbmUgY2hhcnQ8L29wdGlvbj4KKyAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJtZXRyaWNzQ29udHJvbHMiPgorICAgICAgICAgICAgPHNwYW4gaWQ9Im5vTGluZUNoYXJ0V2FybmluZyIgc3R5bGU9InZpc2liaWxpdHk6aGlkZGVuOyIgY2xhc3M9Indhcm5pbmdMYWJlbCI+KkxpbmUgY2hhcnRzIGFyZSBub3QgYXZhaWxhYmxlIHdoZW4geW91IHNlbGVjdCBhIG1ldHJpYyBjb250YWluaW5nIG11bHRpcGxlIG9wbGV0czwvc3Bhbj4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgaWQ9InNob3dNZXRyaWNzVGFibGUiIHRhYmluZGV4PTAgc3R5bGU9J2NsZWFyOmxlZnQ7IHBhZGRpbmctdG9wOiAxMHB4OyB3aWR0aDogMTUwcHg7Jz4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9J2hpZGRlbic+U2hvdyBtZXRyaWNzIGluIHRhYmxlLiBQcmVzcyB0aGUgRW50ZXIga2V5IHRvIGRpc3BsYXkgYXZhaWxhYmxlIG1ldHJpY3MgaW4gYSB0YWJsZS4gVG8KKyAgICAgICAgICAgICAgICBjbG9zZSB0aGUgZGlhbG9nIG9uY2UgaXQgaXMgb3BlbiwgcHJlc3MgdGhlIEVzY2FwZSBrZXkuCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxpbWcgd2lkdGg9IjE1MCIgaGVpZ2h0PSIzOCIgYWx0PSdzaG93IHRhYmxlIG1ldHJpY3MnIHNyYz0icmVzb3VyY2VzL2ltYWdlcy9zaG93X21ldHJpY3NfaW5fdGFibGUucG5nIi8+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgaWQ9Im1ldHJpY3NDaGFydCIgc3R5bGU9ImNsZWFyOmxlZnQ7Ij48L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgorPHNjcmlwdCBzcmM9ImpzL2V4dC9kMy8zLjMuOS9kMy5taW4uanMiIGNoYXJzZXQ9InV0Zi04IiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJqcy9leHQvanF1ZXJ5LzEuMTEuMi9qcXVlcnkubWluLmpzIiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJqcy9leHQvanF1ZXJ5LXVpLzEuMTEuNC9qcXVlcnktdWkubWluLmpzIiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJqcy9leHQvZDMtcGx1Z2lucy1zYW5rZXkvMS4xLjAvc2Fua2V5LmpzIiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJqcy9leHQvZDMubGVnZW5kL2QzLmxlZ2VuZC5qcyIgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ianMvc3RyZWFtdGFncy5qcyIgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ianMvZ3JhcGguanMiIHR5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9ImpzL21ldHJpY3MuanMiIHR5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiPjwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0ianMvaW5kZXguanMiIHR5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL2pzL2V4dC9kMy5sZWdlbmQvZDMubGVnZW5kLmpzIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvanMvZXh0L2QzLmxlZ2VuZC9kMy5sZWdlbmQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljM2M0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL2pzL2V4dC9kMy5sZWdlbmQvZDMubGVnZW5kLmpzCkBAIC0wLDAgKzEsMTkzIEBACisvLyBkMy5sZWdlbmQuanMKKy8vIChDKSAyMDEyIHppZ2d5LmpvbnNzb24ubnljQGdtYWlsLmNvbQorLy8gTUlUIGxpY2VuY2UKKworLy8gRWRnZW50IG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250ZW50LmNvbS9aSk9OU1NPTi8zOTE4MzY5L3Jhdy9iZjliY2U2YjY4YTNiNzBmODc0NTBmMTU1NDM2Y2E0YTg0YWYxYmE0L2QzLmxlZ2VuZC5qcworCisoZnVuY3Rpb24oKSB7CisgICAgZDMubGVnZW5kID0gZnVuY3Rpb24oZywgY2hhcnRTdmcsIHBJdGVtcywgbGVnZW5kVGl0bGUpIHsKKyAgICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGc9IGQzLnNlbGVjdCh0aGlzKTsKKyAgICAgICAgICAgIHZhciBpdGVtcyA9IHt9OworICAgICAgICAgICAgdmFyIHN2ZyA9ICFjaGFydFN2ZyA/IGQzLnNlbGVjdChnLnByb3BlcnR5KCJuZWFyZXN0Vmlld3BvcnRFbGVtZW50IikpIDogY2hhcnRTdmc7CisgICAgICAgICAgICB2YXIgaXNUdXBsZUZsb3dMZWdlbmQgPSBmYWxzZTsKKyAgICAgICAgICAgIHZhciBpc1JlY3QgPSBmdW5jdGlvbihkKSB7CisgICAgICAgICAgICAgICAgdmFyIGsgPSBkLmtleS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBrLnN0YXJ0c1dpdGgoIkNPVU5URVJPUCIpCisgICAgICAgICAgICAgICAgICAgIHx8IGsuc3RhcnRzV2l0aCgiU1RSRUFNU0NPUEUiKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZhcglsZWdlbmRQYWRkaW5nID0gZy5hdHRyKCJkYXRhLXN0eWxlLXBhZGRpbmciKSB8fCA1LAorICAgICAgICAgICAgICAgIGxUaXRsZUl0ZW1zID0gZy5zZWxlY3RBbGwoIi5sZWdlbmQtdGl0bGUtaXRlbXMiKS5kYXRhKFt0cnVlXSksCisgICAgICAgICAgICAgICAgbGIgPSBnLnNlbGVjdEFsbCgiLmxlZ2VuZC1ib3giKS5kYXRhKFt0cnVlXSksCisgICAgICAgICAgICAgICAgbGkgPSBnLnNlbGVjdEFsbCgiLmxlZ2VuZC1pdGVtcyIpLmRhdGEoW3RydWVdKQorCisgICAgICAgICAgICBsVGl0bGVJdGVtcy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxlZ2VuZC10aXRsZS1pdGVtcyIsIHRydWUpCisgICAgICAgICAgICBsYi5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoImxlZ2VuZC1ib3giLHRydWUpCisgICAgICAgICAgICBsaUcgPSBsaS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxlZ2VuZC1pdGVtcyIsdHJ1ZSkKKworICAgICAgICAgICAgaWYgKHBJdGVtcykgeworICAgICAgICAgICAgICAgIHBJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKHApeworICAgICAgICAgICAgICAgICAgICBpZiAocC5pZHggIT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbcC5uYW1lXSA9IHtjb2xvcjogcC5maWxsLCBpZHg6IHAuaWR4fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzVHVwbGVGbG93TGVnZW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW3AubmFtZV0gPSB7Y29sb3I6IHAuZmlsbH07CisgICAgICAgICAgICAgICAgICAgICAgICBpc1R1cGxlRmxvd0xlZ2VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN2Zy5zZWxlY3RBbGwoIltkYXRhLWxlZ2VuZF0iKS5lYWNoKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IGQzLnNlbGVjdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbXNbc2VsZi5hdHRyKCJkYXRhLWxlZ2VuZCIpXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA6IHNlbGYuYXR0cigiZGF0YS1sZWdlbmQtcG9zIikgfHwgdGhpcy5nZXRCQm94KCkueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIDogc2VsZi5hdHRyKCJkYXRhLWxlZ2VuZC1jb2xvciIpICE9IHVuZGVmaW5lZCA/IHNlbGYuYXR0cigiZGF0YS1sZWdlbmQtY29sb3IiKSA6IHNlbGYuc3R5bGUoImZpbGwiKSAhPSAnbm9uZScgPyBzZWxmLnN0eWxlKCJmaWxsIikgOiBzZWxmLnN0eWxlKCJzdHJva2UiKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc1R1cGxlRmxvd0xlZ2VuZCkKKyAgICAgICAgICAgICAgICBpdGVtcyA9IGQzLmVudHJpZXMoaXRlbXMpLnNvcnQoCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGEsYikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEudmFsdWUuaWR4IDwgYi52YWx1ZS5pZHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEudmFsdWUuaWR4ID4gYi52YWx1ZS5pZHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZWxzZSAgeworICAgICAgICAgICAgICAgIGl0ZW1zID0gZDMuZW50cmllcyhpdGVtcykuc29ydCgKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oYSxiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWN0IGJlZm9yZSBjaXJjbGUgLSBncmFwaGljIHBvc2l0aW9uaW5nIGNvZGUgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYSA9IGlzUmVjdChhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYiA9IGlzUmVjdChiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYSAmJiAhcmIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyYSAmJiByYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEua2V5IDwgYi5rZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEua2V5ID4gYi5rZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsaS5zZWxlY3RBbGwoInRleHQiKQorICAgICAgICAgICAgICAgIC5kYXRhKGl0ZW1zLGZ1bmN0aW9uKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQua2V5fQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuY2FsbChmdW5jdGlvbihkKSB7IGQuZW50ZXIoKS5hcHBlbmQoInRleHQiKX0pCisgICAgICAgICAgICAgICAgLmNhbGwoZnVuY3Rpb24oZCkgeyBkLmV4aXQoKS5yZW1vdmUoKX0pCisgICAgICAgICAgICAgICAgLmF0dHIoInkiLGZ1bmN0aW9uKGQsaSkgeyByZXR1cm4gaSsiZW0ifSkKKyAgICAgICAgICAgICAgICAuYXR0cigieCIsIjEuNWVtIikKKyAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmtleTsKKyAgICAgICAgICAgICAgICB9KQorCisgICAgICAgICAgICB2YXIgbGVnZW5kT3BhY2l0eSA9IDAuNzsKKyAgICAgICAgICAgIGlmIChsZWdlbmRUaXRsZSAmJiBsZWdlbmRUaXRsZSA9PT0gIlN0cmVhbSB0YWdzIikgeworICAgICAgICAgICAgICAgIGxlZ2VuZE9wYWNpdHkgPSAxLjA7CisgICAgICAgICAgICAgICAgbGkuc2VsZWN0QWxsKCJyZWN0IikKKyAgICAgICAgICAgICAgICAgICAgLmRhdGEoaXRlbXMsZnVuY3Rpb24oZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQua2V5fQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIC5jYWxsKGZ1bmN0aW9uKGQpIHsgZC5lbnRlcigpLmFwcGVuZCgicmVjdCIpfSkKKyAgICAgICAgICAgICAgICAgICAgLmNhbGwoZnVuY3Rpb24oZCkgeyBkLmV4aXQoKS5yZW1vdmUoKX0pCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCxpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS0wLjc1KyAiZW0ifSkKKyAgICAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgMTApCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCA4KQorICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnZhbHVlLmNvbG9yID09PSAiI2M3YzdjNyIgPyAiIzAwODA4MCIgOiBkLnZhbHVlLmNvbG9yOworICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsICJub25lIikKKyAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmaWxsLW9wYWNpdHkiLCBsZWdlbmRPcGFjaXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVnZW5kVGl0bGUgJiYgbGVnZW5kVGl0bGUgPT09ICJPcGxldCBraW5kIiB8fCBsZWdlbmRUaXRsZSA9PT0gIlR1cGxlIGNvdW50Iil7CisgICAgICAgICAgICAgICAgbGlHLnNlbGVjdEFsbCgiZyIpCisgICAgICAgICAgICAgICAgICAgIC5kYXRhKGl0ZW1zLCBmdW5jdGlvbihkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5rZXk7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5lbnRlcigpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZnVuY3Rpb24oZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVjdChkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZDMubnMucHJlZml4LnN2ZywgJ3JlY3QnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkMy5ucy5wcmVmaXguc3ZnLCAnY2lyY2xlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgLy8gcmVjdHMgYmVmb3JlIGNpcmNsZXMKKyAgICAgICAgICAgICAgICB2YXIgY291bnQgPSAwOworICAgICAgICAgICAgICAgIGxpLnNlbGVjdEFsbCgicmVjdCIpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwgLTMpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCxpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGktMC43NSsgImVtIn0pCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIGxlZ2VuZFRpdGxlID09PSAiT3BsZXQga2luZCIgPyA4IDogMTApCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCA4KQorICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnZhbHVlLmNvbG9yCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgIm5vbmUiKQorICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIGxlZ2VuZE9wYWNpdHkpOworCisgICAgICAgICAgICAgICAgbGkuc2VsZWN0QWxsKCJjaXJjbGUiKQorICAgICAgICAgICAgICAgICAgICAuYXR0cigiY3kiLGZ1bmN0aW9uKGQsaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpK2NvdW50KS0wLjI1KyJlbSJ9KQorICAgICAgICAgICAgICAgICAgICAuYXR0cigiY3giLDApCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJyIiwiMC40ZW0iKQorICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnZhbHVlLmNvbG9yCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZmlsbC1vcGFjaXR5IiwgbGVnZW5kT3BhY2l0eSk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGkuc2VsZWN0QWxsKCJjaXJjbGUiKQorICAgICAgICAgICAgICAgICAgICAuZGF0YShpdGVtcyxmdW5jdGlvbihkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5rZXl9CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgLmNhbGwoZnVuY3Rpb24oZCkgeyBkLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKX0pCisgICAgICAgICAgICAgICAgICAgIC5jYWxsKGZ1bmN0aW9uKGQpIHsgZC5leGl0KCkucmVtb3ZlKCl9KQorICAgICAgICAgICAgICAgICAgICAuYXR0cigiY3kiLGZ1bmN0aW9uKGQsaSkgeyByZXR1cm4gaS0wLjI1KyJlbSJ9KQorICAgICAgICAgICAgICAgICAgICAuYXR0cigiY3giLDApCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJyIiwiMC40ZW0iKQorICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnZhbHVlLmNvbG9yCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZmlsbC1vcGFjaXR5IiwgbGVnZW5kT3BhY2l0eSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZXBvc2l0aW9uIGFuZCByZXNpemUgdGhlIGJveAorICAgICAgICAgICAgdmFyIGxiYm94ID0gbGlbMF1bMF0uZ2V0QkJveCgpOworICAgICAgICAgICAgbGIuYXR0cigieCIsKGxiYm94LngtbGVnZW5kUGFkZGluZykpCisgICAgICAgICAgICAgICAgLmF0dHIoInkiLChsYmJveC55LWxlZ2VuZFBhZGRpbmcpKQorICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLChsYmJveC5oZWlnaHQrMipsZWdlbmRQYWRkaW5nKSkKKyAgICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCgobGJib3gud2lkdGgrMTIpICsgMipsZWdlbmRQYWRkaW5nKSk7CisKKyAgICAgICAgICAgIGxUaXRsZUl0ZW1zLmF0dHIoIngiLCAwKQorICAgICAgICAgICAgICAgIC5hdHRyKCJ5IiwgKGxiYm94LnkgLSBsZWdlbmRQYWRkaW5nIC0gMTUpKQorICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLDE1KQorICAgICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsKGxiYm94LndpZHRoKzIqbGVnZW5kUGFkZGluZykpOworICAgICAgICAgICAgaWYgKGxlZ2VuZFRpdGxlKSB7CisgICAgICAgICAgICAgICAgbFRpdGxlSXRlbXMuc2VsZWN0QWxsKCJ0ZXh0IikKKyAgICAgICAgICAgICAgICAgICAgLmRhdGEoWyIiXSxmdW5jdGlvbihkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVnZW5kVGl0bGU7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5jYWxsKGZ1bmN0aW9uKGQpIHsgZC5lbnRlcigpLmFwcGVuZCgidGV4dCIpfSkKKyAgICAgICAgICAgICAgICAgICAgLmNhbGwoZnVuY3Rpb24oZCkgeyBkLmV4aXQoKS5yZW1vdmUoKX0pCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ5IixmdW5jdGlvbihkLGkpIHsgcmV0dXJuICItMmVtIn0pCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwobGJib3gueC1sZWdlbmRQYWRkaW5nKSkKKyAgICAgICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2VuZFRpdGxlOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9KQorICAgICAgICByZXR1cm4gZworICAgIH0KK30pKCkKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZ3JhcGguanMgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9qcy9ncmFwaC5qcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9ncmFwaC5qcwpyZW5hbWUgdG8gY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvanMvZ3JhcGguanMKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvaW5kZXguanMgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9qcy9pbmRleC5qcwpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBjb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2luZGV4LmpzCnJlbmFtZSB0byBjb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9qcy9pbmRleC5qcwppbmRleCA0M2EzZTEyLi45NDlkMjAyIDEwMDY0NAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2luZGV4LmpzCisrKyBiL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL2pzL2luZGV4LmpzCkBAIC0yNDAsMTAgKzI0MCwxMCBAQAogCiB2YXIgcGF0aCA9IGQzLnN2Zy5kaWFnb25hbCgpCiAuc291cmNlKGZ1bmN0aW9uKGQpIHsgCi0JcmV0dXJuIHsieCI6ZC5zb3VyY2VJZHgueSArIGQuc291cmNlSWR4LmR5LzIsICJ5IjpkLnNvdXJjZUlkeC54ICsgc2Fua2V5Lm5vZGVXaWR0aCgpLzJ9OyAKKwlyZXR1cm4geyJ4IjpkLnNvdXJjZS55ICsgZC5zb3VyY2UuZHkvMiwgInkiOmQuc291cmNlLnggKyBzYW5rZXkubm9kZVdpZHRoKCkvMn07CiAgfSkgICAgICAgICAgICAKIC50YXJnZXQoZnVuY3Rpb24oZCkgeyAKLQlyZXR1cm4geyJ4IjpkLnRhcmdldElkeC55ICsgZC50YXJnZXRJZHguZHkvMiwgInkiOmQudGFyZ2V0SWR4LnggKyBzYW5rZXkubm9kZVdpZHRoKCkvMn07IAorCXJldHVybiB7IngiOmQudGFyZ2V0LnkgKyBkLnRhcmdldC5keS8yLCAieSI6ZC50YXJnZXQueCArIHNhbmtleS5ub2RlV2lkdGgoKS8yfTsKICB9KQogLnByb2plY3Rpb24oZnVuY3Rpb24oZCkgeyAKIAlyZXR1cm4gW2QueSwgZC54XTsgCkBAIC03MDMsOCArNzAzLDggQEAKIAkJdmFyIHNvdXJjZVN0cmVhbUFsaWFzZXNNYXAgPSBuZXcgTWFwKCk7CiAJCXZhciBzb3VyY2VTdHJlYW1UYWdzTWFwID0gbmV3IE1hcCgpOwogCQluLnRhcmdldExpbmtzLmZvckVhY2goZnVuY3Rpb24odHJnKSB7Ci0JCQl2YXIgc291cmNlID0gdHJnLnNvdXJjZUlkeC5pZHgudG9TdHJpbmcoKTsKLQkJCXZhciBzb3VyY2VMaW5rcyA9IHRyZy5zb3VyY2VJZHguc291cmNlTGlua3M7CisJCQl2YXIgc291cmNlID0gdHJnLnNvdXJjZS5pZHgudG9TdHJpbmcoKTsKKwkJCXZhciBzb3VyY2VMaW5rcyA9IHRyZy5zb3VyY2Uuc291cmNlTGlua3M7CiAJCQlmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZUxpbmtzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKHRyZy5zb3VyY2VJZCA9PSBzb3VyY2VMaW5rc1tpXS5zb3VyY2VJZCAmJiB0cmcudGFyZ2V0SWQgPT0gc291cmNlTGlua3NbaV0udGFyZ2V0SWQpIHsKIAkJCQkJaWYgKGxheWVyID09ICJzdGF0aWMiKSB7CkBAIC03MzEsOCArNzMxLDggQEAKIAkJdmFyIHRhcmdldFN0cmVhbUFsaWFzZXNNYXAgPSBuZXcgTWFwKCk7CiAJCXZhciB0YXJnZXRTdHJlYW1UYWdzTWFwID0gbmV3IE1hcCgpOwogCQluLnNvdXJjZUxpbmtzLmZvckVhY2goZnVuY3Rpb24oc3JjKSB7Ci0JCQl2YXIgdGFyZ2V0ID0gc3JjLnRhcmdldElkeC5pZHgudG9TdHJpbmcoKTsKLQkJCXZhciB0YXJnZXRMaW5rcyA9IHNyYy50YXJnZXRJZHgudGFyZ2V0TGlua3M7CisJCQl2YXIgdGFyZ2V0ID0gc3JjLnRhcmdldC5pZHgudG9TdHJpbmcoKTsKKwkJCXZhciB0YXJnZXRMaW5rcyA9IHNyYy50YXJnZXQudGFyZ2V0TGlua3M7CiAJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldExpbmtzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKHNyYy5zb3VyY2VJZCA9PSB0YXJnZXRMaW5rc1tpXS5zb3VyY2VJZCAmJiBzcmMudGFyZ2V0SWQgPT0gdGFyZ2V0TGlua3NbaV0udGFyZ2V0SWQpIHsKIAkJCQkJaWYgKGxheWVyID09ICJzdGF0aWMiKSB7CkBAIC0xMDc1LDggKzEwNzUsOCBAQAogCQkJCXZhbHVlID0gZWRnZS52YWx1ZTsKIAkJCX0KIAkJCWVkZ2UudmFsdWUgPSB2YWx1ZTsKLQkJCWVkZ2Uuc291cmNlSWR4ID0gdmVydGV4TWFwW2VkZ2Uuc291cmNlSWRdLmlkeDsKLQkJCWVkZ2UudGFyZ2V0SWR4ID0gdmVydGV4TWFwW2VkZ2UudGFyZ2V0SWRdLmlkeDsKKwkJCWVkZ2Uuc291cmNlID0gdmVydGV4TWFwW2VkZ2Uuc291cmNlSWRdLmlkeDsKKwkJCWVkZ2UudGFyZ2V0ID0gdmVydGV4TWFwW2VkZ2UudGFyZ2V0SWRdLmlkeDsKIAkJCWkrKzsKIAkJCWlmIChlZGdlLnRhZ3MgJiYgZWRnZS50YWdzLmxlbmd0aCA+IDApIHsKIAkJCQlzZXRBdmFpbGFibGVUYWdzKGVkZ2UudGFncyk7CkBAIC0xMTY1LDEwICsxMTY1LDEwIEBACiAgICAgCSAgfSBlbHNlIGlmIChkLmlzWmVybykgewogICAgIAkJICB2YWx1ZSA9ICIwIjsKICAgICAJICB9Ci0gICAgCSAgdmFyIHNLaW5kID0gcGFyc2VPcGxldEtpbmQoZC5zb3VyY2VJZHguaW52b2NhdGlvbi5raW5kKTsKLSAgICAJICB2YXIgdEtpbmQgPSBwYXJzZU9wbGV0S2luZChkLnRhcmdldElkeC5pbnZvY2F0aW9uLmtpbmQpOwotICAgIAkgIHZhciByZXRTdHJpbmcgPSAiT3BsZXQgbmFtZTogIiArIGQuc291cmNlSWR4LmlkeCArICJcbk9wbGV0IGtpbmQ6ICIgKyBzS2luZCArICIgLS0+IFxuIgotICAgIAkgICsgIk9wbGV0IG5hbWU6ICIgKyBkLnRhcmdldElkeC5pZHggKyAiXG5PcGxldCBraW5kOiAiICsgdEtpbmQgKyAiXG4iICsgdmFsdWU7CisgICAgCSAgdmFyIHNLaW5kID0gcGFyc2VPcGxldEtpbmQoZC5zb3VyY2UuaW52b2NhdGlvbi5raW5kKTsKKyAgICAJICB2YXIgdEtpbmQgPSBwYXJzZU9wbGV0S2luZChkLnRhcmdldC5pbnZvY2F0aW9uLmtpbmQpOworICAgIAkgIHZhciByZXRTdHJpbmcgPSAiT3BsZXQgbmFtZTogIiArIGQuc291cmNlLmlkeCArICJcbk9wbGV0IGtpbmQ6ICIgKyBzS2luZCArICIgLS0+IFxuIgorICAgIAkgICsgIk9wbGV0IG5hbWU6ICIgKyBkLnRhcmdldC5pZHggKyAiXG5PcGxldCBraW5kOiAiICsgdEtpbmQgKyAiXG4iICsgdmFsdWU7CiAKICAgICAJICBpZiAoZC5hbGlhcykgewogICAgIAkJICByZXRTdHJpbmcgKz0gIlxuU3RyZWFtIGFsaWFzOiAiICsgZC5hbGlhczsKQEAgLTEzMDgsOCArMTMwOCw4IEBACiAJCXZhciBzb3VyY2VTdHJlYW1BbGlhc2VzTWFwID0gbmV3IE1hcCgpOwogCQl2YXIgc291cmNlU3RyZWFtVGFnc01hcCA9IG5ldyBNYXAoKTsKIAkJZC50YXJnZXRMaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKHRyZykgewotCQkJdmFyIHNvdXJjZSA9IHRyZy5zb3VyY2VJZHguaWR4LnRvU3RyaW5nKCk7Ci0JCQl2YXIgc291cmNlTGlua3MgPSB0cmcuc291cmNlSWR4LnNvdXJjZUxpbmtzOworCQkJdmFyIHNvdXJjZSA9IHRyZy5zb3VyY2UuaWR4LnRvU3RyaW5nKCk7CisJCQl2YXIgc291cmNlTGlua3MgPSB0cmcuc291cmNlLnNvdXJjZUxpbmtzOwogCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2VMaW5rcy5sZW5ndGg7IGkrKykgewogCQkJCWlmICh0cmcuc291cmNlSWQgPT0gc291cmNlTGlua3NbaV0uc291cmNlSWQgJiYgdHJnLnRhcmdldElkID09IHNvdXJjZUxpbmtzW2ldLnRhcmdldElkKSB7CiAJCQkJCWlmIChsYXllciA9PSAic3RhdGljIikgewpAQCAtMTMzNyw4ICsxMzM3LDggQEAKIAkJdmFyIHRhcmdldFN0cmVhbUFsaWFzZXNNYXAgPSBuZXcgTWFwKCk7CiAJCXZhciB0YXJnZXRTdHJlYW1UYWdzTWFwID0gbmV3IE1hcCgpOwogCQlkLnNvdXJjZUxpbmtzLmZvckVhY2goZnVuY3Rpb24oc3JjKSB7Ci0JCQl2YXIgdGFyZ2V0ID0gc3JjLnRhcmdldElkeC5pZHgudG9TdHJpbmcoKTsKLQkJCXZhciB0YXJnZXRMaW5rcyA9IHNyYy50YXJnZXRJZHgudGFyZ2V0TGlua3M7CisJCQl2YXIgdGFyZ2V0ID0gc3JjLnRhcmdldC5pZHgudG9TdHJpbmcoKTsKKwkJCXZhciB0YXJnZXRMaW5rcyA9IHNyYy50YXJnZXQudGFyZ2V0TGlua3M7CiAJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldExpbmtzLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKHNyYy5zb3VyY2VJZCA9PSB0YXJnZXRMaW5rc1tpXS5zb3VyY2VJZCAmJiBzcmMudGFyZ2V0SWQgPT0gdGFyZ2V0TGlua3NbaV0udGFyZ2V0SWQpIHsKIAkJCQkJaWYgKGxheWVyID09ICJzdGF0aWMiKSB7CmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL21ldHJpY3MuanMgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9qcy9tZXRyaWNzLmpzCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvbWV0cmljcy5qcwpyZW5hbWUgdG8gY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvanMvbWV0cmljcy5qcwppbmRleCA1YzNiZDhjLi45ZDNjMmU4IDEwMDY0NAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL21ldHJpY3MuanMKKysrIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvanMvbWV0cmljcy5qcwpAQCAtNTQsNyArNTQsNiBAQAogCQkJCQkgIHZhciBtZXRyaWNzID0gb3AubWV0cmljczsKIAkJCQkJICBtZXRyaWNzLmZvckVhY2goZnVuY3Rpb24obWV0KSB7CiAJCQkJCQkgb2JqLnR5cGUgPSBtZXQudHlwZTsKLQkJCQkJCSBvYmoub3BJZCA9IG9iai5vcElkOwogCQkJCQkJIG9iai5uYW1lID0gbWV0Lm5hbWU7CiAJCQkJCQkgb2JqLnZhbHVlID0gbWV0LnZhbHVlOwogCQkJCQkgIH0pOwpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9zdHJlYW10YWdzLmpzIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvanMvc3RyZWFtdGFncy5qcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9zdHJlYW10YWdzLmpzCnJlbmFtZSB0byBjb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9qcy9zdHJlYW10YWdzLmpzCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9jc3MvbWFpbi5jc3MgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY3NzL21haW4uY3NzCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGNvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvcmVzb3VyY2VzL2Nzcy9tYWluLmNzcwpyZW5hbWUgdG8gY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2Nzcy9tYWluLmNzcwppbmRleCA3NDk4YWIwLi4zZDI4MWE1IDEwMDY0NAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9jc3MvbWFpbi5jc3MKKysrIGIvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2Nzcy9tYWluLmNzcwpAQCAtMTUxLDggKzE1MSw3IEBACiAKIC51aS13aWRnZXQtb3ZlcmxheSB7CiAJb3BhY2l0eTogMC4yOwotCWJhY2tncm91bmQtY29sb3I6IHN0ZWVsYmx1ZTsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOworCWJhY2tncm91bmQ6IHN0ZWVsYmx1ZSBub25lOwogfQogCiAjbWV0cmljcyB7CmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9jc3MvbWV0cmljcy5jc3MgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvY3NzL21ldHJpY3MuY3NzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9jc3MvbWV0cmljcy5jc3MKcmVuYW1lIHRvIGNvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9jc3MvbWV0cmljcy5jc3MKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvcmVzb3VyY2VzL2ltYWdlcy9hcGFjaGVfZWRnZW50LnBuZyBiL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9pbWFnZXMvYXBhY2hlX2VkZ2VudC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvcmVzb3VyY2VzL2ltYWdlcy9hcGFjaGVfZWRnZW50LnBuZwpyZW5hbWUgdG8gY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2ltYWdlcy9hcGFjaGVfZWRnZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9pbWFnZXMvZmF2aWNvbi5wbmcgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvaW1hZ2VzL2Zhdmljb24ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9pbWFnZXMvZmF2aWNvbi5wbmcKcmVuYW1lIHRvIGNvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9pbWFnZXMvZmF2aWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9yZXNvdXJjZXMvaW1hZ2VzL3Nob3dfbWV0cmljc19pbl90YWJsZS5wbmcgYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvaW1hZ2VzL3Nob3dfbWV0cmljc19pbl90YWJsZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvcmVzb3VyY2VzL2ltYWdlcy9zaG93X21ldHJpY3NfaW5fdGFibGUucG5nCnJlbmFtZSB0byBjb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvaW1hZ2VzL3Nob3dfbWV0cmljc19pbl90YWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9yZXNvdXJjZXMvaW1hZ2VzL3N0YXRlLnBuZyBiL2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9pbWFnZXMvc3RhdGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9pbWFnZXMvc3RhdGUucG5nCnJlbmFtZSB0byBjb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvaW1hZ2VzL3N0YXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9qc29uL3NhbXBsZWdyYXBoLmpzb24gYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvanNvbi9zYW1wbGVncmFwaC5qc29uCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L3Jlc291cmNlcy9qc29uL3NhbXBsZWdyYXBoLmpzb24KcmVuYW1lIHRvIGNvbnNvbGUvc2VydmxldHMvc3JjL21haW4vd2ViYXBwL3Jlc291cmNlcy9qc29uL3NhbXBsZWdyYXBoLmpzb24KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvcmVzb3VyY2VzL2pzb24vc2FtcGxlZ3JhcGhfaGVhbHRoLmpzb24gYi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL3dlYmFwcC9yZXNvdXJjZXMvanNvbi9zYW1wbGVncmFwaF9oZWFsdGguanNvbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9yZXNvdXJjZXMvanNvbi9zYW1wbGVncmFwaF9oZWFsdGguanNvbgpyZW5hbWUgdG8gY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi93ZWJhcHAvcmVzb3VyY2VzL2pzb24vc2FtcGxlZ3JhcGhfaGVhbHRoLmpzb24KZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvV0VCLUlORi9jb25zb2xlLnhtbCBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvV0VCLUlORi9jb25zb2xlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1Mjk5OC4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L1dFQi1JTkYvY29uc29sZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIAotICAgICAgICAgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiCi0gICAgdmVyc2lvbj0iMy4xIj4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5Db25zb2xlIEFwcGxpY2F0aW9uPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29uc29sZVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2bGV0cy5Db25zb2xlU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29uc29sZVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9jb25zb2xlPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgICAgIDxzZXJ2bGV0PgotICAgPGRpc3BsYXktbmFtZT5Kb2IgTGlzdGluZyBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29uc29sZUpvYlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2bGV0cy5Db25zb2xlSm9iU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29uc29sZUpvYlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9qb2JzPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldD4KLSAgICAgIAk8ZGlzcGxheS1uYW1lPk1ldHJpY3MgTGlzdGluZyBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0gICAgIAk8c2VydmxldC1uYW1lPkNvbnNvbGVNZXRyaWNzU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAJPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2bGV0cy5Db25zb2xlTWV0cmljc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgIAk8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgIDwvc2VydmxldD4KLSAgICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgIAk8c2VydmxldC1uYW1lPkNvbnNvbGVNZXRyaWNzU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgCTx1cmwtcGF0dGVybj4vbWV0cmljczwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bTwvd2VsY29tZS1maWxlPgotICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci08L3dlYi1hcHA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9odG1sL2luZGV4Lmh0bWwgYi9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2h0bWwvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlZjAyYS4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2h0bWwvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIiAKLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPHRpdGxlPkFwYWNoZSBFZGdlbnQgQ29uc29sZTwvdGl0bGU+Ci0KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImpzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9qcXVlcnktdWkubWluLmNzcyI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJqcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vanF1ZXJ5LXVpLnRoZW1lLm1pbi5jc3MiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ianMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2pxdWVyeS11aS5zdHJ1Y3R1cmUubWluLmNzcyI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJyZXNvdXJjZXMvY3NzL21haW4uY3NzIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InJlc291cmNlcy9jc3MvbWV0cmljcy5jc3MiPgotPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJyZXNvdXJjZXMvaW1hZ2VzL2Zhdmljb24ucG5nIiAvPgotPC9oZWFkPgotCi08Ym9keT4KLTxkaXYgcm9sZT0ibWFpbiI+Ci08ZGl2IHN0eWxlPSdtYXJnaW4tbGVmdDoxNXB4OyBmbG9hdDpsZWZ0Oyc+Ci08aW1nIGhlaWdodD0nODEnIHdpZHRoPScxNzgnIHRhYmluZGV4PTAgYWx0PSJBcGFjaGUgRWRnZW50IGxvZ28iIHRpdGxlPSJBcGFjaGUgRWRnZW50IGxvZ28iIHNyYz0icmVzb3VyY2VzL2ltYWdlcy9hcGFjaGVfZWRnZW50LnBuZyIvPgotPC9kaXY+Ci08ZGl2IHN0eWxlPSdmbG9hdDpsZWZ0O21hcmdpbi10b3A6IDMwcHg7IGZvbnQtc2l6ZTogMS4yZW07IG1hcmdpbi1sZWZ0OiAzMjBweDsnPgotPGxhYmVsIHRhYmluZGV4PTA+VG9wb2xvZ3kgR3JhcGg8L2xhYmVsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJ0b3BDb250cm9scyIgc3R5bGU9J21hcmdpbi1sZWZ0OiAzMHB4O2NsZWFyOmJvdGg7Jz4KLTxsYWJlbCBmb3I9ImpvYnMiIGNsYXNzPSJqb2JzTGFiZWwiPkpvYjo8L2xhYmVsPgotPHNlbGVjdCBpZD0iam9icyI+PC9zZWxlY3Q+Ci08L2Rpdj4KLTxkaXYgaWQ9J3N0YXRlSW1nJyB0YWJpbmRleD0wIHN0eWxlPSJmbG9hdDpsZWZ0OyBkaXNwbGF5Om5vbmU7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1sZWZ0OiA1cHg7IG1hcmdpbi1yaWdodDogMTBweDsiPgotPGRpdiBjbGFzcz0iaGlkZGVuIj5Kb2Igc3RhdGUsIHByZXNzIHRoZSBFbnRlciBrZXkgdG8gZGlzcGxheSB0aGUgam9iIHN0YXRlIGluZm9ybWF0aW9uIGluIGEgdGFibGU8L2Rpdj4KLTxpbWcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiBhbHQ9ImpvYiBzdGF0ZSIgc3JjPSJyZXNvdXJjZXMvaW1hZ2VzL3N0YXRlLnBuZyIvPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJ0b3BDb250cm9scyI+Ci08bGFiZWwgZm9yPSJsYXllcnMiIGNsYXNzPSJsYXllcnNMYWJlbCI+VmlldyBieTo8L2xhYmVsPgotPHNlbGVjdCB0aXRsZT0idmlldyBieSIgaWQ9ImxheWVycyI+Ci08b3B0aW9uIHZhbHVlPSJzdGF0aWMiPlN0YXRpYyBmbG93PC9vcHRpb24+Ci08b3B0aW9uIHZhbHVlPSJmbG93Ij5UdXBsZSBjb3VudDwvb3B0aW9uPgotPG9wdGlvbiB2YWx1ZT0ib3BsZXRDb2xvciI+T3BsZXQga2luZDwvb3B0aW9uPgotPC9zZWxlY3Q+Ci0KLTxkaXYgaWQ9InRhZ3NEaXYiIHN0eWxlPSJ2aXNpYmlsaXR5OmhpZGRlbjttYXJnaW4tdG9wOiA1cHg7Ij4KLQk8aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSdzaG93VGFncycgY2hlY2tlZC8+Ci0JPGxhYmVsIGZvcj0nc2hvd1RhZ3MnPlNob3cgdGFnczo8L2xhYmVsPgotCTxkaXY+Ci0JCQotCQk8aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSdzaG93QWxsVGFncycgY2hlY2tlZC8+Ci0JCTxsYWJlbCBmb3I9J3Nob3dBbGxUYWdzJz5TaG93IGFsbCB0YWdzOjwvbGFiZWw+Ci0JCTxidXR0b24gaWQ9InRhZ0RpYWxvZ0J0biIgdHlwZT0nYnV0dG9uJyBkaXNhYmxlZD5TZWxlY3QgaW5kaXZpZHVhbCB0YWdzIC4uLjwvYnV0dG9uPgotCTwvZGl2PgotCQk8ZGl2IGlkPSJkaWFsb2ciIHRpdGxlPSJTZWxlY3Qgb25lIG9yIG1vcmUgdGFncyI+Ci0JCQk8bGFiZWwgZm9yPSJ0YWdzIiBjbGFzcz0idGFnc0xhYmVsIj5UYWc6PC9sYWJlbD4KLQkJCTxzZWxlY3QgaWQ9InRhZ3MiIG11bHRpcGxlPjwvc2VsZWN0PgotCQk8L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJ0b3BDb250cm9scyI+Ci08bGFiZWwgY2xhc3M9InJlZnJlc2hMYWJlbCIgdGFiaW5kZXg9MD5SZWZyZXNoIGludGVydmFsOjwvc3Bhbj4KLTxpbnB1dCBhcmlhLWxhYmVsPSdSZWZyZXNoIGludGVydmFsJyBuYW1lPSdyZWZyZXNoSW50ZXJ2YWwnIGlkPSJyZWZyZXNoSW50ZXJ2YWwiIHN0eWxlPSd3aWR0aDogNDBweDsnIHR5cGU9Im51bWJlciIgbWluPSIzIiBtYXg9IjIwIiBzdGVwPSIxIiB2YWx1ZT0iNSIvPgotPGxhYmVsIHRpdGxlPSJzZWNvbmRzIiB0YWJpbmRleD0wIHN0eWxlPSdtYXJnaW4tbGVmdDogNXB4OyBtYXJnaW4tcmlnaHQ6IDEwcHg7Jz5zZWNvbmRzPC9sYWJlbD4KLTxidXR0b24gaWQ9InRvZ2dsZVRpbWVyIiB0aXRsZT0nUGF1c2UgZ3JhcGgnIHR5cGU9ImJ1dHRvbiI+UGF1c2UgZ3JhcGg8L2J1dHRvbj4KLTwvZGl2PgotCi08ZGl2IHN0eWxlPSd3aWR0aDogMzcwcHg7IG1hcmdpbi1sZWZ0OiAzMHB4OyBjbGVhcjpib3RoOyc+Ci0JPGRpdiBpZD0ic2hvd0FsbCIgdGFiaW5kZXg9MCA+Ci0JCTxkaXY+VmlldyBhbGwgb3BsZXQgcHJvcGVydGllczwvZGl2PgotCQk8ZGl2IHN0eWxlPSdmb250LXNpemU6IDAuOTVlbSc+KG9wZW5zIGEgbmV3IHdpbmRvdyk8L2Rpdj4gCi0JPC9kaXY+Ci0JPGRpdiBpZD0iZ3JhcGhMZWdlbmQiIHN0eWxlPSdoZWlnaHQ6IDYwMHB4OyB3aWR0aDogMzQwcHg7Jz48L2Rpdj4KLTwvZGl2PgotCTxkaXYgaWQ9ImNoYXJ0IiBzdHlsZT0iZmxvYXQ6cmlnaHQ7IG1hcmdpbi1yaWdodDogMTAwcHg7IG1hcmdpbi10b3A6IC02MDBweDsiPjxkaXYgaWQ9ImxvYWRpbmciPkxvYWRpbmcgZ3JhcGggLi4uPC9kaXY+PC9kaXY+Ci0KLQotPGRpdiBpZD0ibWV0cmljc0RpdiIgc3R5bGU9ImNsZWFyOmJvdGg7ZGlzcGxheTpub25lO21hcmdpbi1sZWZ0OiAzMHB4OyI+Ci08ZGl2PgotPGxhYmVsIGNsYXNzPSJtZXRyaWNzVGl0bGUiPk1ldHJpY3M8L2xhYmVsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJtZXRyaWNzQ29udHJvbHMiPgotPGxhYmVsIGZvcj0nbWV0cmljcycgY2xhc3M9Im1ldHJpY3NMYWJlbCI+TWV0cmljczo8L2xhYmVsPgotPHNlbGVjdCBpZD0ibWV0cmljcyI+PC9zZWxlY3Q+Ci08c3BhbiBpZD0icmF0ZVVuaXQiPjwvc3Bhbj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJtZXRyaWNzQ29udHJvbHMiPgotPGxhYmVsIGZvcj0nbUNoYXJ0VHlwZScgY2xhc3M9ImNoYXJ0VHlwZUxhYmVsIj5DaGFydCB0eXBlOjwvbGFiZWw+Ci08c2VsZWN0IGlkPSJtQ2hhcnRUeXBlIj4KLTxvcHRpb24gdmFsdWU9J2JhckNoYXJ0JyBzZWxlY3RlZD5CYXIgY2hhcnQ8L29wdGlvbj4KLTxvcHRpb24gdmFsdWU9J2xpbmVDaGFydCcgc2VsZWN0ZWQ+TGluZSBjaGFydDwvb3B0aW9uPgotPC9zZWxlY3Q+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibWV0cmljc0NvbnRyb2xzIj4KLTxzcGFuIGlkPSJub0xpbmVDaGFydFdhcm5pbmciIHN0eWxlPSJ2aXNpYmlsaXR5OmhpZGRlbjsiIGNsYXNzPSJ3YXJuaW5nTGFiZWwiPipMaW5lIGNoYXJ0cyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIHlvdSBzZWxlY3QgYSBtZXRyaWMgY29udGFpbmluZyBtdWx0aXBsZSBvcGxldHM8L3NwYW4+Ci08L2Rpdj4KLTxkaXYgaWQ9InNob3dNZXRyaWNzVGFibGUiIHRhYmluZGV4PTAgc3R5bGU9J2NsZWFyOmxlZnQ7IHBhZGRpbmctdG9wOiAxMHB4OyB3aWR0aDogMTUwcHg7Jz4KLTxkaXYgY2xhc3M9J2hpZGRlbic+U2hvdyBtZXRyaWNzIGluIHRhYmxlLiBQcmVzcyB0aGUgRW50ZXIga2V5IHRvIGRpc3BsYXkgYXZhaWxhYmxlIG1ldHJpY3MgaW4gYSB0YWJsZS4gVG8gY2xvc2UgdGhlIGRpYWxvZyBvbmNlIGl0IGlzIG9wZW4sIHByZXNzIHRoZSBFc2NhcGUga2V5LjwvZGl2PgotPGltZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjM4IiBhbHQ9J3Nob3cgdGFibGUgbWV0cmljcycgc3JjPSJyZXNvdXJjZXMvaW1hZ2VzL3Nob3dfbWV0cmljc19pbl90YWJsZS5wbmciLz4KLTwvZGl2PgotCi08ZGl2IGlkPSJtZXRyaWNzQ2hhcnQiIHN0eWxlPSJjbGVhcjpsZWZ0OyI+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPHNjcmlwdCBzcmM9ImpzL2V4dC9kMy5taW4uanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSJqcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vZXh0ZXJuYWwvanF1ZXJ5L2pxdWVyeS5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IHNyYz0ianMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2pxdWVyeS11aS5taW4uanMiPjwvc2NyaXB0PgotPHNjcmlwdCBzcmM9ImpzL2V4dC9zYW5rZXlfZWRnZW50LmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSJqcy9zdHJlYW10YWdzLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSJqcy9leHQvZDMubGVnZW5kLmpzIj48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSJqcy9ncmFwaC5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IHNyYz0ianMvbWV0cmljcy5qcyI+PC9zY3JpcHQ+Ci0KLTxzY3JpcHQgc3JjPSJqcy9pbmRleC5qcyI+PC9zY3JpcHQ+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9kMy5sZWdlbmQuanMgYi9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9kMy5sZWdlbmQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExNDU0NmMuLjAwMDAwMDAKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvZDMubGVnZW5kLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vIGQzLmxlZ2VuZC5qcyAKLS8vIChDKSAyMDEyIHppZ2d5LmpvbnNzb24ubnljQGdtYWlsLmNvbQotLy8gTUlUIGxpY2VuY2UKLQotKGZ1bmN0aW9uKCkgewotZDMubGVnZW5kID0gZnVuY3Rpb24oZywgY2hhcnRTdmcsIHBJdGVtcywgbGVnZW5kVGl0bGUpIHsKLSAgZy5lYWNoKGZ1bmN0aW9uKCkgewotICAgIHZhciBnPSBkMy5zZWxlY3QodGhpcyk7Ci0gICAgdmFyIGl0ZW1zID0ge307Ci0gICAgdmFyIHN2ZyA9ICFjaGFydFN2ZyA/IGQzLnNlbGVjdChnLnByb3BlcnR5KCJuZWFyZXN0Vmlld3BvcnRFbGVtZW50IikpIDogY2hhcnRTdmc7Ci0gICAgdmFyIGlzVHVwbGVGbG93TGVnZW5kID0gZmFsc2U7Ci0gICAgdmFyIGlzUmVjdCA9IGZ1bmN0aW9uKGQpIHsKLSAgICAgICAgdmFyIGsgPSBkLmtleS50b1VwcGVyQ2FzZSgpOwotICAgICAgICByZXR1cm4gay5zdGFydHNXaXRoKCJDT1VOVEVST1AiKQotICAgICAgICAgICAgIHx8IGsuc3RhcnRzV2l0aCgiU1RSRUFNU0NPUEUiKTsKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgdmFyCWxlZ2VuZFBhZGRpbmcgPSBnLmF0dHIoImRhdGEtc3R5bGUtcGFkZGluZyIpIHx8IDUsCi0gICAgICAgIGxUaXRsZUl0ZW1zID0gZy5zZWxlY3RBbGwoIi5sZWdlbmQtdGl0bGUtaXRlbXMiKS5kYXRhKFt0cnVlXSksCi0gICAgICAgIGxiID0gZy5zZWxlY3RBbGwoIi5sZWdlbmQtYm94IikuZGF0YShbdHJ1ZV0pLAotICAgICAgICBsaSA9IGcuc2VsZWN0QWxsKCIubGVnZW5kLWl0ZW1zIikuZGF0YShbdHJ1ZV0pCi0KLSAgICBsVGl0bGVJdGVtcy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxlZ2VuZC10aXRsZS1pdGVtcyIsIHRydWUpCi0gICAgbGIuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJsZWdlbmQtYm94Iix0cnVlKQotICAgIGxpRyA9IGxpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgibGVnZW5kLWl0ZW1zIix0cnVlKQotCi0gICAgaWYgKHBJdGVtcykgewotICAgIAlwSXRlbXMuZm9yRWFjaChmdW5jdGlvbihwKXsKLSAgICAJCWlmIChwLmlkeCAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgCQkJaXRlbXNbcC5uYW1lXSA9IHtjb2xvcjogcC5maWxsLCBpZHg6IHAuaWR4fTsKLSAgICAJCQlpc1R1cGxlRmxvd0xlZ2VuZCA9IHRydWU7Ci0gICAgCQl9IGVsc2UgewotICAgIAkJCWl0ZW1zW3AubmFtZV0gPSB7Y29sb3I6IHAuZmlsbH07Ci0gICAgCQkJaXNUdXBsZUZsb3dMZWdlbmQgPSBmYWxzZTsKLSAgICAJCX0KLSAgICAJfSk7Ci0gICAgfSBlbHNlIHsKLQkgICAgc3ZnLnNlbGVjdEFsbCgiW2RhdGEtbGVnZW5kXSIpLmVhY2goZnVuY3Rpb24oKSB7Ci0JICAgICAgICB2YXIgc2VsZiA9IGQzLnNlbGVjdCh0aGlzKTsKLQkgICAgICAgIGl0ZW1zW3NlbGYuYXR0cigiZGF0YS1sZWdlbmQiKV0gPSB7Ci0JICAgICAgICAgIHBvcyA6IHNlbGYuYXR0cigiZGF0YS1sZWdlbmQtcG9zIikgfHwgdGhpcy5nZXRCQm94KCkueSwKLQkgICAgICAgICAgY29sb3IgOiBzZWxmLmF0dHIoImRhdGEtbGVnZW5kLWNvbG9yIikgIT0gdW5kZWZpbmVkID8gc2VsZi5hdHRyKCJkYXRhLWxlZ2VuZC1jb2xvciIpIDogc2VsZi5zdHlsZSgiZmlsbCIpICE9ICdub25lJyA/IHNlbGYuc3R5bGUoImZpbGwiKSA6IHNlbGYuc3R5bGUoInN0cm9rZSIpIAotCSAgICAgICAgfQotCSAgICAgIH0pOwotICAgIH0KLQotICAgIGlmIChpc1R1cGxlRmxvd0xlZ2VuZCkKLQkgICBpdGVtcyA9IGQzLmVudHJpZXMoaXRlbXMpLnNvcnQoCi0JCQkgICBmdW5jdGlvbihhLGIpIHsKLQkJCQkgICBpZiAoYS52YWx1ZS5pZHggPCBiLnZhbHVlLmlkeCkgewotCQkJCQkgICByZXR1cm4gLTE7Ci0JCQkJICAgfSBlbHNlIGlmIChhLnZhbHVlLmlkeCA+IGIudmFsdWUuaWR4KSB7Ci0JCQkJCSAgIHJldHVybiAxOwotCQkJCSAgIH0gZWxzZSB7Ci0JCQkJCSAgIHJldHVybiAwOwotCQkJCSAgIH0KLQkJCSAgIH0pOwotICAgIGVsc2UgIHsKLQkgICAgaXRlbXMgPSBkMy5lbnRyaWVzKGl0ZW1zKS5zb3J0KAotCSAgICAJCWZ1bmN0aW9uKGEsYikgewotCSAgICAJCSAgICAvLyByZWN0IGJlZm9yZSBjaXJjbGUgLSBncmFwaGljIHBvc2l0aW9uaW5nIGNvZGUgYmVsb3cKLQkgICAgCQkgICAgdmFyIHJhID0gaXNSZWN0KGEpOwotCSAgICAJCSAgICB2YXIgcmIgPSBpc1JlY3QoYik7Ci0JICAgIAkJICAgIGlmIChyYSAmJiAhcmIpIHsKLQkgICAgCQkgICAgICByZXR1cm4gLTE7Ci0JICAgIAkJICAgIH0gZWxzZSBpZiAoIXJhICYmIHJiKSB7Ci0JICAgIAkJICAgICAgcmV0dXJuIDE7Ci0JICAgIAkJICAgIH0KLQkgICAgCQkJaWYgKGEua2V5IDwgYi5rZXkpIHsKLQkgICAgCQkJCXJldHVybiAtMTsKLQkgICAgCQkJfSBlbHNlIGlmIChhLmtleSA+IGIua2V5KSB7Ci0JICAgIAkJCQlyZXR1cm4gMTsKLQkgICAgCQkJfSBlbHNlIHsKLQkgICAgCQkJCXJldHVybiAwOwotCSAgICAJCQl9Ci0JICAgIH0pOwotICAgIH0KLSAgICAKLSAgICBsaS5zZWxlY3RBbGwoInRleHQiKQotICAgICAgICAuZGF0YShpdGVtcyxmdW5jdGlvbihkKSB7IAotICAgICAgICAJcmV0dXJuIGQua2V5fQotICAgICAgICApCi0gICAgICAgIC5jYWxsKGZ1bmN0aW9uKGQpIHsgZC5lbnRlcigpLmFwcGVuZCgidGV4dCIpfSkKLSAgICAgICAgLmNhbGwoZnVuY3Rpb24oZCkgeyBkLmV4aXQoKS5yZW1vdmUoKX0pCi0gICAgICAgIC5hdHRyKCJ5IixmdW5jdGlvbihkLGkpIHsgcmV0dXJuIGkrImVtIn0pCi0gICAgICAgIC5hdHRyKCJ4IiwiMS41ZW0iKQotICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7Ci0gICAgICAgIAlyZXR1cm4gZC5rZXk7Ci0gICAgICAgIAl9KQotICAgIAotICAgIHZhciBsZWdlbmRPcGFjaXR5ID0gMC43OwotICAgIGlmIChsZWdlbmRUaXRsZSAmJiBsZWdlbmRUaXRsZSA9PT0gIlN0cmVhbSB0YWdzIikgewotICAgIAlsZWdlbmRPcGFjaXR5ID0gMS4wOwotCSAgICBsaS5zZWxlY3RBbGwoInJlY3QiKQotICAgICAgICAuZGF0YShpdGVtcyxmdW5jdGlvbihkKSB7IAotICAgICAgICAJcmV0dXJuIGQua2V5fQotICAgICAgICApCi0gICAgICAgIC5jYWxsKGZ1bmN0aW9uKGQpIHsgZC5lbnRlcigpLmFwcGVuZCgicmVjdCIpfSkKLSAgICAgICAgLmNhbGwoZnVuY3Rpb24oZCkgeyBkLmV4aXQoKS5yZW1vdmUoKX0pCi0gICAgICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCxpKSB7IAotICAgICAgICAJcmV0dXJuIGktMC43NSsgImVtIn0pIAotICAgICAgICAuYXR0cigid2lkdGgiLCAxMCkgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAuYXR0cigiaGVpZ2h0IiwgOCkKLSAgICAgICAgLnN0eWxlKCJmaWxsIixmdW5jdGlvbihkKSB7Ci0gICAgICAgIAlyZXR1cm4gZC52YWx1ZS5jb2xvciA9PT0gIiNjN2M3YzciID8gIiMwMDgwODAiIDogZC52YWx1ZS5jb2xvcjsKLSAgICAgICAgCX0pCi0gICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgIm5vbmUiKQotICAgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIGxlZ2VuZE9wYWNpdHkpOwotICAgIH0gZWxzZSBpZiAobGVnZW5kVGl0bGUgJiYgbGVnZW5kVGl0bGUgPT09ICJPcGxldCBraW5kIiB8fCBsZWdlbmRUaXRsZSA9PT0gIlR1cGxlIGNvdW50Iil7Ci0gICAgCWxpRy5zZWxlY3RBbGwoImciKQotICAgIAkJLmRhdGEoaXRlbXMsIGZ1bmN0aW9uKGQpIHsgCi0gICAgCQkJcmV0dXJuIGQua2V5OwotICAgIAkJfSkKLSAgICAJCS5lbnRlcigpCi0gICAgCQkuYXBwZW5kKGZ1bmN0aW9uKGQpIHsKLSAgICAJCSAgICBpZiAoaXNSZWN0KGQpKSB7Ci0gICAgCSAgCQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkMy5ucy5wcmVmaXguc3ZnLCAncmVjdCcpOwotICAgIAkgIAkJfSBlbHNlIHsKLSAgICAJICAJCQlyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQzLm5zLnByZWZpeC5zdmcsICdjaXJjbGUnKTsKLSAgICAJICAJCX0KLSAgICAJCX0pOwotCi0gICAgICAgIC8vIHJlY3RzIGJlZm9yZSBjaXJjbGVzCi0gICAgCXZhciBjb3VudCA9IDA7Ci0gICAgCWxpLnNlbGVjdEFsbCgicmVjdCIpCi0gICAgCS5hdHRyKCJ4IiwgLTMpCi0gICAgICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCxpKSB7Ci0gICAgICAgIAljb3VudCsrOwotICAgICAgICAJcmV0dXJuIGktMC43NSsgImVtIn0pIAotICAgICAgICAuYXR0cigid2lkdGgiLCBsZWdlbmRUaXRsZSA9PT0gIk9wbGV0IGtpbmQiID8gOCA6IDEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC5hdHRyKCJoZWlnaHQiLCA4KQotICAgICAgICAuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKGQpIHsKLSAgICAgICAgCXJldHVybiBkLnZhbHVlLmNvbG9yCi0gICAgICAgIAl9KQotICAgICAgICAuc3R5bGUoInN0cm9rZSIsICJub25lIikKLSAgICAgICAgLnN0eWxlKCJmaWxsLW9wYWNpdHkiLCBsZWdlbmRPcGFjaXR5KTsKLSAgICAJCi0JICAgIGxpLnNlbGVjdEFsbCgiY2lyY2xlIikKLSAgICAgICAgLmF0dHIoImN5IixmdW5jdGlvbihkLGkpIHsKLSAgICAgICAgCXJldHVybiAoaStjb3VudCktMC4yNSsiZW0ifSkKLSAgICAgICAgLmF0dHIoImN4IiwwKQotICAgICAgICAuYXR0cigiciIsIjAuNGVtIikKLSAgICAgICAgLnN0eWxlKCJmaWxsIixmdW5jdGlvbihkKSB7Ci0gICAgICAgIAlyZXR1cm4gZC52YWx1ZS5jb2xvcgotICAgICAgICAJfSkKLSAgICAgICAgIC5zdHlsZSgiZmlsbC1vcGFjaXR5IiwgbGVnZW5kT3BhY2l0eSk7Ci0gICAgCQotICAgIH0gZWxzZSB7Ci0JICAgIGxpLnNlbGVjdEFsbCgiY2lyY2xlIikKLQkgICAgICAgIC5kYXRhKGl0ZW1zLGZ1bmN0aW9uKGQpIHsgCi0JICAgICAgICAJcmV0dXJuIGQua2V5fQotCSAgICAgICAgKQotCSAgICAgICAgLmNhbGwoZnVuY3Rpb24oZCkgeyBkLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKX0pCi0JICAgICAgICAuY2FsbChmdW5jdGlvbihkKSB7IGQuZXhpdCgpLnJlbW92ZSgpfSkKLQkgICAgICAgIC5hdHRyKCJjeSIsZnVuY3Rpb24oZCxpKSB7IHJldHVybiBpLTAuMjUrImVtIn0pCi0JICAgICAgICAuYXR0cigiY3giLDApCi0JICAgICAgICAuYXR0cigiciIsIjAuNGVtIikKLQkgICAgICAgIC5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oZCkgewotCSAgICAgICAgCXJldHVybiBkLnZhbHVlLmNvbG9yCi0JICAgICAgICAJfSkKLQkgICAgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIGxlZ2VuZE9wYWNpdHkpOwotICAgIH0KLSAgICAvLyBSZXBvc2l0aW9uIGFuZCByZXNpemUgdGhlIGJveAotICAgIHZhciBsYmJveCA9IGxpWzBdWzBdLmdldEJCb3goKTsKLSAgICBsYi5hdHRyKCJ4IiwobGJib3gueC1sZWdlbmRQYWRkaW5nKSkKLSAgICAgICAgLmF0dHIoInkiLChsYmJveC55LWxlZ2VuZFBhZGRpbmcpKQotICAgICAgICAuYXR0cigiaGVpZ2h0IiwobGJib3guaGVpZ2h0KzIqbGVnZW5kUGFkZGluZykpCi0gICAgICAgIC5hdHRyKCJ3aWR0aCIsKChsYmJveC53aWR0aCsxMikgKyAyKmxlZ2VuZFBhZGRpbmcpKTsKLSAgICAKLSAgICBsVGl0bGVJdGVtcy5hdHRyKCJ4IiwgMCkKLSAgICAJLmF0dHIoInkiLCAobGJib3gueSAtIGxlZ2VuZFBhZGRpbmcgLSAxNSkpCi0gICAgCS5hdHRyKCJoZWlnaHQiLDE1KQotICAgICAgICAuYXR0cigid2lkdGgiLChsYmJveC53aWR0aCsyKmxlZ2VuZFBhZGRpbmcpKTsKLSAgICAgICAgaWYgKGxlZ2VuZFRpdGxlKSB7Ci0JICAgICAgICAgbFRpdGxlSXRlbXMuc2VsZWN0QWxsKCJ0ZXh0IikKLQkgICAgICAgICAuZGF0YShbIiJdLGZ1bmN0aW9uKGQpIHsgCi0JICAgICAgICAgCXJldHVybiBsZWdlbmRUaXRsZTsKLQkgICAgICAgICAgfSkKLQkgICAgICAgICAuY2FsbChmdW5jdGlvbihkKSB7IGQuZW50ZXIoKS5hcHBlbmQoInRleHQiKX0pCi0JICAgICAgICAgLmNhbGwoZnVuY3Rpb24oZCkgeyBkLmV4aXQoKS5yZW1vdmUoKX0pCi0JICAgICAgICAgLmF0dHIoInkiLGZ1bmN0aW9uKGQsaSkgeyByZXR1cm4gIi0yZW0ifSkKLQkgICAgICAgICAuYXR0cigieCIsKGxiYm94LngtbGVnZW5kUGFkZGluZykpCi0JICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyAKLQkgICAgICAgICAJcmV0dXJuIGxlZ2VuZFRpdGxlOwotCSAgICAgICAgIAl9KTsKLSAgICAgICAgfQotICAgIAkKLSAgfSkKLSAgcmV0dXJuIGcKLX0KLX0pKCkKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2QzLm1pbi5qcyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2QzLm1pbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTNhYTVjNi4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9kMy5taW4uanMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSFmdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnR8fG4uZG9jdW1lbnR8fG4pLmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiB0KG4pe3JldHVybiBuJiYobi5vd25lckRvY3VtZW50JiZuLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fG4uZG9jdW1lbnQmJm58fG4uZGVmYXVsdFZpZXcpfWZ1bmN0aW9uIGUobix0KXtyZXR1cm4gdD5uPy0xOm4+dD8xOm4+PXQ/MDpOYU59ZnVuY3Rpb24gcihuKXtyZXR1cm4gbnVsbD09PW4/TmFOOitufWZ1bmN0aW9uIHUobil7cmV0dXJuIWlzTmFOKG4pfWZ1bmN0aW9uIGkobil7cmV0dXJue2xlZnQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk8MD9yPWkrMTp1PWl9cmV0dXJuIHJ9LHJpZ2h0OmZ1bmN0aW9uKHQsZSxyLHUpe2Zvcihhcmd1bWVudHMubGVuZ3RoPDMmJihyPTApLGFyZ3VtZW50cy5sZW5ndGg8NCYmKHU9dC5sZW5ndGgpO3U+cjspe3ZhciBpPXIrdT4+PjE7bih0W2ldLGUpPjA/dT1pOnI9aSsxfXJldHVybiByfX19ZnVuY3Rpb24gYShuKXtyZXR1cm4gbi5sZW5ndGh9ZnVuY3Rpb24gbyhuKXtmb3IodmFyIHQ9MTtuKnQlMTspdCo9MTA7cmV0dXJuIHR9ZnVuY3Rpb24gbChuLHQpe2Zvcih2YXIgZSBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHt2YWx1ZTp0W2VdLGVudW1lcmFibGU6ITF9KX1mdW5jdGlvbiBjKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24gcyhuKXtyZXR1cm4obis9IiIpPT09eGF8fG5bMF09PT1iYT9iYStuOm59ZnVuY3Rpb24gZihuKXtyZXR1cm4obis9IiIpWzBdPT09YmE/bi5zbGljZSgxKTpufWZ1bmN0aW9uIGgobil7cmV0dXJuIHMobilpbiB0aGlzLl99ZnVuY3Rpb24gZyhuKXtyZXR1cm4obj1zKG4pKWluIHRoaXMuXyYmZGVsZXRlIHRoaXMuX1tuXX1mdW5jdGlvbiBwKCl7dmFyIG49W107Zm9yKHZhciB0IGluIHRoaXMuXyluLnB1c2goZih0KSk7cmV0dXJuIG59ZnVuY3Rpb24gdigpe3ZhciBuPTA7Zm9yKHZhciB0IGluIHRoaXMuXykrK247cmV0dXJuIG59ZnVuY3Rpb24gZCgpe2Zvcih2YXIgbiBpbiB0aGlzLl8pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbSgpe3RoaXMuXz1PYmplY3QuY3JlYXRlKG51bGwpfWZ1bmN0aW9uIHkobil7cmV0dXJuIG59ZnVuY3Rpb24gTShuLHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZS5hcHBseSh0LGFyZ3VtZW50cyk7cmV0dXJuIHI9PT10P246cn19ZnVuY3Rpb24geChuLHQpe2lmKHQgaW4gbilyZXR1cm4gdDt0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtmb3IodmFyIGU9MCxyPV9hLmxlbmd0aDtyPmU7KytlKXt2YXIgdT1fYVtlXSt0O2lmKHUgaW4gbilyZXR1cm4gdX19ZnVuY3Rpb24gYigpe31mdW5jdGlvbiBfKCl7fWZ1bmN0aW9uIHcobil7ZnVuY3Rpb24gdCgpe2Zvcih2YXIgdCxyPWUsdT0tMSxpPXIubGVuZ3RoOysrdTxpOykodD1yW3VdLm9uKSYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG59dmFyIGU9W10scj1uZXcgYztyZXR1cm4gdC5vbj1mdW5jdGlvbih0LHUpe3ZhciBpLGE9ci5nZXQodCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9hJiZhLm9uOihhJiYoYS5vbj1udWxsLGU9ZS5zbGljZSgwLGk9ZS5pbmRleE9mKGEpKS5jb25jYXQoZS5zbGljZShpKzEpKSxyLnJlbW92ZSh0KSksdSYmZS5wdXNoKHIuc2V0KHQse29uOnV9KSksbil9LHR9ZnVuY3Rpb24gUygpe29hLmV2ZW50LnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gaygpe2Zvcih2YXIgbix0PW9hLmV2ZW50O249dC5zb3VyY2VFdmVudDspdD1uO3JldHVybiB0fWZ1bmN0aW9uIE4obil7Zm9yKHZhciB0PW5ldyBfLGU9MCxyPWFyZ3VtZW50cy5sZW5ndGg7KytlPHI7KXRbYXJndW1lbnRzW2VdXT13KHQpO3JldHVybiB0Lm9mPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKHUpe3RyeXt2YXIgaT11LnNvdXJjZUV2ZW50PW9hLmV2ZW50O3UudGFyZ2V0PW4sb2EuZXZlbnQ9dSx0W3UudHlwZV0uYXBwbHkoZSxyKX1maW5hbGx5e29hLmV2ZW50PWl9fX0sdH1mdW5jdGlvbiBFKG4pe3JldHVybiBTYShuLEFhKSxufWZ1bmN0aW9uIEEobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBrYShuLHRoaXMpfX1mdW5jdGlvbiBDKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gTmEobix0aGlzKX19ZnVuY3Rpb24geihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShuKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpfWZ1bmN0aW9uIHUoKXt0aGlzLnNldEF0dHJpYnV0ZShuLHQpfWZ1bmN0aW9uIGkoKXt0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCx0KX1mdW5jdGlvbiBhKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZShuKTp0aGlzLnNldEF0dHJpYnV0ZShuLGUpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCxlKX1yZXR1cm4gbj1vYS5ucy5xdWFsaWZ5KG4pLG51bGw9PXQ/bi5sb2NhbD9yOmU6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bi5sb2NhbD9vOmE6bi5sb2NhbD9pOnV9ZnVuY3Rpb24gTChuKXtyZXR1cm4gbi50cmltKCkucmVwbGFjZSgvXHMrL2csIiAiKX1mdW5jdGlvbiBxKG4pe3JldHVybiBuZXcgUmVnRXhwKCIoPzpefFxccyspIitvYS5yZXF1b3RlKG4pKyIoPzpcXHMrfCQpIiwiZyIpfWZ1bmN0aW9uIFQobil7cmV0dXJuKG4rIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBSKG4sdCl7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZT0tMTsrK2U8dTspbltlXSh0aGlzLHQpfWZ1bmN0aW9uIHIoKXtmb3IodmFyIGU9LTEscj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsrK2U8dTspbltlXSh0aGlzLHIpfW49VChuKS5tYXAoRCk7dmFyIHU9bi5sZW5ndGg7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/cjplfWZ1bmN0aW9uIEQobil7dmFyIHQ9cShuKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtpZih1PWUuY2xhc3NMaXN0KXJldHVybiByP3UuYWRkKG4pOnUucmVtb3ZlKG4pO3ZhciB1PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtyPyh0Lmxhc3RJbmRleD0wLHQudGVzdCh1KXx8ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixMKHUrIiAiK24pKSk6ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixMKHUucmVwbGFjZSh0LCIgIikpKX19ZnVuY3Rpb24gUChuLHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix0LGUpfWZ1bmN0aW9uIGkoKXt2YXIgcj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIsZSl9cmV0dXJuIG51bGw9PXQ/cjoiZnVuY3Rpb24iPT10eXBlb2YgdD9pOnV9ZnVuY3Rpb24gaihuLHQpe2Z1bmN0aW9uIGUoKXtkZWxldGUgdGhpc1tuXX1mdW5jdGlvbiByKCl7dGhpc1tuXT10fWZ1bmN0aW9uIHUoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW25dOnRoaXNbbl09ZX1yZXR1cm4gbnVsbD09dD9lOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3U6cn1mdW5jdGlvbiBVKG4pe2Z1bmN0aW9uIHQoKXt2YXIgdD10aGlzLm93bmVyRG9jdW1lbnQsZT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gZT90LmNyZWF0ZUVsZW1lbnROUyhlLG4pOnQuY3JlYXRlRWxlbWVudChuKX1mdW5jdGlvbiBlKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobi5zcGFjZSxuLmxvY2FsKX1yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOihuPW9hLm5zLnF1YWxpZnkobikpLmxvY2FsP2U6dH1mdW5jdGlvbiBGKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gSChuKXtyZXR1cm57X19kYXRhX186bn19ZnVuY3Rpb24gTyhuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRWEodGhpcyxuKX19ZnVuY3Rpb24gSShuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aHx8KG49ZSksZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmZT9uKHQuX19kYXRhX18sZS5fX2RhdGFfXyk6IXQtIWV9fWZ1bmN0aW9uIFkobix0KXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTtlKyspZm9yKHZhciB1LGk9bltlXSxhPTAsbz1pLmxlbmd0aDtvPmE7YSsrKSh1PWlbYV0pJiZ0KHUsYSxlKTtyZXR1cm4gbn1mdW5jdGlvbiBaKG4pe3JldHVybiBTYShuLHphKSxufWZ1bmN0aW9uIFYobil7dmFyIHQsZTtyZXR1cm4gZnVuY3Rpb24ocix1LGkpe3ZhciBhLG89bltpXS51cGRhdGUsbD1vLmxlbmd0aDtmb3IoaSE9ZSYmKGU9aSx0PTApLHU+PXQmJih0PXUrMSk7IShhPW9bdF0pJiYrK3Q8bDspO3JldHVybiBhfX1mdW5jdGlvbiBYKG4sdCxlKXtmdW5jdGlvbiByKCl7dmFyIHQ9dGhpc1thXTt0JiYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4sdCx0LiQpLGRlbGV0ZSB0aGlzW2FdKX1mdW5jdGlvbiB1KCl7dmFyIHU9bCh0LGNhKGFyZ3VtZW50cykpO3IuY2FsbCh0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIobix0aGlzW2FdPXUsdS4kPWUpLHUuXz10fWZ1bmN0aW9uIGkoKXt2YXIgdCxlPW5ldyBSZWdFeHAoIl5fX29uKFteLl0rKSIrb2EucmVxdW90ZShuKSsiJCIpO2Zvcih2YXIgciBpbiB0aGlzKWlmKHQ9ci5tYXRjaChlKSl7dmFyIHU9dGhpc1tyXTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodFsxXSx1LHUuJCksZGVsZXRlIHRoaXNbcl19fXZhciBhPSJfX29uIituLG89bi5pbmRleE9mKCIuIiksbD0kO28+MCYmKG49bi5zbGljZSgwLG8pKTt2YXIgYz1MYS5nZXQobik7cmV0dXJuIGMmJihuPWMsbD1CKSxvP3Q/dTpyOnQ/YjppfWZ1bmN0aW9uICQobix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9b2EuZXZlbnQ7b2EuZXZlbnQ9ZSx0WzBdPXRoaXMuX19kYXRhX187dHJ5e24uYXBwbHkodGhpcyx0KX1maW5hbGx5e29hLmV2ZW50PXJ9fX1mdW5jdGlvbiBCKG4sdCl7dmFyIGU9JChuLHQpO3JldHVybiBmdW5jdGlvbihuKXt2YXIgdD10aGlzLHI9bi5yZWxhdGVkVGFyZ2V0O3ImJihyPT09dHx8OCZyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKXx8ZS5jYWxsKHQsbil9fWZ1bmN0aW9uIFcoZSl7dmFyIHI9Ii5kcmFnc3VwcHJlc3MtIisgKytUYSx1PSJjbGljayIrcixpPW9hLnNlbGVjdCh0KGUpKS5vbigidG91Y2htb3ZlIityLFMpLm9uKCJkcmFnc3RhcnQiK3IsUykub24oInNlbGVjdHN0YXJ0IityLFMpO2lmKG51bGw9PXFhJiYocWE9Im9uc2VsZWN0c3RhcnQiaW4gZT8hMTp4KGUuc3R5bGUsInVzZXJTZWxlY3QiKSkscWEpe3ZhciBhPW4oZSkuc3R5bGUsbz1hW3FhXTthW3FhXT0ibm9uZSJ9cmV0dXJuIGZ1bmN0aW9uKG4pe2lmKGkub24ocixudWxsKSxxYSYmKGFbcWFdPW8pLG4pe3ZhciB0PWZ1bmN0aW9uKCl7aS5vbih1LG51bGwpfTtpLm9uKHUsZnVuY3Rpb24oKXtTKCksdCgpfSwhMCksc2V0VGltZW91dCh0LDApfX19ZnVuY3Rpb24gSihuLGUpe2UuY2hhbmdlZFRvdWNoZXMmJihlPWUuY2hhbmdlZFRvdWNoZXNbMF0pO3ZhciByPW4ub3duZXJTVkdFbGVtZW50fHxuO2lmKHIuY3JlYXRlU1ZHUG9pbnQpe3ZhciB1PXIuY3JlYXRlU1ZHUG9pbnQoKTtpZigwPlJhKXt2YXIgaT10KG4pO2lmKGkuc2Nyb2xsWHx8aS5zY3JvbGxZKXtyPW9hLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgic3ZnIikuc3R5bGUoe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLHBhZGRpbmc6MCxib3JkZXI6Im5vbmUifSwiaW1wb3J0YW50Iik7dmFyIGE9clswXVswXS5nZXRTY3JlZW5DVE0oKTtSYT0hKGEuZnx8YS5lKSxyLnJlbW92ZSgpfX1yZXR1cm4gUmE/KHUueD1lLnBhZ2VYLHUueT1lLnBhZ2VZKToodS54PWUuY2xpZW50WCx1Lnk9ZS5jbGllbnRZKSx1PXUubWF0cml4VHJhbnNmb3JtKG4uZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbdS54LHUueV19dmFyIG89bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLW8ubGVmdC1uLmNsaWVudExlZnQsZS5jbGllbnRZLW8udG9wLW4uY2xpZW50VG9wXX1mdW5jdGlvbiBHKCl7cmV0dXJuIG9hLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXJ9ZnVuY3Rpb24gSyhuKXtyZXR1cm4gbj4wPzE6MD5uPy0xOjB9ZnVuY3Rpb24gUShuLHQsZSl7cmV0dXJuKHRbMF0tblswXSkqKGVbMV0tblsxXSktKHRbMV0tblsxXSkqKGVbMF0tblswXSl9ZnVuY3Rpb24gbm4obil7cmV0dXJuIG4+MT8wOi0xPm4/amE6TWF0aC5hY29zKG4pfWZ1bmN0aW9uIHRuKG4pe3JldHVybiBuPjE/SGE6LTE+bj8tSGE6TWF0aC5hc2luKG4pfWZ1bmN0aW9uIGVuKG4pe3JldHVybigobj1NYXRoLmV4cChuKSktMS9uKS8yfWZ1bmN0aW9uIHJuKG4pe3JldHVybigobj1NYXRoLmV4cChuKSkrMS9uKS8yfWZ1bmN0aW9uIHVuKG4pe3JldHVybigobj1NYXRoLmV4cCgyKm4pKS0xKS8obisxKX1mdW5jdGlvbiBhbihuKXtyZXR1cm4obj1NYXRoLnNpbihuLzIpKSpufWZ1bmN0aW9uIG9uKCl7fWZ1bmN0aW9uIGxuKG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGxuPyh0aGlzLmg9K24sdGhpcy5zPSt0LHZvaWQodGhpcy5sPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBsbj9uZXcgbG4obi5oLG4ucyxuLmwpOl9uKCIiK24sd24sbG4pOm5ldyBsbihuLHQsZSl9ZnVuY3Rpb24gY24obix0LGUpe2Z1bmN0aW9uIHIobil7cmV0dXJuIG4+MzYwP24tPTM2MDowPm4mJihuKz0zNjApLDYwPm4/aSsoYS1pKSpuLzYwOjE4MD5uP2E6MjQwPm4/aSsoYS1pKSooMjQwLW4pLzYwOml9ZnVuY3Rpb24gdShuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqcihuKSl9dmFyIGksYTtyZXR1cm4gbj1pc05hTihuKT8wOihuJT0zNjApPDA/biszNjA6bix0PWlzTmFOKHQpPzA6MD50PzA6dD4xPzE6dCxlPTA+ZT8wOmU+MT8xOmUsYT0uNT49ZT9lKigxK3QpOmUrdC1lKnQsaT0yKmUtYSxuZXcgeW4odShuKzEyMCksdShuKSx1KG4tMTIwKSl9ZnVuY3Rpb24gc24obix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygc24/KHRoaXMuaD0rbix0aGlzLmM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIHNuP25ldyBzbihuLmgsbi5jLG4ubCk6biBpbnN0YW5jZW9mIGhuP3BuKG4ubCxuLmEsbi5iKTpwbigobj1Tbigobj1vYS5yZ2IobikpLnIsbi5nLG4uYikpLmwsbi5hLG4uYik6bmV3IHNuKG4sdCxlKX1mdW5jdGlvbiBmbihuLHQsZSl7cmV0dXJuIGlzTmFOKG4pJiYobj0wKSxpc05hTih0KSYmKHQ9MCksbmV3IGhuKGUsTWF0aC5jb3Mobio9T2EpKnQsTWF0aC5zaW4obikqdCl9ZnVuY3Rpb24gaG4obix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgaG4/KHRoaXMubD0rbix0aGlzLmE9K3Qsdm9pZCh0aGlzLmI9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGhuP25ldyBobihuLmwsbi5hLG4uYik6biBpbnN0YW5jZW9mIHNuP2ZuKG4uaCxuLmMsbi5sKTpTbigobj15bihuKSkucixuLmcsbi5iKTpuZXcgaG4obix0LGUpfWZ1bmN0aW9uIGduKG4sdCxlKXt2YXIgcj0obisxNikvMTE2LHU9cit0LzUwMCxpPXItZS8yMDA7cmV0dXJuIHU9dm4odSkqS2Escj12bihyKSpRYSxpPXZuKGkpKm5vLG5ldyB5bihtbigzLjI0MDQ1NDIqdS0xLjUzNzEzODUqci0uNDk4NTMxNCppKSxtbigtLjk2OTI2Nip1KzEuODc2MDEwOCpyKy4wNDE1NTYqaSksbW4oLjA1NTY0MzQqdS0uMjA0MDI1OSpyKzEuMDU3MjI1MippKSl9ZnVuY3Rpb24gcG4obix0LGUpe3JldHVybiBuPjA/bmV3IHNuKE1hdGguYXRhbjIoZSx0KSpJYSxNYXRoLnNxcnQodCp0K2UqZSksbik6bmV3IHNuKE5hTixOYU4sbil9ZnVuY3Rpb24gdm4obil7cmV0dXJuIG4+LjIwNjg5MzAzND9uKm4qbjoobi00LzI5KS83Ljc4NzAzN31mdW5jdGlvbiBkbihuKXtyZXR1cm4gbj4uMDA4ODU2P01hdGgucG93KG4sMS8zKTo3Ljc4NzAzNypuKzQvMjl9ZnVuY3Rpb24gbW4obil7cmV0dXJuIE1hdGgucm91bmQoMjU1KiguMDAzMDQ+PW4/MTIuOTIqbjoxLjA1NSpNYXRoLnBvdyhuLDEvMi40KS0uMDU1KSl9ZnVuY3Rpb24geW4obix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgeW4/KHRoaXMucj1+fm4sdGhpcy5nPX5+dCx2b2lkKHRoaXMuYj1+fmUpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIHluP25ldyB5bihuLnIsbi5nLG4uYik6X24oIiIrbix5bixjbik6bmV3IHluKG4sdCxlKX1mdW5jdGlvbiBNbihuKXtyZXR1cm4gbmV3IHluKG4+PjE2LG4+PjgmMjU1LDI1NSZuKX1mdW5jdGlvbiB4bihuKXtyZXR1cm4gTW4obikrIiJ9ZnVuY3Rpb24gYm4obil7cmV0dXJuIDE2Pm4/IjAiK01hdGgubWF4KDAsbikudG9TdHJpbmcoMTYpOk1hdGgubWluKDI1NSxuKS50b1N0cmluZygxNil9ZnVuY3Rpb24gX24obix0LGUpe3ZhciByLHUsaSxhPTAsbz0wLGw9MDtpZihyPS8oW2Etel0rKVwoKC4qKVwpLy5leGVjKG49bi50b0xvd2VyQ2FzZSgpKSlzd2l0Y2godT1yWzJdLnNwbGl0KCIsIiksclsxXSl7Y2FzZSJoc2wiOnJldHVybiBlKHBhcnNlRmxvYXQodVswXSkscGFyc2VGbG9hdCh1WzFdKS8xMDAscGFyc2VGbG9hdCh1WzJdKS8xMDApO2Nhc2UicmdiIjpyZXR1cm4gdChObih1WzBdKSxObih1WzFdKSxObih1WzJdKSl9cmV0dXJuKGk9cm8uZ2V0KG4pKT90KGkucixpLmcsaS5iKToobnVsbD09bnx8IiMiIT09bi5jaGFyQXQoMCl8fGlzTmFOKGk9cGFyc2VJbnQobi5zbGljZSgxKSwxNikpfHwoND09PW4ubGVuZ3RoPyhhPSgzODQwJmkpPj40LGE9YT4+NHxhLG89MjQwJmksbz1vPj40fG8sbD0xNSZpLGw9bDw8NHxsKTo3PT09bi5sZW5ndGgmJihhPSgxNjcxMTY4MCZpKT4+MTYsbz0oNjUyODAmaSk+PjgsbD0yNTUmaSkpLHQoYSxvLGwpKX1mdW5jdGlvbiB3bihuLHQsZSl7dmFyIHIsdSxpPU1hdGgubWluKG4vPTI1NSx0Lz0yNTUsZS89MjU1KSxhPU1hdGgubWF4KG4sdCxlKSxvPWEtaSxsPShhK2kpLzI7cmV0dXJuIG8/KHU9LjU+bD9vLyhhK2kpOm8vKDItYS1pKSxyPW49PWE/KHQtZSkvbysoZT50PzY6MCk6dD09YT8oZS1uKS9vKzI6KG4tdCkvbys0LHIqPTYwKToocj1OYU4sdT1sPjAmJjE+bD8wOnIpLG5ldyBsbihyLHUsbCl9ZnVuY3Rpb24gU24obix0LGUpe249a24obiksdD1rbih0KSxlPWtuKGUpO3ZhciByPWRuKCguNDEyNDU2NCpuKy4zNTc1NzYxKnQrLjE4MDQzNzUqZSkvS2EpLHU9ZG4oKC4yMTI2NzI5Km4rLjcxNTE1MjIqdCsuMDcyMTc1KmUpL1FhKSxpPWRuKCguMDE5MzMzOSpuKy4xMTkxOTIqdCsuOTUwMzA0MSplKS9ubyk7cmV0dXJuIGhuKDExNip1LTE2LDUwMCooci11KSwyMDAqKHUtaSkpfWZ1bmN0aW9uIGtuKG4pe3JldHVybihuLz0yNTUpPD0uMDQwNDU/bi8xMi45MjpNYXRoLnBvdygobisuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIE5uKG4pe3ZhciB0PXBhcnNlRmxvYXQobik7cmV0dXJuIiUiPT09bi5jaGFyQXQobi5sZW5ndGgtMSk/TWF0aC5yb3VuZCgyLjU1KnQpOnR9ZnVuY3Rpb24gRW4obil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBufX1mdW5jdGlvbiBBbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxDbih0LGUsbixyKX19ZnVuY3Rpb24gQ24obix0LGUscil7ZnVuY3Rpb24gdSgpe3ZhciBuLHQ9bC5zdGF0dXM7aWYoIXQmJkxuKGwpfHx0Pj0yMDAmJjMwMD50fHwzMDQ9PT10KXt0cnl7bj1lLmNhbGwoaSxsKX1jYXRjaChyKXtyZXR1cm4gdm9pZCBhLmVycm9yLmNhbGwoaSxyKX1hLmxvYWQuY2FsbChpLG4pfWVsc2UgYS5lcnJvci5jYWxsKGksbCl9dmFyIGk9e30sYT1vYS5kaXNwYXRjaCgiYmVmb3Jlc2VuZCIsInByb2dyZXNzIiwibG9hZCIsImVycm9yIiksbz17fSxsPW5ldyBYTUxIdHRwUmVxdWVzdCxjPW51bGw7cmV0dXJuIXRoaXMuWERvbWFpblJlcXVlc3R8fCJ3aXRoQ3JlZGVudGlhbHMiaW4gbHx8IS9eKGh0dHAocyk/Oik/XC9cLy8udGVzdChuKXx8KGw9bmV3IFhEb21haW5SZXF1ZXN0KSwib25sb2FkImluIGw/bC5vbmxvYWQ9bC5vbmVycm9yPXU6bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLnJlYWR5U3RhdGU+MyYmdSgpfSxsLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24obil7dmFyIHQ9b2EuZXZlbnQ7b2EuZXZlbnQ9bjt0cnl7YS5wcm9ncmVzcy5jYWxsKGksbCl9ZmluYWxseXtvYS5ldmVudD10fX0saS5oZWFkZXI9ZnVuY3Rpb24obix0KXtyZXR1cm4gbj0obisiIikudG9Mb3dlckNhc2UoKSxhcmd1bWVudHMubGVuZ3RoPDI/b1tuXToobnVsbD09dD9kZWxldGUgb1tuXTpvW25dPXQrIiIsaSl9LGkubWltZVR5cGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bnVsbD09bj9udWxsOm4rIiIsaSk6dH0saS5yZXNwb25zZVR5cGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bixpKTpjfSxpLnJlc3BvbnNlPWZ1bmN0aW9uKG4pe3JldHVybiBlPW4saX0sWyJnZXQiLCJwb3N0Il0uZm9yRWFjaChmdW5jdGlvbihuKXtpW25dPWZ1bmN0aW9uKCl7cmV0dXJuIGkuc2VuZC5hcHBseShpLFtuXS5jb25jYXQoY2EoYXJndW1lbnRzKSkpfX0pLGkuc2VuZD1mdW5jdGlvbihlLHIsdSl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiByJiYodT1yLHI9bnVsbCksbC5vcGVuKGUsbiwhMCksbnVsbD09dHx8ImFjY2VwdCJpbiBvfHwoby5hY2NlcHQ9dCsiLCovKiIpLGwuc2V0UmVxdWVzdEhlYWRlcilmb3IodmFyIHMgaW4gbylsLnNldFJlcXVlc3RIZWFkZXIocyxvW3NdKTtyZXR1cm4gbnVsbCE9dCYmbC5vdmVycmlkZU1pbWVUeXBlJiZsLm92ZXJyaWRlTWltZVR5cGUodCksbnVsbCE9YyYmKGwucmVzcG9uc2VUeXBlPWMpLG51bGwhPXUmJmkub24oImVycm9yIix1KS5vbigibG9hZCIsZnVuY3Rpb24obil7dShudWxsLG4pfSksYS5iZWZvcmVzZW5kLmNhbGwoaSxsKSxsLnNlbmQobnVsbD09cj9udWxsOnIpLGl9LGkuYWJvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbC5hYm9ydCgpLGl9LG9hLnJlYmluZChpLGEsIm9uIiksbnVsbD09cj9pOmkuZ2V0KHpuKHIpKX1mdW5jdGlvbiB6bihuKXtyZXR1cm4gMT09PW4ubGVuZ3RoP2Z1bmN0aW9uKHQsZSl7bihudWxsPT10P2U6bnVsbCl9Om59ZnVuY3Rpb24gTG4obil7dmFyIHQ9bi5yZXNwb25zZVR5cGU7cmV0dXJuIHQmJiJ0ZXh0IiE9PXQ/bi5yZXNwb25zZTpuLnJlc3BvbnNlVGV4dH1mdW5jdGlvbiBxbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDsyPnImJih0PTApLDM+ciYmKGU9RGF0ZS5ub3coKSk7dmFyIHU9ZSt0LGk9e2M6bix0OnUsbjpudWxsfTtyZXR1cm4gaW8/aW8ubj1pOnVvPWksaW89aSxhb3x8KG9vPWNsZWFyVGltZW91dChvbyksYW89MSxsbyhUbikpLGl9ZnVuY3Rpb24gVG4oKXt2YXIgbj1SbigpLHQ9RG4oKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KG9vKSxvbz1zZXRUaW1lb3V0KFRuLHQpKSxhbz0wKTooYW89MSxsbyhUbikpfWZ1bmN0aW9uIFJuKCl7Zm9yKHZhciBuPURhdGUubm93KCksdD11bzt0OyluPj10LnQmJnQuYyhuLXQudCkmJih0LmM9bnVsbCksdD10Lm47cmV0dXJuIG59ZnVuY3Rpb24gRG4oKXtmb3IodmFyIG4sdD11byxlPTEvMDt0Oyl0LmM/KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik6dD1uP24ubj10Lm46dW89dC5uO3JldHVybiBpbz1uLGV9ZnVuY3Rpb24gUG4obix0KXtyZXR1cm4gdC0obj9NYXRoLmNlaWwoTWF0aC5sb2cobikvTWF0aC5MTjEwKToxKX1mdW5jdGlvbiBqbihuLHQpe3ZhciBlPU1hdGgucG93KDEwLDMqTWEoOC10KSk7cmV0dXJue3NjYWxlOnQ+OD9mdW5jdGlvbihuKXtyZXR1cm4gbi9lfTpmdW5jdGlvbihuKXtyZXR1cm4gbiplfSxzeW1ib2w6bn19ZnVuY3Rpb24gVW4obil7dmFyIHQ9bi5kZWNpbWFsLGU9bi50aG91c2FuZHMscj1uLmdyb3VwaW5nLHU9bi5jdXJyZW5jeSxpPXImJmU/ZnVuY3Rpb24obix0KXtmb3IodmFyIHU9bi5sZW5ndGgsaT1bXSxhPTAsbz1yWzBdLGw9MDt1PjAmJm8+MCYmKGwrbysxPnQmJihvPU1hdGgubWF4KDEsdC1sKSksaS5wdXNoKG4uc3Vic3RyaW5nKHUtPW8sdStvKSksISgobCs9bysxKT50KSk7KW89clthPShhKzEpJXIubGVuZ3RoXTtyZXR1cm4gaS5yZXZlcnNlKCkuam9pbihlKX06eTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9c28uZXhlYyhuKSxyPWVbMV18fCIgIixhPWVbMl18fCI+IixvPWVbM118fCItIixsPWVbNF18fCIiLGM9ZVs1XSxzPStlWzZdLGY9ZVs3XSxoPWVbOF0sZz1lWzldLHA9MSx2PSIiLGQ9IiIsbT0hMSx5PSEwO3N3aXRjaChoJiYoaD0raC5zdWJzdHJpbmcoMSkpLChjfHwiMCI9PT1yJiYiPSI9PT1hKSYmKGM9cj0iMCIsYT0iPSIpLGcpe2Nhc2UibiI6Zj0hMCxnPSJnIjticmVhaztjYXNlIiUiOnA9MTAwLGQ9IiUiLGc9ImYiO2JyZWFrO2Nhc2UicCI6cD0xMDAsZD0iJSIsZz0iciI7YnJlYWs7Y2FzZSJiIjpjYXNlIm8iOmNhc2UieCI6Y2FzZSJYIjoiIyI9PT1sJiYodj0iMCIrZy50b0xvd2VyQ2FzZSgpKTtjYXNlImMiOnk9ITE7Y2FzZSJkIjptPSEwLGg9MDticmVhaztjYXNlInMiOnA9LTEsZz0iciJ9IiQiPT09bCYmKHY9dVswXSxkPXVbMV0pLCJyIiE9Z3x8aHx8KGc9ImciKSxudWxsIT1oJiYoImciPT1nP2g9TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxoKSk6KCJlIj09Z3x8ImYiPT1nKSYmKGg9TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSkpKSxnPWZvLmdldChnKXx8Rm47dmFyIE09YyYmZjtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9ZDtpZihtJiZuJTEpcmV0dXJuIiI7dmFyIHU9MD5ufHwwPT09biYmMD4xL24/KG49LW4sIi0iKToiLSI9PT1vPyIiOm87aWYoMD5wKXt2YXIgbD1vYS5mb3JtYXRQcmVmaXgobixoKTtuPWwuc2NhbGUobiksZT1sLnN5bWJvbCtkfWVsc2Ugbio9cDtuPWcobixoKTt2YXIgeCxiLF89bi5sYXN0SW5kZXhPZigiLiIpO2lmKDA+Xyl7dmFyIHc9eT9uLmxhc3RJbmRleE9mKCJlIik6LTE7MD53Pyh4PW4sYj0iIik6KHg9bi5zdWJzdHJpbmcoMCx3KSxiPW4uc3Vic3RyaW5nKHcpKX1lbHNlIHg9bi5zdWJzdHJpbmcoMCxfKSxiPXQrbi5zdWJzdHJpbmcoXysxKTshYyYmZiYmKHg9aSh4LDEvMCkpO3ZhciBTPXYubGVuZ3RoK3gubGVuZ3RoK2IubGVuZ3RoKyhNPzA6dS5sZW5ndGgpLGs9cz5TP25ldyBBcnJheShTPXMtUysxKS5qb2luKHIpOiIiO3JldHVybiBNJiYoeD1pKGsreCxrLmxlbmd0aD9zLWIubGVuZ3RoOjEvMCkpLHUrPXYsbj14K2IsKCI8Ij09PWE/dStuK2s6Ij4iPT09YT9rK3UrbjoiXiI9PT1hP2suc3Vic3RyaW5nKDAsUz4+PTEpK3UrbitrLnN1YnN0cmluZyhTKTp1KyhNP246aytuKSkrZX19fWZ1bmN0aW9uIEZuKG4pe3JldHVybiBuKyIifWZ1bmN0aW9uIEhuKCl7dGhpcy5fPW5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGg+MT9EYXRlLlVUQy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdKX1mdW5jdGlvbiBPbihuLHQsZSl7ZnVuY3Rpb24gcih0KXt2YXIgZT1uKHQpLHI9aShlLDEpO3JldHVybiByLXQ+dC1lP2U6cn1mdW5jdGlvbiB1KGUpe3JldHVybiB0KGU9bihuZXcgZ28oZS0xKSksMSksZX1mdW5jdGlvbiBpKG4sZSl7cmV0dXJuIHQobj1uZXcgZ28oK24pLGUpLG59ZnVuY3Rpb24gYShuLHIsaSl7dmFyIGE9dShuKSxvPVtdO2lmKGk+MSlmb3IoO3I+YTspZShhKSVpfHxvLnB1c2gobmV3IERhdGUoK2EpKSx0KGEsMSk7ZWxzZSBmb3IoO3I+YTspby5wdXNoKG5ldyBEYXRlKCthKSksdChhLDEpO3JldHVybiBvfWZ1bmN0aW9uIG8obix0LGUpe3RyeXtnbz1Ibjt2YXIgcj1uZXcgSG47cmV0dXJuIHIuXz1uLGEocix0LGUpfWZpbmFsbHl7Z289RGF0ZX19bi5mbG9vcj1uLG4ucm91bmQ9cixuLmNlaWw9dSxuLm9mZnNldD1pLG4ucmFuZ2U9YTt2YXIgbD1uLnV0Yz1JbihuKTtyZXR1cm4gbC5mbG9vcj1sLGwucm91bmQ9SW4ociksbC5jZWlsPUluKHUpLGwub2Zmc2V0PUluKGkpLGwucmFuZ2U9byxufWZ1bmN0aW9uIEluKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3RyeXtnbz1Ibjt2YXIgcj1uZXcgSG47cmV0dXJuIHIuXz10LG4ocixlKS5ffWZpbmFsbHl7Z289RGF0ZX19fWZ1bmN0aW9uIFluKG4pe2Z1bmN0aW9uIHQobil7ZnVuY3Rpb24gdCh0KXtmb3IodmFyIGUsdSxpLGE9W10sbz0tMSxsPTA7KytvPHI7KTM3PT09bi5jaGFyQ29kZUF0KG8pJiYoYS5wdXNoKG4uc2xpY2UobCxvKSksbnVsbCE9KHU9dm9bZT1uLmNoYXJBdCgrK28pXSkmJihlPW4uY2hhckF0KCsrbykpLChpPUFbZV0pJiYoZT1pKHQsbnVsbD09dT8iZSI9PT1lPyIgIjoiMCI6dSkpLGEucHVzaChlKSxsPW8rMSk7cmV0dXJuIGEucHVzaChuLnNsaWNlKGwsbykpLGEuam9pbigiIil9dmFyIHI9bi5sZW5ndGg7cmV0dXJuIHQucGFyc2U9ZnVuY3Rpb24odCl7dmFyIHI9e3k6MTkwMCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MCxaOm51bGx9LHU9ZShyLG4sdCwwKTtpZih1IT10Lmxlbmd0aClyZXR1cm4gbnVsbDsicCJpbiByJiYoci5IPXIuSCUxMisxMipyLnApO3ZhciBpPW51bGwhPXIuWiYmZ28hPT1IbixhPW5ldyhpP0huOmdvKTtyZXR1cm4iaiJpbiByP2Euc2V0RnVsbFllYXIoci55LDAsci5qKToiVyJpbiByfHwiVSJpbiByPygidyJpbiByfHwoci53PSJXImluIHI/MTowKSxhLnNldEZ1bGxZZWFyKHIueSwwLDEpLGEuc2V0RnVsbFllYXIoci55LDAsIlciaW4gcj8oci53KzYpJTcrNypyLlctKGEuZ2V0RGF5KCkrNSklNzpyLncrNypyLlUtKGEuZ2V0RGF5KCkrNiklNykpOmEuc2V0RnVsbFllYXIoci55LHIubSxyLmQpLGEuc2V0SG91cnMoci5IKyhyLlovMTAwfDApLHIuTStyLlolMTAwLHIuUyxyLkwpLGk/YS5fOmF9LHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sdH1mdW5jdGlvbiBlKG4sdCxlLHIpe2Zvcih2YXIgdSxpLGEsbz0wLGw9dC5sZW5ndGgsYz1lLmxlbmd0aDtsPm87KXtpZihyPj1jKXJldHVybi0xO2lmKHU9dC5jaGFyQ29kZUF0KG8rKyksMzc9PT11KXtpZihhPXQuY2hhckF0KG8rKyksaT1DW2EgaW4gdm8/dC5jaGFyQXQobysrKTphXSwhaXx8KHI9aShuLGUscikpPDApcmV0dXJuLTF9ZWxzZSBpZih1IT1lLmNoYXJDb2RlQXQocisrKSlyZXR1cm4tMX1yZXR1cm4gcn1mdW5jdGlvbiByKG4sdCxlKXtfLmxhc3RJbmRleD0wO3ZhciByPV8uZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi53PXcuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdShuLHQsZSl7eC5sYXN0SW5kZXg9MDt2YXIgcj14LmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz1iLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGkobix0LGUpe04ubGFzdEluZGV4PTA7dmFyIHI9Ti5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLm09RS5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhKG4sdCxlKXtTLmxhc3RJbmRleD0wO3ZhciByPVMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPWsuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyhuLHQscil7cmV0dXJuIGUobixBLmMudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGwobix0LHIpe3JldHVybiBlKG4sQS54LnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLEEuWC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gcyhuLHQsZSl7dmFyIHI9TS5nZXQodC5zbGljZShlLGUrPTIpLnRvTG93ZXJDYXNlKCkpO3JldHVybiBudWxsPT1yPy0xOihuLnA9cixlKX12YXIgZj1uLmRhdGVUaW1lLGg9bi5kYXRlLGc9bi50aW1lLHA9bi5wZXJpb2RzLHY9bi5kYXlzLGQ9bi5zaG9ydERheXMsbT1uLm1vbnRocyx5PW4uc2hvcnRNb250aHM7dC51dGM9ZnVuY3Rpb24obil7ZnVuY3Rpb24gZShuKXt0cnl7Z289SG47dmFyIHQ9bmV3IGdvO3JldHVybiB0Ll89bixyKHQpfWZpbmFsbHl7Z289RGF0ZX19dmFyIHI9dChuKTtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihuKXt0cnl7Z289SG47dmFyIHQ9ci5wYXJzZShuKTtyZXR1cm4gdCYmdC5ffWZpbmFsbHl7Z289RGF0ZX19LGUudG9TdHJpbmc9ci50b1N0cmluZyxlfSx0Lm11bHRpPXQudXRjLm11bHRpPWN0O3ZhciBNPW9hLm1hcCgpLHg9Vm4odiksYj1Ybih2KSxfPVZuKGQpLHc9WG4oZCksUz1WbihtKSxrPVhuKG0pLE49Vm4oeSksRT1Ybih5KTtwLmZvckVhY2goZnVuY3Rpb24obix0KXtNLnNldChuLnRvTG93ZXJDYXNlKCksdCl9KTt2YXIgQT17YTpmdW5jdGlvbihuKXtyZXR1cm4gZFtuLmdldERheSgpXX0sQTpmdW5jdGlvbihuKXtyZXR1cm4gdltuLmdldERheSgpXX0sYjpmdW5jdGlvbihuKXtyZXR1cm4geVtuLmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uKG4pe3JldHVybiBtW24uZ2V0TW9udGgoKV19LGM6dChmKSxkOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0RGF0ZSgpLHQsMil9LGU6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXREYXRlKCksdCwyKX0sSDpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldEhvdXJzKCksdCwyKX0sSTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldEhvdXJzKCklMTJ8fDEyLHQsMil9LGo6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4oMStoby5kYXlPZlllYXIobiksdCwzKX0sTDpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldE1pbGxpc2Vjb25kcygpLHQsMyl9LG06ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXRNb250aCgpKzEsdCwyKX0sTTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldE1pbnV0ZXMoKSx0LDIpfSxwOmZ1bmN0aW9uKG4pe3JldHVybiBwWysobi5nZXRIb3VycygpPj0xMildfSxTOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0U2Vjb25kcygpLHQsMil9LFU6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4oaG8uc3VuZGF5T2ZZZWFyKG4pLHQsMil9LHc6ZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF5KCl9LFc6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4oaG8ubW9uZGF5T2ZZZWFyKG4pLHQsMil9LHg6dChoKSxYOnQoZykseTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldEZ1bGxZZWFyKCklMTAwLHQsMil9LFk6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXRGdWxsWWVhcigpJTFlNCx0LDQpfSxaOm90LCIlIjpmdW5jdGlvbigpe3JldHVybiIlIn19LEM9e2E6cixBOnUsYjppLEI6YSxjOm8sZDp0dCxlOnR0LEg6cnQsSTpydCxqOmV0LEw6YXQsbTpudCxNOnV0LHA6cyxTOml0LFU6Qm4sdzokbixXOlduLHg6bCxYOmMseTpHbixZOkpuLFo6S24sIiUiOmx0fTtyZXR1cm4gdH1mdW5jdGlvbiBabihuLHQsZSl7dmFyIHI9MD5uPyItIjoiIix1PShyPy1uOm4pKyIiLGk9dS5sZW5ndGg7cmV0dXJuIHIrKGU+aT9uZXcgQXJyYXkoZS1pKzEpLmpvaW4odCkrdTp1KX1mdW5jdGlvbiBWbihuKXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrbi5tYXAob2EucmVxdW90ZSkuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIFhuKG4pe2Zvcih2YXIgdD1uZXcgYyxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQuc2V0KG5bZV0udG9Mb3dlckNhc2UoKSxlKTtyZXR1cm4gdH1mdW5jdGlvbiAkbihuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KG4udz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBCbihuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFduKG4sdCxlKXttby5sYXN0SW5kZXg9MDt2YXIgcj1tby5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLlc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSm4obix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlLGUrNCkpO3JldHVybiByPyhuLnk9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gR24obix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLnk9UW4oK3JbMF0pLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEtuKG4sdCxlKXtyZXR1cm4vXlsrLV1cZHs0fSQvLnRlc3QodD10LnNsaWNlKGUsZSs1KSk/KG4uWj0tdCxlKzUpOi0xfWZ1bmN0aW9uIFFuKG4pe3JldHVybiBuKyhuPjY4PzE5MDA6MmUzKX1mdW5jdGlvbiBudChuLHQsZSl7bW8ubGFzdEluZGV4PTA7dmFyIHI9bW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4ubT1yWzBdLTEsZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdHQobix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZXQobix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlLGUrMykpO3JldHVybiByPyhuLmo9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnQobix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLkg9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdXQobix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaXQobix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLlM9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYXQobix0LGUpe21vLmxhc3RJbmRleD0wO3ZhciByPW1vLmV4ZWModC5zbGljZShlLGUrMykpO3JldHVybiByPyhuLkw9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gb3Qobil7dmFyIHQ9bi5nZXRUaW1lem9uZU9mZnNldCgpLGU9dD4wPyItIjoiKyIscj1NYSh0KS82MHwwLHU9TWEodCklNjA7cmV0dXJuIGUrWm4ociwiMCIsMikrWm4odSwiMCIsMil9ZnVuY3Rpb24gbHQobix0LGUpe3lvLmxhc3RJbmRleD0wO3ZhciByPXlvLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByP2UrclswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gY3Qobil7Zm9yKHZhciB0PW4ubGVuZ3RoLGU9LTE7KytlPHQ7KW5bZV1bMF09dGhpcyhuW2VdWzBdKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj1uW2VdOyFyWzFdKHQpOylyPW5bKytlXTtyZXR1cm4gclswXSh0KX19ZnVuY3Rpb24gc3QoKXt9ZnVuY3Rpb24gZnQobix0LGUpe3ZhciByPWUucz1uK3QsdT1yLW4saT1yLXU7ZS50PW4taSsodC11KX1mdW5jdGlvbiBodChuLHQpe24mJl9vLmhhc093blByb3BlcnR5KG4udHlwZSkmJl9vW24udHlwZV0obix0KX1mdW5jdGlvbiBndChuLHQsZSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoLWU7Zm9yKHQubGluZVN0YXJ0KCk7Kyt1PGk7KXI9blt1XSx0LnBvaW50KHJbMF0sclsxXSxyWzJdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBwdChuLHQpe3ZhciBlPS0xLHI9bi5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPHI7KWd0KG5bZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiB2dCgpe2Z1bmN0aW9uIG4obix0KXtuKj1PYSx0PXQqT2EvMitqYS80O3ZhciBlPW4tcixhPWU+PTA/MTotMSxvPWEqZSxsPU1hdGguY29zKHQpLGM9TWF0aC5zaW4odCkscz1pKmMsZj11KmwrcypNYXRoLmNvcyhvKSxoPXMqYSpNYXRoLnNpbihvKTtTby5hZGQoTWF0aC5hdGFuMihoLGYpKSxyPW4sdT1sLGk9Y312YXIgdCxlLHIsdSxpO2tvLnBvaW50PWZ1bmN0aW9uKGEsbyl7a28ucG9pbnQ9bixyPSh0PWEpKk9hLHU9TWF0aC5jb3Mobz0oZT1vKSpPYS8yK2phLzQpLGk9TWF0aC5zaW4obyl9LGtvLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIGR0KG4pe3ZhciB0PW5bMF0sZT1uWzFdLHI9TWF0aC5jb3MoZSk7cmV0dXJuW3IqTWF0aC5jb3ModCkscipNYXRoLnNpbih0KSxNYXRoLnNpbihlKV19ZnVuY3Rpb24gbXQobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl19ZnVuY3Rpb24geXQobix0KXtyZXR1cm5bblsxXSp0WzJdLW5bMl0qdFsxXSxuWzJdKnRbMF0tblswXSp0WzJdLG5bMF0qdFsxXS1uWzFdKnRbMF1dfWZ1bmN0aW9uIE10KG4sdCl7blswXSs9dFswXSxuWzFdKz10WzFdLG5bMl0rPXRbMl19ZnVuY3Rpb24geHQobix0KXtyZXR1cm5bblswXSp0LG5bMV0qdCxuWzJdKnRdfWZ1bmN0aW9uIGJ0KG4pe3ZhciB0PU1hdGguc3FydChuWzBdKm5bMF0rblsxXSpuWzFdK25bMl0qblsyXSk7blswXS89dCxuWzFdLz10LG5bMl0vPXR9ZnVuY3Rpb24gX3Qobil7cmV0dXJuW01hdGguYXRhbjIoblsxXSxuWzBdKSx0bihuWzJdKV19ZnVuY3Rpb24gd3Qobix0KXtyZXR1cm4gTWEoblswXS10WzBdKTxEYSYmTWEoblsxXS10WzFdKTxEYX1mdW5jdGlvbiBTdChuLHQpe24qPU9hO3ZhciBlPU1hdGguY29zKHQqPU9hKTtrdChlKk1hdGguY29zKG4pLGUqTWF0aC5zaW4obiksTWF0aC5zaW4odCkpfWZ1bmN0aW9uIGt0KG4sdCxlKXsrK05vLEFvKz0obi1BbykvTm8sQ28rPSh0LUNvKS9Obyx6bys9KGUtem8pL05vfWZ1bmN0aW9uIE50KCl7ZnVuY3Rpb24gbihuLHUpe24qPU9hO3ZhciBpPU1hdGguY29zKHUqPU9hKSxhPWkqTWF0aC5jb3Mobiksbz1pKk1hdGguc2luKG4pLGw9TWF0aC5zaW4odSksYz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYz1lKmwtcipvKSpjKyhjPXIqYS10KmwpKmMrKGM9dCpvLWUqYSkqYyksdCphK2UqbytyKmwpO0VvKz1jLExvKz1jKih0Kyh0PWEpKSxxbys9YyooZSsoZT1vKSksVG8rPWMqKHIrKHI9bCkpLGt0KHQsZSxyKX12YXIgdCxlLHI7am8ucG9pbnQ9ZnVuY3Rpb24odSxpKXt1Kj1PYTt2YXIgYT1NYXRoLmNvcyhpKj1PYSk7dD1hKk1hdGguY29zKHUpLGU9YSpNYXRoLnNpbih1KSxyPU1hdGguc2luKGkpLGpvLnBvaW50PW4sa3QodCxlLHIpfX1mdW5jdGlvbiBFdCgpe2pvLnBvaW50PVN0fWZ1bmN0aW9uIEF0KCl7ZnVuY3Rpb24gbihuLHQpe24qPU9hO3ZhciBlPU1hdGguY29zKHQqPU9hKSxhPWUqTWF0aC5jb3Mobiksbz1lKk1hdGguc2luKG4pLGw9TWF0aC5zaW4odCksYz11KmwtaSpvLHM9aSphLXIqbCxmPXIqby11KmEsaD1NYXRoLnNxcnQoYypjK3MqcytmKmYpLGc9ciphK3UqbytpKmwscD1oJiYtbm4oZykvaCx2PU1hdGguYXRhbjIoaCxnKTtSbys9cCpjLERvKz1wKnMsUG8rPXAqZixFbys9dixMbys9dioocisocj1hKSkscW8rPXYqKHUrKHU9bykpLFRvKz12KihpKyhpPWwpKSxrdChyLHUsaSl9dmFyIHQsZSxyLHUsaTtqby5wb2ludD1mdW5jdGlvbihhLG8pe3Q9YSxlPW8sam8ucG9pbnQ9bixhKj1PYTt2YXIgbD1NYXRoLmNvcyhvKj1PYSk7cj1sKk1hdGguY29zKGEpLHU9bCpNYXRoLnNpbihhKSxpPU1hdGguc2luKG8pLGt0KHIsdSxpKX0sam8ubGluZUVuZD1mdW5jdGlvbigpe24odCxlKSxqby5saW5lRW5kPUV0LGpvLnBvaW50PVN0fX1mdW5jdGlvbiBDdChuLHQpe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT1uKGUsciksdChlWzBdLGVbMV0pfXJldHVybiBuLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybiBlPXQuaW52ZXJ0KGUsciksZSYmbi5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24genQoKXtyZXR1cm4hMH1mdW5jdGlvbiBMdChuLHQsZSxyLHUpe3ZhciBpPVtdLGE9W107aWYobi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCEoKHQ9bi5sZW5ndGgtMSk8PTApKXt2YXIgdCxlPW5bMF0scj1uW3RdO2lmKHd0KGUscikpe3UubGluZVN0YXJ0KCk7Zm9yKHZhciBvPTA7dD5vOysrbyl1LnBvaW50KChlPW5bb10pWzBdLGVbMV0pO3JldHVybiB2b2lkIHUubGluZUVuZCgpfXZhciBsPW5ldyBUdChlLG4sbnVsbCwhMCksYz1uZXcgVHQoZSxudWxsLGwsITEpO2wubz1jLGkucHVzaChsKSxhLnB1c2goYyksbD1uZXcgVHQocixuLG51bGwsITEpLGM9bmV3IFR0KHIsbnVsbCxsLCEwKSxsLm89YyxpLnB1c2gobCksYS5wdXNoKGMpfX0pLGEuc29ydCh0KSxxdChpKSxxdChhKSxpLmxlbmd0aCl7Zm9yKHZhciBvPTAsbD1lLGM9YS5sZW5ndGg7Yz5vOysrbylhW29dLmU9bD0hbDtmb3IodmFyIHMsZixoPWlbMF07Oyl7Zm9yKHZhciBnPWgscD0hMDtnLnY7KWlmKChnPWcubik9PT1oKXJldHVybjtzPWcueix1LmxpbmVTdGFydCgpO2Rve2lmKGcudj1nLm8udj0hMCxnLmUpe2lmKHApZm9yKHZhciBvPTAsYz1zLmxlbmd0aDtjPm87KytvKXUucG9pbnQoKGY9c1tvXSlbMF0sZlsxXSk7ZWxzZSByKGcueCxnLm4ueCwxLHUpO2c9Zy5ufWVsc2V7aWYocCl7cz1nLnAuejtmb3IodmFyIG89cy5sZW5ndGgtMTtvPj0wOy0tbyl1LnBvaW50KChmPXNbb10pWzBdLGZbMV0pfWVsc2UgcihnLngsZy5wLngsLTEsdSk7Zz1nLnB9Zz1nLm8scz1nLnoscD0hcH13aGlsZSghZy52KTt1LmxpbmVFbmQoKX19fWZ1bmN0aW9uIHF0KG4pe2lmKHQ9bi5sZW5ndGgpe2Zvcih2YXIgdCxlLHI9MCx1PW5bMF07KytyPHQ7KXUubj1lPW5bcl0sZS5wPXUsdT1lO3Uubj1lPW5bMF0sZS5wPXV9fWZ1bmN0aW9uIFR0KG4sdCxlLHIpe3RoaXMueD1uLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gUnQobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHUsaSl7ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXUodCxlKTtuKHQ9clswXSxlPXJbMV0pJiZpLnBvaW50KHQsZSl9ZnVuY3Rpb24gbyhuLHQpe3ZhciBlPXUobix0KTtkLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gbCgpe3kucG9pbnQ9byxkLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lRW5kKCl9ZnVuY3Rpb24gcyhuLHQpe3YucHVzaChbbix0XSk7dmFyIGU9dShuLHQpO3gucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBmKCl7eC5saW5lU3RhcnQoKSx2PVtdfWZ1bmN0aW9uIGgoKXtzKHZbMF1bMF0sdlswXVsxXSkseC5saW5lRW5kKCk7dmFyIG4sdD14LmNsZWFuKCksZT1NLmJ1ZmZlcigpLHI9ZS5sZW5ndGg7aWYodi5wb3AoKSxwLnB1c2godiksdj1udWxsLHIpaWYoMSZ0KXtuPWVbMF07dmFyIHUscj1uLmxlbmd0aC0xLGE9LTE7aWYocj4wKXtmb3IoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKTsrK2E8cjspaS5wb2ludCgodT1uW2FdKVswXSx1WzFdKTtpLmxpbmVFbmQoKX19ZWxzZSByPjEmJjImdCYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpLGcucHVzaChlLmZpbHRlcihEdCkpfXZhciBnLHAsdixkPXQoaSksbT11LmludmVydChyWzBdLHJbMV0pLHk9e3BvaW50OmEsbGluZVN0YXJ0OmwsbGluZUVuZDpjLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3kucG9pbnQ9cyx5LmxpbmVTdGFydD1mLHkubGluZUVuZD1oLGc9W10scD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3kucG9pbnQ9YSx5LmxpbmVTdGFydD1sLHkubGluZUVuZD1jLGc9b2EubWVyZ2UoZyk7dmFyIG49T3QobSxwKTtnLmxlbmd0aD8oYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksTHQoZyxqdCxuLGUsaSkpOm4mJihifHwoaS5wb2x5Z29uU3RhcnQoKSxiPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGImJihpLnBvbHlnb25FbmQoKSxiPSExKSxnPXA9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fSxNPVB0KCkseD10KE0pLGI9ITE7cmV0dXJuIHl9fWZ1bmN0aW9uIER0KG4pe3JldHVybiBuLmxlbmd0aD4xfWZ1bmN0aW9uIFB0KCl7dmFyIG4sdD1bXTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5wdXNoKG49W10pfSxwb2ludDpmdW5jdGlvbih0LGUpe24ucHVzaChbdCxlXSl9LGxpbmVFbmQ6YixidWZmZXI6ZnVuY3Rpb24oKXt2YXIgZT10O3JldHVybiB0PVtdLG49bnVsbCxlfSxyZWpvaW46ZnVuY3Rpb24oKXt0Lmxlbmd0aD4xJiZ0LnB1c2godC5wb3AoKS5jb25jYXQodC5zaGlmdCgpKSl9fX1mdW5jdGlvbiBqdChuLHQpe3JldHVybigobj1uLngpWzBdPDA/blsxXS1IYS1EYTpIYS1uWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tSGEtRGE6SGEtdFsxXSl9ZnVuY3Rpb24gVXQobil7dmFyIHQsZT1OYU4scj1OYU4sdT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCksdD0xfSxwb2ludDpmdW5jdGlvbihpLGEpe3ZhciBvPWk+MD9qYTotamEsbD1NYShpLWUpO01hKGwtamEpPERhPyhuLnBvaW50KGUscj0ocithKS8yPjA/SGE6LUhhKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KG8sciksbi5wb2ludChpLHIpLHQ9MCk6dSE9PW8mJmw+PWphJiYoTWEoZS11KTxEYSYmKGUtPXUqRGEpLE1hKGktbyk8RGEmJihpLT1vKkRhKSxyPUZ0KGUscixpLGEpLG4ucG9pbnQodSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQobyxyKSx0PTApLG4ucG9pbnQoZT1pLHI9YSksdT1vfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bi5saW5lRW5kKCksZT1yPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi10fX19ZnVuY3Rpb24gRnQobix0LGUscil7dmFyIHUsaSxhPU1hdGguc2luKG4tZSk7cmV0dXJuIE1hKGEpPkRhP01hdGguYXRhbigoTWF0aC5zaW4odCkqKGk9TWF0aC5jb3MocikpKk1hdGguc2luKGUpLU1hdGguc2luKHIpKih1PU1hdGguY29zKHQpKSpNYXRoLnNpbihuKSkvKHUqaSphKSk6KHQrcikvMn1mdW5jdGlvbiBIdChuLHQsZSxyKXt2YXIgdTtpZihudWxsPT1uKXU9ZSpIYSxyLnBvaW50KC1qYSx1KSxyLnBvaW50KDAsdSksci5wb2ludChqYSx1KSxyLnBvaW50KGphLDApLHIucG9pbnQoamEsLXUpLHIucG9pbnQoMCwtdSksci5wb2ludCgtamEsLXUpLHIucG9pbnQoLWphLDApLHIucG9pbnQoLWphLHUpO2Vsc2UgaWYoTWEoblswXS10WzBdKT5EYSl7dmFyIGk9blswXTx0WzBdP2phOi1qYTt1PWUqaS8yLHIucG9pbnQoLWksdSksci5wb2ludCgwLHUpLHIucG9pbnQoaSx1KX1lbHNlIHIucG9pbnQodFswXSx0WzFdKX1mdW5jdGlvbiBPdChuLHQpe3ZhciBlPW5bMF0scj1uWzFdLHU9W01hdGguc2luKGUpLC1NYXRoLmNvcyhlKSwwXSxpPTAsYT0wO1NvLnJlc2V0KCk7Zm9yKHZhciBvPTAsbD10Lmxlbmd0aDtsPm87KytvKXt2YXIgYz10W29dLHM9Yy5sZW5ndGg7aWYocylmb3IodmFyIGY9Y1swXSxoPWZbMF0sZz1mWzFdLzIramEvNCxwPU1hdGguc2luKGcpLHY9TWF0aC5jb3MoZyksZD0xOzspe2Q9PT1zJiYoZD0wKSxuPWNbZF07dmFyIG09blswXSx5PW5bMV0vMitqYS80LE09TWF0aC5zaW4oeSkseD1NYXRoLmNvcyh5KSxiPW0taCxfPWI+PTA/MTotMSx3PV8qYixTPXc+amEsaz1wKk07aWYoU28uYWRkKE1hdGguYXRhbjIoaypfKk1hdGguc2luKHcpLHYqeCtrKk1hdGguY29zKHcpKSksaSs9Uz9iK18qVWE6YixTXmg+PWVebT49ZSl7dmFyIE49eXQoZHQoZiksZHQobikpO2J0KE4pO3ZhciBFPXl0KHUsTik7YnQoRSk7dmFyIEE9KFNeYj49MD8tMToxKSp0bihFWzJdKTsocj5BfHxyPT09QSYmKE5bMF18fE5bMV0pKSYmKGErPVNeYj49MD8xOi0xKX1pZighZCsrKWJyZWFrO2g9bSxwPU0sdj14LGY9bn19cmV0dXJuKC1EYT5pfHxEYT5pJiYwPlNvKV4xJmF9ZnVuY3Rpb24gSXQobil7ZnVuY3Rpb24gdChuLHQpe3JldHVybiBNYXRoLmNvcyhuKSpNYXRoLmNvcyh0KT5pfWZ1bmN0aW9uIGUobil7dmFyIGUsaSxsLGMscztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7Yz1sPSExLHM9MX0scG9pbnQ6ZnVuY3Rpb24oZixoKXt2YXIgZyxwPVtmLGhdLHY9dChmLGgpLGQ9YT92PzA6dShmLGgpOnY/dShmKygwPmY/amE6LWphKSxoKTowO2lmKCFlJiYoYz1sPXYpJiZuLmxpbmVTdGFydCgpLHYhPT1sJiYoZz1yKGUscCksKHd0KGUsZyl8fHd0KHAsZykpJiYocFswXSs9RGEscFsxXSs9RGEsdj10KHBbMF0scFsxXSkpKSx2IT09bClzPTAsdj8obi5saW5lU3RhcnQoKSxnPXIocCxlKSxuLnBvaW50KGdbMF0sZ1sxXSkpOihnPXIoZSxwKSxuLnBvaW50KGdbMF0sZ1sxXSksbi5saW5lRW5kKCkpLGU9ZztlbHNlIGlmKG8mJmUmJmFedil7dmFyIG07ZCZpfHwhKG09cihwLGUsITApKXx8KHM9MCxhPyhuLmxpbmVTdGFydCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSxuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCkpOihuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSkpKX0hdnx8ZSYmd3QoZSxwKXx8bi5wb2ludChwWzBdLHBbMV0pLGU9cCxsPXYsaT1kfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bCYmbi5saW5lRW5kKCksZT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZsKTw8MX19fWZ1bmN0aW9uIHIobix0LGUpe3ZhciByPWR0KG4pLHU9ZHQodCksYT1bMSwwLDBdLG89eXQocix1KSxsPW10KG8sbyksYz1vWzBdLHM9bC1jKmM7aWYoIXMpcmV0dXJuIWUmJm47dmFyIGY9aSpsL3MsaD0taSpjL3MsZz15dChhLG8pLHA9eHQoYSxmKSx2PXh0KG8saCk7TXQocCx2KTt2YXIgZD1nLG09bXQocCxkKSx5PW10KGQsZCksTT1tKm0teSoobXQocCxwKS0xKTtpZighKDA+TSkpe3ZhciB4PU1hdGguc3FydChNKSxiPXh0KGQsKC1tLXgpL3kpO2lmKE10KGIscCksYj1fdChiKSwhZSlyZXR1cm4gYjt2YXIgXyx3PW5bMF0sUz10WzBdLGs9blsxXSxOPXRbMV07dz5TJiYoXz13LHc9UyxTPV8pO3ZhciBFPVMtdyxBPU1hKEUtamEpPERhLEM9QXx8RGE+RTtpZighQSYmaz5OJiYoXz1rLGs9TixOPV8pLEM/QT9rK04+MF5iWzFdPChNYShiWzBdLXcpPERhP2s6Tik6azw9YlsxXSYmYlsxXTw9TjpFPmphXih3PD1iWzBdJiZiWzBdPD1TKSl7dmFyIHo9eHQoZCwoLW0reCkveSk7cmV0dXJuIE10KHoscCksW2IsX3QoeildfX19ZnVuY3Rpb24gdSh0LGUpe3ZhciByPWE/bjpqYS1uLHU9MDtyZXR1cm4tcj50P3V8PTE6dD5yJiYodXw9MiksLXI+ZT91fD00OmU+ciYmKHV8PTgpLHV9dmFyIGk9TWF0aC5jb3MobiksYT1pPjAsbz1NYShpKT5EYSxsPXZlKG4sNipPYSk7cmV0dXJuIFJ0KHQsZSxsLGE/WzAsLW5dOlstamEsbi1qYV0pfWZ1bmN0aW9uIFl0KG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1KXt2YXIgaSxhPXUuYSxvPXUuYixsPWEueCxjPWEueSxzPW8ueCxmPW8ueSxoPTAsZz0xLHA9cy1sLHY9Zi1jO2lmKGk9bi1sLHB8fCEoaT4wKSl7aWYoaS89cCwwPnApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHA+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ZS1sLHB8fCEoMD5pKSl7aWYoaS89cCwwPnApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHA+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWlmKGk9dC1jLHZ8fCEoaT4wKSl7aWYoaS89diwwPnYpe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHY+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ci1jLHZ8fCEoMD5pKSl7aWYoaS89diwwPnYpe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHY+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfXJldHVybiBoPjAmJih1LmE9e3g6bCtoKnAseTpjK2gqdn0pLDE+ZyYmKHUuYj17eDpsK2cqcCx5OmMrZyp2fSksdX19fX19fWZ1bmN0aW9uIFp0KG4sdCxlLHIpe2Z1bmN0aW9uIHUocix1KXtyZXR1cm4gTWEoclswXS1uKTxEYT91PjA/MDozOk1hKHJbMF0tZSk8RGE/dT4wPzI6MTpNYShyWzFdLXQpPERhP3U+MD8xOjA6dT4wPzM6Mn1mdW5jdGlvbiBpKG4sdCl7cmV0dXJuIGEobi54LHQueCl9ZnVuY3Rpb24gYShuLHQpe3ZhciBlPXUobiwxKSxyPXUodCwxKTtyZXR1cm4gZSE9PXI/ZS1yOjA9PT1lP3RbMV0tblsxXToxPT09ZT9uWzBdLXRbMF06Mj09PWU/blsxXS10WzFdOnRbMF0tblswXX1yZXR1cm4gZnVuY3Rpb24obyl7ZnVuY3Rpb24gbChuKXtmb3IodmFyIHQ9MCxlPWQubGVuZ3RoLHI9blsxXSx1PTA7ZT51OysrdSlmb3IodmFyIGksYT0xLG89ZFt1XSxsPW8ubGVuZ3RoLGM9b1swXTtsPmE7KythKWk9b1thXSxjWzFdPD1yP2lbMV0+ciYmUShjLGksbik+MCYmKyt0OmlbMV08PXImJlEoYyxpLG4pPDAmJi0tdCxjPWk7cmV0dXJuIDAhPT10fWZ1bmN0aW9uIGMoaSxvLGwsYyl7dmFyIHM9MCxmPTA7aWYobnVsbD09aXx8KHM9dShpLGwpKSE9PShmPXUobyxsKSl8fGEoaSxvKTwwXmw+MCl7ZG8gYy5wb2ludCgwPT09c3x8Mz09PXM/bjplLHM+MT9yOnQpO3doaWxlKChzPShzK2wrNCklNCkhPT1mKX1lbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBzKHUsaSl7cmV0dXJuIHU+PW4mJmU+PXUmJmk+PXQmJnI+PWl9ZnVuY3Rpb24gZihuLHQpe3Mobix0KSYmby5wb2ludChuLHQpfWZ1bmN0aW9uIGgoKXtDLnBvaW50PXAsZCYmZC5wdXNoKG09W10pLFM9ITAsdz0hMSxiPV89TmFOfWZ1bmN0aW9uIGcoKXt2JiYocCh5LE0pLHgmJncmJkUucmVqb2luKCksdi5wdXNoKEUuYnVmZmVyKCkpKSxDLnBvaW50PWYsdyYmby5saW5lRW5kKCl9ZnVuY3Rpb24gcChuLHQpe249TWF0aC5tYXgoLUZvLE1hdGgubWluKEZvLG4pKSx0PU1hdGgubWF4KC1GbyxNYXRoLm1pbihGbyx0KSk7dmFyIGU9cyhuLHQpO2lmKGQmJm0ucHVzaChbbix0XSksUyl5PW4sTT10LHg9ZSxTPSExLGUmJihvLmxpbmVTdGFydCgpLG8ucG9pbnQobix0KSk7ZWxzZSBpZihlJiZ3KW8ucG9pbnQobix0KTtlbHNle3ZhciByPXthOnt4OmIseTpffSxiOnt4Om4seTp0fX07QShyKT8od3x8KG8ubGluZVN0YXJ0KCksby5wb2ludChyLmEueCxyLmEueSkpLG8ucG9pbnQoci5iLngsci5iLnkpLGV8fG8ubGluZUVuZCgpLGs9ITEpOmUmJihvLmxpbmVTdGFydCgpLG8ucG9pbnQobix0KSxrPSExKX1iPW4sXz10LHc9ZX12YXIgdixkLG0seSxNLHgsYixfLHcsUyxrLE49byxFPVB0KCksQT1ZdChuLHQsZSxyKSxDPXtwb2ludDpmLGxpbmVTdGFydDpoLGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtvPUUsdj1bXSxkPVtdLGs9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtvPU4sdj1vYS5tZXJnZSh2KTt2YXIgdD1sKFtuLHJdKSxlPWsmJnQsdT12Lmxlbmd0aDsoZXx8dSkmJihvLnBvbHlnb25TdGFydCgpLGUmJihvLmxpbmVTdGFydCgpLGMobnVsbCxudWxsLDEsbyksby5saW5lRW5kKCkpLHUmJkx0KHYsaSx0LGMsbyksby5wb2x5Z29uRW5kKCkpLHY9ZD1tPW51bGx9fTtyZXR1cm4gQ319ZnVuY3Rpb24gVnQobil7dmFyIHQ9MCxlPWphLzMscj1vZShuKSx1PXIodCxlKTtyZXR1cm4gdS5wYXJhbGxlbHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cih0PW5bMF0qamEvMTgwLGU9blsxXSpqYS8xODApOlt0L2phKjE4MCxlL2phKjE4MF19LHV9ZnVuY3Rpb24gWHQobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5zcXJ0KGktMip1Kk1hdGguc2luKHQpKS91O3JldHVybltlKk1hdGguc2luKG4qPXUpLGEtZSpNYXRoLmNvcyhuKV19dmFyIHI9TWF0aC5zaW4obiksdT0ocitNYXRoLnNpbih0KSkvMixpPTErciooMip1LXIpLGE9TWF0aC5zcXJ0KGkpL3U7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9YS10O3JldHVybltNYXRoLmF0YW4yKG4sZSkvdSx0bigoaS0obipuK2UqZSkqdSp1KS8oMip1KSldfSxlfWZ1bmN0aW9uICR0KCl7ZnVuY3Rpb24gbihuLHQpe09vKz11Km4tcip0LHI9bix1PXR9dmFyIHQsZSxyLHU7WG8ucG9pbnQ9ZnVuY3Rpb24oaSxhKXtYby5wb2ludD1uLHQ9cj1pLGU9dT1hfSxYby5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBCdChuLHQpe0lvPm4mJihJbz1uKSxuPlpvJiYoWm89biksWW8+dCYmKFlvPXQpLHQ+Vm8mJihWbz10KX1mdW5jdGlvbiBXdCgpe2Z1bmN0aW9uIG4obix0KXthLnB1c2goIk0iLG4sIiwiLHQsaSl9ZnVuY3Rpb24gdChuLHQpe2EucHVzaCgiTSIsbiwiLCIsdCksby5wb2ludD1lfWZ1bmN0aW9uIGUobix0KXthLnB1c2goIkwiLG4sIiwiLHQpfWZ1bmN0aW9uIHIoKXtvLnBvaW50PW59ZnVuY3Rpb24gdSgpe2EucHVzaCgiWiIpfXZhciBpPUp0KDQuNSksYT1bXSxvPXtwb2ludDpuLGxpbmVTdGFydDpmdW5jdGlvbigpe28ucG9pbnQ9dH0sbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe28ubGluZUVuZD11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7by5saW5lRW5kPXIsby5wb2ludD1ufSxwb2ludFJhZGl1czpmdW5jdGlvbihuKXtyZXR1cm4gaT1KdChuKSxvfSxyZXN1bHQ6ZnVuY3Rpb24oKXtpZihhLmxlbmd0aCl7dmFyIG49YS5qb2luKCIiKTtyZXR1cm4gYT1bXSxufX19O3JldHVybiBvfWZ1bmN0aW9uIEp0KG4pe3JldHVybiJtMCwiK24rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrLTIqbisiYSIrbisiLCIrbisiIDAgMSwxIDAsIisyKm4rInoifWZ1bmN0aW9uIEd0KG4sdCl7QW8rPW4sQ28rPXQsKyt6b31mdW5jdGlvbiBLdCgpe2Z1bmN0aW9uIG4obixyKXt2YXIgdT1uLXQsaT1yLWUsYT1NYXRoLnNxcnQodSp1K2kqaSk7TG8rPWEqKHQrbikvMixxbys9YSooZStyKS8yLFRvKz1hLEd0KHQ9bixlPXIpfXZhciB0LGU7Qm8ucG9pbnQ9ZnVuY3Rpb24ocix1KXtCby5wb2ludD1uLEd0KHQ9cixlPXUpfX1mdW5jdGlvbiBRdCgpe0JvLnBvaW50PUd0fWZ1bmN0aW9uIG5lKCl7ZnVuY3Rpb24gbihuLHQpe3ZhciBlPW4tcixpPXQtdSxhPU1hdGguc3FydChlKmUraSppKTtMbys9YSoocituKS8yLHFvKz1hKih1K3QpLzIsVG8rPWEsYT11Km4tcip0LFJvKz1hKihyK24pLERvKz1hKih1K3QpLFBvKz0zKmEsR3Qocj1uLHU9dCl9dmFyIHQsZSxyLHU7Qm8ucG9pbnQ9ZnVuY3Rpb24oaSxhKXtCby5wb2ludD1uLEd0KHQ9cj1pLGU9dT1hKX0sQm8ubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gdGUobil7ZnVuY3Rpb24gdCh0LGUpe24ubW92ZVRvKHQrYSxlKSxuLmFyYyh0LGUsYSwwLFVhKX1mdW5jdGlvbiBlKHQsZSl7bi5tb3ZlVG8odCxlKSxvLnBvaW50PXJ9ZnVuY3Rpb24gcih0LGUpe24ubGluZVRvKHQsZSl9ZnVuY3Rpb24gdSgpe28ucG9pbnQ9dH1mdW5jdGlvbiBpKCl7bi5jbG9zZVBhdGgoKX12YXIgYT00LjUsbz17cG9pbnQ6dCxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtvLnBvaW50PWV9LGxpbmVFbmQ6dSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtvLmxpbmVFbmQ9aX0scG9seWdvbkVuZDpmdW5jdGlvbigpe28ubGluZUVuZD11LG8ucG9pbnQ9dH0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGE9bixvfSxyZXN1bHQ6Yn07cmV0dXJuIG99ZnVuY3Rpb24gZWUobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4obz9yOmUpKG4pfWZ1bmN0aW9uIGUodCl7cmV0dXJuIGllKHQsZnVuY3Rpb24oZSxyKXtlPW4oZSxyKSx0LnBvaW50KGVbMF0sZVsxXSl9KX1mdW5jdGlvbiByKHQpe2Z1bmN0aW9uIGUoZSxyKXtlPW4oZSxyKSx0LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gcigpe009TmFOLFMucG9pbnQ9aSx0LmxpbmVTdGFydCgpfWZ1bmN0aW9uIGkoZSxyKXt2YXIgaT1kdChbZSxyXSksYT1uKGUscik7dShNLHgseSxiLF8sdyxNPWFbMF0seD1hWzFdLHk9ZSxiPWlbMF0sXz1pWzFdLHc9aVsyXSxvLHQpLHQucG9pbnQoTSx4KX1mdW5jdGlvbiBhKCl7Uy5wb2ludD1lLHQubGluZUVuZCgpfWZ1bmN0aW9uIGwoKXtyKCksUy5wb2ludD1jLFMubGluZUVuZD1zfWZ1bmN0aW9uIGMobix0KXsKLWkoZj1uLGg9dCksZz1NLHA9eCx2PWIsZD1fLG09dyxTLnBvaW50PWl9ZnVuY3Rpb24gcygpe3UoTSx4LHksYixfLHcsZyxwLGYsdixkLG0sbyx0KSxTLmxpbmVFbmQ9YSxhKCl9dmFyIGYsaCxnLHAsdixkLG0seSxNLHgsYixfLHcsUz17cG9pbnQ6ZSxsaW5lU3RhcnQ6cixsaW5lRW5kOmEscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dC5wb2x5Z29uU3RhcnQoKSxTLmxpbmVTdGFydD1sfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksUy5saW5lU3RhcnQ9cn19O3JldHVybiBTfWZ1bmN0aW9uIHUodCxlLHIsbyxsLGMscyxmLGgsZyxwLHYsZCxtKXt2YXIgeT1zLXQsTT1mLWUseD15KnkrTSpNO2lmKHg+NCppJiZkLS0pe3ZhciBiPW8rZyxfPWwrcCx3PWMrdixTPU1hdGguc3FydChiKmIrXypfK3cqdyksaz1NYXRoLmFzaW4ody89UyksTj1NYShNYSh3KS0xKTxEYXx8TWEoci1oKTxEYT8ocitoKS8yOk1hdGguYXRhbjIoXyxiKSxFPW4oTixrKSxBPUVbMF0sQz1FWzFdLHo9QS10LEw9Qy1lLHE9TSp6LXkqTDsocSpxL3g+aXx8TWEoKHkqeitNKkwpL3gtLjUpPi4zfHxhPm8qZytsKnArYyp2KSYmKHUodCxlLHIsbyxsLGMsQSxDLE4sYi89UyxfLz1TLHcsZCxtKSxtLnBvaW50KEEsQyksdShBLEMsTixiLF8sdyxzLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsYT1NYXRoLmNvcygzMCpPYSksbz0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVuY3Rpb24gcmUobil7dmFyIHQ9ZWUoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpJYSxlKklhXSl9KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGxlKHQobikpfX1mdW5jdGlvbiB1ZShuKXt0aGlzLnN0cmVhbT1ufWZ1bmN0aW9uIGllKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiBhZShuKXtyZXR1cm4gb2UoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gb2Uobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1vKG5bMF0qT2EsblsxXSpPYSksW25bMF0qaCtsLGMtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPW8uaW52ZXJ0KChuWzBdLWwpL2gsKGMtblsxXSkvaCksbiYmW25bMF0qSWEsblsxXSpJYV19ZnVuY3Rpb24gcigpe289Q3QoYT1mZShtLE0seCksaSk7dmFyIG49aSh2LGQpO3JldHVybiBsPWctblswXSpoLGM9cCtuWzFdKmgsdSgpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciBpLGEsbyxsLGMscyxmPWVlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49aShuLHQpLFtuWzBdKmgrbCxjLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCx2PTAsZD0wLG09MCxNPTAseD0wLGI9VW8sXz15LHc9bnVsbCxTPW51bGw7cmV0dXJuIHQuc3RyZWFtPWZ1bmN0aW9uKG4pe3JldHVybiBzJiYocy52YWxpZD0hMSkscz1sZShiKGEsZihfKG4pKSkpLHMudmFsaWQ9ITAsc30sdC5jbGlwQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9bnVsbD09bj8odz1uLFVvKTpJdCgodz0rbikqT2EpLHUoKSk6d30sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPW4sXz1uP1p0KG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pOnksdSgpKTpTfSx0LnNjYWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPStuLHIoKSk6aH0sdC50cmFuc2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K25bMF0scD0rblsxXSxyKCkpOltnLHBdfSx0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1uWzBdJTM2MCpPYSxkPW5bMV0lMzYwKk9hLHIoKSk6W3YqSWEsZCpJYV19LHQucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW5bMF0lMzYwKk9hLE09blsxXSUzNjAqT2EseD1uLmxlbmd0aD4yP25bMl0lMzYwKk9hOjAscigpKTpbbSpJYSxNKklhLHgqSWFdfSxvYS5yZWJpbmQodCxmLCJwcmVjaXNpb24iKSxmdW5jdGlvbigpe3JldHVybiBpPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuaW52ZXJ0PWkuaW52ZXJ0JiZlLHIoKX19ZnVuY3Rpb24gbGUobil7cmV0dXJuIGllKG4sZnVuY3Rpb24odCxlKXtuLnBvaW50KHQqT2EsZSpPYSl9KX1mdW5jdGlvbiBjZShuLHQpe3JldHVybltuLHRdfWZ1bmN0aW9uIHNlKG4sdCl7cmV0dXJuW24+amE/bi1VYTotamE+bj9uK1VhOm4sdF19ZnVuY3Rpb24gZmUobix0LGUpe3JldHVybiBuP3R8fGU/Q3QoZ2UobikscGUodCxlKSk6Z2Uobik6dHx8ZT9wZSh0LGUpOnNlfWZ1bmN0aW9uIGhlKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1uLFt0PmphP3QtVWE6LWphPnQ/dCtVYTp0LGVdfX1mdW5jdGlvbiBnZShuKXt2YXIgdD1oZShuKTtyZXR1cm4gdC5pbnZlcnQ9aGUoLW4pLHR9ZnVuY3Rpb24gcGUobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksbz1NYXRoLmNvcyhuKSplLGw9TWF0aC5zaW4obikqZSxjPU1hdGguc2luKHQpLHM9YypyK28qdTtyZXR1cm5bTWF0aC5hdGFuMihsKmktcyphLG8qci1jKnUpLHRuKHMqaStsKmEpXX12YXIgcj1NYXRoLmNvcyhuKSx1PU1hdGguc2luKG4pLGk9TWF0aC5jb3ModCksYT1NYXRoLnNpbih0KTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1NYXRoLmNvcyh0KSxvPU1hdGguY29zKG4pKmUsbD1NYXRoLnNpbihuKSplLGM9TWF0aC5zaW4odCkscz1jKmktbCphO3JldHVybltNYXRoLmF0YW4yKGwqaStjKmEsbypyK3MqdSksdG4ocypyLW8qdSldfSxlfWZ1bmN0aW9uIHZlKG4sdCl7dmFyIGU9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKTtyZXR1cm4gZnVuY3Rpb24odSxpLGEsbyl7dmFyIGw9YSp0O251bGwhPXU/KHU9ZGUoZSx1KSxpPWRlKGUsaSksKGE+MD9pPnU6dT5pKSYmKHUrPWEqVWEpKToodT1uK2EqVWEsaT1uLS41KmwpO2Zvcih2YXIgYyxzPXU7YT4wP3M+aTppPnM7cy09bClvLnBvaW50KChjPV90KFtlLC1yKk1hdGguY29zKHMpLC1yKk1hdGguc2luKHMpXSkpWzBdLGNbMV0pfX1mdW5jdGlvbiBkZShuLHQpe3ZhciBlPWR0KHQpO2VbMF0tPW4sYnQoZSk7dmFyIHI9bm4oLWVbMV0pO3JldHVybigoLWVbMl08MD8tcjpyKSsyKk1hdGguUEktRGEpJSgyKk1hdGguUEkpfWZ1bmN0aW9uIG1lKG4sdCxlKXt2YXIgcj1vYS5yYW5nZShuLHQtRGEsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24geWUobix0LGUpe3ZhciByPW9hLnJhbmdlKG4sdC1EYSxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdCxuXX0pfX1mdW5jdGlvbiBNZShuKXtyZXR1cm4gbi5zb3VyY2V9ZnVuY3Rpb24geGUobil7cmV0dXJuIG4udGFyZ2V0fWZ1bmN0aW9uIGJlKG4sdCxlLHIpe3ZhciB1PU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCksYT1NYXRoLmNvcyhyKSxvPU1hdGguc2luKHIpLGw9dSpNYXRoLmNvcyhuKSxjPXUqTWF0aC5zaW4obikscz1hKk1hdGguY29zKGUpLGY9YSpNYXRoLnNpbihlKSxoPTIqTWF0aC5hc2luKE1hdGguc3FydChhbihyLXQpK3UqYSphbihlLW4pKSksZz0xL01hdGguc2luKGgpLHA9aD9mdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNpbihuKj1oKSpnLGU9TWF0aC5zaW4oaC1uKSpnLHI9ZSpsK3Qqcyx1PWUqYyt0KmYsYT1lKmkrdCpvO3JldHVybltNYXRoLmF0YW4yKHUscikqSWEsTWF0aC5hdGFuMihhLE1hdGguc3FydChyKnIrdSp1KSkqSWFdfTpmdW5jdGlvbigpe3JldHVybltuKklhLHQqSWFdfTtyZXR1cm4gcC5kaXN0YW5jZT1oLHB9ZnVuY3Rpb24gX2UoKXtmdW5jdGlvbiBuKG4sdSl7dmFyIGk9TWF0aC5zaW4odSo9T2EpLGE9TWF0aC5jb3ModSksbz1NYSgobio9T2EpLXQpLGw9TWF0aC5jb3Mobyk7V28rPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChvPWEqTWF0aC5zaW4obykpKm8rKG89cippLWUqYSpsKSpvKSxlKmkrciphKmwpLHQ9bixlPWkscj1hfXZhciB0LGUscjtKby5wb2ludD1mdW5jdGlvbih1LGkpe3Q9dSpPYSxlPU1hdGguc2luKGkqPU9hKSxyPU1hdGguY29zKGkpLEpvLnBvaW50PW59LEpvLmxpbmVFbmQ9ZnVuY3Rpb24oKXtKby5wb2ludD1Kby5saW5lRW5kPWJ9fWZ1bmN0aW9uIHdlKG4sdCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciByPU1hdGguY29zKHQpLHU9TWF0aC5jb3MoZSksaT1uKHIqdSk7cmV0dXJuW2kqdSpNYXRoLnNpbih0KSxpKk1hdGguc2luKGUpXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obixlKXt2YXIgcj1NYXRoLnNxcnQobipuK2UqZSksdT10KHIpLGk9TWF0aC5zaW4odSksYT1NYXRoLmNvcyh1KTtyZXR1cm5bTWF0aC5hdGFuMihuKmksciphKSxNYXRoLmFzaW4ociYmZSppL3IpXX0sZX1mdW5jdGlvbiBTZShuLHQpe2Z1bmN0aW9uIGUobix0KXthPjA/LUhhK0RhPnQmJih0PS1IYStEYSk6dD5IYS1EYSYmKHQ9SGEtRGEpO3ZhciBlPWEvTWF0aC5wb3codSh0KSxpKTtyZXR1cm5bZSpNYXRoLnNpbihpKm4pLGEtZSpNYXRoLmNvcyhpKm4pXX12YXIgcj1NYXRoLmNvcyhuKSx1PWZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnRhbihqYS80K24vMil9LGk9bj09PXQ/TWF0aC5zaW4obik6TWF0aC5sb2coci9NYXRoLmNvcyh0KSkvTWF0aC5sb2codSh0KS91KG4pKSxhPXIqTWF0aC5wb3codShuKSxpKS9pO3JldHVybiBpPyhlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWEtdCxyPUsoaSkqTWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybltNYXRoLmF0YW4yKG4sZSkvaSwyKk1hdGguYXRhbihNYXRoLnBvdyhhL3IsMS9pKSktSGFdfSxlKTpOZX1mdW5jdGlvbiBrZShuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1pLXQ7cmV0dXJuW2UqTWF0aC5zaW4odSpuKSxpLWUqTWF0aC5jb3ModSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1uPT09dD9NYXRoLnNpbihuKTooci1NYXRoLmNvcyh0KSkvKHQtbiksaT1yL3UrbjtyZXR1cm4gTWEodSk8RGE/Y2U6KGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9aS10O3JldHVybltNYXRoLmF0YW4yKG4sZSkvdSxpLUsodSkqTWF0aC5zcXJ0KG4qbitlKmUpXX0sZSl9ZnVuY3Rpb24gTmUobix0KXtyZXR1cm5bbixNYXRoLmxvZyhNYXRoLnRhbihqYS80K3QvMikpXX1mdW5jdGlvbiBFZShuKXt2YXIgdCxlPWFlKG4pLHI9ZS5zY2FsZSx1PWUudHJhbnNsYXRlLGk9ZS5jbGlwRXh0ZW50O3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIG49ci5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgbj11LmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dD9lLmNsaXBFeHRlbnQobnVsbCk6ZTpufSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7dmFyIGE9aS5hcHBseShlLGFyZ3VtZW50cyk7aWYoYT09PWUpe2lmKHQ9bnVsbD09bil7dmFyIG89amEqcigpLGw9dSgpO2koW1tsWzBdLW8sbFsxXS1vXSxbbFswXStvLGxbMV0rb11dKX19ZWxzZSB0JiYoYT1udWxsKTtyZXR1cm4gYX0sZS5jbGlwRXh0ZW50KG51bGwpfWZ1bmN0aW9uIEFlKG4sdCl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKGphLzQrdC8yKSksLW5dfWZ1bmN0aW9uIENlKG4pe3JldHVybiBuWzBdfWZ1bmN0aW9uIHplKG4pe3JldHVybiBuWzFdfWZ1bmN0aW9uIExlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPVswLDFdLHI9Mix1PTI7dD51O3UrKyl7Zm9yKDtyPjEmJlEobltlW3ItMl1dLG5bZVtyLTFdXSxuW3VdKTw9MDspLS1yO2VbcisrXT11fXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24gcWUobix0KXtyZXR1cm4gblswXS10WzBdfHxuWzFdLXRbMV19ZnVuY3Rpb24gVGUobix0LGUpe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pPChlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIFJlKG4sdCxlLHIpe3ZhciB1PW5bMF0saT1lWzBdLGE9dFswXS11LG89clswXS1pLGw9blsxXSxjPWVbMV0scz10WzFdLWwsZj1yWzFdLWMsaD0obyoobC1jKS1mKih1LWkpKS8oZiphLW8qcyk7cmV0dXJuW3UraCphLGwraCpzXX1mdW5jdGlvbiBEZShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4hKHRbMF0tZVswXXx8dFsxXS1lWzFdKX1mdW5jdGlvbiBQZSgpe3JyKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBqZShuKXt2YXIgdD1sbC5wb3AoKXx8bmV3IFBlO3JldHVybiB0LnNpdGU9bix0fWZ1bmN0aW9uIFVlKG4pe0JlKG4pLGlsLnJlbW92ZShuKSxsbC5wdXNoKG4pLHJyKG4pfWZ1bmN0aW9uIEZlKG4pe3ZhciB0PW4uY2lyY2xlLGU9dC54LHI9dC5jeSx1PXt4OmUseTpyfSxpPW4uUCxhPW4uTixvPVtuXTtVZShuKTtmb3IodmFyIGw9aTtsLmNpcmNsZSYmTWEoZS1sLmNpcmNsZS54KTxEYSYmTWEoci1sLmNpcmNsZS5jeSk8RGE7KWk9bC5QLG8udW5zaGlmdChsKSxVZShsKSxsPWk7by51bnNoaWZ0KGwpLEJlKGwpO2Zvcih2YXIgYz1hO2MuY2lyY2xlJiZNYShlLWMuY2lyY2xlLngpPERhJiZNYShyLWMuY2lyY2xlLmN5KTxEYTspYT1jLk4sby5wdXNoKGMpLFVlKGMpLGM9YTtvLnB1c2goYyksQmUoYyk7dmFyIHMsZj1vLmxlbmd0aDtmb3Iocz0xO2Y+czsrK3MpYz1vW3NdLGw9b1tzLTFdLG5yKGMuZWRnZSxsLnNpdGUsYy5zaXRlLHUpO2w9b1swXSxjPW9bZi0xXSxjLmVkZ2U9S2UobC5zaXRlLGMuc2l0ZSxudWxsLHUpLCRlKGwpLCRlKGMpfWZ1bmN0aW9uIEhlKG4pe2Zvcih2YXIgdCxlLHIsdSxpPW4ueCxhPW4ueSxvPWlsLl87bzspaWYocj1PZShvLGEpLWkscj5EYSlvPW8uTDtlbHNle2lmKHU9aS1JZShvLGEpLCEodT5EYSkpe3I+LURhPyh0PW8uUCxlPW8pOnU+LURhPyh0PW8sZT1vLk4pOnQ9ZT1vO2JyZWFrfWlmKCFvLlIpe3Q9bzticmVha31vPW8uUn12YXIgbD1qZShuKTtpZihpbC5pbnNlcnQodCxsKSx0fHxlKXtpZih0PT09ZSlyZXR1cm4gQmUodCksZT1qZSh0LnNpdGUpLGlsLmluc2VydChsLGUpLGwuZWRnZT1lLmVkZ2U9S2UodC5zaXRlLGwuc2l0ZSksJGUodCksdm9pZCAkZShlKTtpZighZSlyZXR1cm4gdm9pZChsLmVkZ2U9S2UodC5zaXRlLGwuc2l0ZSkpO0JlKHQpLEJlKGUpO3ZhciBjPXQuc2l0ZSxzPWMueCxmPWMueSxoPW4ueC1zLGc9bi55LWYscD1lLnNpdGUsdj1wLngtcyxkPXAueS1mLG09MiooaCpkLWcqdikseT1oKmgrZypnLE09dip2K2QqZCx4PXt4OihkKnktZypNKS9tK3MseTooaCpNLXYqeSkvbStmfTtucihlLmVkZ2UsYyxwLHgpLGwuZWRnZT1LZShjLG4sbnVsbCx4KSxlLmVkZ2U9S2UobixwLG51bGwseCksJGUodCksJGUoZSl9fWZ1bmN0aW9uIE9lKG4sdCl7dmFyIGU9bi5zaXRlLHI9ZS54LHU9ZS55LGk9dS10O2lmKCFpKXJldHVybiByO3ZhciBhPW4uUDtpZighYSlyZXR1cm4tKDEvMCk7ZT1hLnNpdGU7dmFyIG89ZS54LGw9ZS55LGM9bC10O2lmKCFjKXJldHVybiBvO3ZhciBzPW8tcixmPTEvaS0xL2MsaD1zL2M7cmV0dXJuIGY/KC1oK01hdGguc3FydChoKmgtMipmKihzKnMvKC0yKmMpLWwrYy8yK3UtaS8yKSkpL2YrcjoocitvKS8yfWZ1bmN0aW9uIEllKG4sdCl7dmFyIGU9bi5OO2lmKGUpcmV0dXJuIE9lKGUsdCk7dmFyIHI9bi5zaXRlO3JldHVybiByLnk9PT10P3IueDoxLzB9ZnVuY3Rpb24gWWUobil7dGhpcy5zaXRlPW4sdGhpcy5lZGdlcz1bXX1mdW5jdGlvbiBaZShuKXtmb3IodmFyIHQsZSxyLHUsaSxhLG8sbCxjLHMsZj1uWzBdWzBdLGg9blsxXVswXSxnPW5bMF1bMV0scD1uWzFdWzFdLHY9dWwsZD12Lmxlbmd0aDtkLS07KWlmKGk9dltkXSxpJiZpLnByZXBhcmUoKSlmb3Iobz1pLmVkZ2VzLGw9by5sZW5ndGgsYT0wO2w+YTspcz1vW2FdLmVuZCgpLHI9cy54LHU9cy55LGM9b1srK2ElbF0uc3RhcnQoKSx0PWMueCxlPWMueSwoTWEoci10KT5EYXx8TWEodS1lKT5EYSkmJihvLnNwbGljZShhLDAsbmV3IHRyKFFlKGkuc2l0ZSxzLE1hKHItZik8RGEmJnAtdT5EYT97eDpmLHk6TWEodC1mKTxEYT9lOnB9Ok1hKHUtcCk8RGEmJmgtcj5EYT97eDpNYShlLXApPERhP3Q6aCx5OnB9Ok1hKHItaCk8RGEmJnUtZz5EYT97eDpoLHk6TWEodC1oKTxEYT9lOmd9Ok1hKHUtZyk8RGEmJnItZj5EYT97eDpNYShlLWcpPERhP3Q6Zix5Omd9Om51bGwpLGkuc2l0ZSxudWxsKSksKytsKX1mdW5jdGlvbiBWZShuLHQpe3JldHVybiB0LmFuZ2xlLW4uYW5nbGV9ZnVuY3Rpb24gWGUoKXtycih0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gJGUobil7dmFyIHQ9bi5QLGU9bi5OO2lmKHQmJmUpe3ZhciByPXQuc2l0ZSx1PW4uc2l0ZSxpPWUuc2l0ZTtpZihyIT09aSl7dmFyIGE9dS54LG89dS55LGw9ci54LWEsYz1yLnktbyxzPWkueC1hLGY9aS55LW8saD0yKihsKmYtYypzKTtpZighKGg+PS1QYSkpe3ZhciBnPWwqbCtjKmMscD1zKnMrZipmLHY9KGYqZy1jKnApL2gsZD0obCpwLXMqZykvaCxmPWQrbyxtPWNsLnBvcCgpfHxuZXcgWGU7bS5hcmM9bixtLnNpdGU9dSxtLng9dithLG0ueT1mK01hdGguc3FydCh2KnYrZCpkKSxtLmN5PWYsbi5jaXJjbGU9bTtmb3IodmFyIHk9bnVsbCxNPW9sLl87TTspaWYobS55PE0ueXx8bS55PT09TS55JiZtLng8PU0ueCl7aWYoIU0uTCl7eT1NLlA7YnJlYWt9TT1NLkx9ZWxzZXtpZighTS5SKXt5PU07YnJlYWt9TT1NLlJ9b2wuaW5zZXJ0KHksbSkseXx8KGFsPW0pfX19fWZ1bmN0aW9uIEJlKG4pe3ZhciB0PW4uY2lyY2xlO3QmJih0LlB8fChhbD10Lk4pLG9sLnJlbW92ZSh0KSxjbC5wdXNoKHQpLHJyKHQpLG4uY2lyY2xlPW51bGwpfWZ1bmN0aW9uIFdlKG4pe2Zvcih2YXIgdCxlPXJsLHI9WXQoblswXVswXSxuWzBdWzFdLG5bMV1bMF0sblsxXVsxXSksdT1lLmxlbmd0aDt1LS07KXQ9ZVt1XSwoIUplKHQsbil8fCFyKHQpfHxNYSh0LmEueC10LmIueCk8RGEmJk1hKHQuYS55LXQuYi55KTxEYSkmJih0LmE9dC5iPW51bGwsZS5zcGxpY2UodSwxKSl9ZnVuY3Rpb24gSmUobix0KXt2YXIgZT1uLmI7aWYoZSlyZXR1cm4hMDt2YXIgcix1LGk9bi5hLGE9dFswXVswXSxvPXRbMV1bMF0sbD10WzBdWzFdLGM9dFsxXVsxXSxzPW4ubCxmPW4ucixoPXMueCxnPXMueSxwPWYueCx2PWYueSxkPShoK3ApLzIsbT0oZyt2KS8yO2lmKHY9PT1nKXtpZihhPmR8fGQ+PW8pcmV0dXJuO2lmKGg+cCl7aWYoaSl7aWYoaS55Pj1jKXJldHVybn1lbHNlIGk9e3g6ZCx5Omx9O2U9e3g6ZCx5OmN9fWVsc2V7aWYoaSl7aWYoaS55PGwpcmV0dXJufWVsc2UgaT17eDpkLHk6Y307ZT17eDpkLHk6bH19fWVsc2UgaWYocj0oaC1wKS8odi1nKSx1PW0tcipkLC0xPnJ8fHI+MSlpZihoPnApe2lmKGkpe2lmKGkueT49YylyZXR1cm59ZWxzZSBpPXt4OihsLXUpL3IseTpsfTtlPXt4OihjLXUpL3IseTpjfX1lbHNle2lmKGkpe2lmKGkueTxsKXJldHVybn1lbHNlIGk9e3g6KGMtdSkvcix5OmN9O2U9e3g6KGwtdSkvcix5Omx9fWVsc2UgaWYodj5nKXtpZihpKXtpZihpLng+PW8pcmV0dXJufWVsc2UgaT17eDphLHk6ciphK3V9O2U9e3g6byx5OnIqbyt1fX1lbHNle2lmKGkpe2lmKGkueDxhKXJldHVybn1lbHNlIGk9e3g6byx5OnIqbyt1fTtlPXt4OmEseTpyKmErdX19cmV0dXJuIG4uYT1pLG4uYj1lLCEwfWZ1bmN0aW9uIEdlKG4sdCl7dGhpcy5sPW4sdGhpcy5yPXQsdGhpcy5hPXRoaXMuYj1udWxsfWZ1bmN0aW9uIEtlKG4sdCxlLHIpe3ZhciB1PW5ldyBHZShuLHQpO3JldHVybiBybC5wdXNoKHUpLGUmJm5yKHUsbix0LGUpLHImJm5yKHUsdCxuLHIpLHVsW24uaV0uZWRnZXMucHVzaChuZXcgdHIodSxuLHQpKSx1bFt0LmldLmVkZ2VzLnB1c2gobmV3IHRyKHUsdCxuKSksdX1mdW5jdGlvbiBRZShuLHQsZSl7dmFyIHI9bmV3IEdlKG4sbnVsbCk7cmV0dXJuIHIuYT10LHIuYj1lLHJsLnB1c2gocikscn1mdW5jdGlvbiBucihuLHQsZSxyKXtuLmF8fG4uYj9uLmw9PT1lP24uYj1yOm4uYT1yOihuLmE9cixuLmw9dCxuLnI9ZSl9ZnVuY3Rpb24gdHIobix0LGUpe3ZhciByPW4uYSx1PW4uYjt0aGlzLmVkZ2U9bix0aGlzLnNpdGU9dCx0aGlzLmFuZ2xlPWU/TWF0aC5hdGFuMihlLnktdC55LGUueC10LngpOm4ubD09PXQ/TWF0aC5hdGFuMih1Lngtci54LHIueS11LnkpOk1hdGguYXRhbjIoci54LXUueCx1Lnktci55KX1mdW5jdGlvbiBlcigpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIHJyKG4pe24uVT1uLkM9bi5MPW4uUj1uLlA9bi5OPW51bGx9ZnVuY3Rpb24gdXIobix0KXt2YXIgZT10LHI9dC5SLHU9ZS5VO3U/dS5MPT09ZT91Lkw9cjp1LlI9cjpuLl89cixyLlU9dSxlLlU9cixlLlI9ci5MLGUuUiYmKGUuUi5VPWUpLHIuTD1lfWZ1bmN0aW9uIGlyKG4sdCl7dmFyIGU9dCxyPXQuTCx1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5MPXIuUixlLkwmJihlLkwuVT1lKSxyLlI9ZX1mdW5jdGlvbiBhcihuKXtmb3IoO24uTDspbj1uLkw7cmV0dXJuIG59ZnVuY3Rpb24gb3Iobix0KXt2YXIgZSxyLHUsaT1uLnNvcnQobHIpLnBvcCgpO2ZvcihybD1bXSx1bD1uZXcgQXJyYXkobi5sZW5ndGgpLGlsPW5ldyBlcixvbD1uZXcgZXI7OylpZih1PWFsLGkmJighdXx8aS55PHUueXx8aS55PT09dS55JiZpLng8dS54KSkoaS54IT09ZXx8aS55IT09cikmJih1bFtpLmldPW5ldyBZZShpKSxIZShpKSxlPWkueCxyPWkueSksaT1uLnBvcCgpO2Vsc2V7aWYoIXUpYnJlYWs7RmUodS5hcmMpfXQmJihXZSh0KSxaZSh0KSk7dmFyIGE9e2NlbGxzOnVsLGVkZ2VzOnJsfTtyZXR1cm4gaWw9b2w9cmw9dWw9bnVsbCxhfWZ1bmN0aW9uIGxyKG4sdCl7cmV0dXJuIHQueS1uLnl8fHQueC1uLnh9ZnVuY3Rpb24gY3Iobix0LGUpe3JldHVybihuLngtZS54KSoodC55LW4ueSktKG4ueC10LngpKihlLnktbi55KX1mdW5jdGlvbiBzcihuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIGZyKG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gaHIoKXtyZXR1cm57bGVhZjohMCxub2RlczpbXSxwb2ludDpudWxsLHg6bnVsbCx5Om51bGx9fWZ1bmN0aW9uIGdyKG4sdCxlLHIsdSxpKXtpZighbih0LGUscix1LGkpKXt2YXIgYT0uNSooZSt1KSxvPS41KihyK2kpLGw9dC5ub2RlcztsWzBdJiZncihuLGxbMF0sZSxyLGEsbyksbFsxXSYmZ3IobixsWzFdLGEscix1LG8pLGxbMl0mJmdyKG4sbFsyXSxlLG8sYSxpKSxsWzNdJiZncihuLGxbM10sYSxvLHUsaSl9fWZ1bmN0aW9uIHByKG4sdCxlLHIsdSxpLGEpe3ZhciBvLGw9MS8wO3JldHVybiBmdW5jdGlvbiBjKG4scyxmLGgsZyl7aWYoIShzPml8fGY+YXx8cj5ofHx1PmcpKXtpZihwPW4ucG9pbnQpe3ZhciBwLHY9dC1uLngsZD1lLW4ueSxtPXYqditkKmQ7aWYobD5tKXt2YXIgeT1NYXRoLnNxcnQobD1tKTtyPXQteSx1PWUteSxpPXQreSxhPWUreSxvPXB9fWZvcih2YXIgTT1uLm5vZGVzLHg9LjUqKHMraCksYj0uNSooZitnKSxfPXQ+PXgsdz1lPj1iLFM9dzw8MXxfLGs9Uys0O2s+UzsrK1MpaWYobj1NWzMmU10pc3dpdGNoKDMmUyl7Y2FzZSAwOmMobixzLGYseCxiKTticmVhaztjYXNlIDE6YyhuLHgsZixoLGIpO2JyZWFrO2Nhc2UgMjpjKG4scyxiLHgsZyk7YnJlYWs7Y2FzZSAzOmMobix4LGIsaCxnKX19fShuLHIsdSxpLGEpLG99ZnVuY3Rpb24gdnIobix0KXtuPW9hLnJnYihuKSx0PW9hLnJnYih0KTt2YXIgZT1uLnIscj1uLmcsdT1uLmIsaT10LnItZSxhPXQuZy1yLG89dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiIjIitibihNYXRoLnJvdW5kKGUraSpuKSkrYm4oTWF0aC5yb3VuZChyK2EqbikpK2JuKE1hdGgucm91bmQodStvKm4pKX19ZnVuY3Rpb24gZHIobix0KXt2YXIgZSxyPXt9LHU9e307Zm9yKGUgaW4gbillIGluIHQ/cltlXT1NcihuW2VdLHRbZV0pOnVbZV09bltlXTtmb3IoZSBpbiB0KWUgaW4gbnx8KHVbZV09dFtlXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlIGluIHIpdVtlXT1yW2VdKG4pO3JldHVybiB1fX1mdW5jdGlvbiBtcihuLHQpe3JldHVybiBuPStuLHQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIG4qKDEtZSkrdCplfX1mdW5jdGlvbiB5cihuLHQpe3ZhciBlLHIsdSxpPWZsLmxhc3RJbmRleD1obC5sYXN0SW5kZXg9MCxhPS0xLG89W10sbD1bXTtmb3Iobis9IiIsdCs9IiI7KGU9ZmwuZXhlYyhuKSkmJihyPWhsLmV4ZWModCkpOykodT1yLmluZGV4KT5pJiYodT10LnNsaWNlKGksdSksb1thXT9vW2FdKz11Om9bKythXT11KSwoZT1lWzBdKT09PShyPXJbMF0pP29bYV0/b1thXSs9cjpvWysrYV09cjoob1srK2FdPW51bGwsbC5wdXNoKHtpOmEseDptcihlLHIpfSkpLGk9aGwubGFzdEluZGV4O3JldHVybiBpPHQubGVuZ3RoJiYodT10LnNsaWNlKGkpLG9bYV0/b1thXSs9dTpvWysrYV09dSksby5sZW5ndGg8Mj9sWzBdPyh0PWxbMF0ueCxmdW5jdGlvbihuKXtyZXR1cm4gdChuKSsiIn0pOmZ1bmN0aW9uKCl7cmV0dXJuIHR9Oih0PWwubGVuZ3RoLGZ1bmN0aW9uKG4pe2Zvcih2YXIgZSxyPTA7dD5yOysrcilvWyhlPWxbcl0pLmldPWUueChuKTtyZXR1cm4gby5qb2luKCIiKX0pfWZ1bmN0aW9uIE1yKG4sdCl7Zm9yKHZhciBlLHI9b2EuaW50ZXJwb2xhdG9ycy5sZW5ndGg7LS1yPj0wJiYhKGU9b2EuaW50ZXJwb2xhdG9yc1tyXShuLHQpKTspO3JldHVybiBlfWZ1bmN0aW9uIHhyKG4sdCl7dmFyIGUscj1bXSx1PVtdLGk9bi5sZW5ndGgsYT10Lmxlbmd0aCxvPU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKTtmb3IoZT0wO28+ZTsrK2Upci5wdXNoKE1yKG5bZV0sdFtlXSkpO2Zvcig7aT5lOysrZSl1W2VdPW5bZV07Zm9yKDthPmU7KytlKXVbZV09dFtlXTtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKGU9MDtvPmU7KytlKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gYnIobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAwPj10PzA6dD49MT8xOm4odCl9fWZ1bmN0aW9uIF9yKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMS1uKDEtdCl9fWZ1bmN0aW9uIHdyKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4uNSooLjU+dD9uKDIqdCk6Mi1uKDItMip0KSl9fWZ1bmN0aW9uIFNyKG4pe3JldHVybiBuKm59ZnVuY3Rpb24ga3Iobil7cmV0dXJuIG4qbipufWZ1bmN0aW9uIE5yKG4pe2lmKDA+PW4pcmV0dXJuIDA7aWYobj49MSlyZXR1cm4gMTt2YXIgdD1uKm4sZT10Km47cmV0dXJuIDQqKC41Pm4/ZTozKihuLXQpK2UtLjc1KX1mdW5jdGlvbiBFcihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIEFyKG4pe3JldHVybiAxLU1hdGguY29zKG4qSGEpfWZ1bmN0aW9uIENyKG4pe3JldHVybiBNYXRoLnBvdygyLDEwKihuLTEpKX1mdW5jdGlvbiB6cihuKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1uKm4pfWZ1bmN0aW9uIExyKG4sdCl7dmFyIGU7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9LjQ1KSxhcmd1bWVudHMubGVuZ3RoP2U9dC9VYSpNYXRoLmFzaW4oMS9uKToobj0xLGU9dC80KSxmdW5jdGlvbihyKXtyZXR1cm4gMStuKk1hdGgucG93KDIsLTEwKnIpKk1hdGguc2luKChyLWUpKlVhL3QpfX1mdW5jdGlvbiBxcihuKXtyZXR1cm4gbnx8KG49MS43MDE1OCksZnVuY3Rpb24odCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX19ZnVuY3Rpb24gVHIobil7cmV0dXJuIDEvMi43NT5uPzcuNTYyNSpuKm46Mi8yLjc1Pm4/Ny41NjI1KihuLT0xLjUvMi43NSkqbisuNzU6Mi41LzIuNzU+bj83LjU2MjUqKG4tPTIuMjUvMi43NSkqbisuOTM3NTo3LjU2MjUqKG4tPTIuNjI1LzIuNzUpKm4rLjk4NDM3NX1mdW5jdGlvbiBScihuLHQpe249b2EuaGNsKG4pLHQ9b2EuaGNsKHQpO3ZhciBlPW4uaCxyPW4uYyx1PW4ubCxpPXQuaC1lLGE9dC5jLXIsbz10LmwtdTtyZXR1cm4gaXNOYU4oYSkmJihhPTAscj1pc05hTihyKT90LmM6ciksaXNOYU4oaSk/KGk9MCxlPWlzTmFOKGUpP3QuaDplKTppPjE4MD9pLT0zNjA6LTE4MD5pJiYoaSs9MzYwKSxmdW5jdGlvbihuKXtyZXR1cm4gZm4oZStpKm4scithKm4sdStvKm4pKyIifX1mdW5jdGlvbiBEcihuLHQpe249b2EuaHNsKG4pLHQ9b2EuaHNsKHQpO3ZhciBlPW4uaCxyPW4ucyx1PW4ubCxpPXQuaC1lLGE9dC5zLXIsbz10LmwtdTtyZXR1cm4gaXNOYU4oYSkmJihhPTAscj1pc05hTihyKT90LnM6ciksaXNOYU4oaSk/KGk9MCxlPWlzTmFOKGUpP3QuaDplKTppPjE4MD9pLT0zNjA6LTE4MD5pJiYoaSs9MzYwKSxmdW5jdGlvbihuKXtyZXR1cm4gY24oZStpKm4scithKm4sdStvKm4pKyIifX1mdW5jdGlvbiBQcihuLHQpe249b2EubGFiKG4pLHQ9b2EubGFiKHQpO3ZhciBlPW4ubCxyPW4uYSx1PW4uYixpPXQubC1lLGE9dC5hLXIsbz10LmItdTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGduKGUraSpuLHIrYSpuLHUrbypuKSsiIn19ZnVuY3Rpb24ganIobix0KXtyZXR1cm4gdC09bixmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZChuK3QqZSl9fWZ1bmN0aW9uIFVyKG4pe3ZhciB0PVtuLmEsbi5iXSxlPVtuLmMsbi5kXSxyPUhyKHQpLHU9RnIodCxlKSxpPUhyKE9yKGUsdCwtdSkpfHwwO3RbMF0qZVsxXTxlWzBdKnRbMV0mJih0WzBdKj0tMSx0WzFdKj0tMSxyKj0tMSx1Kj0tMSksdGhpcy5yb3RhdGU9KHI/TWF0aC5hdGFuMih0WzFdLHRbMF0pOk1hdGguYXRhbjIoLWVbMF0sZVsxXSkpKklhLHRoaXMudHJhbnNsYXRlPVtuLmUsbi5mXSx0aGlzLnNjYWxlPVtyLGldLHRoaXMuc2tldz1pP01hdGguYXRhbjIodSxpKSpJYTowfWZ1bmN0aW9uIEZyKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV19ZnVuY3Rpb24gSHIobil7dmFyIHQ9TWF0aC5zcXJ0KEZyKG4sbikpO3JldHVybiB0JiYoblswXS89dCxuWzFdLz10KSx0fWZ1bmN0aW9uIE9yKG4sdCxlKXtyZXR1cm4gblswXSs9ZSp0WzBdLG5bMV0rPWUqdFsxXSxufWZ1bmN0aW9uIElyKG4pe3JldHVybiBuLmxlbmd0aD9uLnBvcCgpKyIsIjoiIn1mdW5jdGlvbiBZcihuLHQsZSxyKXtpZihuWzBdIT09dFswXXx8blsxXSE9PXRbMV0pe3ZhciB1PWUucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO3IucHVzaCh7aTp1LTQseDptcihuWzBdLHRbMF0pfSx7aTp1LTIseDptcihuWzFdLHRbMV0pfSl9ZWxzZSh0WzBdfHx0WzFdKSYmZS5wdXNoKCJ0cmFuc2xhdGUoIit0KyIpIil9ZnVuY3Rpb24gWnIobix0LGUscil7biE9PXQ/KG4tdD4xODA/dCs9MzYwOnQtbj4xODAmJihuKz0zNjApLHIucHVzaCh7aTplLnB1c2goSXIoZSkrInJvdGF0ZSgiLG51bGwsIikiKS0yLHg6bXIobix0KX0pKTp0JiZlLnB1c2goSXIoZSkrInJvdGF0ZSgiK3QrIikiKX1mdW5jdGlvbiBWcihuLHQsZSxyKXtuIT09dD9yLnB1c2goe2k6ZS5wdXNoKElyKGUpKyJza2V3WCgiLG51bGwsIikiKS0yLHg6bXIobix0KX0pOnQmJmUucHVzaChJcihlKSsic2tld1goIit0KyIpIil9ZnVuY3Rpb24gWHIobix0LGUscil7aWYoblswXSE9PXRbMF18fG5bMV0hPT10WzFdKXt2YXIgdT1lLnB1c2goSXIoZSkrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO3IucHVzaCh7aTp1LTQseDptcihuWzBdLHRbMF0pfSx7aTp1LTIseDptcihuWzFdLHRbMV0pfSl9ZWxzZSgxIT09dFswXXx8MSE9PXRbMV0pJiZlLnB1c2goSXIoZSkrInNjYWxlKCIrdCsiKSIpfWZ1bmN0aW9uICRyKG4sdCl7dmFyIGU9W10scj1bXTtyZXR1cm4gbj1vYS50cmFuc2Zvcm0obiksdD1vYS50cmFuc2Zvcm0odCksWXIobi50cmFuc2xhdGUsdC50cmFuc2xhdGUsZSxyKSxacihuLnJvdGF0ZSx0LnJvdGF0ZSxlLHIpLFZyKG4uc2tldyx0LnNrZXcsZSxyKSxYcihuLnNjYWxlLHQuc2NhbGUsZSxyKSxuPXQ9bnVsbCxmdW5jdGlvbihuKXtmb3IodmFyIHQsdT0tMSxpPXIubGVuZ3RoOysrdTxpOyllWyh0PXJbdV0pLmldPXQueChuKTtyZXR1cm4gZS5qb2luKCIiKX19ZnVuY3Rpb24gQnIobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4oZS1uKS90fX1mdW5jdGlvbiBXcihuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsKGUtbikvdCkpfX1mdW5jdGlvbiBKcihuKXtmb3IodmFyIHQ9bi5zb3VyY2UsZT1uLnRhcmdldCxyPUtyKHQsZSksdT1bdF07dCE9PXI7KXQ9dC5wYXJlbnQsdS5wdXNoKHQpO2Zvcih2YXIgaT11Lmxlbmd0aDtlIT09cjspdS5zcGxpY2UoaSwwLGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIHV9ZnVuY3Rpb24gR3Iobil7Zm9yKHZhciB0PVtdLGU9bi5wYXJlbnQ7bnVsbCE9ZTspdC5wdXNoKG4pLG49ZSxlPWUucGFyZW50O3JldHVybiB0LnB1c2gobiksdH1mdW5jdGlvbiBLcihuLHQpe2lmKG49PT10KXJldHVybiBuO2Zvcih2YXIgZT1HcihuKSxyPUdyKHQpLHU9ZS5wb3AoKSxpPXIucG9wKCksYT1udWxsO3U9PT1pOylhPXUsdT1lLnBvcCgpLGk9ci5wb3AoKTtyZXR1cm4gYX1mdW5jdGlvbiBRcihuKXtuLmZpeGVkfD0yfWZ1bmN0aW9uIG51KG4pe24uZml4ZWQmPS03fWZ1bmN0aW9uIHR1KG4pe24uZml4ZWR8PTQsbi5weD1uLngsbi5weT1uLnl9ZnVuY3Rpb24gZXUobil7bi5maXhlZCY9LTV9ZnVuY3Rpb24gcnUobix0LGUpe3ZhciByPTAsdT0wO2lmKG4uY2hhcmdlPTAsIW4ubGVhZilmb3IodmFyIGksYT1uLm5vZGVzLG89YS5sZW5ndGgsbD0tMTsrK2w8bzspaT1hW2xdLG51bGwhPWkmJihydShpLHQsZSksbi5jaGFyZ2UrPWkuY2hhcmdlLHIrPWkuY2hhcmdlKmkuY3gsdSs9aS5jaGFyZ2UqaS5jeSk7aWYobi5wb2ludCl7bi5sZWFmfHwobi5wb2ludC54Kz1NYXRoLnJhbmRvbSgpLS41LG4ucG9pbnQueSs9TWF0aC5yYW5kb20oKS0uNSk7dmFyIGM9dCplW24ucG9pbnQuaW5kZXhdO24uY2hhcmdlKz1uLnBvaW50Q2hhcmdlPWMscis9YypuLnBvaW50LngsdSs9YypuLnBvaW50Lnl9bi5jeD1yL24uY2hhcmdlLG4uY3k9dS9uLmNoYXJnZX1mdW5jdGlvbiB1dShuLHQpe3JldHVybiBvYS5yZWJpbmQobix0LCJzb3J0IiwiY2hpbGRyZW4iLCJ2YWx1ZSIpLG4ubm9kZXM9bixuLmxpbmtzPXN1LG59ZnVuY3Rpb24gaXUobix0KXtmb3IodmFyIGU9W25dO251bGwhPShuPWUucG9wKCkpOylpZih0KG4pLCh1PW4uY2hpbGRyZW4pJiYocj11Lmxlbmd0aCkpZm9yKHZhciByLHU7LS1yPj0wOyllLnB1c2godVtyXSl9ZnVuY3Rpb24gYXUobix0KXtmb3IodmFyIGU9W25dLHI9W107bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHIucHVzaChuKSwoaT1uLmNoaWxkcmVuKSYmKHU9aS5sZW5ndGgpKWZvcih2YXIgdSxpLGE9LTE7KythPHU7KWUucHVzaChpW2FdKTtmb3IoO251bGwhPShuPXIucG9wKCkpOyl0KG4pfWZ1bmN0aW9uIG91KG4pe3JldHVybiBuLmNoaWxkcmVufWZ1bmN0aW9uIGx1KG4pe3JldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGN1KG4sdCl7cmV0dXJuIHQudmFsdWUtbi52YWx1ZX1mdW5jdGlvbiBzdShuKXtyZXR1cm4gb2EubWVyZ2Uobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuLHRhcmdldDp0fX0pfSkpfWZ1bmN0aW9uIGZ1KG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gaHUobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBndShuLHQsZSl7bi55MD10LG4ueT1lfWZ1bmN0aW9uIHB1KG4pe3JldHVybiBvYS5yYW5nZShuLmxlbmd0aCl9ZnVuY3Rpb24gdnUobil7Zm9yKHZhciB0PS0xLGU9blswXS5sZW5ndGgscj1bXTsrK3Q8ZTspclt0XT0wO3JldHVybiByfWZ1bmN0aW9uIGR1KG4pe2Zvcih2YXIgdCxlPTEscj0wLHU9blswXVsxXSxpPW4ubGVuZ3RoO2k+ZTsrK2UpKHQ9bltlXVsxXSk+dSYmKHI9ZSx1PXQpO3JldHVybiByfWZ1bmN0aW9uIG11KG4pe3JldHVybiBuLnJlZHVjZSh5dSwwKX1mdW5jdGlvbiB5dShuLHQpe3JldHVybiBuK3RbMV19ZnVuY3Rpb24gTXUobix0KXtyZXR1cm4geHUobixNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKzEpKX1mdW5jdGlvbiB4dShuLHQpe2Zvcih2YXIgZT0tMSxyPStuWzBdLHU9KG5bMV0tcikvdCxpPVtdOysrZTw9dDspaVtlXT11KmUrcjtyZXR1cm4gaX1mdW5jdGlvbiBidShuKXtyZXR1cm5bb2EubWluKG4pLG9hLm1heChuKV19ZnVuY3Rpb24gX3Uobix0KXtyZXR1cm4gbi52YWx1ZS10LnZhbHVlfWZ1bmN0aW9uIHd1KG4sdCl7dmFyIGU9bi5fcGFja19uZXh0O24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1uLHQuX3BhY2tfbmV4dD1lLGUuX3BhY2tfcHJldj10fWZ1bmN0aW9uIFN1KG4sdCl7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW59ZnVuY3Rpb24ga3Uobix0KXt2YXIgZT10Lngtbi54LHI9dC55LW4ueSx1PW4ucit0LnI7cmV0dXJuLjk5OSp1KnU+ZSplK3Iqcn1mdW5jdGlvbiBOdShuKXtmdW5jdGlvbiB0KG4pe3M9TWF0aC5taW4obi54LW4ucixzKSxmPU1hdGgubWF4KG4ueCtuLnIsZiksaD1NYXRoLm1pbihuLnktbi5yLGgpLGc9TWF0aC5tYXgobi55K24ucixnKX1pZigoZT1uLmNoaWxkcmVuKSYmKGM9ZS5sZW5ndGgpKXt2YXIgZSxyLHUsaSxhLG8sbCxjLHM9MS8wLGY9LSgxLzApLGg9MS8wLGc9LSgxLzApO2lmKGUuZm9yRWFjaChFdSkscj1lWzBdLHIueD0tci5yLHIueT0wLHQociksYz4xJiYodT1lWzFdLHUueD11LnIsdS55PTAsdCh1KSxjPjIpKWZvcihpPWVbMl0senUocix1LGkpLHQoaSksd3UocixpKSxyLl9wYWNrX3ByZXY9aSx3dShpLHUpLHU9ci5fcGFja19uZXh0LGE9MztjPmE7YSsrKXt6dShyLHUsaT1lW2FdKTt2YXIgcD0wLHY9MSxkPTE7Zm9yKG89dS5fcGFja19uZXh0O28hPT11O289by5fcGFja19uZXh0LHYrKylpZihrdShvLGkpKXtwPTE7YnJlYWt9aWYoMT09cClmb3IobD1yLl9wYWNrX3ByZXY7bCE9PW8uX3BhY2tfcHJldiYmIWt1KGwsaSk7bD1sLl9wYWNrX3ByZXYsZCsrKTtwPyhkPnZ8fHY9PWQmJnUucjxyLnI/U3Uocix1PW8pOlN1KHI9bCx1KSxhLS0pOih3dShyLGkpLHU9aSx0KGkpKX12YXIgbT0ocytmKS8yLHk9KGgrZykvMixNPTA7Zm9yKGE9MDtjPmE7YSsrKWk9ZVthXSxpLngtPW0saS55LT15LE09TWF0aC5tYXgoTSxpLnIrTWF0aC5zcXJ0KGkueCppLngraS55KmkueSkpO24ucj1NLGUuZm9yRWFjaChBdSl9fWZ1bmN0aW9uIEV1KG4pe24uX3BhY2tfbmV4dD1uLl9wYWNrX3ByZXY9bn1mdW5jdGlvbiBBdShuKXtkZWxldGUgbi5fcGFja19uZXh0LGRlbGV0ZSBuLl9wYWNrX3ByZXZ9ZnVuY3Rpb24gQ3Uobix0LGUscil7dmFyIHU9bi5jaGlsZHJlbjtpZihuLng9dCs9cipuLngsbi55PWUrPXIqbi55LG4ucio9cix1KWZvcih2YXIgaT0tMSxhPXUubGVuZ3RoOysraTxhOylDdSh1W2ldLHQsZSxyKX1mdW5jdGlvbiB6dShuLHQsZSl7dmFyIHI9bi5yK2Uucix1PXQueC1uLngsaT10Lnktbi55O2lmKHImJih1fHxpKSl7dmFyIGE9dC5yK2UucixvPXUqdStpKmk7YSo9YSxyKj1yO3ZhciBsPS41KyhyLWEpLygyKm8pLGM9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMiphKihyK28pLShyLT1vKSpyLWEqYSkpLygyKm8pO2UueD1uLngrbCp1K2MqaSxlLnk9bi55K2wqaS1jKnV9ZWxzZSBlLng9bi54K3IsZS55PW4ueX1mdW5jdGlvbiBMdShuLHQpe3JldHVybiBuLnBhcmVudD09dC5wYXJlbnQ/MToyfWZ1bmN0aW9uIHF1KG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQubGVuZ3RoP3RbMF06bi50fWZ1bmN0aW9uIFR1KG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4odD1lLmxlbmd0aCk/ZVt0LTFdOm4udH1mdW5jdGlvbiBSdShuLHQsZSl7dmFyIHI9ZS8odC5pLW4uaSk7dC5jLT1yLHQucys9ZSxuLmMrPXIsdC56Kz1lLHQubSs9ZX1mdW5jdGlvbiBEdShuKXtmb3IodmFyIHQsZT0wLHI9MCx1PW4uY2hpbGRyZW4saT11Lmxlbmd0aDstLWk+PTA7KXQ9dVtpXSx0LnorPWUsdC5tKz1lLGUrPXQucysocis9dC5jKX1mdW5jdGlvbiBQdShuLHQsZSl7cmV0dXJuIG4uYS5wYXJlbnQ9PT10LnBhcmVudD9uLmE6ZX1mdW5jdGlvbiBqdShuKXtyZXR1cm4gMStvYS5tYXgobixmdW5jdGlvbihuKXtyZXR1cm4gbi55fSl9ZnVuY3Rpb24gVXUobil7cmV0dXJuIG4ucmVkdWNlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4rdC54fSwwKS9uLmxlbmd0aH1mdW5jdGlvbiBGdShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0JiZ0Lmxlbmd0aD9GdSh0WzBdKTpufWZ1bmN0aW9uIEh1KG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4gZSYmKHQ9ZS5sZW5ndGgpP0h1KGVbdC0xXSk6bn1mdW5jdGlvbiBPdShuKXtyZXR1cm57eDpuLngseTpuLnksZHg6bi5keCxkeTpuLmR5fX1mdW5jdGlvbiBJdShuLHQpe3ZhciBlPW4ueCt0WzNdLHI9bi55K3RbMF0sdT1uLmR4LXRbMV0tdFszXSxpPW4uZHktdFswXS10WzJdO3JldHVybiAwPnUmJihlKz11LzIsdT0wKSwwPmkmJihyKz1pLzIsaT0wKSx7eDplLHk6cixkeDp1LGR5Oml9fWZ1bmN0aW9uIFl1KG4pe3ZhciB0PW5bMF0sZT1uW24ubGVuZ3RoLTFdO3JldHVybiBlPnQ/W3QsZV06W2UsdF19ZnVuY3Rpb24gWnUobil7cmV0dXJuIG4ucmFuZ2VFeHRlbnQ/bi5yYW5nZUV4dGVudCgpOll1KG4ucmFuZ2UoKSl9ZnVuY3Rpb24gVnUobix0LGUscil7dmFyIHU9ZShuWzBdLG5bMV0pLGk9cih0WzBdLHRbMV0pO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaSh1KG4pKX19ZnVuY3Rpb24gWHUobix0KXt2YXIgZSxyPTAsdT1uLmxlbmd0aC0xLGk9bltyXSxhPW5bdV07cmV0dXJuIGk+YSYmKGU9cixyPXUsdT1lLGU9aSxpPWEsYT1lKSxuW3JdPXQuZmxvb3IoaSksblt1XT10LmNlaWwoYSksbn1mdW5jdGlvbiAkdShuKXtyZXR1cm4gbj97Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IodC9uKSpufSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwodC9uKSpufX06d2x9ZnVuY3Rpb24gQnUobix0LGUscil7dmFyIHU9W10saT1bXSxhPTAsbz1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCktMTtmb3IobltvXTxuWzBdJiYobj1uLnNsaWNlKCkucmV2ZXJzZSgpLHQ9dC5zbGljZSgpLnJldmVyc2UoKSk7KythPD1vOyl1LnB1c2goZShuW2EtMV0sblthXSkpLGkucHVzaChyKHRbYS0xXSx0W2FdKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW9hLmJpc2VjdChuLHQsMSxvKS0xO3JldHVybiBpW2VdKHVbZV0odCkpfX1mdW5jdGlvbiBXdShuLHQsZSxyKXtmdW5jdGlvbiB1KCl7dmFyIHU9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpPjI/QnU6VnUsbD1yP1dyOkJyO3JldHVybiBhPXUobix0LGwsZSksbz11KHQsbixsLE1yKSxpfWZ1bmN0aW9uIGkobil7cmV0dXJuIGEobil9dmFyIGEsbztyZXR1cm4gaS5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuIG8obil9LGkuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKE51bWJlciksdSgpKTpufSxpLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sdSgpKTp0fSxpLnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGkucmFuZ2UobikuaW50ZXJwb2xhdGUoanIpfSxpLmNsYW1wPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdSgpKTpyfSxpLmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdSgpKTplfSxpLnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBRdShuLHQpfSxpLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmkobix0LGUpfSxpLm5pY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEd1KG4sdCksdSgpfSxpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gV3Uobix0LGUscil9LHUoKX1mdW5jdGlvbiBKdShuLHQpe3JldHVybiBvYS5yZWJpbmQobix0LCJyYW5nZSIsInJhbmdlUm91bmQiLCJpbnRlcnBvbGF0ZSIsImNsYW1wIil9ZnVuY3Rpb24gR3Uobix0KXtyZXR1cm4gWHUobiwkdShLdShuLHQpWzJdKSl9ZnVuY3Rpb24gS3Uobix0KXtudWxsPT10JiYodD0xMCk7dmFyIGU9WXUobikscj1lWzFdLWVbMF0sdT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIvdCkvTWF0aC5MTjEwKSksaT10L3IqdTtyZXR1cm4uMTU+PWk/dSo9MTA6LjM1Pj1pP3UqPTU6Ljc1Pj1pJiYodSo9MiksZVswXT1NYXRoLmNlaWwoZVswXS91KSp1LGVbMV09TWF0aC5mbG9vcihlWzFdL3UpKnUrLjUqdSxlWzJdPXUsZX1mdW5jdGlvbiBRdShuLHQpe3JldHVybiBvYS5yYW5nZS5hcHBseShvYSxLdShuLHQpKX1mdW5jdGlvbiBuaShuLHQsZSl7dmFyIHI9S3Uobix0KTtpZihlKXt2YXIgdT1zby5leGVjKGUpO2lmKHUuc2hpZnQoKSwicyI9PT11WzhdKXt2YXIgaT1vYS5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoTWEoclswXSksTWEoclsxXSkpKTtyZXR1cm4gdVs3XXx8KHVbN109Ii4iK3RpKGkuc2NhbGUoclsyXSkpKSx1WzhdPSJmIixlPW9hLmZvcm1hdCh1LmpvaW4oIiIpKSxmdW5jdGlvbihuKXtyZXR1cm4gZShpLnNjYWxlKG4pKStpLnN5bWJvbH19dVs3XXx8KHVbN109Ii4iK2VpKHVbOF0scikpLGU9dS5qb2luKCIiKX1lbHNlIGU9IiwuIit0aShyWzJdKSsiZiI7cmV0dXJuIG9hLmZvcm1hdChlKX1mdW5jdGlvbiB0aShuKXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyhuKS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBlaShuLHQpe3ZhciBlPXRpKHRbMl0pO3JldHVybiBuIGluIFNsP01hdGguYWJzKGUtdGkoTWF0aC5tYXgoTWEodFswXSksTWEodFsxXSkpKSkrICsoImUiIT09bik6ZS0yKigiJSI9PT1uKX1mdW5jdGlvbiByaShuLHQsZSxyKXtmdW5jdGlvbiB1KG4pe3JldHVybihlP01hdGgubG9nKDA+bj8wOm4pOi1NYXRoLmxvZyhuPjA/MDotbikpL01hdGgubG9nKHQpfWZ1bmN0aW9uIGkobil7cmV0dXJuIGU/TWF0aC5wb3codCxuKTotTWF0aC5wb3codCwtbil9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbih1KHQpKX1yZXR1cm4gYS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10WzBdPj0wLG4uZG9tYWluKChyPXQubWFwKE51bWJlcikpLm1hcCh1KSksYSk6cn0sYS5iYXNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlLG4uZG9tYWluKHIubWFwKHUpKSxhKTp0fSxhLm5pY2U9ZnVuY3Rpb24oKXt2YXIgdD1YdShyLm1hcCh1KSxlP01hdGg6TmwpO3JldHVybiBuLmRvbWFpbih0KSxyPXQubWFwKGkpLGF9LGEudGlja3M9ZnVuY3Rpb24oKXt2YXIgbj1ZdShyKSxhPVtdLG89blswXSxsPW5bMV0sYz1NYXRoLmZsb29yKHUobykpLHM9TWF0aC5jZWlsKHUobCkpLGY9dCUxPzI6dDtpZihpc0Zpbml0ZShzLWMpKXtpZihlKXtmb3IoO3M+YztjKyspZm9yKHZhciBoPTE7Zj5oO2grKylhLnB1c2goaShjKSpoKTthLnB1c2goaShjKSl9ZWxzZSBmb3IoYS5wdXNoKGkoYykpO2MrKzxzOylmb3IodmFyIGg9Zi0xO2g+MDtoLS0pYS5wdXNoKGkoYykqaCk7Zm9yKGM9MDthW2NdPG87YysrKTtmb3Iocz1hLmxlbmd0aDthW3MtMV0+bDtzLS0pO2E9YS5zbGljZShjLHMpfXJldHVybiBhfSxhLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4ga2w7YXJndW1lbnRzLmxlbmd0aDwyP3Q9a2w6ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW9hLmZvcm1hdCh0KSk7dmFyIHIsbz1NYXRoLm1heCguMSxuL2EudGlja3MoKS5sZW5ndGgpLGw9ZT8ocj0xZS0xMixNYXRoLmNlaWwpOihyPS0xZS0xMixNYXRoLmZsb29yKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4vaShsKHUobikrcikpPD1vP3Qobik6IiJ9fSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcmkobi5jb3B5KCksdCxlLHIpfSxKdShhLG4pfWZ1bmN0aW9uIHVpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHUodCkpfXZhciB1PWlpKHQpLGk9aWkoMS90KTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4oKGU9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxyKTplfSxyLnRpY2tzPWZ1bmN0aW9uKG4pe3JldHVybiBRdShlLG4pfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbmkoZSxuLHQpfSxyLm5pY2U9ZnVuY3Rpb24obil7cmV0dXJuIHIuZG9tYWluKEd1KGUsbikpfSxyLmV4cG9uZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWlpKHQ9YSksaT1paSgxL3QpLG4uZG9tYWluKGUubWFwKHUpKSxyKTp0fSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdWkobi5jb3B5KCksdCxlKX0sSnUocixuKX1mdW5jdGlvbiBpaShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+dD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX19ZnVuY3Rpb24gYWkobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBpWygodS5nZXQoZSl8fCgicmFuZ2UiPT09dC50P3Uuc2V0KGUsbi5wdXNoKGUpKTpOYU4pKS0xKSVpLmxlbmd0aF19ZnVuY3Rpb24gcih0LGUpe3JldHVybiBvYS5yYW5nZShuLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn0pfXZhciB1LGksYTtyZXR1cm4gZS5kb21haW49ZnVuY3Rpb24ocil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47bj1bXSx1PW5ldyBjO2Zvcih2YXIgaSxhPS0xLG89ci5sZW5ndGg7KythPG87KXUuaGFzKGk9clthXSl8fHUuc2V0KGksbi5wdXNoKGkpKTtyZXR1cm4gZVt0LnRdLmFwcGx5KGUsdC5hKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLGE9MCx0PXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LGUpOml9LGUucmFuZ2VQb2ludHM9ZnVuY3Rpb24odSxvKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApO3ZhciBsPXVbMF0sYz11WzFdLHM9bi5sZW5ndGg8Mj8obD0obCtjKS8yLDApOihjLWwpLyhuLmxlbmd0aC0xK28pO3JldHVybiBpPXIobCtzKm8vMixzKSxhPTAsdD17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24odSxvKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApO3ZhciBsPXVbMF0sYz11WzFdLHM9bi5sZW5ndGg8Mj8obD1jPU1hdGgucm91bmQoKGwrYykvMiksMCk6KGMtbCkvKG4ubGVuZ3RoLTErbyl8MDtyZXR1cm4gaT1yKGwrTWF0aC5yb3VuZChzKm8vMisoYy1sLShuLmxlbmd0aC0xK28pKnMpLzIpLHMpLGE9MCx0PXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmRzPWZ1bmN0aW9uKHUsbyxsKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGw9byk7dmFyIGM9dVsxXTx1WzBdLHM9dVtjLTBdLGY9dVsxLWNdLGg9KGYtcykvKG4ubGVuZ3RoLW8rMipsKTtyZXR1cm4gaT1yKHMraCpsLGgpLGMmJmkucmV2ZXJzZSgpLGE9aCooMS1vKSx0PXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24odSxvLGwpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKG89MCksYXJndW1lbnRzLmxlbmd0aDwzJiYobD1vKTt2YXIgYz11WzFdPHVbMF0scz11W2MtMF0sZj11WzEtY10saD1NYXRoLmZsb29yKChmLXMpLyhuLmxlbmd0aC1vKzIqbCkpO3JldHVybiBpPXIocytNYXRoLnJvdW5kKChmLXMtKG4ubGVuZ3RoLW8pKmgpLzIpLGgpLGMmJmkucmV2ZXJzZSgpLGE9TWF0aC5yb3VuZChoKigxLW8pKSx0PXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBhfSxlLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIFl1KHQuYVswXSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBhaShuLHQpfSxlLmRvbWFpbihuKX1mdW5jdGlvbiBvaShuLHQpe2Z1bmN0aW9uIGkoKXt2YXIgZT0wLHI9dC5sZW5ndGg7Zm9yKG89W107KytlPHI7KW9bZS0xXT1vYS5xdWFudGlsZShuLGUvcik7cmV0dXJuIGF9ZnVuY3Rpb24gYShuKXtyZXR1cm4gaXNOYU4obj0rbik/dm9pZCAwOnRbb2EuYmlzZWN0KG8sbildfXZhciBvO3JldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChyKS5maWx0ZXIodSkuc29ydChlKSxpKCkpOm59LGEucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKCkpOnR9LGEucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGEuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSwwPmU/W05hTixOYU5dOltlPjA/b1tlLTFdOm5bMF0sZTxvLmxlbmd0aD9vW2VdOm5bbi5sZW5ndGgtMV1dfSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gb2kobix0KX0saSgpfWZ1bmN0aW9uIGxpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBlW01hdGgubWF4KDAsTWF0aC5taW4oYSxNYXRoLmZsb29yKGkqKHQtbikpKSldfWZ1bmN0aW9uIHUoKXtyZXR1cm4gaT1lLmxlbmd0aC8odC1uKSxhPWUubGVuZ3RoLTEscn12YXIgaSxhO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rZVswXSx0PStlW2UubGVuZ3RoLTFdLHUoKSk6W24sdF19LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PWUuaW5kZXhPZih0KSx0PTA+dD9OYU46dC9pK24sW3QsdCsxL2ldfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbGkobix0LGUpfSx1KCl9ZnVuY3Rpb24gY2kobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBlPj1lP3Rbb2EuYmlzZWN0KG4sZSldOnZvaWQgMH1yZXR1cm4gZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZSk6dH0sZS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLFtuW2UtMV0sbltlXV19LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBjaShuLHQpfSxlfWZ1bmN0aW9uIHNpKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuK259cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLm1hcCh0KSx0KTpufSx0LnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBRdShuLHQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmkobix0LGUpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gc2kobil9LHR9ZnVuY3Rpb24gZmkoKXtyZXR1cm4gMH1mdW5jdGlvbiBoaShuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiBnaShuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBwaShuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIHZpKG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGRpKG4pe3JldHVybiBuJiZuLnBhZEFuZ2xlfWZ1bmN0aW9uIG1pKG4sdCxlLHIpe3JldHVybihuLWUpKnQtKHQtcikqbj4wPzA6MX1mdW5jdGlvbiB5aShuLHQsZSxyLHUpe3ZhciBpPW5bMF0tdFswXSxhPW5bMV0tdFsxXSxvPSh1P3I6LXIpL01hdGguc3FydChpKmkrYSphKSxsPW8qYSxjPS1vKmkscz1uWzBdK2wsZj1uWzFdK2MsaD10WzBdK2wsZz10WzFdK2MscD0ocytoKS8yLHY9KGYrZykvMixkPWgtcyxtPWctZix5PWQqZCttKm0sTT1lLXIseD1zKmctaCpmLGI9KDA+bT8tMToxKSpNYXRoLnNxcnQoTWF0aC5tYXgoMCxNKk0qeS14KngpKSxfPSh4Km0tZCpiKS95LHc9KC14KmQtbSpiKS95LFM9KHgqbStkKmIpL3ksaz0oLXgqZCttKmIpL3ksTj1fLXAsRT13LXYsQT1TLXAsQz1rLXY7cmV0dXJuIE4qTitFKkU+QSpBK0MqQyYmKF89Uyx3PWspLFtbXy1sLHctY10sW18qZS9NLHcqZS9NXV19ZnVuY3Rpb24gTWkobil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBhKCl7Yy5wdXNoKCJNIixpKG4ocyksbykpfWZvcih2YXIgbCxjPVtdLHM9W10sZj0tMSxoPXQubGVuZ3RoLGc9RW4oZSkscD1FbihyKTsrK2Y8aDspdS5jYWxsKHRoaXMsbD10W2ZdLGYpP3MucHVzaChbK2cuY2FsbCh0aGlzLGwsZiksK3AuY2FsbCh0aGlzLGwsZildKTpzLmxlbmd0aCYmKGEoKSxzPVtdKTtyZXR1cm4gcy5sZW5ndGgmJmEoKSxjLmxlbmd0aD9jLmpvaW4oIiIpOm51bGx9dmFyIGU9Q2Uscj16ZSx1PXp0LGk9eGksYT1pLmtleSxvPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2k9bjooaT1xbC5nZXQobil8fHhpKS5rZXksdCk6YX0sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdH1mdW5jdGlvbiB4aShuKXtyZXR1cm4gbi5sZW5ndGg+MT9uLmpvaW4oIkwiKTpuKyJaIn1mdW5jdGlvbiBiaShuKXtyZXR1cm4gbi5qb2luKCJMIikrIloifWZ1bmN0aW9uIF9pKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyWzBdKyhyPW5bdF0pWzBdKS8yLCJWIixyWzFdKTtyZXR1cm4gZT4xJiZ1LnB1c2goIkgiLHJbMF0pLHUuam9pbigiIil9ZnVuY3Rpb24gd2kobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiViIsKHI9blt0XSlbMV0sIkgiLHJbMF0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIFNpKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyPW5bdF0pWzBdLCJWIixyWzFdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiBraShuLHQpe3JldHVybiBuLmxlbmd0aDw0P3hpKG4pOm5bMV0rQWkobi5zbGljZSgxLC0xKSxDaShuLHQpKX1mdW5jdGlvbiBOaShuLHQpe3JldHVybiBuLmxlbmd0aDwzP2JpKG4pOm5bMF0rQWkoKG4ucHVzaChuWzBdKSxuKSxDaShbbltuLmxlbmd0aC0yXV0uY29uY2F0KG4sW25bMV1dKSx0KSl9ZnVuY3Rpb24gRWkobix0KXtyZXR1cm4gbi5sZW5ndGg8Mz94aShuKTpuWzBdK0FpKG4sQ2kobix0KSl9ZnVuY3Rpb24gQWkobix0KXtpZih0Lmxlbmd0aDwxfHxuLmxlbmd0aCE9dC5sZW5ndGgmJm4ubGVuZ3RoIT10Lmxlbmd0aCsyKXJldHVybiB4aShuKTt2YXIgZT1uLmxlbmd0aCE9dC5sZW5ndGgscj0iIix1PW5bMF0saT1uWzFdLGE9dFswXSxvPWEsbD0xO2lmKGUmJihyKz0iUSIrKGlbMF0tMiphWzBdLzMpKyIsIisoaVsxXS0yKmFbMV0vMykrIiwiK2lbMF0rIiwiK2lbMV0sdT1uWzFdLGw9MiksdC5sZW5ndGg+MSl7bz10WzFdLGk9bltsXSxsKysscis9IkMiKyh1WzBdK2FbMF0pKyIsIisodVsxXSthWzFdKSsiLCIrKGlbMF0tb1swXSkrIiwiKyhpWzFdLW9bMV0pKyIsIitpWzBdKyIsIitpWzFdO2Zvcih2YXIgYz0yO2M8dC5sZW5ndGg7YysrLGwrKylpPW5bbF0sbz10W2NdLHIrPSJTIisoaVswXS1vWzBdKSsiLCIrKGlbMV0tb1sxXSkrIiwiK2lbMF0rIiwiK2lbMV19aWYoZSl7dmFyIHM9bltsXTtyKz0iUSIrKGlbMF0rMipvWzBdLzMpKyIsIisoaVsxXSsyKm9bMV0vMykrIiwiK3NbMF0rIiwiK3NbMV19cmV0dXJuIHJ9ZnVuY3Rpb24gQ2kobix0KXtmb3IodmFyIGUscj1bXSx1PSgxLXQpLzIsaT1uWzBdLGE9blsxXSxvPTEsbD1uLmxlbmd0aDsrK288bDspZT1pLGk9YSxhPW5bb10sci5wdXNoKFt1KihhWzBdLWVbMF0pLHUqKGFbMV0tZVsxXSldKTtyZXR1cm4gcn1mdW5jdGlvbiB6aShuKXtpZihuLmxlbmd0aDwzKXJldHVybiB4aShuKTt2YXIgdD0xLGU9bi5sZW5ndGgscj1uWzBdLHU9clswXSxpPXJbMV0sYT1bdSx1LHUsKHI9blsxXSlbMF1dLG89W2ksaSxpLHJbMV1dLGw9W3UsIiwiLGksIkwiLFJpKERsLGEpLCIsIixSaShEbCxvKV07Zm9yKG4ucHVzaChuW2UtMV0pOysrdDw9ZTspcj1uW3RdLGEuc2hpZnQoKSxhLnB1c2goclswXSksby5zaGlmdCgpLG8ucHVzaChyWzFdKSxEaShsLGEsbyk7cmV0dXJuIG4ucG9wKCksbC5wdXNoKCJMIixyKSxsLmpvaW4oIiIpfWZ1bmN0aW9uIExpKG4pe2lmKG4ubGVuZ3RoPDQpcmV0dXJuIHhpKG4pO2Zvcih2YXIgdCxlPVtdLHI9LTEsdT1uLmxlbmd0aCxpPVswXSxhPVswXTsrK3I8MzspdD1uW3JdLGkucHVzaCh0WzBdKSxhLnB1c2godFsxXSk7Zm9yKGUucHVzaChSaShEbCxpKSsiLCIrUmkoRGwsYSkpLC0tcjsrK3I8dTspdD1uW3JdLGkuc2hpZnQoKSxpLnB1c2godFswXSksYS5zaGlmdCgpLGEucHVzaCh0WzFdKSxEaShlLGksYSk7cmV0dXJuIGUuam9pbigiIil9ZnVuY3Rpb24gcWkobil7Zm9yKHZhciB0LGUscj0tMSx1PW4ubGVuZ3RoLGk9dSs0LGE9W10sbz1bXTsrK3I8NDspZT1uW3IldV0sYS5wdXNoKGVbMF0pLG8ucHVzaChlWzFdKTtmb3IodD1bUmkoRGwsYSksIiwiLFJpKERsLG8pXSwtLXI7KytyPGk7KWU9bltyJXVdLGEuc2hpZnQoKSxhLnB1c2goZVswXSksby5zaGlmdCgpLG8ucHVzaChlWzFdKSxEaSh0LGEsbyk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gVGkobix0KXt2YXIgZT1uLmxlbmd0aC0xO2lmKGUpZm9yKHZhciByLHUsaT1uWzBdWzBdLGE9blswXVsxXSxvPW5bZV1bMF0taSxsPW5bZV1bMV0tYSxjPS0xOysrYzw9ZTspcj1uW2NdLHU9Yy9lLHJbMF09dCpyWzBdKygxLXQpKihpK3UqbyksclsxXT10KnJbMV0rKDEtdCkqKGErdSpsKTtyZXR1cm4gemkobil9ZnVuY3Rpb24gUmkobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl0rblszXSp0WzNdfWZ1bmN0aW9uIERpKG4sdCxlKXtuLnB1c2goIkMiLFJpKFRsLHQpLCIsIixSaShUbCxlKSwiLCIsUmkoUmwsdCksIiwiLFJpKFJsLGUpLCIsIixSaShEbCx0KSwiLCIsUmkoRGwsZSkpfWZ1bmN0aW9uIFBpKG4sdCl7cmV0dXJuKHRbMV0tblsxXSkvKHRbMF0tblswXSl9ZnVuY3Rpb24gamkobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aC0xLHI9W10sdT1uWzBdLGk9blsxXSxhPXJbMF09UGkodSxpKTsrK3Q8ZTspclt0XT0oYSsoYT1QaSh1PWksaT1uW3QrMV0pKSkvMjtyZXR1cm4gclt0XT1hLHJ9ZnVuY3Rpb24gVWkobil7Zm9yKHZhciB0LGUscix1LGk9W10sYT1qaShuKSxvPS0xLGw9bi5sZW5ndGgtMTsrK288bDspdD1QaShuW29dLG5bbysxXSksTWEodCk8RGE/YVtvXT1hW28rMV09MDooZT1hW29dL3Qscj1hW28rMV0vdCx1PWUqZStyKnIsdT45JiYodT0zKnQvTWF0aC5zcXJ0KHUpLGFbb109dSplLGFbbysxXT11KnIpKTtmb3Iobz0tMTsrK288PWw7KXU9KG5bTWF0aC5taW4obCxvKzEpXVswXS1uW01hdGgubWF4KDAsby0xKV1bMF0pLyg2KigxK2Fbb10qYVtvXSkpLGkucHVzaChbdXx8MCxhW29dKnV8fDBdKTtyZXR1cm4gaX1mdW5jdGlvbiBGaShuKXtyZXR1cm4gbi5sZW5ndGg8Mz94aShuKTpuWzBdK0FpKG4sVWkobikpfWZ1bmN0aW9uIEhpKG4pe2Zvcih2YXIgdCxlLHIsdT0tMSxpPW4ubGVuZ3RoOysrdTxpOyl0PW5bdV0sZT10WzBdLHI9dFsxXS1IYSx0WzBdPWUqTWF0aC5jb3MociksdFsxXT1lKk1hdGguc2luKHIpO3JldHVybiBufWZ1bmN0aW9uIE9pKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbCgpe3YucHVzaCgiTSIsbyhuKG0pLGYpLHMsYyhuKGQucmV2ZXJzZSgpKSxmKSwiWiIpfWZvcih2YXIgaCxnLHAsdj1bXSxkPVtdLG09W10seT0tMSxNPXQubGVuZ3RoLHg9RW4oZSksYj1Fbih1KSxfPWU9PT1yP2Z1bmN0aW9uKCl7cmV0dXJuIGc7Ci19OkVuKHIpLHc9dT09PWk/ZnVuY3Rpb24oKXtyZXR1cm4gcH06RW4oaSk7Kyt5PE07KWEuY2FsbCh0aGlzLGg9dFt5XSx5KT8oZC5wdXNoKFtnPSt4LmNhbGwodGhpcyxoLHkpLHA9K2IuY2FsbCh0aGlzLGgseSldKSxtLnB1c2goWytfLmNhbGwodGhpcyxoLHkpLCt3LmNhbGwodGhpcyxoLHkpXSkpOmQubGVuZ3RoJiYobCgpLGQ9W10sbT1bXSk7cmV0dXJuIGQubGVuZ3RoJiZsKCksdi5sZW5ndGg/di5qb2luKCIiKTpudWxsfXZhciBlPUNlLHI9Q2UsdT0wLGk9emUsYT16dCxvPXhpLGw9by5rZXksYz1vLHM9IkwiLGY9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yPW4sdCk6cn0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueDE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9aT1uLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LnkxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sdCk6aX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sdCk6YX0sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9vPW46KG89cWwuZ2V0KG4pfHx4aSkua2V5LGM9by5yZXZlcnNlfHxvLHM9by5jbG9zZWQ/Ik0iOiJMIix0KTpsfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bix0KTpmfSx0fWZ1bmN0aW9uIElpKG4pe3JldHVybiBuLnJhZGl1c31mdW5jdGlvbiBZaShuKXtyZXR1cm5bbi54LG4ueV19ZnVuY3Rpb24gWmkobil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10WzBdLHI9dFsxXS1IYTtyZXR1cm5bZSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKHIpXX19ZnVuY3Rpb24gVmkoKXtyZXR1cm4gNjR9ZnVuY3Rpb24gWGkoKXtyZXR1cm4iY2lyY2xlIn1mdW5jdGlvbiAkaShuKXt2YXIgdD1NYXRoLnNxcnQobi9qYSk7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIit0KyJaIn1mdW5jdGlvbiBCaShuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdCxlLHI7KHQ9dGhpc1tuXSkmJihyPXRbZT10LmFjdGl2ZV0pJiYoci50aW1lci5jPW51bGwsci50aW1lci50PU5hTiwtLXQuY291bnQ/ZGVsZXRlIHRbZV06ZGVsZXRlIHRoaXNbbl0sdC5hY3RpdmUrPS41LHIuZXZlbnQmJnIuZXZlbnQuaW50ZXJydXB0LmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLHIuaW5kZXgpKX19ZnVuY3Rpb24gV2kobix0LGUpe3JldHVybiBTYShuLElsKSxuLm5hbWVzcGFjZT10LG4uaWQ9ZSxufWZ1bmN0aW9uIEppKG4sdCxlLHIpe3ZhciB1PW4uaWQsaT1uLm5hbWVzcGFjZTtyZXR1cm4gWShuLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2Z1bmN0aW9uKG4sYSxvKXtuW2ldW3VdLnR3ZWVuLnNldCh0LHIoZS5jYWxsKG4sbi5fX2RhdGFfXyxhLG8pKSl9OihlPXIoZSksZnVuY3Rpb24obil7bltpXVt1XS50d2Vlbi5zZXQodCxlKX0pKX1mdW5jdGlvbiBHaShuKXtyZXR1cm4gbnVsbD09biYmKG49IiIpLGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufX1mdW5jdGlvbiBLaShuKXtyZXR1cm4gbnVsbD09bj8iX190cmFuc2l0aW9uX18iOiJfX3RyYW5zaXRpb25fIituKyJfXyJ9ZnVuY3Rpb24gUWkobix0LGUscix1KXtmdW5jdGlvbiBpKG4pe3ZhciB0PXYuZGVsYXk7cmV0dXJuIHMudD10K2wsbj49dD9hKG4tdCk6dm9pZChzLmM9YSl9ZnVuY3Rpb24gYShlKXt2YXIgdT1wLmFjdGl2ZSxpPXBbdV07aSYmKGkudGltZXIuYz1udWxsLGkudGltZXIudD1OYU4sLS1wLmNvdW50LGRlbGV0ZSBwW3VdLGkuZXZlbnQmJmkuZXZlbnQuaW50ZXJydXB0LmNhbGwobixuLl9fZGF0YV9fLGkuaW5kZXgpKTtmb3IodmFyIGEgaW4gcClpZihyPithKXt2YXIgYz1wW2FdO2MudGltZXIuYz1udWxsLGMudGltZXIudD1OYU4sLS1wLmNvdW50LGRlbGV0ZSBwW2FdfXMuYz1vLHFuKGZ1bmN0aW9uKCl7cmV0dXJuIHMuYyYmbyhlfHwxKSYmKHMuYz1udWxsLHMudD1OYU4pLDF9LDAsbCkscC5hY3RpdmU9cix2LmV2ZW50JiZ2LmV2ZW50LnN0YXJ0LmNhbGwobixuLl9fZGF0YV9fLHQpLGc9W10sdi50d2Vlbi5mb3JFYWNoKGZ1bmN0aW9uKGUscil7KHI9ci5jYWxsKG4sbi5fX2RhdGFfXyx0KSkmJmcucHVzaChyKX0pLGg9di5lYXNlLGY9di5kdXJhdGlvbn1mdW5jdGlvbiBvKHUpe2Zvcih2YXIgaT11L2YsYT1oKGkpLG89Zy5sZW5ndGg7bz4wOylnWy0tb10uY2FsbChuLGEpO3JldHVybiBpPj0xPyh2LmV2ZW50JiZ2LmV2ZW50LmVuZC5jYWxsKG4sbi5fX2RhdGFfXyx0KSwtLXAuY291bnQ/ZGVsZXRlIHBbcl06ZGVsZXRlIG5bZV0sMSk6dm9pZCAwfXZhciBsLHMsZixoLGcscD1uW2VdfHwobltlXT17YWN0aXZlOjAsY291bnQ6MH0pLHY9cFtyXTt2fHwobD11LnRpbWUscz1xbihpLDAsbCksdj1wW3JdPXt0d2VlbjpuZXcgYyx0aW1lOmwsdGltZXI6cyxkZWxheTp1LmRlbGF5LGR1cmF0aW9uOnUuZHVyYXRpb24sZWFzZTp1LmVhc2UsaW5kZXg6dH0sdT1udWxsLCsrcC5jb3VudCl9ZnVuY3Rpb24gbmEobix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoIisoaXNGaW5pdGUocik/cjplKG4pKSsiLDApIn0pfWZ1bmN0aW9uIHRhKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKDAsIisoaXNGaW5pdGUocik/cjplKG4pKSsiKSJ9KX1mdW5jdGlvbiBlYShuKXtyZXR1cm4gbi50b0lTT1N0cmluZygpfWZ1bmN0aW9uIHJhKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHQpfWZ1bmN0aW9uIHUobixlKXt2YXIgcj1uWzFdLW5bMF0sdT1yL2UsaT1vYS5iaXNlY3QoR2wsdSk7cmV0dXJuIGk9PUdsLmxlbmd0aD9bdC55ZWFyLEt1KG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLzMxNTM2ZTZ9KSxlKVsyXV06aT90W3UvR2xbaS0xXTxHbFtpXS91P2ktMTppXTpbbmMsS3UobixlKVsyXV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB1YShuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbih0KSxyKTpuLmRvbWFpbigpLm1hcCh1YSl9LHIubmljZT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIWlzTmFOKGUpJiYhbi5yYW5nZShlLHVhKCtlKzEpLHQpLmxlbmd0aH12YXIgaT1yLmRvbWFpbigpLGE9WXUoaSksbz1udWxsPT1uP3UoYSwxMCk6Im51bWJlciI9PXR5cGVvZiBuJiZ1KGEsbik7cmV0dXJuIG8mJihuPW9bMF0sdD1vWzFdKSxyLmRvbWFpbihYdShpLHQ+MT97Zmxvb3I6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5mbG9vcih0KSk7KXQ9dWEodC0xKTtyZXR1cm4gdH0sY2VpbDpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmNlaWwodCkpOyl0PXVhKCt0KzEpO3JldHVybiB0fX06bikpfSxyLnRpY2tzPWZ1bmN0aW9uKG4sdCl7dmFyIGU9WXUoci5kb21haW4oKSksaT1udWxsPT1uP3UoZSwxMCk6Im51bWJlciI9PXR5cGVvZiBuP3UoZSxuKTohbi5yYW5nZSYmW3tyYW5nZTpufSx0XTtyZXR1cm4gaSYmKG49aVswXSx0PWlbMV0pLG4ucmFuZ2UoZVswXSx1YSgrZVsxXSsxKSwxPnQ/MTp0KX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiByYShuLmNvcHkoKSx0LGUpfSxKdShyLG4pfWZ1bmN0aW9uIHVhKG4pe3JldHVybiBuZXcgRGF0ZShuKX1mdW5jdGlvbiBpYShuKXtyZXR1cm4gSlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gYWEobil7dmFyIHQ9c2EuY3JlYXRlUmFuZ2UoKTtyZXR1cm4gdC5zZWxlY3ROb2RlKHNhLmJvZHkpLHQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KG4ucmVzcG9uc2VUZXh0KX12YXIgb2E9e3ZlcnNpb246IjMuNS45In0sbGE9W10uc2xpY2UsY2E9ZnVuY3Rpb24obil7cmV0dXJuIGxhLmNhbGwobil9LHNhPXRoaXMuZG9jdW1lbnQ7aWYoc2EpdHJ5e2NhKHNhLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZX1jYXRjaChmYSl7Y2E9ZnVuY3Rpb24obil7Zm9yKHZhciB0PW4ubGVuZ3RoLGU9bmV3IEFycmF5KHQpO3QtLTspZVt0XT1uW3RdO3JldHVybiBlfX1pZihEYXRlLm5vd3x8KERhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSksc2EpdHJ5e3NhLmNyZWF0ZUVsZW1lbnQoIkRJViIpLnN0eWxlLnNldFByb3BlcnR5KCJvcGFjaXR5IiwwLCIiKX1jYXRjaChoYSl7dmFyIGdhPXRoaXMuRWxlbWVudC5wcm90b3R5cGUscGE9Z2Euc2V0QXR0cmlidXRlLHZhPWdhLnNldEF0dHJpYnV0ZU5TLGRhPXRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsbWE9ZGEuc2V0UHJvcGVydHk7Z2Euc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7cGEuY2FsbCh0aGlzLG4sdCsiIil9LGdhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXt2YS5jYWxsKHRoaXMsbix0LGUrIiIpfSxkYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7bWEuY2FsbCh0aGlzLG4sdCsiIixlKX19b2EuYXNjZW5kaW5nPWUsb2EuZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOk5hTn0sb2EubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPW5bdV0pJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9blt1XSkmJmU+ciYmKGU9cil9ZWxzZXtmb3IoOysrdTxpOylpZihudWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZlPnImJihlPXIpfXJldHVybiBlfSxvYS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+ZSYmKGU9cil9cmV0dXJuIGV9LG9hLmV4dGVudD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdSxpPS0xLGE9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPGE7KWlmKG51bGwhPShyPW5baV0pJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxhOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxhOylpZihudWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj49cil7ZT11PXI7YnJlYWt9Zm9yKDsrK2k8YTspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJihlPnImJihlPXIpLHI+dSYmKHU9cikpfXJldHVybltlLHVdfSxvYS5zdW09ZnVuY3Rpb24obix0KXt2YXIgZSxyPTAsaT1uLmxlbmd0aCxhPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPGk7KXUoZT0rblthXSkmJihyKz1lKTtlbHNlIGZvcig7KythPGk7KXUoZT0rdC5jYWxsKG4sblthXSxhKSkmJihyKz1lKTtyZXR1cm4gcn0sb2EubWVhbj1mdW5jdGlvbihuLHQpe3ZhciBlLGk9MCxhPW4ubGVuZ3RoLG89LTEsbD1hO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytvPGE7KXUoZT1yKG5bb10pKT9pKz1lOi0tbDtlbHNlIGZvcig7KytvPGE7KXUoZT1yKHQuY2FsbChuLG5bb10sbykpKT9pKz1lOi0tbDtyZXR1cm4gbD9pL2w6dm9pZCAwfSxvYS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLHU9K25bci0xXSxpPWUtcjtyZXR1cm4gaT91K2kqKG5bcl0tdSk6dX0sb2EubWVkaWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGksYT1bXSxvPW4ubGVuZ3RoLGw9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8bzspdShpPXIobltsXSkpJiZhLnB1c2goaSk7ZWxzZSBmb3IoOysrbDxvOyl1KGk9cih0LmNhbGwobixuW2xdLGwpKSkmJmEucHVzaChpKTtyZXR1cm4gYS5sZW5ndGg/b2EucXVhbnRpbGUoYS5zb3J0KGUpLC41KTp2b2lkIDB9LG9hLnZhcmlhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaSxhPW4ubGVuZ3RoLG89MCxsPTAsYz0tMSxzPTA7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2M8YTspdShlPXIobltjXSkpJiYoaT1lLW8sbys9aS8rK3MsbCs9aSooZS1vKSk7ZWxzZSBmb3IoOysrYzxhOyl1KGU9cih0LmNhbGwobixuW2NdLGMpKSkmJihpPWUtbyxvKz1pLysrcyxsKz1pKihlLW8pKTtyZXR1cm4gcz4xP2wvKHMtMSk6dm9pZCAwfSxvYS5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgbj1vYS52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59O3ZhciB5YT1pKGUpO29hLmJpc2VjdExlZnQ9eWEubGVmdCxvYS5iaXNlY3Q9b2EuYmlzZWN0UmlnaHQ9eWEucmlnaHQsb2EuYmlzZWN0b3I9ZnVuY3Rpb24obil7cmV0dXJuIGkoMT09PW4ubGVuZ3RoP2Z1bmN0aW9uKHQscil7cmV0dXJuIGUobih0KSxyKX06bil9LG9hLnNodWZmbGU9ZnVuY3Rpb24obix0LGUpeyhpPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihlPW4ubGVuZ3RoLDI+aSYmKHQ9MCkpO2Zvcih2YXIgcix1LGk9ZS10O2k7KXU9TWF0aC5yYW5kb20oKSppLS18MCxyPW5baSt0XSxuW2krdF09blt1K3RdLG5bdSt0XT1yO3JldHVybiBufSxvYS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSxvYS5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSxvYS56aXA9ZnVuY3Rpb24oKXtpZighKHI9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9b2EubWluKGFyZ3VtZW50cyxhKSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciByLHU9LTEsaT1lW25dPW5ldyBBcnJheShyKTsrK3U8cjspaVt1XT1hcmd1bWVudHNbdV1bbl07cmV0dXJuIGV9LG9hLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gb2EuemlwLmFwcGx5KG9hLG4pfSxvYS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sb2EudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sb2EuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sb2EubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsYT0wOysraTx1OylhKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tYV09clt0XTtyZXR1cm4gZX07dmFyIE1hPU1hdGguYWJzO29hLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLCh0LW4pL2U9PT0xLzApdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLHU9W10saT1vKE1hKGUpKSxhPS0xO2lmKG4qPWksdCo9aSxlKj1pLDA+ZSlmb3IoOyhyPW4rZSorK2EpPnQ7KXUucHVzaChyL2kpO2Vsc2UgZm9yKDsocj1uK2UqKythKTx0Oyl1LnB1c2goci9pKTtyZXR1cm4gdX0sb2EubWFwPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bmV3IGM7aWYobiBpbnN0YW5jZW9mIGMpbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KWUuc2V0KHUsblt1XSk7ZWxzZSBmb3IoOysrdTxpOyllLnNldCh0LmNhbGwobixyPW5bdV0sdSkscil9ZWxzZSBmb3IodmFyIGEgaW4gbillLnNldChhLG5bYV0pO3JldHVybiBlfTt2YXIgeGE9Il9fcHJvdG9fXyIsYmE9Ilx4MDAiO2woYyx7aGFzOmgsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bcyhuKV09dH0scmVtb3ZlOmcsa2V5czpwLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmYodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpLHRoaXMuX1t0XSl9fSksb2EubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxhLG8pe2lmKG8+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LGEpOmU/YS5zb3J0KGUpOmE7Zm9yKHZhciBsLHMsZixoLGc9LTEscD1hLmxlbmd0aCx2PWlbbysrXSxkPW5ldyBjOysrZzxwOykoaD1kLmdldChsPXYocz1hW2ddKSkpP2gucHVzaChzKTpkLnNldChsLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLG8pKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLG8pfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9YVtlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxhPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4ob2EubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYVtpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sb2Euc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBtO2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxsKG0se2hhczpoLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW3Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zyx2YWx1ZXM6cCxzaXplOnYsZW1wdHk6ZCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsZih0KSl9fSksb2EuYmVoYXZpb3I9e30sb2EucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPU0obix0LHRbZV0pO3JldHVybiBufTt2YXIgX2E9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07b2EuZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IF8sdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT13KG4pO3JldHVybiBufSxfLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSxvYS5ldmVudD1udWxsLG9hLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSh3YSwiXFwkJiIpfTt2YXIgd2E9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLFNhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxrYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LE5hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sRWE9ZnVuY3Rpb24obix0KXt2YXIgZT1uLm1hdGNoZXN8fG5beChuLCJtYXRjaGVzU2VsZWN0b3IiKV07cmV0dXJuKEVhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUuY2FsbChuLHQpfSkobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKGthPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSxOYT1TaXp6bGUsRWE9U2l6emxlLm1hdGNoZXNTZWxlY3Rvciksb2Euc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLnNlbGVjdChzYS5kb2N1bWVudEVsZW1lbnQpfTt2YXIgQWE9b2Euc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtBYS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPUEobik7Zm9yKHZhciBhPS0xLG89dGhpcy5sZW5ndGg7KythPG87KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbYV0pLnBhcmVudE5vZGU7Zm9yKHZhciBsPS0xLGM9ci5sZW5ndGg7KytsPGM7KSh1PXJbbF0pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGwsYSkpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBFKGkpfSxBYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249QyhuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBhPXRoaXNbdV0sbz0tMSxsPWEubGVuZ3RoOysrbzxsOykoZT1hW29dKSYmKHIucHVzaCh0PWNhKG4uY2FsbChlLGUuX19kYXRhX18sbyx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gRShyKX07dmFyIENhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtvYS5ucz17cHJlZml4OkNhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYieG1sbnMiIT09KGU9bi5zbGljZSgwLHQpKSYmKG49bi5zbGljZSh0KzEpKSxDYS5oYXNPd25Qcm9wZXJ0eShlKT97c3BhY2U6Q2FbZV0sbG9jYWw6bn06bn19LEFhLmF0dHI9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGU9dGhpcy5ub2RlKCk7cmV0dXJuIG49b2EubnMucXVhbGlmeShuKSxuLmxvY2FsP2UuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTplLmdldEF0dHJpYnV0ZShuKX1mb3IodCBpbiBuKXRoaXMuZWFjaCh6KHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goeihuLHQpKX0sQWEuY2xhc3NlZD1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKSxyPShuPVQobikpLmxlbmd0aCx1PS0xO2lmKHQ9ZS5jbGFzc0xpc3Qpe2Zvcig7Kyt1PHI7KWlmKCF0LmNvbnRhaW5zKG5bdV0pKXJldHVybiExfWVsc2UgZm9yKHQ9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Kyt1PHI7KWlmKCFxKG5bdV0pLnRlc3QodCkpcmV0dXJuITE7cmV0dXJuITB9Zm9yKHQgaW4gbil0aGlzLmVhY2goUih0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFIobix0KSl9LEFhLnN0eWxlPWZ1bmN0aW9uKG4sZSxyKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoO2lmKDM+dSl7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnUmJihlPSIiKTtmb3IociBpbiBuKXRoaXMuZWFjaChQKHIsbltyXSxlKSk7cmV0dXJuIHRoaXN9aWYoMj51KXt2YXIgaT10aGlzLm5vZGUoKTtyZXR1cm4gdChpKS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKX1yPSIifXJldHVybiB0aGlzLmVhY2goUChuLGUscikpfSxBYS5wcm9wZXJ0eT1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiB0aGlzLm5vZGUoKVtuXTtmb3IodCBpbiBuKXRoaXMuZWFjaChqKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goaihuLHQpKX0sQWEudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9OmZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LEFhLmh0bWw9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9bn0pOnRoaXMubm9kZSgpLmlubmVySFRNTH0sQWEuYXBwZW5kPWZ1bmN0aW9uKG4pe3JldHVybiBuPVUobiksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sQWEuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49VShuKSx0PUEodCksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LEFhLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goRil9LEFhLmRhdGE9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHIsdSxpLGE9bi5sZW5ndGgsZj1lLmxlbmd0aCxoPU1hdGgubWluKGEsZiksZz1uZXcgQXJyYXkoZikscD1uZXcgQXJyYXkoZiksdj1uZXcgQXJyYXkoYSk7aWYodCl7dmFyIGQsbT1uZXcgYyx5PW5ldyBBcnJheShhKTtmb3Iocj0tMTsrK3I8YTspKHU9bltyXSkmJihtLmhhcyhkPXQuY2FsbCh1LHUuX19kYXRhX18scikpP3Zbcl09dTptLnNldChkLHUpLHlbcl09ZCk7Zm9yKHI9LTE7KytyPGY7KSh1PW0uZ2V0KGQ9dC5jYWxsKGUsaT1lW3JdLHIpKSk/dSE9PSEwJiYoZ1tyXT11LHUuX19kYXRhX189aSk6cFtyXT1IKGkpLG0uc2V0KGQsITApO2ZvcihyPS0xOysrcjxhOylyIGluIHkmJm0uZ2V0KHlbcl0pIT09ITAmJih2W3JdPW5bcl0pfWVsc2V7Zm9yKHI9LTE7KytyPGg7KXU9bltyXSxpPWVbcl0sdT8odS5fX2RhdGFfXz1pLGdbcl09dSk6cFtyXT1IKGkpO2Zvcig7Zj5yOysrcilwW3JdPUgoZVtyXSk7Zm9yKDthPnI7KytyKXZbcl09bltyXX1wLnVwZGF0ZT1nLHAucGFyZW50Tm9kZT1nLnBhcmVudE5vZGU9di5wYXJlbnROb2RlPW4ucGFyZW50Tm9kZSxvLnB1c2gocCksbC5wdXNoKGcpLHMucHVzaCh2KX12YXIgcix1LGk9LTEsYT10aGlzLmxlbmd0aDtpZighYXJndW1lbnRzLmxlbmd0aCl7Zm9yKG49bmV3IEFycmF5KGE9KHI9dGhpc1swXSkubGVuZ3RoKTsrK2k8YTspKHU9cltpXSkmJihuW2ldPXUuX19kYXRhX18pO3JldHVybiBufXZhciBvPVooW10pLGw9RShbXSkscz1FKFtdKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbilmb3IoOysraTxhOyllKHI9dGhpc1tpXSxuLmNhbGwocixyLnBhcmVudE5vZGUuX19kYXRhX18saSkpO2Vsc2UgZm9yKDsrK2k8YTspZShyPXRoaXNbaV0sbik7cmV0dXJuIGwuZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gb30sbC5leGl0PWZ1bmN0aW9uKCl7cmV0dXJuIHN9LGx9LEFhLmRhdHVtPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIixuKTp0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpfSxBYS5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPU8obikpO2Zvcih2YXIgaT0wLGE9dGhpcy5sZW5ndGg7YT5pO2krKyl7dS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT0oZT10aGlzW2ldKS5wYXJlbnROb2RlO2Zvcih2YXIgbz0wLGw9ZS5sZW5ndGg7bD5vO28rKykocj1lW29dKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxvLGkpJiZ0LnB1c2gocil9cmV0dXJuIEUodSl9LEFhLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xLHQ9dGhpcy5sZW5ndGg7KytuPHQ7KWZvcih2YXIgZSxyPXRoaXNbbl0sdT1yLmxlbmd0aC0xLGk9clt1XTstLXU+PTA7KShlPXJbdV0pJiYoaSYmaSE9PWUubmV4dFNpYmxpbmcmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxpKSxpPWUpO3JldHVybiB0aGlzfSxBYS5zb3J0PWZ1bmN0aW9uKG4pe249SS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KXRoaXNbdF0uc29ydChuKTtyZXR1cm4gdGhpcy5vcmRlcigpfSxBYS5lYWNoPWZ1bmN0aW9uKG4pe3JldHVybiBZKHRoaXMsZnVuY3Rpb24odCxlLHIpe24uY2FsbCh0LHQuX19kYXRhX18sZSxyKX0pfSxBYS5jYWxsPWZ1bmN0aW9uKG4pe3ZhciB0PWNhKGFyZ3VtZW50cyk7cmV0dXJuIG4uYXBwbHkodFswXT10aGlzLHQpLHRoaXN9LEFhLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxBYS5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsdD10aGlzLmxlbmd0aDt0Pm47bisrKWZvcih2YXIgZT10aGlzW25dLHI9MCx1PWUubGVuZ3RoO3U+cjtyKyspe3ZhciBpPWVbcl07aWYoaSlyZXR1cm4gaX1yZXR1cm4gbnVsbH0sQWEuc2l6ZT1mdW5jdGlvbigpe3ZhciBuPTA7cmV0dXJuIFkodGhpcyxmdW5jdGlvbigpeysrbn0pLG59O3ZhciB6YT1bXTtvYS5zZWxlY3Rpb24uZW50ZXI9WixvYS5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPXphLHphLmFwcGVuZD1BYS5hcHBlbmQsemEuZW1wdHk9QWEuZW1wdHksemEubm9kZT1BYS5ub2RlLHphLmNhbGw9QWEuY2FsbCx6YS5zaXplPUFhLnNpemUsemEuc2VsZWN0PWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdSxpLGE9W10sbz0tMSxsPXRoaXMubGVuZ3RoOysrbzxsOyl7cj0odT10aGlzW29dKS51cGRhdGUsYS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT11LnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLHM9dS5sZW5ndGg7KytjPHM7KShpPXVbY10pPyh0LnB1c2gocltjXT1lPW4uY2FsbCh1LnBhcmVudE5vZGUsaS5fX2RhdGFfXyxjLG8pKSxlLl9fZGF0YV9fPWkuX19kYXRhX18pOnQucHVzaChudWxsKX1yZXR1cm4gRShhKX0semEuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9Vih0aGlzKSksQWEuaW5zZXJ0LmNhbGwodGhpcyxuLHQpfSxvYS5zZWxlY3Q9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0PyhlPVtrYSh0LHNhKV0sZS5wYXJlbnROb2RlPXNhLmRvY3VtZW50RWxlbWVudCk6KGU9W3RdLGUucGFyZW50Tm9kZT1uKHQpKSxFKFtlXSl9LG9hLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4/KHQ9Y2EoTmEobixzYSkpLHQucGFyZW50Tm9kZT1zYS5kb2N1bWVudEVsZW1lbnQpOih0PWNhKG4pLHQucGFyZW50Tm9kZT1udWxsKSxFKFt0XSl9LEFhLm9uPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO2lmKDM+cil7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnImJih0PSExKTtmb3IoZSBpbiBuKXRoaXMuZWFjaChYKGUsbltlXSx0KSk7cmV0dXJuIHRoaXN9aWYoMj5yKXJldHVybihyPXRoaXMubm9kZSgpWyJfX29uIituXSkmJnIuXztlPSExfXJldHVybiB0aGlzLmVhY2goWChuLHQsZSkpfTt2YXIgTGE9b2EubWFwKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pO3NhJiZMYS5mb3JFYWNoKGZ1bmN0aW9uKG4peyJvbiIrbiBpbiBzYSYmTGEucmVtb3ZlKG4pfSk7dmFyIHFhLFRhPTA7b2EubW91c2U9ZnVuY3Rpb24obil7cmV0dXJuIEoobixrKCkpfTt2YXIgUmE9dGhpcy5uYXZpZ2F0b3ImJi9XZWJLaXQvLnRlc3QodGhpcy5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO29hLnRvdWNoPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPXQsdD1rKCkuY2hhbmdlZFRvdWNoZXMpLHQpZm9yKHZhciByLHU9MCxpPXQubGVuZ3RoO2k+dTsrK3UpaWYoKHI9dFt1XSkuaWRlbnRpZmllcj09PWUpcmV0dXJuIEoobixyKX0sb2EuYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsaSkub24oInRvdWNoc3RhcnQuZHJhZyIsYSl9ZnVuY3Rpb24gZShuLHQsZSxpLGEpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIG8oKXt2YXIgbixlLHI9dChoLHYpO3ImJihuPXJbMF0tTVswXSxlPXJbMV0tTVsxXSxwfD1ufGUsTT1yLGcoe3R5cGU6ImRyYWciLHg6clswXStjWzBdLHk6clsxXStjWzFdLGR4Om4sZHk6ZX0pKX1mdW5jdGlvbiBsKCl7dChoLHYpJiYobS5vbihpK2QsbnVsbCkub24oYStkLG51bGwpLHkocCksZyh7dHlwZToiZHJhZ2VuZCJ9KSl9dmFyIGMscz10aGlzLGY9b2EuZXZlbnQudGFyZ2V0LGg9cy5wYXJlbnROb2RlLGc9ci5vZihzLGFyZ3VtZW50cykscD0wLHY9bigpLGQ9Ii5kcmFnIisobnVsbD09dj8iIjoiLSIrdiksbT1vYS5zZWxlY3QoZShmKSkub24oaStkLG8pLm9uKGErZCxsKSx5PVcoZiksTT10KGgsdik7dT8oYz11LmFwcGx5KHMsYXJndW1lbnRzKSxjPVtjLngtTVswXSxjLnktTVsxXV0pOmM9WzAsMF0sZyh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgcj1OKG4sImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiksdT1udWxsLGk9ZShiLG9hLm1vdXNlLHQsIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxhPWUoRyxvYS50b3VjaCx5LCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG9hLnJlYmluZChuLHIsIm9uIil9LG9hLnRvdWNoZXM9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1rKCkudG91Y2hlcyksdD9jYSh0KS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9SihuLHQpO3JldHVybiBlLmlkZW50aWZpZXI9dC5pZGVudGlmaWVyLGV9KTpbXX07dmFyIERhPTFlLTYsUGE9RGEqRGEsamE9TWF0aC5QSSxVYT0yKmphLEZhPVVhLURhLEhhPWphLzIsT2E9amEvMTgwLElhPTE4MC9qYSxZYT1NYXRoLlNRUlQyLFphPTIsVmE9NDtvYS5pbnRlcnBvbGF0ZVpvb209ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9blswXSxpPW5bMV0sYT1uWzJdLG89dFswXSxsPXRbMV0sYz10WzJdLHM9by11LGY9bC1pLGg9cypzK2YqZjtpZihQYT5oKXI9TWF0aC5sb2coYy9hKS9ZYSxlPWZ1bmN0aW9uKG4pe3JldHVyblt1K24qcyxpK24qZixhKk1hdGguZXhwKFlhKm4qcildfTtlbHNle3ZhciBnPU1hdGguc3FydChoKSxwPShjKmMtYSphK1ZhKmgpLygyKmEqWmEqZyksdj0oYypjLWEqYS1WYSpoKS8oMipjKlphKmcpLGQ9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSxtPU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0obS1kKS9ZYSxlPWZ1bmN0aW9uKG4pe3ZhciB0PW4qcixlPXJuKGQpLG89YS8oWmEqZykqKGUqdW4oWWEqdCtkKS1lbihkKSk7cmV0dXJuW3UrbypzLGkrbypmLGEqZS9ybihZYSp0K2QpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX0sb2EuYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5vbihMLGYpLm9uKCRhKyIuem9vbSIsZykub24oImRibGNsaWNrLnpvb20iLHApLm9uKFIsaCl9ZnVuY3Rpb24gZShuKXtyZXR1cm5bKG5bMF0tay54KS9rLmssKG5bMV0tay55KS9rLmtdfWZ1bmN0aW9uIHIobil7cmV0dXJuW25bMF0qay5rK2sueCxuWzFdKmsuaytrLnldfWZ1bmN0aW9uIHUobil7ay5rPU1hdGgubWF4KEFbMF0sTWF0aC5taW4oQVsxXSxuKSl9ZnVuY3Rpb24gaShuLHQpe3Q9cih0KSxrLngrPW5bMF0tdFswXSxrLnkrPW5bMV0tdFsxXX1mdW5jdGlvbiBhKHQsZSxyLGEpe3QuX19jaGFydF9fPXt4OmsueCx5OmsueSxrOmsua30sdShNYXRoLnBvdygyLGEpKSxpKGQ9ZSxyKSx0PW9hLnNlbGVjdCh0KSxDPjAmJih0PXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKEMpKSx0LmNhbGwobi5ldmVudCl9ZnVuY3Rpb24gbygpe2ImJmIuZG9tYWluKHgucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay54KS9rLmt9KS5tYXAoeC5pbnZlcnQpKSx3JiZ3LmRvbWFpbihfLnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueSkvay5rfSkubWFwKF8uaW52ZXJ0KSl9ZnVuY3Rpb24gbChuKXt6Kyt8fG4oe3R5cGU6Inpvb21zdGFydCJ9KX1mdW5jdGlvbiBjKG4pe28oKSxuKHt0eXBlOiJ6b29tIixzY2FsZTprLmssdHJhbnNsYXRlOltrLngsay55XX0pfWZ1bmN0aW9uIHMobil7LS16fHwobih7dHlwZToiem9vbWVuZCJ9KSxkPW51bGwpfWZ1bmN0aW9uIGYoKXtmdW5jdGlvbiBuKCl7bz0xLGkob2EubW91c2UodSksaCksYyhhKX1mdW5jdGlvbiByKCl7Zi5vbihxLG51bGwpLm9uKFQsbnVsbCksZyhvKSxzKGEpfXZhciB1PXRoaXMsYT1ELm9mKHUsYXJndW1lbnRzKSxvPTAsZj1vYS5zZWxlY3QodCh1KSkub24ocSxuKS5vbihULHIpLGg9ZShvYS5tb3VzZSh1KSksZz1XKHUpO09sLmNhbGwodSksbChhKX1mdW5jdGlvbiBoKCl7ZnVuY3Rpb24gbigpe3ZhciBuPW9hLnRvdWNoZXMocCk7cmV0dXJuIGc9ay5rLG4uZm9yRWFjaChmdW5jdGlvbihuKXtuLmlkZW50aWZpZXIgaW4gZCYmKGRbbi5pZGVudGlmaWVyXT1lKG4pKX0pLG59ZnVuY3Rpb24gdCgpe3ZhciB0PW9hLmV2ZW50LnRhcmdldDtvYS5zZWxlY3QodCkub24oeCxyKS5vbihiLG8pLF8ucHVzaCh0KTtmb3IodmFyIGU9b2EuZXZlbnQuY2hhbmdlZFRvdWNoZXMsdT0wLGk9ZS5sZW5ndGg7aT51OysrdSlkW2VbdV0uaWRlbnRpZmllcl09bnVsbDt2YXIgbD1uKCksYz1EYXRlLm5vdygpO2lmKDE9PT1sLmxlbmd0aCl7aWYoNTAwPmMtTSl7dmFyIHM9bFswXTthKHAscyxkW3MuaWRlbnRpZmllcl0sTWF0aC5mbG9vcihNYXRoLmxvZyhrLmspL01hdGguTE4yKSsxKSxTKCl9TT1jfWVsc2UgaWYobC5sZW5ndGg+MSl7dmFyIHM9bFswXSxmPWxbMV0saD1zWzBdLWZbMF0sZz1zWzFdLWZbMV07bT1oKmgrZypnfX1mdW5jdGlvbiByKCl7dmFyIG4sdCxlLHIsYT1vYS50b3VjaGVzKHApO09sLmNhbGwocCk7Zm9yKHZhciBvPTAsbD1hLmxlbmd0aDtsPm87KytvLHI9bnVsbClpZihlPWFbb10scj1kW2UuaWRlbnRpZmllcl0pe2lmKHQpYnJlYWs7bj1lLHQ9cn1pZihyKXt2YXIgcz0ocz1lWzBdLW5bMF0pKnMrKHM9ZVsxXS1uWzFdKSpzLGY9bSYmTWF0aC5zcXJ0KHMvbSk7bj1bKG5bMF0rZVswXSkvMiwoblsxXStlWzFdKS8yXSx0PVsodFswXStyWzBdKS8yLCh0WzFdK3JbMV0pLzJdLHUoZipnKX1NPW51bGwsaShuLHQpLGModil9ZnVuY3Rpb24gbygpe2lmKG9hLmV2ZW50LnRvdWNoZXMubGVuZ3RoKXtmb3IodmFyIHQ9b2EuZXZlbnQuY2hhbmdlZFRvdWNoZXMsZT0wLHI9dC5sZW5ndGg7cj5lOysrZSlkZWxldGUgZFt0W2VdLmlkZW50aWZpZXJdO2Zvcih2YXIgdSBpbiBkKXJldHVybiB2b2lkIG4oKX1vYS5zZWxlY3RBbGwoXykub24oeSxudWxsKSx3Lm9uKEwsZikub24oUixoKSxOKCkscyh2KX12YXIgZyxwPXRoaXMsdj1ELm9mKHAsYXJndW1lbnRzKSxkPXt9LG09MCx5PSIuem9vbS0iK29hLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIseD0idG91Y2htb3ZlIit5LGI9InRvdWNoZW5kIit5LF89W10sdz1vYS5zZWxlY3QocCksTj1XKHApO3QoKSxsKHYpLHcub24oTCxudWxsKS5vbihSLHQpfWZ1bmN0aW9uIGcoKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKTt5P2NsZWFyVGltZW91dCh5KTooT2wuY2FsbCh0aGlzKSx2PWUoZD1tfHxvYS5tb3VzZSh0aGlzKSksbChuKSkseT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eT1udWxsLHMobil9LDUwKSxTKCksdShNYXRoLnBvdygyLC4wMDIqWGEoKSkqay5rKSxpKGQsdiksYyhuKX1mdW5jdGlvbiBwKCl7dmFyIG49b2EubW91c2UodGhpcyksdD1NYXRoLmxvZyhrLmspL01hdGguTE4yO2EodGhpcyxuLGUobiksb2EuZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKHQpLTE6TWF0aC5mbG9vcih0KSsxKX12YXIgdixkLG0seSxNLHgsYixfLHcsaz17eDowLHk6MCxrOjF9LEU9Wzk2MCw1MDBdLEE9QmEsQz0yNTAsej0wLEw9Im1vdXNlZG93bi56b29tIixxPSJtb3VzZW1vdmUuem9vbSIsVD0ibW91c2V1cC56b29tIixSPSJ0b3VjaHN0YXJ0Lnpvb20iLEQ9TihuLCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiAkYXx8KCRhPSJvbndoZWVsImluIHNhPyhYYT1mdW5jdGlvbigpe3JldHVybi1vYS5ldmVudC5kZWx0YVkqKG9hLmV2ZW50LmRlbHRhTW9kZT8xMjA6MSl9LCJ3aGVlbCIpOiJvbm1vdXNld2hlZWwiaW4gc2E/KFhhPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLmV2ZW50LndoZWVsRGVsdGF9LCJtb3VzZXdoZWVsIik6KFhhPWZ1bmN0aW9uKCl7cmV0dXJuLW9hLmV2ZW50LmRldGFpbH0sIk1vek1vdXNlUGl4ZWxTY3JvbGwiKSksbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKSx0PWs7Rmw/b2Euc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe2s9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sbChuKX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIGU9RVswXSxyPUVbMV0sdT1kP2RbMF06ZS8yLGk9ZD9kWzFdOnIvMixhPW9hLmludGVycG9sYXRlWm9vbShbKHUtay54KS9rLmssKGktay55KS9rLmssZS9rLmtdLFsodS10LngpL3QuaywoaS10LnkpL3QuayxlL3Qua10pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1hKHQpLG89ZS9yWzJdO3RoaXMuX19jaGFydF9fPWs9e3g6dS1yWzBdKm8seTppLXJbMV0qbyxrOm99LGMobil9fSkuZWFjaCgiaW50ZXJydXB0Lnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe3Mobil9KToodGhpcy5fX2NoYXJ0X189ayxsKG4pLGMobikscyhuKSl9KX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9e3g6K3RbMF0seTordFsxXSxrOmsua30sbygpLG4pOltrLngsay55XX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDprLngseTprLnksazpudWxsfSx1KCt0KSxvKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPW51bGw9PXQ/QmE6Wyt0WzBdLCt0WzFdXSxuKTpBfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10JiZbK3RbMF0sK3RbMV1dLG4pOm19LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT10JiZbK3RbMF0sK3RbMV1dLG4pOkV9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9K3Qsbik6Q30sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQseD10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6Yn0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6d30sb2EucmViaW5kKG4sRCwib24iKX07dmFyIFhhLCRhLEJhPVswLDEvMF07b2EuY29sb3I9b24sb24ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LG9hLmhzbD1sbjt2YXIgV2E9bG4ucHJvdG90eXBlPW5ldyBvbjtXYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGxuKHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxXYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBsbih0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sV2EucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGNuKHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sb2EuaGNsPXNuO3ZhciBKYT1zbi5wcm90b3R5cGU9bmV3IG9uO0phLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgc24odGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK0dhKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sSmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgc24odGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1HYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LEphLnJnYj1mdW5jdGlvbigpe3JldHVybiBmbih0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LG9hLmxhYj1objt2YXIgR2E9MTgsS2E9Ljk1MDQ3LFFhPTEsbm89MS4wODg4Myx0bz1obi5wcm90b3R5cGU9bmV3IG9uO3RvLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaG4oTWF0aC5taW4oMTAwLHRoaXMubCtHYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sdG8uZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaG4oTWF0aC5tYXgoMCx0aGlzLmwtR2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LHRvLnJnYj1mdW5jdGlvbigpe3JldHVybiBnbih0aGlzLmwsdGhpcy5hLHRoaXMuYil9LG9hLnJnYj15bjt2YXIgZW89eW4ucHJvdG90eXBlPW5ldyBvbjtlby5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IHluKE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IHluKHUsdSx1KX0sZW8uZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgeW4obip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxlby5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gd24odGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxlby50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIitibih0aGlzLnIpK2JuKHRoaXMuZykrYm4odGhpcy5iKX07dmFyIHJvPW9hLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7cm8uZm9yRWFjaChmdW5jdGlvbihuLHQpe3JvLnNldChuLE1uKHQpKX0pLG9hLmZ1bmN0b3I9RW4sb2EueGhyPUFuKHkpLG9hLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBhPUNuKG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gYS5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/YS5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LGF9ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKGEpLmpvaW4obil9ZnVuY3Rpb24gYShuKXtyZXR1cm4gby50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIG89bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGw9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihzPj1jKXJldHVybiBhO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1zO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8YzspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfXM9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytzKToxMD09PXImJih1PSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtjPnM7KXt2YXIgcj1uLmNoYXJDb2RlQXQocysrKSxvPTE7aWYoMTA9PT1yKXU9ITA7ZWxzZSBpZigxMz09PXIpdT0hMCwxMD09PW4uY2hhckNvZGVBdChzKSYmKCsrcywrK28pO2Vsc2UgaWYociE9PWwpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxzLW8pfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcix1LGk9e30sYT17fSxvPVtdLGM9bi5sZW5ndGgscz0wLGY9MDsocj1lKCkpIT09YTspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PWE7KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgsZisrKSl8fG8ucHVzaChoKX1yZXR1cm4gb30sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyBtLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChhKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBhKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LG9hLmNzdj1vYS5kc3YoIiwiLCJ0ZXh0L2NzdiIpLG9hLnRzdj1vYS5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIHVvLGlvLGFvLG9vLGxvPXRoaXNbeCh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O29hLnRpbWVyPWZ1bmN0aW9uKCl7cW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvYS50aW1lci5mbHVzaD1mdW5jdGlvbigpe1JuKCksRG4oKX0sb2Eucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciBjbz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoam4pO29hLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuKG49K24pJiYoMD5uJiYobio9LTEpLHQmJihuPW9hLnJvdW5kKG4sUG4obix0KSkpLGU9MStNYXRoLmZsb29yKDFlLTEyK01hdGgubG9nKG4pL01hdGguTE4xMCksZT1NYXRoLm1heCgtMjQsTWF0aC5taW4oMjQsMypNYXRoLmZsb29yKChlLTEpLzMpKSkpLGNvWzgrZS8zXX07dmFyIHNvPS8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLi0/XGQrKT8oW2EteiVdKT8vaSxmbz1vYS5tYXAoe2I6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobil9LG86ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoOCl9LHg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpfSxYOmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSxnOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9QcmVjaXNpb24odCl9LGU6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0V4cG9uZW50aWFsKHQpfSxmOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9GaXhlZCh0KX0scjpmdW5jdGlvbihuLHQpe3JldHVybihuPW9hLnJvdW5kKG4sUG4obix0KSkpLnRvRml4ZWQoTWF0aC5tYXgoMCxNYXRoLm1pbigyMCxQbihuKigxKzFlLTE1KSx0KSkpKX19KSxobz1vYS50aW1lPXt9LGdvPURhdGU7SG4ucHJvdG90eXBlPXtnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCl9LGdldERheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCl9LGdldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpfSxnZXRIb3VyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKX0sZ2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKX0sZ2V0TWludXRlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpfSxnZXRNb250aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKX0sZ2V0U2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRUaW1lKCl9LGdldFRpbWV6b25lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLnZhbHVlT2YoKX0sc2V0RGF0ZTpmdW5jdGlvbigpe3BvLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldERheTpmdW5jdGlvbigpe3BvLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtwby5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0SG91cnM6ZnVuY3Rpb24oKXtwby5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cG8uc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaW51dGVzOmZ1bmN0aW9uKCl7cG8uc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TW9udGg6ZnVuY3Rpb24oKXtwby5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0U2Vjb25kczpmdW5jdGlvbigpe3BvLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFRpbWU6ZnVuY3Rpb24oKXtwby5zZXRUaW1lLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfX07dmFyIHBvPURhdGUucHJvdG90eXBlO2hvLnllYXI9T24oZnVuY3Rpb24obil7cmV0dXJuIG49aG8uZGF5KG4pLG4uc2V0TW9udGgoMCwxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRGdWxsWWVhcigpfSksaG8ueWVhcnM9aG8ueWVhci5yYW5nZSxoby55ZWFycy51dGM9aG8ueWVhci51dGMucmFuZ2UsaG8uZGF5PU9uKGZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBnbygyZTMsMCk7cmV0dXJuIHQuc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKSksdH0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERhdGUoKS0xfSksaG8uZGF5cz1oby5kYXkucmFuZ2UsaG8uZGF5cy51dGM9aG8uZGF5LnV0Yy5yYW5nZSxoby5kYXlPZlllYXI9ZnVuY3Rpb24obil7dmFyIHQ9aG8ueWVhcihuKTtyZXR1cm4gTWF0aC5mbG9vcigobi10LTZlNCoobi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpLzg2NGU1KX0sWyJzdW5kYXkiLCJtb25kYXkiLCJ0dWVzZGF5Iiwid2VkbmVzZGF5IiwidGh1cnNkYXkiLCJmcmlkYXkiLCJzYXR1cmRheSJdLmZvckVhY2goZnVuY3Rpb24obix0KXt0PTctdDt2YXIgZT1ob1tuXT1PbihmdW5jdGlvbihuKXtyZXR1cm4obj1oby5kYXkobikpLnNldERhdGUobi5nZXREYXRlKCktKG4uZ2V0RGF5KCkrdCklNyksbn0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrNypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7dmFyIGU9aG8ueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoaG8uZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpLShlIT09dCl9KTtob1tuKyJzIl09ZS5yYW5nZSxob1tuKyJzIl0udXRjPWUudXRjLnJhbmdlLGhvW24rIk9mWWVhciJdPWZ1bmN0aW9uKG4pe3ZhciBlPWhvLnllYXIobikuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKGhvLmRheU9mWWVhcihuKSsoZSt0KSU3KS83KX19KSxoby53ZWVrPWhvLnN1bmRheSxoby53ZWVrcz1oby5zdW5kYXkucmFuZ2UsaG8ud2Vla3MudXRjPWhvLnN1bmRheS51dGMucmFuZ2UsaG8ud2Vla09mWWVhcj1oby5zdW5kYXlPZlllYXI7dmFyIHZvPXsiLSI6IiIsXzoiICIsMDoiMCJ9LG1vPS9eXHMqXGQrLyx5bz0vXiUvO29hLmxvY2FsZT1mdW5jdGlvbihuKXtyZXR1cm57bnVtYmVyRm9ybWF0OlVuKG4pLHRpbWVGb3JtYXQ6WW4obil9fTt2YXIgTW89b2EubG9jYWxlKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxkYXRlVGltZToiJWEgJWIgJWUgJVggJVkiLGRhdGU6IiVtLyVkLyVZIix0aW1lOiIlSDolTTolUyIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSwKLXNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO29hLmZvcm1hdD1Nby5udW1iZXJGb3JtYXQsb2EuZ2VvPXt9LHN0LnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7ZnQobix0aGlzLnQseG8pLGZ0KHhvLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXhvLnQ6dGhpcy5zPXhvLnR9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciB4bz1uZXcgc3Q7b2EuZ2VvLnN0cmVhbT1mdW5jdGlvbihuLHQpe24mJmJvLmhhc093blByb3BlcnR5KG4udHlwZSk/Ym9bbi50eXBlXShuLHQpOmh0KG4sdCl9O3ZhciBibz17RmVhdHVyZTpmdW5jdGlvbihuLHQpe2h0KG4uZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZmVhdHVyZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylodChlW3JdLmdlb21ldHJ5LHQpfX0sX289e1NwaGVyZTpmdW5jdGlvbihuLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKG4sdCl7bj1uLmNvb3JkaW5hdGVzLHQucG9pbnQoblswXSxuWzFdLG5bMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OyluPWVbcl0sdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24obix0KXtndChuLmNvb3JkaW5hdGVzLHQsMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspZ3QoZVtyXSx0LDApfSxQb2x5Z29uOmZ1bmN0aW9uKG4sdCl7cHQobi5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylwdChlW3JdLHQpfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5nZW9tZXRyaWVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspaHQoZVtyXSx0KX19O29hLmdlby5hcmVhPWZ1bmN0aW9uKG4pe3JldHVybiB3bz0wLG9hLmdlby5zdHJlYW0obixrbyksd299O3ZhciB3byxTbz1uZXcgc3Qsa289e3NwaGVyZTpmdW5jdGlvbigpe3dvKz00KmphfSxwb2ludDpiLGxpbmVTdGFydDpiLGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtTby5yZXNldCgpLGtvLmxpbmVTdGFydD12dH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPTIqU287d28rPTA+bj80KmphK246bixrby5saW5lU3RhcnQ9a28ubGluZUVuZD1rby5wb2ludD1ifX07b2EuZ2VvLmJvdW5kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtNLnB1c2goeD1bcz1uLGg9bl0pLGY+dCYmKGY9dCksdD5nJiYoZz10KX1mdW5jdGlvbiB0KHQsZSl7dmFyIHI9ZHQoW3QqT2EsZSpPYV0pO2lmKG0pe3ZhciB1PXl0KG0sciksaT1bdVsxXSwtdVswXSwwXSxhPXl0KGksdSk7YnQoYSksYT1fdChhKTt2YXIgbD10LXAsYz1sPjA/MTotMSx2PWFbMF0qSWEqYyxkPU1hKGwpPjE4MDtpZihkXih2PmMqcCYmYyp0PnYpKXt2YXIgeT1hWzFdKklhO3k+ZyYmKGc9eSl9ZWxzZSBpZih2PSh2KzM2MCklMzYwLTE4MCxkXih2PmMqcCYmYyp0PnYpKXt2YXIgeT0tYVsxXSpJYTtmPnkmJihmPXkpfWVsc2UgZj5lJiYoZj1lKSxlPmcmJihnPWUpO2Q/cD50P28ocyx0KT5vKHMsaCkmJihoPXQpOm8odCxoKT5vKHMsaCkmJihzPXQpOmg+PXM/KHM+dCYmKHM9dCksdD5oJiYoaD10KSk6dD5wP28ocyx0KT5vKHMsaCkmJihoPXQpOm8odCxoKT5vKHMsaCkmJihzPXQpfWVsc2Ugbih0LGUpO209cixwPXR9ZnVuY3Rpb24gZSgpe2IucG9pbnQ9dH1mdW5jdGlvbiByKCl7eFswXT1zLHhbMV09aCxiLnBvaW50PW4sbT1udWxsfWZ1bmN0aW9uIHUobixlKXtpZihtKXt2YXIgcj1uLXA7eSs9TWEocik+MTgwP3IrKHI+MD8zNjA6LTM2MCk6cn1lbHNlIHY9bixkPWU7a28ucG9pbnQobixlKSx0KG4sZSl9ZnVuY3Rpb24gaSgpe2tvLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGEoKXt1KHYsZCksa28ubGluZUVuZCgpLE1hKHkpPkRhJiYocz0tKGg9MTgwKSkseFswXT1zLHhbMV09aCxtPW51bGx9ZnVuY3Rpb24gbyhuLHQpe3JldHVybih0LT1uKTwwP3QrMzYwOnR9ZnVuY3Rpb24gbChuLHQpe3JldHVybiBuWzBdLXRbMF19ZnVuY3Rpb24gYyhuLHQpe3JldHVybiB0WzBdPD10WzFdP3RbMF08PW4mJm48PXRbMV06bjx0WzBdfHx0WzFdPG59dmFyIHMsZixoLGcscCx2LGQsbSx5LE0seCxiPXtwb2ludDpuLGxpbmVTdGFydDplLGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtiLnBvaW50PXUsYi5saW5lU3RhcnQ9aSxiLmxpbmVFbmQ9YSx5PTAsa28ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtrby5wb2x5Z29uRW5kKCksYi5wb2ludD1uLGIubGluZVN0YXJ0PWUsYi5saW5lRW5kPXIsMD5Tbz8ocz0tKGg9MTgwKSxmPS0oZz05MCkpOnk+RGE/Zz05MDotRGE+eSYmKGY9LTkwKSx4WzBdPXMseFsxXT1ofX07cmV0dXJuIGZ1bmN0aW9uKG4pe2c9aD0tKHM9Zj0xLzApLE09W10sb2EuZ2VvLnN0cmVhbShuLGIpO3ZhciB0PU0ubGVuZ3RoO2lmKHQpe00uc29ydChsKTtmb3IodmFyIGUscj0xLHU9TVswXSxpPVt1XTt0PnI7KytyKWU9TVtyXSxjKGVbMF0sdSl8fGMoZVsxXSx1KT8obyh1WzBdLGVbMV0pPm8odVswXSx1WzFdKSYmKHVbMV09ZVsxXSksbyhlWzBdLHVbMV0pPm8odVswXSx1WzFdKSYmKHVbMF09ZVswXSkpOmkucHVzaCh1PWUpO2Zvcih2YXIgYSxlLHA9LSgxLzApLHQ9aS5sZW5ndGgtMSxyPTAsdT1pW3RdO3Q+PXI7dT1lLCsrcillPWlbcl0sKGE9byh1WzFdLGVbMF0pKT5wJiYocD1hLHM9ZVswXSxoPXVbMV0pfXJldHVybiBNPXg9bnVsbCxzPT09MS8wfHxmPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW3MsZl0sW2gsZ11dfX0oKSxvYS5nZW8uY2VudHJvaWQ9ZnVuY3Rpb24obil7Tm89RW89QW89Q289em89TG89cW89VG89Um89RG89UG89MCxvYS5nZW8uc3RyZWFtKG4sam8pO3ZhciB0PVJvLGU9RG8scj1Qbyx1PXQqdCtlKmUrcipyO3JldHVybiBQYT51JiYodD1MbyxlPXFvLHI9VG8sRGE+RW8mJih0PUFvLGU9Q28scj16byksdT10KnQrZSplK3IqcixQYT51KT9bTmFOLE5hTl06W01hdGguYXRhbjIoZSx0KSpJYSx0bihyL01hdGguc3FydCh1KSkqSWFdfTt2YXIgTm8sRW8sQW8sQ28sem8sTG8scW8sVG8sUm8sRG8sUG8sam89e3NwaGVyZTpiLHBvaW50OlN0LGxpbmVTdGFydDpOdCxsaW5lRW5kOkV0LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2pvLmxpbmVTdGFydD1BdH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2pvLmxpbmVTdGFydD1OdH19LFVvPVJ0KHp0LFV0LEh0LFstamEsLWphLzJdKSxGbz0xZTk7b2EuZ2VvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgbix0LGUscix1LGksYT17c3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiB1JiYodS52YWxpZD0hMSksdT1pKG4pLHUudmFsaWQ9ITAsdX0sZXh0ZW50OmZ1bmN0aW9uKG8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPVp0KG49K29bMF1bMF0sdD0rb1swXVsxXSxlPStvWzFdWzBdLHI9K29bMV1bMV0pLHUmJih1LnZhbGlkPSExLHU9bnVsbCksYSk6W1tuLHRdLFtlLHJdXX19O3JldHVybiBhLmV4dGVudChbWzAsMF0sWzk2MCw1MDBdXSl9LChvYS5nZW8uY29uaWNFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gVnQoWHQpfSkucmF3PVh0LG9hLmdlby5hbGJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gb2EuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCl9LG9hLmdlby5hbGJlcnNVc2E9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3ZhciBpPW5bMF0sYT1uWzFdO3JldHVybiB0PW51bGwsZShpLGEpLHR8fChyKGksYSksdCl8fHUoaSxhKSx0fXZhciB0LGUscix1LGk9b2EuZ2VvLmFsYmVycygpLGE9b2EuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxvPW9hLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxsPXtwb2ludDpmdW5jdGlvbihuLGUpe3Q9W24sZV19fTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIHQ9aS5zY2FsZSgpLGU9aS50cmFuc2xhdGUoKSxyPShuWzBdLWVbMF0pL3QsdT0oblsxXS1lWzFdKS90O3JldHVybih1Pj0uMTImJi4yMzQ+dSYmcj49LS40MjUmJi0uMjE0PnI/YTp1Pj0uMTY2JiYuMjM0PnUmJnI+PS0uMjE0JiYtLjExNT5yP286aSkuaW52ZXJ0KG4pfSxuLnN0cmVhbT1mdW5jdGlvbihuKXt2YXIgdD1pLnN0cmVhbShuKSxlPWEuc3RyZWFtKG4pLHI9by5zdHJlYW0obik7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sdSl7dC5wb2ludChuLHUpLGUucG9pbnQobix1KSxyLnBvaW50KG4sdSl9LHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCksZS5zcGhlcmUoKSxyLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGUubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGUubGluZUVuZCgpLHIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLGUucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLGUucG9seWdvbkVuZCgpLHIucG9seWdvbkVuZCgpfX19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnByZWNpc2lvbih0KSxhLnByZWNpc2lvbih0KSxvLnByZWNpc2lvbih0KSxuKTppLnByZWNpc2lvbigpfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnNjYWxlKHQpLGEuc2NhbGUoLjM1KnQpLG8uc2NhbGUodCksbi50cmFuc2xhdGUoaS50cmFuc2xhdGUoKSkpOmkuc2NhbGUoKX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGkudHJhbnNsYXRlKCk7dmFyIGM9aS5zY2FsZSgpLHM9K3RbMF0sZj0rdFsxXTtyZXR1cm4gZT1pLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbcy0uNDU1KmMsZi0uMjM4KmNdLFtzKy40NTUqYyxmKy4yMzgqY11dKS5zdHJlYW0obCkucG9pbnQscj1hLnRyYW5zbGF0ZShbcy0uMzA3KmMsZisuMjAxKmNdKS5jbGlwRXh0ZW50KFtbcy0uNDI1KmMrRGEsZisuMTIqYytEYV0sW3MtLjIxNCpjLURhLGYrLjIzNCpjLURhXV0pLnN0cmVhbShsKS5wb2ludCx1PW8udHJhbnNsYXRlKFtzLS4yMDUqYyxmKy4yMTIqY10pLmNsaXBFeHRlbnQoW1tzLS4yMTQqYytEYSxmKy4xNjYqYytEYV0sW3MtLjExNSpjLURhLGYrLjIzNCpjLURhXV0pLnN0cmVhbShsKS5wb2ludCxufSxuLnNjYWxlKDEwNzApfTt2YXIgSG8sT28sSW8sWW8sWm8sVm8sWG89e3BvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe09vPTAsWG8ubGluZVN0YXJ0PSR0fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WG8ubGluZVN0YXJ0PVhvLmxpbmVFbmQ9WG8ucG9pbnQ9YixIbys9TWEoT28vMil9fSwkbz17cG9pbnQ6QnQsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpiLHBvbHlnb25FbmQ6Yn0sQm89e3BvaW50Okd0LGxpbmVTdGFydDpLdCxsaW5lRW5kOlF0LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0JvLmxpbmVTdGFydD1uZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0JvLnBvaW50PUd0LEJvLmxpbmVTdGFydD1LdCxCby5saW5lRW5kPVF0fX07b2EuZ2VvLnBhdGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMoK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxhJiZhLnZhbGlkfHwoYT11KGkpKSxvYS5nZW8uc3RyZWFtKG4sYSkpLGkucmVzdWx0KCl9ZnVuY3Rpb24gdCgpe3JldHVybiBhPW51bGwsbn12YXIgZSxyLHUsaSxhLG89NC41O3JldHVybiBuLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIEhvPTAsb2EuZ2VvLnN0cmVhbShuLHUoWG8pKSxIb30sbi5jZW50cm9pZD1mdW5jdGlvbihuKXtyZXR1cm4gQW89Q289em89TG89cW89VG89Um89RG89UG89MCxvYS5nZW8uc3RyZWFtKG4sdShCbykpLFBvP1tSby9QbyxEby9Qb106VG8/W0xvL1RvLHFvL1RvXTp6bz9bQW8vem8sQ28vem9dOltOYU4sTmFOXX0sbi5ib3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIFpvPVZvPS0oSW89WW89MS8wKSxvYS5nZW8uc3RyZWFtKG4sdSgkbykpLFtbSW8sWW9dLFtabyxWb11dfSxuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9KGU9bik/bi5zdHJlYW18fHJlKG4pOnksdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3IFd0Om5ldyB0ZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgbyYmaS5wb2ludFJhZGl1cyhvKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOm99LG4ucHJvamVjdGlvbihvYS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LG9hLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgdWUodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LHVlLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sb2EuZ2VvLnByb2plY3Rpb249YWUsb2EuZ2VvLnByb2plY3Rpb25NdXRhdG9yPW9lLChvYS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIGFlKGNlKX0pLnJhdz1jZS5pbnZlcnQ9Y2Usb2EuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKk9hLHRbMV0qT2EpLHRbMF0qPUlhLHRbMV0qPUlhLHR9cmV0dXJuIG49ZmUoblswXSUzNjAqT2EsblsxXSpPYSxuLmxlbmd0aD4yP25bMl0qT2E6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpPYSx0WzFdKk9hKSx0WzBdKj1JYSx0WzFdKj1JYSx0fSx0fSxzZS5pbnZlcnQ9Y2Usb2EuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9ZmUoLW5bMF0qT2EsLW5bMV0qT2EsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1JYSxuWzFdKj1JYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dmUoKHQ9K3IpKk9hLHUqT2EpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXZlKHQqT2EsKHU9K3IpKk9hKSxuKTp1fSxuLmFuZ2xlKDkwKX0sb2EuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpPYSx1PW5bMV0qT2EsaT10WzFdKk9hLGE9TWF0aC5zaW4ociksbz1NYXRoLmNvcyhyKSxsPU1hdGguc2luKHUpLGM9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKmEpKmUrKGU9YypzLWwqZipvKSplKSxsKnMrYypmKm8pfSxvYS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiBvYS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdChvYS5yYW5nZShNYXRoLmNlaWwoYy9tKSptLGwsbSkubWFwKGcpKS5jb25jYXQob2EucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gTWEobiVkKT5EYX0pLm1hcChzKSkuY29uY2F0KG9hLnJhbmdlKE1hdGguY2VpbChvL3YpKnYsYSx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIE1hKG4lbSk+RGF9KS5tYXAoZikpfXZhciBlLHIsdSxpLGEsbyxsLGMscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhsKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGMpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxjPSt0WzBdWzFdLGw9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGM+bCYmKHQ9YyxjPWwsbD10KSxuLnByZWNpc2lvbih5KSk6W1tpLGNdLFt1LGxdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLG89K3RbMF1bMV0sYT0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksbz5hJiYodD1vLG89YSxhPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3Isb10sW2UsYV1dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9bWUobyxhLDkwKSxmPXllKHIsZSx5KSxoPW1lKGMsbCw5MCksZz15ZShpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK0RhXSxbMTgwLDkwLURhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtRGFdLFsxODAsODArRGFdXSl9LG9hLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPU1lLHU9eGU7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gb2EuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSxvYS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gYmUoblswXSpPYSxuWzFdKk9hLHRbMF0qT2EsdFsxXSpPYSl9LG9hLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIFdvPTAsb2EuZ2VvLnN0cmVhbShuLEpvKSxXb307dmFyIFdvLEpvPXtzcGhlcmU6Yixwb2ludDpiLGxpbmVTdGFydDpfZSxsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxHbz13ZShmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyhvYS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIGFlKEdvKX0pLnJhdz1Hbzt2YXIgS289d2UoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSx5KTsob2EuZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIGFlKEtvKX0pLnJhdz1Lbywob2EuZ2VvLmNvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIFZ0KFNlKX0pLnJhdz1TZSwob2EuZ2VvLmNvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gVnQoa2UpfSkucmF3PWtlO3ZhciBRbz13ZShmdW5jdGlvbihuKXtyZXR1cm4gMS9ufSxNYXRoLmF0YW4pOyhvYS5nZW8uZ25vbW9uaWM9ZnVuY3Rpb24oKXtyZXR1cm4gYWUoUW8pfSkucmF3PVFvLE5lLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVybltuLDIqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS1IYV19LChvYS5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gRWUoTmUpfSkucmF3PU5lO3ZhciBubD13ZShmdW5jdGlvbigpe3JldHVybiAxfSxNYXRoLmFzaW4pOyhvYS5nZW8ub3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIGFlKG5sKX0pLnJhdz1ubDt2YXIgdGw9d2UoZnVuY3Rpb24obil7cmV0dXJuIDEvKDErbil9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXRhbihuKX0pOyhvYS5nZW8uc3RlcmVvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiBhZSh0bCl9KS5yYXc9dGwsQWUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuWy10LDIqTWF0aC5hdGFuKE1hdGguZXhwKG4pKS1IYV19LChvYS5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yPWZ1bmN0aW9uKCl7dmFyIG49RWUoQWUpLHQ9bi5jZW50ZXIsZT1uLnJvdGF0ZTtyZXR1cm4gbi5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG4/dChbLW5bMV0sblswXV0pOihuPXQoKSxbblsxXSwtblswXV0pfSxuLnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbj9lKFtuWzBdLG5bMV0sbi5sZW5ndGg+Mj9uWzJdKzkwOjkwXSk6KG49ZSgpLFtuWzBdLG5bMV0sblsyXS05MF0pfSxlKFswLDAsOTBdKX0pLnJhdz1BZSxvYS5nZW9tPXt9LG9hLmdlb20uaHVsbD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuW107dmFyIHQsdT1FbihlKSxpPUVuKHIpLGE9bi5sZW5ndGgsbz1bXSxsPVtdO2Zvcih0PTA7YT50O3QrKylvLnB1c2goWyt1LmNhbGwodGhpcyxuW3RdLHQpLCtpLmNhbGwodGhpcyxuW3RdLHQpLHRdKTtmb3Ioby5zb3J0KHFlKSx0PTA7YT50O3QrKylsLnB1c2goW29bdF1bMF0sLW9bdF1bMV1dKTt2YXIgYz1MZShvKSxzPUxlKGwpLGY9c1swXT09PWNbMF0saD1zW3MubGVuZ3RoLTFdPT09Y1tjLmxlbmd0aC0xXSxnPVtdO2Zvcih0PWMubGVuZ3RoLTE7dD49MDstLXQpZy5wdXNoKG5bb1tjW3RdXVsyXV0pO2Zvcih0PStmO3Q8cy5sZW5ndGgtaDsrK3QpZy5wdXNoKG5bb1tzW3RdXVsyXV0pO3JldHVybiBnfXZhciBlPUNlLHI9emU7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChuKToodC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdCl9LG9hLmdlb20ucG9seWdvbj1mdW5jdGlvbihuKXtyZXR1cm4gU2EobixlbCksbn07dmFyIGVsPW9hLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107ZWwuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PS0xLGU9dGhpcy5sZW5ndGgscj10aGlzW2UtMV0sdT0wOysrdDxlOyluPXIscj10aGlzW3RdLHUrPW5bMV0qclswXS1uWzBdKnJbMV07cmV0dXJuLjUqdX0sZWwuY2VudHJvaWQ9ZnVuY3Rpb24obil7dmFyIHQsZSxyPS0xLHU9dGhpcy5sZW5ndGgsaT0wLGE9MCxvPXRoaXNbdS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KG49LTEvKDYqdGhpcy5hcmVhKCkpKTsrK3I8dTspdD1vLG89dGhpc1tyXSxlPXRbMF0qb1sxXS1vWzBdKnRbMV0saSs9KHRbMF0rb1swXSkqZSxhKz0odFsxXStvWzFdKSplO3JldHVybltpKm4sYSpuXX0sZWwuY2xpcD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxhLG89RGUobiksbD0tMSxjPXRoaXMubGVuZ3RoLURlKHRoaXMpLHM9dGhpc1tjLTFdOysrbDxjOyl7Zm9yKHQ9bi5zbGljZSgpLG4ubGVuZ3RoPTAsdT10aGlzW2xdLGk9dFsocj10Lmxlbmd0aC1vKS0xXSxlPS0xOysrZTxyOylhPXRbZV0sVGUoYSxzLHUpPyhUZShpLHMsdSl8fG4ucHVzaChSZShpLGEscyx1KSksbi5wdXNoKGEpKTpUZShpLHMsdSkmJm4ucHVzaChSZShpLGEscyx1KSksaT1hO28mJm4ucHVzaChuWzBdKSxzPXV9cmV0dXJuIG59O3ZhciBybCx1bCxpbCxhbCxvbCxsbD1bXSxjbD1bXTtZZS5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PXRoaXMuZWRnZXMsZT10Lmxlbmd0aDtlLS07KW49dFtlXS5lZGdlLG4uYiYmbi5hfHx0LnNwbGljZShlLDEpO3JldHVybiB0LnNvcnQoVmUpLHQubGVuZ3RofSx0ci5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSxlci5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbihuLHQpe3ZhciBlLHIsdTtpZihuKXtpZih0LlA9bix0Lk49bi5OLG4uTiYmKG4uTi5QPXQpLG4uTj10LG4uUil7Zm9yKG49bi5SO24uTDspbj1uLkw7bi5MPXR9ZWxzZSBuLlI9dDtlPW59ZWxzZSB0aGlzLl8/KG49YXIodGhpcy5fKSx0LlA9bnVsbCx0Lk49bixuLlA9bi5MPXQsZT1uKToodC5QPXQuTj1udWxsLHRoaXMuXz10LGU9bnVsbCk7Zm9yKHQuTD10LlI9bnVsbCx0LlU9ZSx0LkM9ITAsbj10O2UmJmUuQzspcj1lLlUsZT09PXIuTD8odT1yLlIsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5SJiYodXIodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAsaXIodGhpcyxyKSkpOih1PXIuTCx1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLkwmJihpcih0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCx1cih0aGlzLHIpKSksZT1uLlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbihuKXtuLk4mJihuLk4uUD1uLlApLG4uUCYmKG4uUC5OPW4uTiksbi5OPW4uUD1udWxsO3ZhciB0LGUscix1PW4uVSxpPW4uTCxhPW4uUjtpZihlPWk/YT9hcihhKTppOmEsdT91Lkw9PT1uP3UuTD1lOnUuUj1lOnRoaXMuXz1lLGkmJmE/KHI9ZS5DLGUuQz1uLkMsZS5MPWksaS5VPWUsZSE9PWE/KHU9ZS5VLGUuVT1uLlUsbj1lLlIsdS5MPW4sZS5SPWEsYS5VPWUpOihlLlU9dSx1PWUsbj1lLlIpKToocj1uLkMsbj1lKSxuJiYobi5VPXUpLCFyKXtpZihuJiZuLkMpcmV0dXJuIHZvaWQobi5DPSExKTtkb3tpZihuPT09dGhpcy5fKWJyZWFrO2lmKG49PT11Lkwpe2lmKHQ9dS5SLHQuQyYmKHQuQz0hMSx1LkM9ITAsdXIodGhpcyx1KSx0PXUuUiksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5SJiZ0LlIuQ3x8KHQuTC5DPSExLHQuQz0hMCxpcih0aGlzLHQpLHQ9dS5SKSx0LkM9dS5DLHUuQz10LlIuQz0hMSx1cih0aGlzLHUpLG49dGhpcy5fO2JyZWFrfX1lbHNlIGlmKHQ9dS5MLHQuQyYmKHQuQz0hMSx1LkM9ITAsaXIodGhpcyx1KSx0PXUuTCksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5MJiZ0LkwuQ3x8KHQuUi5DPSExLHQuQz0hMCx1cih0aGlzLHQpLHQ9dS5MKSx0LkM9dS5DLHUuQz10LkwuQz0hMSxpcih0aGlzLHUpLG49dGhpcy5fO2JyZWFrfXQuQz0hMCxuPXUsdT11LlV9d2hpbGUoIW4uQyk7biYmKG4uQz0hMSl9fX0sb2EuZ2VvbS52b3Jvbm9pPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7dmFyIHQ9bmV3IEFycmF5KG4ubGVuZ3RoKSxyPW9bMF1bMF0sdT1vWzBdWzFdLGk9b1sxXVswXSxhPW9bMV1bMV07cmV0dXJuIG9yKGUobiksbykuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLG8pe3ZhciBsPWUuZWRnZXMsYz1lLnNpdGUscz10W29dPWwubGVuZ3RoP2wubWFwKGZ1bmN0aW9uKG4pe3ZhciB0PW4uc3RhcnQoKTtyZXR1cm5bdC54LHQueV19KTpjLng+PXImJmMueDw9aSYmYy55Pj11JiZjLnk8PWE/W1tyLGFdLFtpLGFdLFtpLHVdLFtyLHVdXTpbXTtzLnBvaW50PW5bb119KSx0fWZ1bmN0aW9uIGUobil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJue3g6TWF0aC5yb3VuZChpKG4sdCkvRGEpKkRhLHk6TWF0aC5yb3VuZChhKG4sdCkvRGEpKkRhLGk6dH19KX12YXIgcj1DZSx1PXplLGk9cixhPXUsbz1zbDtyZXR1cm4gbj90KG4pOih0LmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBvcihlKG4pKS5lZGdlcy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4ubCYmbi5yfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6blt0LmwuaV0sdGFyZ2V0Om5bdC5yLmldfX0pfSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtyZXR1cm4gb3IoZShuKSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2Zvcih2YXIgdSxpLGE9ZS5zaXRlLG89ZS5lZGdlcy5zb3J0KFZlKSxsPS0xLGM9by5sZW5ndGgscz1vW2MtMV0uZWRnZSxmPXMubD09PWE/cy5yOnMubDsrK2w8YzspdT1zLGk9ZixzPW9bbF0uZWRnZSxmPXMubD09PWE/cy5yOnMubCxyPGkuaSYmcjxmLmkmJmNyKGEsaSxmKTwwJiZ0LnB1c2goW25bcl0sbltpLmldLG5bZi5pXV0pfSksdH0sdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUVuKHI9biksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUVuKHU9biksdCk6dX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PW4/c2w6bix0KTpvPT09c2w/bnVsbDpvfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jbGlwRXh0ZW50KG4mJltbMCwwXSxuXSk6bz09PXNsP251bGw6byYmb1sxXX0sdCl9O3ZhciBzbD1bWy0xZTYsLTFlNl0sWzFlNiwxZTZdXTtvYS5nZW9tLmRlbGF1bmF5PWZ1bmN0aW9uKG4pe3JldHVybiBvYS5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXMobil9LG9hLmdlb20ucXVhZHRyZWU9ZnVuY3Rpb24obix0LGUscix1KXtmdW5jdGlvbiBpKG4pe2Z1bmN0aW9uIGkobix0LGUscix1LGksYSxvKXtpZighaXNOYU4oZSkmJiFpc05hTihyKSlpZihuLmxlYWYpe3ZhciBsPW4ueCxzPW4ueTtpZihudWxsIT1sKWlmKE1hKGwtZSkrTWEocy1yKTwuMDEpYyhuLHQsZSxyLHUsaSxhLG8pO2Vsc2V7dmFyIGY9bi5wb2ludDtuLng9bi55PW4ucG9pbnQ9bnVsbCxjKG4sZixsLHMsdSxpLGEsbyksYyhuLHQsZSxyLHUsaSxhLG8pfWVsc2Ugbi54PWUsbi55PXIsbi5wb2ludD10fWVsc2UgYyhuLHQsZSxyLHUsaSxhLG8pfWZ1bmN0aW9uIGMobix0LGUscix1LGEsbyxsKXt2YXIgYz0uNSoodStvKSxzPS41KihhK2wpLGY9ZT49YyxoPXI+PXMsZz1oPDwxfGY7bi5sZWFmPSExLG49bi5ub2Rlc1tnXXx8KG4ubm9kZXNbZ109aHIoKSksZj91PWM6bz1jLGg/YT1zOmw9cyxpKG4sdCxlLHIsdSxhLG8sbCl9dmFyIHMsZixoLGcscCx2LGQsbSx5LE09RW4obykseD1FbihsKTtpZihudWxsIT10KXY9dCxkPWUsbT1yLHk9dTtlbHNlIGlmKG09eT0tKHY9ZD0xLzApLGY9W10saD1bXSxwPW4ubGVuZ3RoLGEpZm9yKGc9MDtwPmc7KytnKXM9bltnXSxzLng8diYmKHY9cy54KSxzLnk8ZCYmKGQ9cy55KSxzLng+bSYmKG09cy54KSxzLnk+eSYmKHk9cy55KSxmLnB1c2gocy54KSxoLnB1c2gocy55KTtlbHNlIGZvcihnPTA7cD5nOysrZyl7dmFyIGI9K00ocz1uW2ddLGcpLF89K3gocyxnKTt2PmImJih2PWIpLGQ+XyYmKGQ9XyksYj5tJiYobT1iKSxfPnkmJih5PV8pLGYucHVzaChiKSxoLnB1c2goXyl9dmFyIHc9bS12LFM9eS1kO3c+Uz95PWQrdzptPXYrUzt2YXIgaz1ocigpO2lmKGsuYWRkPWZ1bmN0aW9uKG4pe2koayxuLCtNKG4sKytnKSwreChuLGcpLHYsZCxtLHkpfSxrLnZpc2l0PWZ1bmN0aW9uKG4pe2dyKG4sayx2LGQsbSx5KX0say5maW5kPWZ1bmN0aW9uKG4pe3JldHVybiBwcihrLG5bMF0sblsxXSx2LGQsbSx5KX0sZz0tMSxudWxsPT10KXtmb3IoOysrZzxwOylpKGssbltnXSxmW2ddLGhbZ10sdixkLG0seSk7LS1nfWVsc2Ugbi5mb3JFYWNoKGsuYWRkKTtyZXR1cm4gZj1oPW49cz1udWxsLGt9dmFyIGEsbz1DZSxsPXplO3JldHVybihhPWFyZ3VtZW50cy5sZW5ndGgpPyhvPXNyLGw9ZnIsMz09PWEmJih1PWUscj10LGU9dD0wKSxpKG4pKTooaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4saSk6b30saS55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PStuWzBdWzBdLGU9K25bMF1bMV0scj0rblsxXVswXSx1PStuWzFdWzFdKSxpKTpudWxsPT10P251bGw6W1t0LGVdLFtyLHVdXX0saS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD1lPTAscj0rblswXSx1PStuWzFdKSxpKTpudWxsPT10P251bGw6W3ItdCx1LWVdfSxpKX0sb2EuaW50ZXJwb2xhdGVSZ2I9dnIsb2EuaW50ZXJwb2xhdGVPYmplY3Q9ZHIsb2EuaW50ZXJwb2xhdGVOdW1iZXI9bXIsb2EuaW50ZXJwb2xhdGVTdHJpbmc9eXI7dmFyIGZsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxobD1uZXcgUmVnRXhwKGZsLnNvdXJjZSwiZyIpO29hLmludGVycG9sYXRlPU1yLG9hLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKG4sdCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuKCJzdHJpbmciPT09ZT9yby5oYXModC50b0xvd2VyQ2FzZSgpKXx8L14oI3xyZ2JcKHxoc2xcKCkvaS50ZXN0KHQpP3ZyOnlyOnQgaW5zdGFuY2VvZiBvbj92cjpBcnJheS5pc0FycmF5KHQpP3hyOiJvYmplY3QiPT09ZSYmaXNOYU4odCk/ZHI6bXIpKG4sdCl9XSxvYS5pbnRlcnBvbGF0ZUFycmF5PXhyO3ZhciBnbD1mdW5jdGlvbigpe3JldHVybiB5fSxwbD1vYS5tYXAoe2xpbmVhcjpnbCxwb2x5OkVyLHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gU3J9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIGtyfSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gQXJ9LGV4cDpmdW5jdGlvbigpe3JldHVybiBDcn0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIHpyfSxlbGFzdGljOkxyLGJhY2s6cXIsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIFRyfX0pLHZsPW9hLm1hcCh7ImluIjp5LG91dDpfciwiaW4tb3V0Ijp3ciwib3V0LWluIjpmdW5jdGlvbihuKXtyZXR1cm4gd3IoX3IobikpfX0pO29hLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCItIiksZT10Pj0wP24uc2xpY2UoMCx0KTpuLHI9dD49MD9uLnNsaWNlKHQrMSk6ImluIjtyZXR1cm4gZT1wbC5nZXQoZSl8fGdsLHI9dmwuZ2V0KHIpfHx5LGJyKHIoZS5hcHBseShudWxsLGxhLmNhbGwoYXJndW1lbnRzLDEpKSkpfSxvYS5pbnRlcnBvbGF0ZUhjbD1ScixvYS5pbnRlcnBvbGF0ZUhzbD1EcixvYS5pbnRlcnBvbGF0ZUxhYj1QcixvYS5pbnRlcnBvbGF0ZVJvdW5kPWpyLG9hLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD1zYS5jcmVhdGVFbGVtZW50TlMob2EubnMucHJlZml4LnN2ZywiZyIpO3JldHVybihvYS50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgVXIoZT9lLm1hdHJpeDpkbCl9KShuKX0sVXIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBkbD17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O29hLmludGVycG9sYXRlVHJhbnNmb3JtPSRyLG9hLmxheW91dD17fSxvYS5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChKcihuW2VdKSk7cmV0dXJuIHR9fSxvYS5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sYyxmLGgsZyxwPXt9LHY9W10sZD1vYS5yYW5nZShpKSxtPVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPGk7KXtmb3IoYz0wLGc9LTE7KytnPGk7KWMrPXVbaF1bZ107di5wdXNoKGMpLG0ucHVzaChvYS5yYW5nZShpKSksbis9Y31mb3IoYSYmZC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIGEodltuXSx2W3RdKX0pLG8mJm0uZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBvKHVbdF1bbl0sdVt0XVtlXSl9KX0pLG49KFVhLXMqaSkvbixjPTAsaD0tMTsrK2g8aTspe2ZvcihmPWMsZz0tMTsrK2c8aTspe3ZhciB5PWRbaF0sTT1tW3ldW2ddLHg9dVt5XVtNXSxiPWMsXz1jKz14Km47cFt5KyItIitNXT17aW5kZXg6eSxzdWJpbmRleDpNLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTpfLHZhbHVlOnh9fXJbeV09e2luZGV4Onksc3RhcnRBbmdsZTpmLGVuZEFuZ2xlOmMsdmFsdWU6KGMtZikvbn0sYys9c31mb3IoaD0tMTsrK2g8aTspZm9yKGc9aC0xOysrZzxpOyl7dmFyIHc9cFtoKyItIitnXSxTPXBbZysiLSIraF07KHcudmFsdWV8fFMudmFsdWUpJiZlLnB1c2gody52YWx1ZTxTLnZhbHVlP3tzb3VyY2U6Uyx0YXJnZXQ6d306e3NvdXJjZTp3LHRhcmdldDpTfSl9bCYmdCgpfWZ1bmN0aW9uIHQoKXtlLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gbCgobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpLzIsKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yKX0pfXZhciBlLHIsdSxpLGEsbyxsLGM9e30scz0wO3JldHVybiBjLm1hdHJpeD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1uKSYmdS5sZW5ndGgsZT1yPW51bGwsYyk6dX0sYy5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sZT1yPW51bGwsYyk6c30sYy5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sZT1yPW51bGwsYyk6YX0sYy5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sZT1udWxsLGMpOm99LGMuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGUmJnQoKSxjKTpsfSxjLmNob3Jkcz1mdW5jdGlvbigpe3JldHVybiBlfHxuKCksZX0sYy5ncm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8bigpLHJ9LGN9LG9hLmxheW91dC5mb3JjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLHUpe2lmKHQucG9pbnQhPT1uKXt2YXIgaT10LmN4LW4ueCxhPXQuY3ktbi55LG89dS1lLGw9aSppK2EqYTtpZihsPm8qby9tKXtpZih2Pmwpe3ZhciBjPXQuY2hhcmdlL2w7bi5weC09aSpjLG4ucHktPWEqY31yZXR1cm4hMH1pZih0LnBvaW50JiZsJiZ2Pmwpe3ZhciBjPXQucG9pbnRDaGFyZ2UvbDtuLnB4LT1pKmMsbi5weS09YSpjfX1yZXR1cm4hdC5jaGFyZ2V9fWZ1bmN0aW9uIHQobil7bi5weD1vYS5ldmVudC54LG4ucHk9b2EuZXZlbnQueSxsLnJlc3VtZSgpfXZhciBlLHIsdSxpLGEsbyxsPXt9LGM9b2EuZGlzcGF0Y2goInN0YXJ0IiwidGljayIsImVuZCIpLHM9WzEsMV0sZj0uOSxoPW1sLGc9eWwscD0tMzAsdj1NbCxkPS4xLG09LjY0LE09W10seD1bXTtyZXR1cm4gbC50aWNrPWZ1bmN0aW9uKCl7aWYoKHUqPS45OSk8LjAwNSlyZXR1cm4gZT1udWxsLGMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnU9MH0pLCEwO3ZhciB0LHIsbCxoLGcsdixtLHksYixfPU0ubGVuZ3RoLHc9eC5sZW5ndGg7Zm9yKHI9MDt3PnI7KytyKWw9eFtyXSxoPWwuc291cmNlLGc9bC50YXJnZXQseT1nLngtaC54LGI9Zy55LWgueSwodj15KnkrYipiKSYmKHY9dSphW3JdKigodj1NYXRoLnNxcnQodikpLWlbcl0pL3YseSo9dixiKj12LGcueC09eSoobT1oLndlaWdodCtnLndlaWdodD9oLndlaWdodC8oaC53ZWlnaHQrZy53ZWlnaHQpOi41KSxnLnktPWIqbSxoLngrPXkqKG09MS1tKSxoLnkrPWIqbSk7aWYoKG09dSpkKSYmKHk9c1swXS8yLGI9c1sxXS8yLHI9LTEsbSkpZm9yKDsrK3I8XzspbD1NW3JdLGwueCs9KHktbC54KSptLGwueSs9KGItbC55KSptO2lmKHApZm9yKHJ1KHQ9b2EuZ2VvbS5xdWFkdHJlZShNKSx1LG8pLHI9LTE7KytyPF87KShsPU1bcl0pLmZpeGVkfHx0LnZpc2l0KG4obCkpO2ZvcihyPS0xOysrcjxfOylsPU1bcl0sbC5maXhlZD8obC54PWwucHgsbC55PWwucHkpOihsLngtPShsLnB4LShsLnB4PWwueCkpKmYsbC55LT0obC5weS0obC5weT1sLnkpKSpmKTtjLnRpY2soe3R5cGU6InRpY2siLGFscGhhOnV9KX0sbC5ub2Rlcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1uLGwpOk19LGwubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9bixsKTp4fSxsLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bixsKTpzfSxsLmxpbmtEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGwpOmh9LGwuZGlzdGFuY2U9bC5saW5rRGlzdGFuY2UsbC5saW5rU3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixsKTpnfSxsLmZyaWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPStuLGwpOmZ9LGwuY2hhcmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sbCk6cH0sbC5jaGFyZ2VEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1uKm4sbCk6TWF0aC5zcXJ0KHYpfSxsLmdyYXZpdHk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K24sbCk6ZH0sbC50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uKm4sbCk6TWF0aC5zcXJ0KG0pfSxsLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStuLHU/bj4wP3U9bjooZS5jPW51bGwsZS50PU5hTixlPW51bGwsYy5zdGFydCh7dHlwZToiZW5kIixhbHBoYTp1PTB9KSk6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOnU9bn0pLGU9cW4obC50aWNrKSksbCk6dX0sbC5zdGFydD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtpZighZSl7Zm9yKGU9bmV3IEFycmF5KHUpLGw9MDt1Pmw7KytsKWVbbF09W107Zm9yKGw9MDtjPmw7KytsKXt2YXIgaT14W2xdO2VbaS5zb3VyY2UuaW5kZXhdLnB1c2goaS50YXJnZXQpLGVbaS50YXJnZXQuaW5kZXhdLnB1c2goaS5zb3VyY2UpfX1mb3IodmFyIGEsbz1lW3RdLGw9LTEscz1vLmxlbmd0aDsrK2w8czspaWYoIWlzTmFOKGE9b1tsXVtuXSkpcmV0dXJuIGE7cmV0dXJuIE1hdGgucmFuZG9tKCkqcn12YXIgdCxlLHIsdT1NLmxlbmd0aCxjPXgubGVuZ3RoLGY9c1swXSx2PXNbMV07Zm9yKHQ9MDt1PnQ7Kyt0KShyPU1bdF0pLmluZGV4PXQsci53ZWlnaHQ9MDtmb3IodD0wO2M+dDsrK3Qpcj14W3RdLCJudW1iZXIiPT10eXBlb2Ygci5zb3VyY2UmJihyLnNvdXJjZT1NW3Iuc291cmNlXSksIm51bWJlciI9PXR5cGVvZiByLnRhcmdldCYmKHIudGFyZ2V0PU1bci50YXJnZXRdKSwrK3Iuc291cmNlLndlaWdodCwrK3IudGFyZ2V0LndlaWdodDtmb3IodD0wO3U+dDsrK3Qpcj1NW3RdLGlzTmFOKHIueCkmJihyLng9bigieCIsZikpLGlzTmFOKHIueSkmJihyLnk9bigieSIsdikpLGlzTmFOKHIucHgpJiYoci5weD1yLngpLGlzTmFOKHIucHkpJiYoci5weT1yLnkpO2lmKGk9W10sImZ1bmN0aW9uIj09dHlwZW9mIGgpZm9yKHQ9MDtjPnQ7Kyt0KWlbdF09K2guY2FsbCh0aGlzLHhbdF0sdCk7ZWxzZSBmb3IodD0wO2M+dDsrK3QpaVt0XT1oO2lmKGE9W10sImZ1bmN0aW9uIj09dHlwZW9mIGcpZm9yKHQ9MDtjPnQ7Kyt0KWFbdF09K2cuY2FsbCh0aGlzLHhbdF0sdCk7ZWxzZSBmb3IodD0wO2M+dDsrK3QpYVt0XT1nO2lmKG89W10sImZ1bmN0aW9uIj09dHlwZW9mIHApZm9yKHQ9MDt1PnQ7Kyt0KW9bdF09K3AuY2FsbCh0aGlzLE1bdF0sdCk7ZWxzZSBmb3IodD0wO3U+dDsrK3Qpb1t0XT1wO3JldHVybiBsLnJlc3VtZSgpfSxsLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBsLmFscGhhKC4xKX0sbC5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWxwaGEoMCl9LGwuZHJhZz1mdW5jdGlvbigpe3JldHVybiByfHwocj1vYS5iZWhhdmlvci5kcmFnKCkub3JpZ2luKHkpLm9uKCJkcmFnc3RhcnQuZm9yY2UiLFFyKS5vbigiZHJhZy5mb3JjZSIsdCkub24oImRyYWdlbmQuZm9yY2UiLG51KSksYXJndW1lbnRzLmxlbmd0aD92b2lkIHRoaXMub24oIm1vdXNlb3Zlci5mb3JjZSIsdHUpLm9uKCJtb3VzZW91dC5mb3JjZSIsZXUpLmNhbGwocik6cn0sb2EucmViaW5kKGwsYywib24iKX07dmFyIG1sPTIwLHlsPTEsTWw9MS8wO29hLmxheW91dC5oaWVyYXJjaHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHUpe3ZhciBpLGE9W3VdLG89W107Zm9yKHUuZGVwdGg9MDtudWxsIT0oaT1hLnBvcCgpKTspaWYoby5wdXNoKGkpLChjPWUuY2FsbChuLGksaS5kZXB0aCkpJiYobD1jLmxlbmd0aCkpe2Zvcih2YXIgbCxjLHM7LS1sPj0wOylhLnB1c2gocz1jW2xdKSxzLnBhcmVudD1pLHMuZGVwdGg9aS5kZXB0aCsxO3ImJihpLnZhbHVlPTApLGkuY2hpbGRyZW49Y31lbHNlIHImJihpLnZhbHVlPStyLmNhbGwobixpLGkuZGVwdGgpfHwwKSxkZWxldGUgaS5jaGlsZHJlbjtyZXR1cm4gYXUodSxmdW5jdGlvbihuKXt2YXIgZSx1O3QmJihlPW4uY2hpbGRyZW4pJiZlLnNvcnQodCksciYmKHU9bi5wYXJlbnQpJiYodS52YWx1ZSs9bi52YWx1ZSl9KSxvfXZhciB0PWN1LGU9b3Uscj1sdTtyZXR1cm4gbi5zb3J0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jaGlsZHJlbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLnJldmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHImJihpdSh0LGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJihuLnZhbHVlPTApfSksYXUodCxmdW5jdGlvbih0KXt2YXIgZTt0LmNoaWxkcmVufHwodC52YWx1ZT0rci5jYWxsKG4sdCx0LmRlcHRoKXx8MCksKGU9dC5wYXJlbnQpJiYoZS52YWx1ZSs9dC52YWx1ZSl9KSksdH0sbn0sb2EubGF5b3V0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxlLHIsdSl7dmFyIGk9dC5jaGlsZHJlbjtpZih0Lng9ZSx0Lnk9dC5kZXB0aCp1LHQuZHg9cix0LmR5PXUsaSYmKGE9aS5sZW5ndGgpKXt2YXIgYSxvLGwsYz0tMTtmb3Iocj10LnZhbHVlP3IvdC52YWx1ZTowOysrYzxhOyluKG89aVtjXSxlLGw9by52YWx1ZSpyLHUpLGUrPWx9fWZ1bmN0aW9uIHQobil7dmFyIGU9bi5jaGlsZHJlbixyPTA7aWYoZSYmKHU9ZS5sZW5ndGgpKWZvcih2YXIgdSxpPS0xOysraTx1OylyPU1hdGgubWF4KHIsdChlW2ldKSk7cmV0dXJuIDErcn1mdW5jdGlvbiBlKGUsaSl7dmFyIGE9ci5jYWxsKHRoaXMsZSxpKTtyZXR1cm4gbihhWzBdLDAsdVswXSx1WzFdL3QoYVswXSkpLGF9dmFyIHI9b2EubGF5b3V0LmhpZXJhcmNoeSgpLHU9WzEsMV07cmV0dXJuIGUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLGUpOnV9LHV1KGUscil9LG9hLmxheW91dC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGEpe3ZhciBvLGw9YS5sZW5ndGgsYz1hLm1hcChmdW5jdGlvbihlLHIpe3JldHVybit0LmNhbGwobixlLHIpfSkscz0rKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIpLGY9KCJmdW5jdGlvbiI9PXR5cGVvZiB1P3UuYXBwbHkodGhpcyxhcmd1bWVudHMpOnUpLXMsaD1NYXRoLm1pbihNYXRoLmFicyhmKS9sLCsoImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aSkpLGc9aCooMD5mPy0xOjEpLHA9b2Euc3VtKGMpLHY9cD8oZi1sKmcpL3A6MCxkPW9hLnJhbmdlKGwpLG09W107cmV0dXJuIG51bGwhPWUmJmQuc29ydChlPT09eGw/ZnVuY3Rpb24obix0KXtyZXR1cm4gY1t0XS1jW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKGFbbl0sYVt0XSl9KSxkLmZvckVhY2goZnVuY3Rpb24obil7bVtuXT17ZGF0YTphW25dLHZhbHVlOm89Y1tuXSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6cys9byp2K2cscGFkQW5nbGU6aH19KSxtfXZhciB0PU51bWJlcixlPXhsLHI9MCx1PVVhLGk9MDtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbn07dmFyIHhsPXt9O29hLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obyxsKXtpZighKGg9by5sZW5ndGgpKXJldHVybiBvO3ZhciBjPW8ubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxzPWMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybltpLmNhbGwobix0LGUpLGEuY2FsbChuLHQsZSldfSl9KSxmPWUuY2FsbChuLHMsbCk7Yz1vYS5wZXJtdXRlKGMsZikscz1vYS5wZXJtdXRlKHMsZik7dmFyIGgsZyxwLHYsZD1yLmNhbGwobixzLGwpLG09Y1swXS5sZW5ndGg7Zm9yKHA9MDttPnA7KytwKWZvcih1LmNhbGwobixjWzBdW3BdLHY9ZFtwXSxzWzBdW3BdWzFdKSxnPTE7aD5nOysrZyl1LmNhbGwobixjW2ddW3BdLHYrPXNbZy0xXVtwXVsxXSxzW2ddW3BdWzFdKTtyZXR1cm4gb312YXIgdD15LGU9cHUscj12dSx1PWd1LGk9ZnUsYT1odTtyZXR1cm4gbi52YWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6YmwuZ2V0KHQpfHxwdSxuKTplfSxuLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ol9sLmdldCh0KXx8dnUsbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbik6YX0sbi5vdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxufTt2YXIgYmw9b2EubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24obil7dmFyIHQsZSxyPW4ubGVuZ3RoLHU9bi5tYXAoZHUpLGk9bi5tYXAobXUpLGE9b2EucmFuZ2Uocikuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiB1W25dLXVbdF19KSxvPTAsbD0wLGM9W10scz1bXTtmb3IodD0wO3I+dDsrK3QpZT1hW3RdLGw+bz8obys9aVtlXSxjLnB1c2goZSkpOihsKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChjKX0scmV2ZXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gb2EucmFuZ2Uobi5sZW5ndGgpLnJldmVyc2UoKX0sImRlZmF1bHQiOnB1fSksX2w9b2EubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsYT1bXSxvPTAsbD1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtyPm8mJihvPXIpLGEucHVzaChyKX1mb3IoZT0wO2k+ZTsrK2UpbFtlXT0oby1hW2VdKS8yO3JldHVybiBsfSx3aWdnbGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxhLG8sbCxjLHM9bi5sZW5ndGgsZj1uWzBdLGg9Zi5sZW5ndGgsZz1bXTtmb3IoZ1swXT1sPWM9MCxlPTE7aD5lOysrZSl7Zm9yKHQ9MCx1PTA7cz50OysrdCl1Kz1uW3RdW2VdWzFdO2Zvcih0PTAsaT0wLG89ZltlXVswXS1mW2UtMV1bMF07cz50OysrdCl7Zm9yKHI9MCxhPShuW3RdW2VdWzFdLW5bdF1bZS0xXVsxXSkvKDIqbyk7dD5yOysrcilhKz0obltyXVtlXVsxXS1uW3JdW2UtMV1bMV0pL287aSs9YSpuW3RdW2VdWzFdfWdbZV09bC09dT9pL3UqbzowLGM+bCYmKGM9bCl9Zm9yKGU9MDtoPmU7KytlKWdbZV0tPWM7cmV0dXJuIGd9LGV4cGFuZDpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPW5bMF0ubGVuZ3RoLGE9MS91LG89W107Zm9yKGU9MDtpPmU7KytlKXtmb3IodD0wLHI9MDt1PnQ7dCsrKXIrPW5bdF1bZV1bMV07aWYocilmb3IodD0wO3U+dDt0Kyspblt0XVtlXVsxXS89cjtlbHNlIGZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdPWF9Zm9yKGU9MDtpPmU7KytlKW9bZV09MDtyZXR1cm4gb30semVybzp2dX0pO29hLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7Zm9yKHZhciBhLG8sbD1bXSxjPW4ubWFwKGUsdGhpcykscz1yLmNhbGwodGhpcyxjLGkpLGY9dS5jYWxsKHRoaXMscyxjLGkpLGk9LTEsaD1jLmxlbmd0aCxnPWYubGVuZ3RoLTEscD10PzE6MS9oOysraTxnOylhPWxbaV09W10sYS5keD1mW2krMV0tKGEueD1mW2ldKSxhLnk9MDtpZihnPjApZm9yKGk9LTE7KytpPGg7KW89Y1tpXSxvPj1zWzBdJiZvPD1zWzFdJiYoYT1sW29hLmJpc2VjdChmLG8sMSxnKS0xXSxhLnkrPXAsYS5wdXNoKG5baV0pKTtyZXR1cm4gbH12YXIgdD0hMCxlPU51bWJlcixyPWJ1LHU9TXU7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUVuKHQpLG4pOnJ9LG4uYmlucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24obil7cmV0dXJuIHh1KG4sdCl9OkVuKHQpLG4pOnV9LG4uZnJlcXVlbmN5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSEhZSxuKTp0fSxufSxvYS5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgYT1lLmNhbGwodGhpcyxuLGkpLG89YVswXSxsPXVbMF0sYz11WzFdLHM9bnVsbD09dD9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fTtpZihvLng9by55PTAsYXUobyxmdW5jdGlvbihuKXtuLnI9K3Mobi52YWx1ZSl9KSxhdShvLE51KSxyKXt2YXIgZj1yKih0PzE6TWF0aC5tYXgoMipvLnIvbCwyKm8uci9jKSkvMjthdShvLGZ1bmN0aW9uKG4pe24ucis9Zn0pLGF1KG8sTnUpLGF1KG8sZnVuY3Rpb24obil7bi5yLT1mfSl9cmV0dXJuIEN1KG8sbC8yLGMvMix0PzE6MS9NYXRoLm1heCgyKm8uci9sLDIqby5yL2MpKSxhfXZhciB0LGU9b2EubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQoX3UpLHI9MCx1PVsxLDFdO3JldHVybiBuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1lfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9lOitlLG4pOnR9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSx1dShuLGUpfSxvYS5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgcz1hLmNhbGwodGhpcyxuLHUpLGY9c1swXSxoPXQoZik7aWYoYXUoaCxlKSxoLnBhcmVudC5tPS1oLnosaXUoaCxyKSxjKWl1KGYsaSk7ZWxzZXt2YXIgZz1mLHA9Zix2PWY7aXUoZixmdW5jdGlvbihuKXtuLng8Zy54JiYoZz1uKSxuLng+cC54JiYocD1uKSxuLmRlcHRoPnYuZGVwdGgmJih2PW4pfSk7dmFyIGQ9byhnLHApLzItZy54LG09bFswXS8ocC54K28ocCxnKS8yK2QpLHk9bFsxXS8odi5kZXB0aHx8MSk7aXUoZixmdW5jdGlvbihuKXtuLng9KG4ueCtkKSptLG4ueT1uLmRlcHRoKnl9KX1yZXR1cm4gc31mdW5jdGlvbiB0KG4pe2Zvcih2YXIgdCxlPXtBOm51bGwsY2hpbGRyZW46W25dfSxyPVtlXTtudWxsIT0odD1yLnBvcCgpKTspZm9yKHZhciB1LGk9dC5jaGlsZHJlbixhPTAsbz1pLmxlbmd0aDtvPmE7KythKXIucHVzaCgoaVthXT11PXtfOmlbYV0scGFyZW50OnQsY2hpbGRyZW46KHU9aVthXS5jaGlsZHJlbikmJnUuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6YX0pLmE9dSk7cmV0dXJuIGUuY2hpbGRyZW5bMF19ZnVuY3Rpb24gZShuKXt2YXIgdD1uLmNoaWxkcmVuLGU9bi5wYXJlbnQuY2hpbGRyZW4scj1uLmk/ZVtuLmktMV06bnVsbDtpZih0Lmxlbmd0aCl7RHUobik7dmFyIGk9KHRbMF0ueit0W3QubGVuZ3RoLTFdLnopLzI7cj8obi56PXIueitvKG4uXyxyLl8pLG4ubT1uLnotaSk6bi56PWl9ZWxzZSByJiYobi56PXIueitvKG4uXyxyLl8pKTtuLnBhcmVudC5BPXUobixyLG4ucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIHIobil7bi5fLng9bi56K24ucGFyZW50Lm0sbi5tKz1uLnBhcmVudC5tfWZ1bmN0aW9uIHUobix0LGUpe2lmKHQpe2Zvcih2YXIgcix1PW4saT1uLGE9dCxsPXUucGFyZW50LmNoaWxkcmVuWzBdLGM9dS5tLHM9aS5tLGY9YS5tLGg9bC5tO2E9VHUoYSksdT1xdSh1KSxhJiZ1OylsPXF1KGwpLGk9VHUoaSksaS5hPW4scj1hLnorZi11LnotYytvKGEuXyx1Ll8pLHI+MCYmKFJ1KFB1KGEsbixlKSxuLHIpLGMrPXIscys9ciksZis9YS5tLGMrPXUubSxoKz1sLm0scys9aS5tO2EmJiFUdShpKSYmKGkudD1hLGkubSs9Zi1zKSx1JiYhcXUobCkmJihsLnQ9dSxsLm0rPWMtaCxlPW4pfXJldHVybiBlfWZ1bmN0aW9uIGkobil7bi54Kj1sWzBdLG4ueT1uLmRlcHRoKmxbMV19dmFyIGE9b2EubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksbz1MdSxsPVsxLDFdLGM9bnVsbDtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PShsPXQpP2k6bnVsbCxuKTpjP251bGw6bH0sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1udWxsPT0obD10KT9udWxsOmksbik6Yz9sOm51bGx9LHV1KG4sYSl9LG9hLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBhLG89dC5jYWxsKHRoaXMsbixpKSxsPW9bMF0sYz0wO2F1KGwsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PVV1KHQpLG4ueT1qdSh0KSk6KG4ueD1hP2MrPWUobixhKTowLG4ueT0wLGE9bil9KTt2YXIgcz1GdShsKSxmPUh1KGwpLGg9cy54LWUocyxmKS8yLGc9Zi54K2UoZixzKS8yO3JldHVybiBhdShsLHU/ZnVuY3Rpb24obil7bi54PShuLngtbC54KSpyWzBdLG4ueT0obC55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKGctaCkqclswXSxuLnk9KDEtKGwueT9uLnkvbC55OjEpKSpyWzFdfSksb312YXIgdD1vYS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPUx1LHI9WzEsMV0sdT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShyPXQpLG4pOnU/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGwhPShyPXQpLG4pOnU/cjpudWxsfSx1dShuLHQpfSxvYS5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXI9KGU9blt1XSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgaT1lLmNoaWxkcmVuO2lmKGkmJmkubGVuZ3RoKXt2YXIgYSxvLGwsYz1mKGUpLHM9W10saD1pLnNsaWNlKCkscD0xLzAsdj0ic2xpY2UiPT09Zz9jLmR4OiJkaWNlIj09PWc/Yy5keToic2xpY2UtZGljZSI9PT1nPzEmZS5kZXB0aD9jLmR5OmMuZHg6TWF0aC5taW4oYy5keCxjLmR5KTtmb3IobihoLGMuZHgqYy5keS9lLnZhbHVlKSxzLmFyZWE9MDsobD1oLmxlbmd0aCk+MDspcy5wdXNoKGE9aFtsLTFdKSxzLmFyZWErPWEuYXJlYSwic3F1YXJpZnkiIT09Z3x8KG89cihzLHYpKTw9cD8oaC5wb3AoKSxwPW8pOihzLmFyZWEtPXMucG9wKCkuYXJlYSx1KHMsdixjLCExKSx2PU1hdGgubWluKGMuZHgsYy5keSkscy5sZW5ndGg9cy5hcmVhPTAscD0xLzApO3MubGVuZ3RoJiYodShzLHYsYywhMCkscy5sZW5ndGg9cy5hcmVhPTApLGkuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgaSxhPWYodCksbz1yLnNsaWNlKCksbD1bXTtmb3IobihvLGEuZHgqYS5keS90LnZhbHVlKSxsLmFyZWE9MDtpPW8ucG9wKCk7KWwucHVzaChpKSxsLmFyZWErPWkuYXJlYSxudWxsIT1pLnomJih1KGwsaS56P2EuZHg6YS5keSxhLCFvLmxlbmd0aCksbC5sZW5ndGg9bC5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSx1PTAsaT0xLzAsYT0tMSxvPW4ubGVuZ3RoOysrYTxvOykoZT1uW2FdLmFyZWEpJiYoaT5lJiYoaT1lKSxlPnUmJih1PWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCp1KnAvcixyLyh0KmkqcCkpOjEvMH1mdW5jdGlvbiB1KG4sdCxlLHIpe3ZhciB1LGk9LTEsYT1uLmxlbmd0aCxvPWUueCxjPWUueSxzPXQ/bChuLmFyZWEvdCk6MDsKLWlmKHQ9PWUuZHgpe2Zvcigocnx8cz5lLmR5KSYmKHM9ZS5keSk7KytpPGE7KXU9bltpXSx1Lng9byx1Lnk9Yyx1LmR5PXMsbys9dS5keD1NYXRoLm1pbihlLngrZS5keC1vLHM/bCh1LmFyZWEvcyk6MCk7dS56PSEwLHUuZHgrPWUueCtlLmR4LW8sZS55Kz1zLGUuZHktPXN9ZWxzZXtmb3IoKHJ8fHM+ZS5keCkmJihzPWUuZHgpOysraTxhOyl1PW5baV0sdS54PW8sdS55PWMsdS5keD1zLGMrPXUuZHk9TWF0aC5taW4oZS55K2UuZHktYyxzP2wodS5hcmVhL3MpOjApO3Uuej0hMSx1LmR5Kz1lLnkrZS5keS1jLGUueCs9cyxlLmR4LT1zfX1mdW5jdGlvbiBpKHIpe3ZhciB1PWF8fG8ociksaT11WzBdO3JldHVybiBpLng9aS55PTAsaS52YWx1ZT8oaS5keD1jWzBdLGkuZHk9Y1sxXSk6aS5keD1pLmR5PTAsYSYmby5yZXZhbHVlKGkpLG4oW2ldLGkuZHgqaS5keS9pLnZhbHVlKSwoYT9lOnQpKGkpLGgmJihhPXUpLHV9dmFyIGEsbz1vYS5sYXlvdXQuaGllcmFyY2h5KCksbD1NYXRoLnJvdW5kLGM9WzEsMV0scz1udWxsLGY9T3UsaD0hMSxnPSJzcXVhcmlmeSIscD0uNSooMStNYXRoLnNxcnQoNSkpO3JldHVybiBpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bixpKTpjfSxpLnBhZGRpbmc9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXt2YXIgZT1uLmNhbGwoaSx0LHQuZGVwdGgpO3JldHVybiBudWxsPT1lP091KHQpOkl1KHQsIm51bWJlciI9PXR5cGVvZiBlP1tlLGUsZSxlXTplKX1mdW5jdGlvbiBlKHQpe3JldHVybiBJdSh0LG4pfWlmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBzO3ZhciByO3JldHVybiBmPW51bGw9PShzPW4pP091OiJmdW5jdGlvbiI9PShyPXR5cGVvZiBuKT90OiJudW1iZXIiPT09cj8obj1bbixuLG4sbl0sZSk6ZSxpfSxpLnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4/TWF0aC5yb3VuZDpOdW1iZXIsaSk6bCE9TnVtYmVyfSxpLnN0aWNreT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1uLGE9bnVsbCxpKTpofSxpLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4saSk6cH0saS5tb2RlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPW4rIiIsaSk6Z30sdXUoaSxvKX0sb2EucmFuZG9tPXtub3JtYWw6ZnVuY3Rpb24obix0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiAyPmUmJih0PTEpLDE+ZSYmKG49MCksZnVuY3Rpb24oKXt2YXIgZSxyLHU7ZG8gZT0yKk1hdGgucmFuZG9tKCktMSxyPTIqTWF0aC5yYW5kb20oKS0xLHU9ZSplK3Iqcjt3aGlsZSghdXx8dT4xKTtyZXR1cm4gbit0KmUqTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHUpL3UpfX0sbG9nTm9ybWFsOmZ1bmN0aW9uKCl7dmFyIG49b2EucmFuZG9tLm5vcm1hbC5hcHBseShvYSxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cChuKCkpfX0sYmF0ZXM6ZnVuY3Rpb24obil7dmFyIHQ9b2EucmFuZG9tLmlyd2luSGFsbChuKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCgpL259fSxpcndpbkhhbGw6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO24+ZTtlKyspdCs9TWF0aC5yYW5kb20oKTtyZXR1cm4gdH19fSxvYS5zY2FsZT17fTt2YXIgd2w9e2Zsb29yOnksY2VpbDp5fTtvYS5zY2FsZS5saW5lYXI9ZnVuY3Rpb24oKXtyZXR1cm4gV3UoWzAsMV0sWzAsMV0sTXIsITEpfTt2YXIgU2w9e3M6MSxnOjEscDoxLHI6MSxlOjF9O29hLnNjYWxlLmxvZz1mdW5jdGlvbigpe3JldHVybiByaShvYS5zY2FsZS5saW5lYXIoKS5kb21haW4oWzAsMV0pLDEwLCEwLFsxLDEwXSl9O3ZhciBrbD1vYS5mb3JtYXQoIi4wZSIpLE5sPXtmbG9vcjpmdW5jdGlvbihuKXtyZXR1cm4tTWF0aC5jZWlsKC1uKX0sY2VpbDpmdW5jdGlvbihuKXtyZXR1cm4tTWF0aC5mbG9vcigtbil9fTtvYS5zY2FsZS5wb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdWkob2Euc2NhbGUubGluZWFyKCksMSxbMCwxXSl9LG9hLnNjYWxlLnNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gb2Euc2NhbGUucG93KCkuZXhwb25lbnQoLjUpfSxvYS5zY2FsZS5vcmRpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIGFpKFtdLHt0OiJyYW5nZSIsYTpbW11dfSl9LG9hLnNjYWxlLmNhdGVnb3J5MTA9ZnVuY3Rpb24oKXtyZXR1cm4gb2Euc2NhbGUub3JkaW5hbCgpLnJhbmdlKEVsKX0sb2Euc2NhbGUuY2F0ZWdvcnkyMD1mdW5jdGlvbigpe3JldHVybiBvYS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoQWwpfSxvYS5zY2FsZS5jYXRlZ29yeTIwYj1mdW5jdGlvbigpe3JldHVybiBvYS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoQ2wpfSxvYS5zY2FsZS5jYXRlZ29yeTIwYz1mdW5jdGlvbigpe3JldHVybiBvYS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoemwpfTt2YXIgRWw9WzIwNjIyNjAsMTY3NDQyMDYsMjkyNDU4OCwxNDAzNDcyOCw5NzI1ODg1LDkxOTcxMzEsMTQ5MDczMzAsODM1NTcxMSwxMjM2OTE4NiwxNTU2MTc1XS5tYXAoeG4pLEFsPVsyMDYyMjYwLDExNDU0NDQwLDE2NzQ0MjA2LDE2NzU5NjcyLDI5MjQ1ODgsMTAwMTg2OTgsMTQwMzQ3MjgsMTY3NTA3NDIsOTcyNTg4NSwxMjk1NTg2MSw5MTk3MTMxLDEyODg1MTQwLDE0OTA3MzMwLDE2MjM0MTk0LDgzNTU3MTEsMTMwOTI4MDcsMTIzNjkxODYsMTQ0MDg1ODksMTU1NjE3NSwxMDQxMDcyNV0ubWFwKHhuKSxDbD1bMzc1MDc3Nyw1Mzk1NjE5LDcwNDA3MTksMTAyNjQyODYsNjUxOTA5Nyw5MjE2NTk0LDExOTE1MTE1LDEzNTU2NjM2LDkyMDI5OTMsMTI0MjY4MDksMTUxODY1MTQsMTUxOTA5MzIsODY2NjE2OSwxMTM1NjQ5MCwxNDA0OTY0MywxNTE3NzM3Miw4MDc3NjgzLDEwODM0MzI0LDEzNTI4NTA5LDE0NTg5NjU0XS5tYXAoeG4pLHpsPVszMjQ0NzMzLDcwNTcxMTAsMTA0MDY2MjUsMTMwMzI0MzEsMTUwOTUwNTMsMTY2MTY3NjQsMTY2MjUyNTksMTY2MzQwMTgsMzI1MzA3Niw3NjUyNDcwLDEwNjA3MDAzLDEzMTAxNTA0LDc2OTUyODEsMTAzOTQzMTIsMTIzNjkzNzIsMTQzNDI4OTEsNjUxMzUwNyw5ODY4OTUwLDEyNDM0ODc3LDE0Mjc3MDgxXS5tYXAoeG4pO29hLnNjYWxlLnF1YW50aWxlPWZ1bmN0aW9uKCl7cmV0dXJuIG9pKFtdLFtdKX0sb2Euc2NhbGUucXVhbnRpemU9ZnVuY3Rpb24oKXtyZXR1cm4gbGkoMCwxLFswLDFdKX0sb2Euc2NhbGUudGhyZXNob2xkPWZ1bmN0aW9uKCl7cmV0dXJuIGNpKFsuNV0sWzAsMV0pfSxvYS5zY2FsZS5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiBzaShbMCwxXSl9LG9hLnN2Zz17fSxvYS5zdmcuYXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPU1hdGgubWF4KDAsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxjPU1hdGgubWF4KDAsK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLUhhLGY9by5hcHBseSh0aGlzLGFyZ3VtZW50cyktSGEsaD1NYXRoLmFicyhmLXMpLGc9cz5mPzA6MTtpZihuPmMmJihwPWMsYz1uLG49cCksaD49RmEpcmV0dXJuIHQoYyxnKSsobj90KG4sMS1nKToiIikrIloiO3ZhciBwLHYsZCxtLHksTSx4LGIsXyx3LFMsayxOPTAsRT0wLEE9W107aWYoKG09KCtsLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MCkvMikmJihkPWk9PT1MbD9NYXRoLnNxcnQobipuK2MqYyk6K2kuYXBwbHkodGhpcyxhcmd1bWVudHMpLGd8fChFKj0tMSksYyYmKEU9dG4oZC9jKk1hdGguc2luKG0pKSksbiYmKE49dG4oZC9uKk1hdGguc2luKG0pKSkpLGMpe3k9YypNYXRoLmNvcyhzK0UpLE09YypNYXRoLnNpbihzK0UpLHg9YypNYXRoLmNvcyhmLUUpLGI9YypNYXRoLnNpbihmLUUpO3ZhciBDPU1hdGguYWJzKGYtcy0yKkUpPD1qYT8wOjE7aWYoRSYmbWkoeSxNLHgsYik9PT1nXkMpe3ZhciB6PShzK2YpLzI7eT1jKk1hdGguY29zKHopLE09YypNYXRoLnNpbih6KSx4PWI9bnVsbH19ZWxzZSB5PU09MDtpZihuKXtfPW4qTWF0aC5jb3MoZi1OKSx3PW4qTWF0aC5zaW4oZi1OKSxTPW4qTWF0aC5jb3MocytOKSxrPW4qTWF0aC5zaW4ocytOKTt2YXIgTD1NYXRoLmFicyhzLWYrMipOKTw9amE/MDoxO2lmKE4mJm1pKF8sdyxTLGspPT09MS1nXkwpe3ZhciBxPShzK2YpLzI7Xz1uKk1hdGguY29zKHEpLHc9bipNYXRoLnNpbihxKSxTPWs9bnVsbH19ZWxzZSBfPXc9MDtpZihoPkRhJiYocD1NYXRoLm1pbihNYXRoLmFicyhjLW4pLzIsK3UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSk+LjAwMSl7dj1jPm5eZz8wOjE7dmFyIFQ9cCxSPXA7aWYoamE+aCl7dmFyIEQ9bnVsbD09Uz9bXyx3XTpudWxsPT14P1t5LE1dOlJlKFt5LE1dLFtTLGtdLFt4LGJdLFtfLHddKSxQPXktRFswXSxqPU0tRFsxXSxVPXgtRFswXSxGPWItRFsxXSxIPTEvTWF0aC5zaW4oTWF0aC5hY29zKChQKlUraipGKS8oTWF0aC5zcXJ0KFAqUCtqKmopKk1hdGguc3FydChVKlUrRipGKSkpLzIpLE89TWF0aC5zcXJ0KERbMF0qRFswXStEWzFdKkRbMV0pO1I9TWF0aC5taW4ocCwobi1PKS8oSC0xKSksVD1NYXRoLm1pbihwLChjLU8pLyhIKzEpKX1pZihudWxsIT14KXt2YXIgST15aShudWxsPT1TP1tfLHddOltTLGtdLFt5LE1dLGMsVCxnKSxZPXlpKFt4LGJdLFtfLHddLGMsVCxnKTtwPT09VD9BLnB1c2goIk0iLElbMF0sIkEiLFQsIiwiLFQsIiAwIDAsIix2LCIgIixJWzFdLCJBIixjLCIsIixjLCIgMCAiLDEtZ15taShJWzFdWzBdLElbMV1bMV0sWVsxXVswXSxZWzFdWzFdKSwiLCIsZywiICIsWVsxXSwiQSIsVCwiLCIsVCwiIDAgMCwiLHYsIiAiLFlbMF0pOkEucHVzaCgiTSIsSVswXSwiQSIsVCwiLCIsVCwiIDAgMSwiLHYsIiAiLFlbMF0pfWVsc2UgQS5wdXNoKCJNIix5LCIsIixNKTtpZihudWxsIT1TKXt2YXIgWj15aShbeSxNXSxbUyxrXSxuLC1SLGcpLFY9eWkoW18sd10sbnVsbD09eD9beSxNXTpbeCxiXSxuLC1SLGcpO3A9PT1SP0EucHVzaCgiTCIsVlswXSwiQSIsUiwiLCIsUiwiIDAgMCwiLHYsIiAiLFZbMV0sIkEiLG4sIiwiLG4sIiAwICIsZ15taShWWzFdWzBdLFZbMV1bMV0sWlsxXVswXSxaWzFdWzFdKSwiLCIsMS1nLCIgIixaWzFdLCJBIixSLCIsIixSLCIgMCAwLCIsdiwiICIsWlswXSk6QS5wdXNoKCJMIixWWzBdLCJBIixSLCIsIixSLCIgMCAwLCIsdiwiICIsWlswXSl9ZWxzZSBBLnB1c2goIkwiLF8sIiwiLHcpfWVsc2UgQS5wdXNoKCJNIix5LCIsIixNKSxudWxsIT14JiZBLnB1c2goIkEiLGMsIiwiLGMsIiAwICIsQywiLCIsZywiICIseCwiLCIsYiksQS5wdXNoKCJMIixfLCIsIix3KSxudWxsIT1TJiZBLnB1c2goIkEiLG4sIiwiLG4sIiAwICIsTCwiLCIsMS1nLCIgIixTLCIsIixrKTtyZXR1cm4gQS5wdXNoKCJaIiksQS5qb2luKCIiKX1mdW5jdGlvbiB0KG4sdCl7cmV0dXJuIk0wLCIrbisiQSIrbisiLCIrbisiIDAgMSwiK3QrIiAwLCIrLW4rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiK259dmFyIGU9aGkscj1naSx1PWZpLGk9TGwsYT1waSxvPXZpLGw9ZGk7cmV0dXJuIG4uaW5uZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RW4odCksbik6ZX0sbi5vdXRlclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1Fbih0KSxuKTpyfSxuLmNvcm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1Fbih0KSxuKTp1fSxuLnBhZFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10PT1MbD9MbDpFbih0KSxuKTppfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RW4odCksbik6YX0sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1Fbih0KSxuKTpvfSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUVuKHQpLG4pOmx9LG4uY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsdD0oK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItSGE7cmV0dXJuW01hdGguY29zKHQpKm4sTWF0aC5zaW4odCkqbl19LG59O3ZhciBMbD0iYXV0byI7b2Euc3ZnLmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gTWkoeSl9O3ZhciBxbD1vYS5tYXAoe2xpbmVhcjp4aSwibGluZWFyLWNsb3NlZCI6Ymksc3RlcDpfaSwic3RlcC1iZWZvcmUiOndpLCJzdGVwLWFmdGVyIjpTaSxiYXNpczp6aSwiYmFzaXMtb3BlbiI6TGksImJhc2lzLWNsb3NlZCI6cWksYnVuZGxlOlRpLGNhcmRpbmFsOkVpLCJjYXJkaW5hbC1vcGVuIjpraSwiY2FyZGluYWwtY2xvc2VkIjpOaSxtb25vdG9uZTpGaX0pO3FsLmZvckVhY2goZnVuY3Rpb24obix0KXt0LmtleT1uLHQuY2xvc2VkPS8tY2xvc2VkJC8udGVzdChuKX0pO3ZhciBUbD1bMCwyLzMsMS8zLDBdLFJsPVswLDEvMywyLzMsMF0sRGw9WzAsMS82LDIvMywxLzZdO29hLnN2Zy5saW5lLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPU1pKEhpKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxufSx3aS5yZXZlcnNlPVNpLFNpLnJldmVyc2U9d2ksb2Euc3ZnLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gT2koeSl9LG9hLnN2Zy5hcmVhLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPU9pKEhpKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5pbm5lclJhZGl1cz1uLngwLGRlbGV0ZSBuLngwLG4ub3V0ZXJSYWRpdXM9bi54MSxkZWxldGUgbi54MSxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG4uc3RhcnRBbmdsZT1uLnkwLGRlbGV0ZSBuLnkwLG4uZW5kQW5nbGU9bi55MSxkZWxldGUgbi55MSxufSxvYS5zdmcuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sbyl7dmFyIGw9dCh0aGlzLGksbixvKSxjPXQodGhpcyxhLG4sbyk7cmV0dXJuIk0iK2wucDArcihsLnIsbC5wMSxsLmExLWwuYTApKyhlKGwsYyk/dShsLnIsbC5wMSxsLnIsbC5wMCk6dShsLnIsbC5wMSxjLnIsYy5wMCkrcihjLnIsYy5wMSxjLmExLWMuYTApK3UoYy5yLGMucDEsbC5yLGwucDApKSsiWiJ9ZnVuY3Rpb24gdChuLHQsZSxyKXt2YXIgdT10LmNhbGwobixlLHIpLGk9by5jYWxsKG4sdSxyKSxhPWwuY2FsbChuLHUsciktSGEscz1jLmNhbGwobix1LHIpLUhhO3JldHVybntyOmksYTA6YSxhMTpzLHAwOltpKk1hdGguY29zKGEpLGkqTWF0aC5zaW4oYSldLHAxOltpKk1hdGguY29zKHMpLGkqTWF0aC5zaW4ocyldfX1mdW5jdGlvbiBlKG4sdCl7cmV0dXJuIG4uYTA9PXQuYTAmJm4uYTE9PXQuYTF9ZnVuY3Rpb24gcihuLHQsZSl7cmV0dXJuIkEiK24rIiwiK24rIiAwICIrICsoZT5qYSkrIiwxICIrdH1mdW5jdGlvbiB1KG4sdCxlLHIpe3JldHVybiJRIDAsMCAiK3J9dmFyIGk9TWUsYT14ZSxvPUlpLGw9cGksYz12aTtyZXR1cm4gbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RW4odCksbik6b30sbi5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9RW4odCksbik6aX0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RW4odCksbik6YX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUVuKHQpLG4pOmx9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9RW4odCksbik6Y30sbn0sb2Euc3ZnLmRpYWdvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPXQuY2FsbCh0aGlzLG4sdSksYT1lLmNhbGwodGhpcyxuLHUpLG89KGkueSthLnkpLzIsbD1baSx7eDppLngseTpvfSx7eDphLngseTpvfSxhXTtyZXR1cm4gbD1sLm1hcChyKSwiTSIrbFswXSsiQyIrbFsxXSsiICIrbFsyXSsiICIrbFszXX12YXIgdD1NZSxlPXhlLHI9WWk7cmV0dXJuIG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUVuKGUpLG4pOnR9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUVuKHQpLG4pOmV9LG4ucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG59LG9hLnN2Zy5kaWFnb25hbC5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1vYS5zdmcuZGlhZ29uYWwoKSx0PVlpLGU9bi5wcm9qZWN0aW9uO3JldHVybiBuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShaaSh0PW4pKTp0fSxufSxvYS5zdmcuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe3JldHVybihQbC5nZXQodC5jYWxsKHRoaXMsbixyKSl8fCRpKShlLmNhbGwodGhpcyxuLHIpKX12YXIgdD1YaSxlPVZpO3JldHVybiBuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9RW4oZSksbik6dH0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUVuKHQpLG4pOmV9LG59O3ZhciBQbD1vYS5tYXAoe2NpcmNsZTokaSxjcm9zczpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi81KS8yO3JldHVybiJNIistMyp0KyIsIistdCsiSCIrLXQrIlYiKy0zKnQrIkgiK3QrIlYiKy10KyJIIiszKnQrIlYiK3QrIkgiK3QrIlYiKzMqdCsiSCIrLXQrIlYiK3QrIkgiKy0zKnQrIloifSxkaWFtb25kOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLygyKlVsKSksZT10KlVsO3JldHVybiJNMCwiKy10KyJMIitlKyIsMCAwLCIrdCsiICIrLWUrIiwwWiJ9LHNxdWFyZTpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobikvMjtyZXR1cm4iTSIrLXQrIiwiKy10KyJMIit0KyIsIistdCsiICIrdCsiLCIrdCsiICIrLXQrIiwiK3QrIloifSwidHJpYW5nbGUtZG93biI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vamwpLGU9dCpqbC8yO3JldHVybiJNMCwiK2UrIkwiK3QrIiwiKy1lKyIgIistdCsiLCIrLWUrIloifSwidHJpYW5nbGUtdXAiOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL2psKSxlPXQqamwvMjtyZXR1cm4iTTAsIistZSsiTCIrdCsiLCIrZSsiICIrLXQrIiwiK2UrIloifX0pO29hLnN2Zy5zeW1ib2xUeXBlcz1QbC5rZXlzKCk7dmFyIGpsPU1hdGguc3FydCgzKSxVbD1NYXRoLnRhbigzMCpPYSk7QWEudHJhbnNpdGlvbj1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyPUZsfHwrK1lsLHU9S2kobiksaT1bXSxhPUhsfHx7dGltZTpEYXRlLm5vdygpLGVhc2U6TnIsZGVsYXk6MCxkdXJhdGlvbjoyNTB9LG89LTEsbD10aGlzLmxlbmd0aDsrK288bDspe2kucHVzaCh0PVtdKTtmb3IodmFyIGM9dGhpc1tvXSxzPS0xLGY9Yy5sZW5ndGg7KytzPGY7KShlPWNbc10pJiZRaShlLHMsdSxyLGEpLHQucHVzaChlKX1yZXR1cm4gV2koaSx1LHIpfSxBYS5pbnRlcnJ1cHQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChudWxsPT1uP09sOkJpKEtpKG4pKSl9O3ZhciBGbCxIbCxPbD1CaShLaSgpKSxJbD1bXSxZbD0wO0lsLmNhbGw9QWEuY2FsbCxJbC5lbXB0eT1BYS5lbXB0eSxJbC5ub2RlPUFhLm5vZGUsSWwuc2l6ZT1BYS5zaXplLG9hLnRyYW5zaXRpb249ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi50cmFuc2l0aW9uP0ZsP24udHJhbnNpdGlvbih0KTpuOm9hLnNlbGVjdGlvbigpLnRyYW5zaXRpb24obil9LG9hLnRyYW5zaXRpb24ucHJvdG90eXBlPUlsLElsLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT10aGlzLmlkLGk9dGhpcy5uYW1lc3BhY2UsYT1bXTtuPUEobik7Zm9yKHZhciBvPS0xLGw9dGhpcy5sZW5ndGg7KytvPGw7KXthLnB1c2godD1bXSk7Zm9yKHZhciBjPXRoaXNbb10scz0tMSxmPWMubGVuZ3RoOysrczxmOykocj1jW3NdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxzLG8pKT8oIl9fZGF0YV9fImluIHImJihlLl9fZGF0YV9fPXIuX19kYXRhX18pLFFpKGUscyxpLHUscltpXVt1XSksdC5wdXNoKGUpKTp0LnB1c2gobnVsbCl9cmV0dXJuIFdpKGEsaSx1KX0sSWwuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1LGksYT10aGlzLmlkLG89dGhpcy5uYW1lc3BhY2UsbD1bXTtuPUMobik7Zm9yKHZhciBjPS0xLHM9dGhpcy5sZW5ndGg7KytjPHM7KWZvcih2YXIgZj10aGlzW2NdLGg9LTEsZz1mLmxlbmd0aDsrK2g8ZzspaWYocj1mW2hdKXtpPXJbb11bYV0sZT1uLmNhbGwocixyLl9fZGF0YV9fLGgsYyksbC5wdXNoKHQ9W10pO2Zvcih2YXIgcD0tMSx2PWUubGVuZ3RoOysrcDx2OykodT1lW3BdKSYmUWkodSxwLG8sYSxpKSx0LnB1c2godSl9cmV0dXJuIFdpKGwsbyxhKX0sSWwuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1PKG4pKTtmb3IodmFyIGk9MCxhPXRoaXMubGVuZ3RoO2E+aTtpKyspe3UucHVzaCh0PVtdKTtmb3IodmFyIGU9dGhpc1tpXSxvPTAsbD1lLmxlbmd0aDtsPm87bysrKShyPWVbb10pJiZuLmNhbGwocixyLl9fZGF0YV9fLG8saSkmJnQucHVzaChyKX1yZXR1cm4gV2kodSx0aGlzLm5hbWVzcGFjZSx0aGlzLmlkKX0sSWwudHdlZW49ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzLm5vZGUoKVtyXVtlXS50d2Vlbi5nZXQobik6WSh0aGlzLG51bGw9PXQ/ZnVuY3Rpb24odCl7dFtyXVtlXS50d2Vlbi5yZW1vdmUobil9OmZ1bmN0aW9uKHUpe3Vbcl1bZV0udHdlZW4uc2V0KG4sdCl9KX0sSWwuYXR0cj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShvKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhvLnNwYWNlLG8ubG9jYWwpfWZ1bmN0aW9uIHUobil7cmV0dXJuIG51bGw9PW4/ZToobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlKG8pO3JldHVybiBlIT09biYmKHQ9YShlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKG8sdChuKSl9KX0pfWZ1bmN0aW9uIGkobil7cmV0dXJuIG51bGw9PW4/cjoobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlTlMoby5zcGFjZSxvLmxvY2FsKTtyZXR1cm4gZSE9PW4mJih0PWEoZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKG8uc3BhY2Usby5sb2NhbCx0KG4pKX0pfSl9aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodCBpbiBuKXRoaXMuYXR0cih0LG5bdF0pO3JldHVybiB0aGlzfXZhciBhPSJ0cmFuc2Zvcm0iPT1uPyRyOk1yLG89b2EubnMucXVhbGlmeShuKTtyZXR1cm4gSmkodGhpcywiYXR0ci4iK24sdCxvLmxvY2FsP2k6dSl9LElsLmF0dHJUd2Vlbj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGUodSkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh1LHIobikpfX1mdW5jdGlvbiByKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsLHIobikpfX12YXIgdT1vYS5ucy5xdWFsaWZ5KG4pO3JldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIrbix1LmxvY2FsP3I6ZSl9LElsLnN0eWxlPWZ1bmN0aW9uKG4sZSxyKXtmdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiBpKGUpe3JldHVybiBudWxsPT1lP3U6KGUrPSIiLGZ1bmN0aW9uKCl7dmFyIHUsaT10KHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pO3JldHVybiBpIT09ZSYmKHU9TXIoaSxlKSxmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4sdSh0KSxyKX0pfSl9dmFyIGE9YXJndW1lbnRzLmxlbmd0aDtpZigzPmEpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5hJiYoZT0iIik7Zm9yKHIgaW4gbil0aGlzLnN0eWxlKHIsbltyXSxlKTtyZXR1cm4gdGhpc31yPSIifXJldHVybiBKaSh0aGlzLCJzdHlsZS4iK24sZSxpKX0sSWwuc3R5bGVUd2Vlbj1mdW5jdGlvbihuLGUscil7ZnVuY3Rpb24gdSh1LGkpe3ZhciBhPWUuY2FsbCh0aGlzLHUsaSx0KHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pKTtyZXR1cm4gYSYmZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLGEodCkscil9fXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDMmJihyPSIiKSx0aGlzLnR3ZWVuKCJzdHlsZS4iK24sdSl9LElsLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIEppKHRoaXMsInRleHQiLG4sR2kpfSxJbC5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gdGhpcy5lYWNoKCJlbmQudHJhbnNpdGlvbiIsZnVuY3Rpb24oKXt2YXIgdDt0aGlzW25dLmNvdW50PDImJih0PXRoaXMucGFyZW50Tm9kZSkmJnQucmVtb3ZlQ2hpbGQodGhpcyl9KX0sSWwuZWFzZT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5lYXNlOigiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49b2EuZWFzZS5hcHBseShvYSxhcmd1bWVudHMpKSxZKHRoaXMsZnVuY3Rpb24ocil7cltlXVt0XS5lYXNlPW59KSl9LElsLmRlbGF5PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmRlbGF5OlkodGhpcywiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbihyLHUsaSl7cltlXVt0XS5kZWxheT0rbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpfToobj0rbixmdW5jdGlvbihyKXtyW2VdW3RdLmRlbGF5PW59KSl9LElsLmR1cmF0aW9uPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmR1cmF0aW9uOlkodGhpcywiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbihyLHUsaSl7cltlXVt0XS5kdXJhdGlvbj1NYXRoLm1heCgxLG4uY2FsbChyLHIuX19kYXRhX18sdSxpKSl9OihuPU1hdGgubWF4KDEsbiksZnVuY3Rpb24ocil7cltlXVt0XS5kdXJhdGlvbj1ufSkpfSxJbC5lYWNoPWZ1bmN0aW9uKG4sdCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHU9SGwsaT1GbDt0cnl7Rmw9ZSxZKHRoaXMsZnVuY3Rpb24odCx1LGkpe0hsPXRbcl1bZV0sbi5jYWxsKHQsdC5fX2RhdGFfXyx1LGkpfSl9ZmluYWxseXtIbD11LEZsPWl9fWVsc2UgWSh0aGlzLGZ1bmN0aW9uKHUpe3ZhciBpPXVbcl1bZV07KGkuZXZlbnR8fChpLmV2ZW50PW9hLmRpc3BhdGNoKCJzdGFydCIsImVuZCIsImludGVycnVwdCIpKSkub24obix0KX0pO3JldHVybiB0aGlzfSxJbC50cmFuc2l0aW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQsZSxyLHU9dGhpcy5pZCxpPSsrWWwsYT10aGlzLm5hbWVzcGFjZSxvPVtdLGw9MCxjPXRoaXMubGVuZ3RoO2M+bDtsKyspe28ucHVzaChuPVtdKTtmb3IodmFyIHQ9dGhpc1tsXSxzPTAsZj10Lmxlbmd0aDtmPnM7cysrKShlPXRbc10pJiYocj1lW2FdW3VdLFFpKGUscyxhLGkse3RpbWU6ci50aW1lLGVhc2U6ci5lYXNlLGRlbGF5OnIuZGVsYXkrci5kdXJhdGlvbixkdXJhdGlvbjpyLmR1cmF0aW9ufSkpLG4ucHVzaChlKX1yZXR1cm4gV2kobyxhLGkpfSxvYS5zdmcuYXhpcz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG4sYz1vYS5zZWxlY3QodGhpcykscz10aGlzLl9fY2hhcnRfX3x8ZSxmPXRoaXMuX19jaGFydF9fPWUuY29weSgpLGg9bnVsbD09bD9mLnRpY2tzP2YudGlja3MuYXBwbHkoZixvKTpmLmRvbWFpbigpOmwsZz1udWxsPT10P2YudGlja0Zvcm1hdD9mLnRpY2tGb3JtYXQuYXBwbHkoZixvKTp5OnQscD1jLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsZiksdj1wLmVudGVyKCkuaW5zZXJ0KCJnIiwiLmRvbWFpbiIpLmF0dHIoImNsYXNzIiwidGljayIpLnN0eWxlKCJvcGFjaXR5IixEYSksZD1vYS50cmFuc2l0aW9uKHAuZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsRGEpLnJlbW92ZSgpLG09b2EudHJhbnNpdGlvbihwLm9yZGVyKCkpLnN0eWxlKCJvcGFjaXR5IiwxKSxNPU1hdGgubWF4KHUsMCkrYSx4PVp1KGYpLGI9Yy5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFswXSksXz0oYi5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwiZG9tYWluIiksb2EudHJhbnNpdGlvbihiKSk7di5hcHBlbmQoImxpbmUiKSx2LmFwcGVuZCgidGV4dCIpO3ZhciB3LFMsayxOLEU9di5zZWxlY3QoImxpbmUiKSxBPW0uc2VsZWN0KCJsaW5lIiksQz1wLnNlbGVjdCgidGV4dCIpLnRleHQoZyksej12LnNlbGVjdCgidGV4dCIpLEw9bS5zZWxlY3QoInRleHQiKSxxPSJ0b3AiPT09cnx8ImxlZnQiPT09cj8tMToxO2lmKCJib3R0b20iPT09cnx8InRvcCI9PT1yPyhuPW5hLHc9IngiLGs9InkiLFM9IngyIixOPSJ5MiIsQy5hdHRyKCJkeSIsMD5xPyIwZW0iOiIuNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLF8uYXR0cigiZCIsIk0iK3hbMF0rIiwiK3EqaSsiVjBIIit4WzFdKyJWIitxKmkpKToobj10YSx3PSJ5IixrPSJ4IixTPSJ5MiIsTj0ieDIiLEMuYXR0cigiZHkiLCIuMzJlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsMD5xPyJlbmQiOiJzdGFydCIpLF8uYXR0cigiZCIsIk0iK3EqaSsiLCIreFswXSsiSDBWIit4WzFdKyJIIitxKmkpKSxFLmF0dHIoTixxKnUpLHouYXR0cihrLHEqTSksQS5hdHRyKFMsMCkuYXR0cihOLHEqdSksTC5hdHRyKHcsMCkuYXR0cihrLHEqTSksZi5yYW5nZUJhbmQpe3ZhciBUPWYsUj1ULnJhbmdlQmFuZCgpLzI7cz1mPWZ1bmN0aW9uKG4pe3JldHVybiBUKG4pK1J9fWVsc2Ugcy5yYW5nZUJhbmQ/cz1mOmQuY2FsbChuLGYscyk7di5jYWxsKG4scyxmKSxtLmNhbGwobixmLGYpfSl9dmFyIHQsZT1vYS5zY2FsZS5saW5lYXIoKSxyPVpsLHU9NixpPTYsYT0zLG89WzEwXSxsPW51bGw7cmV0dXJuIG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLm9yaWVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10IGluIFZsP3QrIiI6Wmwsbik6cn0sbi50aWNrcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWNhKGFyZ3VtZW50cyksbik6b30sbi50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsbik6bH0sbi50aWNrRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi50aWNrU2l6ZT1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBlPyh1PSt0LGk9K2FyZ3VtZW50c1tlLTFdLG4pOnV9LG4uaW5uZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxuKTp1fSxuLm91dGVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbik6aX0sbi50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxuKTphfSxuLnRpY2tTdWJkaXZpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCYmbn0sbn07dmFyIFpsPSJib3R0b20iLFZsPXt0b3A6MSxyaWdodDoxLGJvdHRvbToxLGxlZnQ6MX07b2Euc3ZnLmJydXNoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1vYS5zZWxlY3QodGhpcykuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIixpKS5vbigidG91Y2hzdGFydC5icnVzaCIsaSksYT10LnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFswXSk7YS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiYmFja2dyb3VuZCIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikuc3R5bGUoImN1cnNvciIsImNyb3NzaGFpciIpLHQuc2VsZWN0QWxsKCIuZXh0ZW50IikuZGF0YShbMF0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJleHRlbnQiKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpO3ZhciBvPXQuc2VsZWN0QWxsKCIucmVzaXplIikuZGF0YSh2LHkpO28uZXhpdCgpLnJlbW92ZSgpLG8uZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24obil7cmV0dXJuInJlc2l6ZSAiK259KS5zdHlsZSgiY3Vyc29yIixmdW5jdGlvbihuKXtyZXR1cm4gWGxbbl19KS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IixmdW5jdGlvbihuKXtyZXR1cm4vW2V3XSQvLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoInkiLGZ1bmN0aW9uKG4pe3JldHVybi9eW25zXS8udGVzdChuKT8tMzpudWxsfSkuYXR0cigid2lkdGgiLDYpLmF0dHIoImhlaWdodCIsNikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxvLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpO3ZhciBsLGY9b2EudHJhbnNpdGlvbih0KSxoPW9hLnRyYW5zaXRpb24oYSk7YyYmKGw9WnUoYyksaC5hdHRyKCJ4IixsWzBdKS5hdHRyKCJ3aWR0aCIsbFsxXS1sWzBdKSxyKGYpKSxzJiYobD1adShzKSxoLmF0dHIoInkiLGxbMF0pLmF0dHIoImhlaWdodCIsbFsxXS1sWzBdKSx1KGYpKSxlKGYpfSl9ZnVuY3Rpb24gZShuKXtuLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgiK2ZbKy9lJC8udGVzdChuKV0rIiwiK2hbKy9ecy8udGVzdChuKV0rIikifSl9ZnVuY3Rpb24gcihuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLGZbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixmWzFdLWZbMF0pfWZ1bmN0aW9uIHUobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixoWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGhbMV0taFswXSl9ZnVuY3Rpb24gaSgpe2Z1bmN0aW9uIGkoKXszMj09b2EuZXZlbnQua2V5Q29kZSYmKEN8fChNPW51bGwsTFswXS09ZlsxXSxMWzFdLT1oWzFdLEM9MiksUygpKX1mdW5jdGlvbiB2KCl7MzI9PW9hLmV2ZW50LmtleUNvZGUmJjI9PUMmJihMWzBdKz1mWzFdLExbMV0rPWhbMV0sQz0wLFMoKSl9ZnVuY3Rpb24gZCgpe3ZhciBuPW9hLm1vdXNlKGIpLHQ9ITE7eCYmKG5bMF0rPXhbMF0sblsxXSs9eFsxXSksQ3x8KG9hLmV2ZW50LmFsdEtleT8oTXx8KE09WyhmWzBdK2ZbMV0pLzIsKGhbMF0raFsxXSkvMl0pLExbMF09ZlsrKG5bMF08TVswXSldLExbMV09aFsrKG5bMV08TVsxXSldKTpNPW51bGwpLEUmJm0obixjLDApJiYocihrKSx0PSEwKSxBJiZtKG4scywxKSYmKHUoayksdD0hMCksdCYmKGUoayksdyh7dHlwZToiYnJ1c2giLG1vZGU6Qz8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gbShuLHQsZSl7dmFyIHIsdSxpPVp1KHQpLGw9aVswXSxjPWlbMV0scz1MW2VdLHY9ZT9oOmYsZD12WzFdLXZbMF07cmV0dXJuIEMmJihsLT1zLGMtPWQrcykscj0oZT9wOmcpP01hdGgubWF4KGwsTWF0aC5taW4oYyxuW2VdKSk6bltlXSxDP3U9KHIrPXMpK2Q6KE0mJihzPU1hdGgubWF4KGwsTWF0aC5taW4oYywyKk1bZV0tcikpKSxyPnM/KHU9cixyPXMpOnU9cyksdlswXSE9cnx8dlsxXSE9dT8oZT9vPW51bGw6YT1udWxsLHZbMF09cix2WzFdPXUsITApOnZvaWQgMH1mdW5jdGlvbiB5KCl7ZCgpLGsuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCksb2Euc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCkscS5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSx6KCksdyh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIE0seCxiPXRoaXMsXz1vYS5zZWxlY3Qob2EuZXZlbnQudGFyZ2V0KSx3PWwub2YoYixhcmd1bWVudHMpLGs9b2Euc2VsZWN0KGIpLE49Xy5kYXR1bSgpLEU9IS9eKG58cykkLy50ZXN0KE4pJiZjLEE9IS9eKGV8dykkLy50ZXN0KE4pJiZzLEM9Xy5jbGFzc2VkKCJleHRlbnQiKSx6PVcoYiksTD1vYS5tb3VzZShiKSxxPW9hLnNlbGVjdCh0KGIpKS5vbigia2V5ZG93bi5icnVzaCIsaSkub24oImtleXVwLmJydXNoIix2KTtpZihvYS5ldmVudC5jaGFuZ2VkVG91Y2hlcz9xLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLGQpLm9uKCJ0b3VjaGVuZC5icnVzaCIseSk6cS5vbigibW91c2Vtb3ZlLmJydXNoIixkKS5vbigibW91c2V1cC5icnVzaCIseSksay5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxDKUxbMF09ZlswXS1MWzBdLExbMV09aFswXS1MWzFdO2Vsc2UgaWYoTil7dmFyIFQ9Ky93JC8udGVzdChOKSxSPSsvXm4vLnRlc3QoTik7eD1bZlsxLVRdLUxbMF0saFsxLVJdLUxbMV1dLExbMF09ZltUXSxMWzFdPWhbUl19ZWxzZSBvYS5ldmVudC5hbHRLZXkmJihNPUwuc2xpY2UoKSk7ay5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLG9hLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLF8uc3R5bGUoImN1cnNvciIpKSx3KHt0eXBlOiJicnVzaHN0YXJ0In0pLGQoKX12YXIgYSxvLGw9TihuLCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLGM9bnVsbCxzPW51bGwsZj1bMCwwXSxoPVswLDBdLGc9ITAscD0hMCx2PSRsWzBdO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPWwub2YodGhpcyxhcmd1bWVudHMpLHQ9e3g6Zix5OmgsaTphLGo6b30sZT10aGlzLl9fY2hhcnRfX3x8dDt0aGlzLl9fY2hhcnRfXz10LEZsP29hLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7YT1lLmksbz1lLmosZj1lLngsaD1lLnksbih7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgZT14cihmLHQueCkscj14cihoLHQueSk7cmV0dXJuIGE9bz1udWxsLGZ1bmN0aW9uKHUpe2Y9dC54PWUodSksaD10Lnk9cih1KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXthPXQuaSxvPXQuaixuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pfSk6KG4oe3R5cGU6ImJydXNoc3RhcnQifSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQsdj0kbFshYzw8MXwhc10sbik6Y30sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsdj0kbFshYzw8MXwhc10sbik6c30sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyYmcz8oZz0hIXRbMF0scD0hIXRbMV0pOmM/Zz0hIXQ6cyYmKHA9ISF0KSxuKTpjJiZzP1tnLHBdOmM/ZzpzP3A6bnVsbH0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGUscix1LGksbDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyYmKGU9dFswXSxyPXRbMV0scyYmKGU9ZVswXSxyPXJbMF0pLGE9W2Uscl0sYy5pbnZlcnQmJihlPWMoZSkscj1jKHIpKSxlPnImJihsPWUsZT1yLHI9bCksKGUhPWZbMF18fHIhPWZbMV0pJiYoZj1bZSxyXSkpLHMmJih1PXRbMF0saT10WzFdLGMmJih1PXVbMV0saT1pWzFdKSxvPVt1LGldLHMuaW52ZXJ0JiYodT1zKHUpLGk9cyhpKSksdT5pJiYobD11LHU9aSxpPWwpLCh1IT1oWzBdfHxpIT1oWzFdKSYmKGg9W3UsaV0pKSxuKTooYyYmKGE/KGU9YVswXSxyPWFbMV0pOihlPWZbMF0scj1mWzFdLGMuaW52ZXJ0JiYoZT1jLmludmVydChlKSxyPWMuaW52ZXJ0KHIpKSxlPnImJihsPWUsZT1yLHI9bCkpKSxzJiYobz8odT1vWzBdLGk9b1sxXSk6KHU9aFswXSxpPWhbMV0scy5pbnZlcnQmJih1PXMuaW52ZXJ0KHUpLGk9cy5pbnZlcnQoaSkpLHU+aSYmKGw9dSx1PWksaT1sKSkpLGMmJnM/W1tlLHVdLFtyLGldXTpjP1tlLHJdOnMmJlt1LGldKX0sbi5jbGVhcj1mdW5jdGlvbigpe3JldHVybiBuLmVtcHR5KCl8fChmPVswLDBdLGg9WzAsMF0sYT1vPW51bGwpLG59LG4uZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hIWMmJmZbMF09PWZbMV18fCEhcyYmaFswXT09aFsxXX0sb2EucmViaW5kKG4sbCwib24iKX07dmFyIFhsPXtuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LCRsPVtbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLFsiZSIsInciXSxbIm4iLCJzIl0sW11dLEJsPWhvLmZvcm1hdD1Nby50aW1lRm9ybWF0LFdsPUJsLnV0YyxKbD1XbCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7QmwuaXNvPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nJiYrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2VhOkpsLGVhLnBhcnNlPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBEYXRlKG4pO3JldHVybiBpc05hTih0KT9udWxsOnR9LGVhLnRvU3RyaW5nPUpsLnRvU3RyaW5nLGhvLnNlY29uZD1PbihmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGdvKDFlMypNYXRoLmZsb29yKG4vMWUzKSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzFlMypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfSksaG8uc2Vjb25kcz1oby5zZWNvbmQucmFuZ2UsaG8uc2Vjb25kcy51dGM9aG8uc2Vjb25kLnV0Yy5yYW5nZSxoby5taW51dGU9T24oZnVuY3Rpb24obil7cmV0dXJuIG5ldyBnbyg2ZTQqTWF0aC5mbG9vcihuLzZlNCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSs2ZTQqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX0pLGhvLm1pbnV0ZXM9aG8ubWludXRlLnJhbmdlLGhvLm1pbnV0ZXMudXRjPWhvLm1pbnV0ZS51dGMucmFuZ2UsaG8uaG91cj1PbihmdW5jdGlvbihuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBnbygzNmU1KihNYXRoLmZsb29yKG4vMzZlNS10KSt0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9KSxoby5ob3Vycz1oby5ob3VyLnJhbmdlLGhvLmhvdXJzLnV0Yz1oby5ob3VyLnV0Yy5yYW5nZSxoby5tb250aD1PbihmdW5jdGlvbihuKXtyZXR1cm4gbj1oby5kYXkobiksbi5zZXREYXRlKDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRNb250aChuLmdldE1vbnRoKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9KSxoby5tb250aHM9aG8ubW9udGgucmFuZ2UsaG8ubW9udGhzLnV0Yz1oby5tb250aC51dGMucmFuZ2U7dmFyIEdsPVsxZTMsNWUzLDE1ZTMsM2U0LDZlNCwzZTUsOWU1LDE4ZTUsMzZlNSwxMDhlNSwyMTZlNSw0MzJlNSw4NjRlNSwxNzI4ZTUsNjA0OGU1LDI1OTJlNiw3Nzc2ZTYsMzE1MzZlNl0sS2w9W1toby5zZWNvbmQsMV0sW2hvLnNlY29uZCw1XSxbaG8uc2Vjb25kLDE1XSxbaG8uc2Vjb25kLDMwXSxbaG8ubWludXRlLDFdLFtoby5taW51dGUsNV0sW2hvLm1pbnV0ZSwxNV0sW2hvLm1pbnV0ZSwzMF0sW2hvLmhvdXIsMV0sW2hvLmhvdXIsM10sW2hvLmhvdXIsNl0sW2hvLmhvdXIsMTJdLFtoby5kYXksMV0sW2hvLmRheSwyXSxbaG8ud2VlaywxXSxbaG8ubW9udGgsMV0sW2hvLm1vbnRoLDNdLFtoby55ZWFyLDFdXSxRbD1CbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKSYmMSE9bi5nZXREYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXREYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfV0sWyIlWSIsenRdXSksbmM9e3JhbmdlOmZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gb2EucmFuZ2UoTWF0aC5jZWlsKG4vZSkqZSwrdCxlKS5tYXAodWEpfSxmbG9vcjp5LGNlaWw6eX07S2wueWVhcj1oby55ZWFyLGhvLnNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHJhKG9hLnNjYWxlLmxpbmVhcigpLEtsLFFsKX07dmFyIHRjPUtsLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bblswXS51dGMsblsxXV19KSxlYz1XbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ1NlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0hvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENEYXkoKSYmMSE9bi5nZXRVVENEYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXRVVENEYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNb250aCgpfV0sWyIlWSIsenRdXSk7dGMueWVhcj1oby55ZWFyLnV0Yyxoby5zY2FsZS51dGM9ZnVuY3Rpb24oKXtyZXR1cm4gcmEob2Euc2NhbGUubGluZWFyKCksdGMsZWMpfSxvYS50ZXh0PUFuKGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlc3BvbnNlVGV4dH0pLG9hLmpzb249ZnVuY3Rpb24obix0KXtyZXR1cm4gQ24obiwiYXBwbGljYXRpb24vanNvbiIsaWEsdCl9LG9hLmh0bWw9ZnVuY3Rpb24obix0KXtyZXR1cm4gQ24obiwidGV4dC9odG1sIixhYSx0KX0sb2EueG1sPUFuKGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlc3BvbnNlWE1MfSksImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD8odGhpcy5kMz1vYSxkZWZpbmUob2EpKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9b2E6dGhpcy5kMz1vYX0oKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9leHRlcm5hbC9qcXVlcnkvanF1ZXJ5LmpzIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vZXh0ZXJuYWwvanF1ZXJ5L2pxdWVyeS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjNjQ4Mi4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9leHRlcm5hbC9qcXVlcnkvanF1ZXJ5LmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTc4OSArMCwwIEBACi0vKiEKLSAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMTAuMgotICogaHR0cDovL2pxdWVyeS5jb20vCi0gKgotICogSW5jbHVkZXMgU2l6emxlLmpzCi0gKiBodHRwOi8vc2l6emxlanMuY29tLwotICoKLSAqIENvcHlyaWdodCAyMDA1LCAyMDEzIGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnMKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQotICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQotICoKLSAqIERhdGU6IDIwMTMtMDctMDNUMTM6NDhaCi0gKi8KLShmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7Ci0KLS8vIENhbid0IGRvIHRoaXMgYmVjYXVzZSBzZXZlcmFsIGFwcHMgaW5jbHVkaW5nIEFTUC5ORVQgdHJhY2UKLS8vIHRoZSBzdGFjayB2aWEgYXJndW1lbnRzLmNhbGxlci5jYWxsZWUgYW5kIEZpcmVmb3ggZGllcyBpZgotLy8geW91IHRyeSB0byB0cmFjZSB0aHJvdWdoICJ1c2Ugc3RyaWN0IiBjYWxsIGNoYWlucy4gKCMxMzMzNSkKLS8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrCi0vLyJ1c2Ugc3RyaWN0IjsKLXZhcgotCS8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQotCXJlYWR5TGlzdCwKLQotCS8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQotCXJvb3RqUXVlcnksCi0KLQkvLyBTdXBwb3J0OiBJRTwxMAotCS8vIEZvciBgdHlwZW9mIHhtbE5vZGUubWV0aG9kYCBpbnN0ZWFkIG9mIGB4bWxOb2RlLm1ldGhvZCAhPT0gdW5kZWZpbmVkYAotCWNvcmVfc3RydW5kZWZpbmVkID0gdHlwZW9mIHVuZGVmaW5lZCwKLQotCS8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkKLQlsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbiwKLQlkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKLQlkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAotCi0JLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCi0JX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCi0KLQkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQotCV8kID0gd2luZG93LiQsCi0KLQkvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWlycwotCWNsYXNzMnR5cGUgPSB7fSwKLQotCS8vIExpc3Qgb2YgZGVsZXRlZCBkYXRhIGNhY2hlIGlkcywgc28gd2UgY2FuIHJldXNlIHRoZW0KLQljb3JlX2RlbGV0ZWRJZHMgPSBbXSwKLQotCWNvcmVfdmVyc2lvbiA9ICIxLjEwLjIiLAotCi0JLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcwotCWNvcmVfY29uY2F0ID0gY29yZV9kZWxldGVkSWRzLmNvbmNhdCwKLQljb3JlX3B1c2ggPSBjb3JlX2RlbGV0ZWRJZHMucHVzaCwKLQljb3JlX3NsaWNlID0gY29yZV9kZWxldGVkSWRzLnNsaWNlLAotCWNvcmVfaW5kZXhPZiA9IGNvcmVfZGVsZXRlZElkcy5pbmRleE9mLAotCWNvcmVfdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nLAotCWNvcmVfaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eSwKLQljb3JlX3RyaW0gPSBjb3JlX3ZlcnNpb24udHJpbSwKLQotCS8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5Ci0JalF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewotCQkvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCcKLQkJcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKLQl9LAotCi0JLy8gVXNlZCBmb3IgbWF0Y2hpbmcgbnVtYmVycwotCWNvcmVfcG51bSA9IC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLAotCi0JLy8gVXNlZCBmb3Igc3BsaXR0aW5nIG9uIHdoaXRlc3BhY2UKLQljb3JlX3Jub3R3aGl0ZSA9IC9cUysvZywKLQotCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUCAoaGVyZSdzIGxvb2tpbmcgYXQgeW91LCBTYWZhcmkgNS4wIGFuZCBJRSkKLQlydHJpbSA9IC9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZywKLQotCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzCi0JLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQotCS8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KQotCXJxdWlja0V4cHIgPSAvXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLAotCi0JLy8gTWF0Y2ggYSBzdGFuZGFsb25lIHRhZwotCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLAotCi0JLy8gSlNPTiBSZWdFeHAKLQlydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKLQlydmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAotCXJ2YWxpZGVzY2FwZSA9IC9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZywKLQlydmFsaWR0b2tlbnMgPSAvIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZCtcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvZywKLQotCS8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZwotCXJtc1ByZWZpeCA9IC9eLW1zLS8sCi0JcmRhc2hBbHBoYSA9IC8tKFtcZGEtel0pL2dpLAotCi0JLy8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKQotCWZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7Ci0JCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKLQl9LAotCi0JLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIKLQljb21wbGV0ZWQgPSBmdW5jdGlvbiggZXZlbnQgKSB7Ci0KLQkJLy8gcmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiBpcyBnb29kIGVub3VnaCBmb3IgdXMgdG8gY2FsbCB0aGUgZG9tIHJlYWR5IGluIG9sZElFCi0JCWlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciB8fCBldmVudC50eXBlID09PSAibG9hZCIgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKLQkJCWRldGFjaCgpOwotCQkJalF1ZXJ5LnJlYWR5KCk7Ci0JCX0KLQl9LAotCS8vIENsZWFuLXVwIG1ldGhvZCBmb3IgZG9tIHJlYWR5IGV2ZW50cwotCWRldGFjaCA9IGZ1bmN0aW9uKCkgewotCQlpZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7Ci0JCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKLQkJCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAibG9hZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsKLQotCQl9IGVsc2UgewotCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBjb21wbGV0ZWQgKTsKLQkJCXdpbmRvdy5kZXRhY2hFdmVudCggIm9ubG9hZCIsIGNvbXBsZXRlZCApOwotCQl9Ci0JfTsKLQotalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKLQkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCi0JanF1ZXJ5OiBjb3JlX3ZlcnNpb24sCi0KLQljb25zdHJ1Y3RvcjogalF1ZXJ5LAotCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeSApIHsKLQkJdmFyIG1hdGNoLCBlbGVtOwotCi0JCS8vIEhBTkRMRTogJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKLQkJaWYgKCAhc2VsZWN0b3IgKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKLQkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewotCQkJaWYgKCBzZWxlY3Rvci5jaGFyQXQoMCkgPT09ICI8IiAmJiBzZWxlY3Rvci5jaGFyQXQoIHNlbGVjdG9yLmxlbmd0aCAtIDEgKSA9PT0gIj4iICYmIHNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewotCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCi0JCQkJbWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJbWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7Ci0JCQl9Ci0KLQkJCS8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWQKLQkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsKLQotCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQotCQkJCWlmICggbWF0Y2hbMV0gKSB7Ci0JCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRleHQ7Ci0KLQkJCQkJLy8gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdAotCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCi0JCQkJCQltYXRjaFsxXSwKLQkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCi0JCQkJCQl0cnVlCi0JCQkJCSkgKTsKLQotCQkJCQkvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpCi0JCQkJCWlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsxXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7Ci0JCQkJCQlmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkgewotCQkJCQkJCS8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGUKLQkJCQkJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7Ci0JCQkJCQkJCXRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTsKLQotCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl0aGlzLmF0dHIoIG1hdGNoLCBjb250ZXh0WyBtYXRjaCBdICk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHRoaXM7Ci0KLQkJCQkvLyBIQU5ETEU6ICQoI2lkKQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsKLQotCQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucwotCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCi0JCQkJCWlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7Ci0JCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcwotCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECi0JCQkJCQlpZiAoIGVsZW0uaWQgIT09IG1hdGNoWzJdICkgewotCQkJCQkJCXJldHVybiByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKLQkJCQkJCXRoaXMubGVuZ3RoID0gMTsKLQkJCQkJCXRoaXNbMF0gPSBlbGVtOwotCQkJCQl9Ci0KLQkJCQkJdGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7Ci0JCQkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKLQkJCQkJcmV0dXJuIHRoaXM7Ci0JCQkJfQotCi0JCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQotCQkJfSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7Ci0JCQkJcmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsKLQotCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCi0JCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOwotCQkJfQotCi0JCS8vIEhBTkRMRTogJChET01FbGVtZW50KQotCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKLQkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKLQkJCXRoaXMubGVuZ3RoID0gMTsKLQkJCXJldHVybiB0aGlzOwotCi0JCS8vIEhBTkRMRTogJChmdW5jdGlvbikKLQkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5Ci0JCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewotCQkJcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICk7Ci0JCX0KLQotCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICE9PSB1bmRlZmluZWQgKSB7Ci0JCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7Ci0JCQl0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0OwotCQl9Ci0KLQkJcmV0dXJuIGpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yLCB0aGlzICk7Ci0JfSwKLQotCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKLQlzZWxlY3RvcjogIiIsCi0KLQkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKLQlsZW5ndGg6IDAsCi0KLQl0b0FycmF5OiBmdW5jdGlvbigpIHsKLQkJcmV0dXJuIGNvcmVfc2xpY2UuY2FsbCggdGhpcyApOwotCX0sCi0KLQkvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SCi0JLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKLQlnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7Ci0JCXJldHVybiBudW0gPT0gbnVsbCA/Ci0KLQkJCS8vIFJldHVybiBhICdjbGVhbicgYXJyYXkKLQkJCXRoaXMudG9BcnJheSgpIDoKLQotCQkJLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAotCQkJKCBudW0gPCAwID8gdGhpc1sgdGhpcy5sZW5ndGggKyBudW0gXSA6IHRoaXNbIG51bSBdICk7Ci0JfSwKLQotCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKLQkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKLQlwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHsKLQotCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAotCQl2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7Ci0KLQkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKLQkJcmV0LnByZXZPYmplY3QgPSB0aGlzOwotCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKLQotCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAotCQlyZXR1cm4gcmV0OwotCX0sCi0KLQkvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LgotCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCi0JLy8gb25seSB1c2VkIGludGVybmFsbHkuKQotCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHsKLQkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwotCX0sCi0KLQlyZWFkeTogZnVuY3Rpb24oIGZuICkgewotCQkvLyBBZGQgdGhlIGNhbGxiYWNrCi0JCWpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTsKLQotCQlyZXR1cm4gdGhpczsKLQl9LAotCi0Jc2xpY2U6IGZ1bmN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGNvcmVfc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7Ci0JfSwKLQotCWZpcnN0OiBmdW5jdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKLQl9LAotCi0JbGFzdDogZnVuY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVxKCAtMSApOwotCX0sCi0KLQllcTogZnVuY3Rpb24oIGkgKSB7Ci0JCXZhciBsZW4gPSB0aGlzLmxlbmd0aCwKLQkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7Ci0JCXJldHVybiB0aGlzLnB1c2hTdGFjayggaiA+PSAwICYmIGogPCBsZW4gPyBbIHRoaXNbal0gXSA6IFtdICk7Ci0JfSwKLQotCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewotCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7Ci0JCQlyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApOwotCQl9KSk7Ci0JfSwKLQotCWVuZDogZnVuY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKLQl9LAotCi0JLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgotCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgotCXB1c2g6IGNvcmVfcHVzaCwKLQlzb3J0OiBbXS5zb3J0LAotCXNwbGljZTogW10uc3BsaWNlCi19OwotCi0vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCi1qUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47Ci0KLWpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Ci0JdmFyIHNyYywgY29weUlzQXJyYXksIGNvcHksIG5hbWUsIG9wdGlvbnMsIGNsb25lLAotCQl0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sCi0JCWkgPSAxLAotCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAotCQlkZWVwID0gZmFsc2U7Ci0KLQkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCi0JaWYgKCB0eXBlb2YgdGFyZ2V0ID09PSAiYm9vbGVhbiIgKSB7Ci0JCWRlZXAgPSB0YXJnZXQ7Ci0JCXRhcmdldCA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKLQkJLy8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldAotCQlpID0gMjsKLQl9Ci0KLQkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKLQlpZiAoIHR5cGVvZiB0YXJnZXQgIT09ICJvYmplY3QiICYmICFqUXVlcnkuaXNGdW5jdGlvbih0YXJnZXQpICkgewotCQl0YXJnZXQgPSB7fTsKLQl9Ci0KLQkvLyBleHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWQKLQlpZiAoIGxlbmd0aCA9PT0gaSApIHsKLQkJdGFyZ2V0ID0gdGhpczsKLQkJLS1pOwotCX0KLQotCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewotCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCi0JCWlmICggKG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSkgIT0gbnVsbCApIHsKLQkJCS8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3QKLQkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKLQkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKLQkJCQljb3B5ID0gb3B0aW9uc1sgbmFtZSBdOwotCi0JCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAotCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5ICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKLQkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5KGNvcHkpKSApICkgewotCQkJCQlpZiAoIGNvcHlJc0FycmF5ICkgewotCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKLQkJCQkJCWNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9OwotCQkJCQl9Ci0KLQkJCQkJLy8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCi0JCQkJCXRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTsKLQotCQkJCS8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKLQkJCQl9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7Ci0JCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAotCXJldHVybiB0YXJnZXQ7Ci19OwotCi1qUXVlcnkuZXh0ZW5kKHsKLQkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKLQkvLyBOb24tZGlnaXRzIHJlbW92ZWQgdG8gbWF0Y2ggcmlubGluZWpRdWVyeQotCWV4cGFuZG86ICJqUXVlcnkiICsgKCBjb3JlX3ZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xEL2csICIiICksCi0KLQlub0NvbmZsaWN0OiBmdW5jdGlvbiggZGVlcCApIHsKLQkJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgewotCQkJd2luZG93LiQgPSBfJDsKLQkJfQotCi0JCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7Ci0JCQl3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTsKLQkJfQotCi0JCXJldHVybiBqUXVlcnk7Ci0JfSwKLQotCS8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuCi0JaXNSZWFkeTogZmFsc2UsCi0KLQkvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlCi0JLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKLQlyZWFkeVdhaXQ6IDEsCi0KLQkvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKLQlob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkgewotCQlpZiAoIGhvbGQgKSB7Ci0JCQlqUXVlcnkucmVhZHlXYWl0Kys7Ci0JCX0gZWxzZSB7Ci0JCQlqUXVlcnkucmVhZHkoIHRydWUgKTsKLQkJfQotCX0sCi0KLQkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5Ci0JcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewotCi0JCS8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHkKLQkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCi0JCWlmICggIWRvY3VtZW50LmJvZHkgKSB7Ci0JCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7Ci0JCX0KLQotCQkvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKLQkJalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOwotCi0JCS8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlCi0JCWlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQotCQlyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7Ci0KLQkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCi0JCWlmICggalF1ZXJ5LmZuLnRyaWdnZXIgKSB7Ci0JCQlqUXVlcnkoIGRvY3VtZW50ICkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iik7Ci0JCX0KLQl9LAotCi0JLy8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBkZXRhaWxzIGNvbmNlcm5pbmcgaXNGdW5jdGlvbi4KLQkvLyBTaW5jZSB2ZXJzaW9uIDEuMywgRE9NIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBsaWtlIGFsZXJ0Ci0JLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KLQlpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkgewotCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImZ1bmN0aW9uIjsKLQl9LAotCi0JaXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiggb2JqICkgewotCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKLQl9LAotCi0JaXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7Ci0JCS8qIGpzaGludCBlcWVxZXE6IGZhbHNlICovCi0JCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT0gb2JqLndpbmRvdzsKLQl9LAotCi0JaXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkgewotCQlyZXR1cm4gIWlzTmFOKCBwYXJzZUZsb2F0KG9iaikgKSAmJiBpc0Zpbml0ZSggb2JqICk7Ci0JfSwKLQotCXR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7Ci0JCWlmICggb2JqID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gU3RyaW5nKCBvYmogKTsKLQkJfQotCQlyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/Ci0JCQljbGFzczJ0eXBlWyBjb3JlX3RvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiIDoKLQkJCXR5cGVvZiBvYmo7Ci0JfSwKLQotCWlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7Ci0JCXZhciBrZXk7Ci0KLQkJLy8gTXVzdCBiZSBhbiBPYmplY3QuCi0JCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgotCQkvLyBNYWtlIHN1cmUgdGhhdCBET00gbm9kZXMgYW5kIHdpbmRvdyBvYmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMgd2VsbAotCQlpZiAoICFvYmogfHwgalF1ZXJ5LnR5cGUob2JqKSAhPT0gIm9iamVjdCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdAotCQkJaWYgKCBvYmouY29uc3RydWN0b3IgJiYKLQkJCQkhY29yZV9oYXNPd24uY2FsbChvYmosICJjb25zdHJ1Y3RvciIpICYmCi0JCQkJIWNvcmVfaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKSApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gY2F0Y2ggKCBlICkgewotCQkJLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBTdXBwb3J0OiBJRTw5Ci0JCS8vIEhhbmRsZSBpdGVyYXRpb24gb3ZlciBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWZvcmUgb3duIHByb3BlcnRpZXMuCi0JCWlmICggalF1ZXJ5LnN1cHBvcnQub3duTGFzdCApIHsKLQkJCWZvciAoIGtleSBpbiBvYmogKSB7Ci0JCQkJcmV0dXJuIGNvcmVfaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCwKLQkJLy8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd24uCi0JCWZvciAoIGtleSBpbiBvYmogKSB7fQotCi0JCXJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBjb3JlX2hhc093bi5jYWxsKCBvYmosIGtleSApOwotCX0sCi0KLQlpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewotCQl2YXIgbmFtZTsKLQkJZm9yICggbmFtZSBpbiBvYmogKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfSwKLQotCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewotCQl0aHJvdyBuZXcgRXJyb3IoIG1zZyApOwotCX0sCi0KLQkvLyBkYXRhOiBzdHJpbmcgb2YgaHRtbAotCS8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQKLQkvLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nCi0JcGFyc2VIVE1MOiBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7Ci0JCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewotCQkJa2VlcFNjcmlwdHMgPSBjb250ZXh0OwotCQkJY29udGV4dCA9IGZhbHNlOwotCQl9Ci0JCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwotCi0JCXZhciBwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSwKLQkJCXNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107Ci0KLQkJLy8gU2luZ2xlIHRhZwotCQlpZiAoIHBhcnNlZCApIHsKLQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWzFdICkgXTsKLQkJfQotCi0JCXBhcnNlZCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApOwotCQlpZiAoIHNjcmlwdHMgKSB7Ci0JCQlqUXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTsKLQl9LAotCi0JcGFyc2VKU09OOiBmdW5jdGlvbiggZGF0YSApIHsKLQkJLy8gQXR0ZW1wdCB0byBwYXJzZSB1c2luZyB0aGUgbmF0aXZlIEpTT04gcGFyc2VyIGZpcnN0Ci0JCWlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7Ci0JCQlyZXR1cm4gd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKTsKLQkJfQotCi0JCWlmICggZGF0YSA9PT0gbnVsbCApIHsKLQkJCXJldHVybiBkYXRhOwotCQl9Ci0KLQkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7Ci0KLQkJCS8vIE1ha2Ugc3VyZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCAoSUUgY2FuJ3QgaGFuZGxlIGl0KQotCQkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7Ci0KLQkJCWlmICggZGF0YSApIHsKLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGluY29taW5nIGRhdGEgaXMgYWN0dWFsIEpTT04KLQkJCQkvLyBMb2dpYyBib3Jyb3dlZCBmcm9tIGh0dHA6Ly9qc29uLm9yZy9qc29uMi5qcwotCQkJCWlmICggcnZhbGlkY2hhcnMudGVzdCggZGF0YS5yZXBsYWNlKCBydmFsaWRlc2NhcGUsICJAIiApCi0JCQkJCS5yZXBsYWNlKCBydmFsaWR0b2tlbnMsICJdIiApCi0JCQkJCS5yZXBsYWNlKCBydmFsaWRicmFjZXMsICIiKSkgKSB7Ci0KLQkJCQkJcmV0dXJuICggbmV3IEZ1bmN0aW9uKCAicmV0dXJuICIgKyBkYXRhICkgKSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKLQl9LAotCi0JLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwotCXBhcnNlWE1MOiBmdW5jdGlvbiggZGF0YSApIHsKLQkJdmFyIHhtbCwgdG1wOwotCQlpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCi0JCQkJdG1wID0gbmV3IERPTVBhcnNlcigpOwotCQkJCXhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCAidGV4dC94bWwiICk7Ci0JCQl9IGVsc2UgeyAvLyBJRQotCQkJCXhtbCA9IG5ldyBBY3RpdmVYT2JqZWN0KCAiTWljcm9zb2Z0LlhNTERPTSIgKTsKLQkJCQl4bWwuYXN5bmMgPSAiZmFsc2UiOwotCQkJCXhtbC5sb2FkWE1MKCBkYXRhICk7Ci0JCQl9Ci0JCX0gY2F0Y2goIGUgKSB7Ci0JCQl4bWwgPSB1bmRlZmluZWQ7Ci0JCX0KLQkJaWYgKCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKLQkJCWpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOwotCQl9Ci0JCXJldHVybiB4bWw7Ci0JfSwKLQotCW5vb3A6IGZ1bmN0aW9uKCkge30sCi0KLQkvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAotCS8vIFdvcmthcm91bmRzIGJhc2VkIG9uIGZpbmRpbmdzIGJ5IEppbSBEcmlzY29sbAotCS8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dAotCWdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBkYXRhICkgewotCQlpZiAoIGRhdGEgJiYgalF1ZXJ5LnRyaW0oIGRhdGEgKSApIHsKLQkJCS8vIFdlIHVzZSBleGVjU2NyaXB0IG9uIEludGVybmV0IEV4cGxvcmVyCi0JCQkvLyBXZSB1c2UgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4dCBpcyB3aW5kb3cKLQkJCS8vIHJhdGhlciB0aGFuIGpRdWVyeSBpbiBGaXJlZm94Ci0JCQkoIHdpbmRvdy5leGVjU2NyaXB0IHx8IGZ1bmN0aW9uKCBkYXRhICkgewotCQkJCXdpbmRvd1sgImV2YWwiIF0uY2FsbCggd2luZG93LCBkYXRhICk7Ci0JCQl9ICkoIGRhdGEgKTsKLQkJfQotCX0sCi0KLQkvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCi0JLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKQotCWNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHsKLQkJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwotCX0sCi0KLQlub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0JCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCX0sCi0KLQkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5Ci0JZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2ssIGFyZ3MgKSB7Ci0JCXZhciB2YWx1ZSwKLQkJCWkgPSAwLAotCQkJbGVuZ3RoID0gb2JqLmxlbmd0aCwKLQkJCWlzQXJyYXkgPSBpc0FycmF5bGlrZSggb2JqICk7Ci0KLQkJaWYgKCBhcmdzICkgewotCQkJaWYgKCBpc0FycmF5ICkgewotCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewotCQkJCQl2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApOwotCi0JCQkJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoIGkgaW4gb2JqICkgewotCQkJCQl2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJncyApOwotCi0JCQkJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKLQkJfSBlbHNlIHsKLQkJCWlmICggaXNBcnJheSApIHsKLQkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKLQkJCQkJdmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKLQotCQkJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKCBpIGluIG9iaiApIHsKLQkJCQkJdmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKTsKLQotCQkJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9LAotCi0JLy8gVXNlIG5hdGl2ZSBTdHJpbmcudHJpbSBmdW5jdGlvbiB3aGVyZXZlciBwb3NzaWJsZQotCXRyaW06IGNvcmVfdHJpbSAmJiAhY29yZV90cmltLmNhbGwoIlx1RkVGRlx4QTAiKSA/Ci0JCWZ1bmN0aW9uKCB0ZXh0ICkgewotCQkJcmV0dXJuIHRleHQgPT0gbnVsbCA/Ci0JCQkJIiIgOgotCQkJCWNvcmVfdHJpbS5jYWxsKCB0ZXh0ICk7Ci0JCX0gOgotCi0JCS8vIE90aGVyd2lzZSB1c2Ugb3VyIG93biB0cmltbWluZyBmdW5jdGlvbmFsaXR5Ci0JCWZ1bmN0aW9uKCB0ZXh0ICkgewotCQkJcmV0dXJuIHRleHQgPT0gbnVsbCA/Ci0JCQkJIiIgOgotCQkJCSggdGV4dCArICIiICkucmVwbGFjZSggcnRyaW0sICIiICk7Ci0JCX0sCi0KLQkvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5Ci0JbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewotCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKLQotCQlpZiAoIGFyciAhPSBudWxsICkgewotCQkJaWYgKCBpc0FycmF5bGlrZSggT2JqZWN0KGFycikgKSApIHsKLQkJCQlqUXVlcnkubWVyZ2UoIHJldCwKLQkJCQkJdHlwZW9mIGFyciA9PT0gInN0cmluZyIgPwotCQkJCQlbIGFyciBdIDogYXJyCi0JCQkJKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29yZV9wdXNoLmNhbGwoIHJldCwgYXJyICk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0sCi0KLQlpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkgewotCQl2YXIgbGVuOwotCi0JCWlmICggYXJyICkgewotCQkJaWYgKCBjb3JlX2luZGV4T2YgKSB7Ci0JCQkJcmV0dXJuIGNvcmVfaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTsKLQkJCX0KLQotCQkJbGVuID0gYXJyLmxlbmd0aDsKLQkJCWkgPSBpID8gaSA8IDAgPyBNYXRoLm1heCggMCwgbGVuICsgaSApIDogaSA6IDA7Ci0KLQkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewotCQkJCS8vIFNraXAgYWNjZXNzaW5nIGluIHNwYXJzZSBhcnJheXMKLQkJCQlpZiAoIGkgaW4gYXJyICYmIGFyclsgaSBdID09PSBlbGVtICkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gLTE7Ci0JfSwKLQotCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKLQkJdmFyIGwgPSBzZWNvbmQubGVuZ3RoLAotCQkJaSA9IGZpcnN0Lmxlbmd0aCwKLQkJCWogPSAwOwotCi0JCWlmICggdHlwZW9mIGwgPT09ICJudW1iZXIiICkgewotCQkJZm9yICggOyBqIDwgbDsgaisrICkgewotCQkJCWZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdOwotCQkJfQotCQl9IGVsc2UgewotCQkJd2hpbGUgKCBzZWNvbmRbal0gIT09IHVuZGVmaW5lZCApIHsKLQkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGorKyBdOwotCQkJfQotCQl9Ci0KLQkJZmlyc3QubGVuZ3RoID0gaTsKLQotCQlyZXR1cm4gZmlyc3Q7Ci0JfSwKLQotCWdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiApIHsKLQkJdmFyIHJldFZhbCwKLQkJCXJldCA9IFtdLAotCQkJaSA9IDAsCi0JCQlsZW5ndGggPSBlbGVtcy5sZW5ndGg7Ci0JCWludiA9ICEhaW52OwotCi0JCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKLQkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KLQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Ci0JCQlyZXRWYWwgPSAhIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7Ci0JCQlpZiAoIGludiAhPT0gcmV0VmFsICkgewotCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0sCi0KLQkvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKLQltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKLQkJdmFyIHZhbHVlLAotCQkJaSA9IDAsCi0JCQlsZW5ndGggPSBlbGVtcy5sZW5ndGgsCi0JCQlpc0FycmF5ID0gaXNBcnJheWxpa2UoIGVsZW1zICksCi0JCQlyZXQgPSBbXTsKLQotCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKLQkJaWYgKCBpc0FycmF5ICkgewotCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7Ci0JCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7Ci0KLQkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0JCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7Ci0JCQkJfQotCQkJfQotCi0JCS8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsCi0JCX0gZWxzZSB7Ci0JCQlmb3IgKCBpIGluIGVsZW1zICkgewotCQkJCXZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApOwotCi0JCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewotCQkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKLQkJcmV0dXJuIGNvcmVfY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7Ci0JfSwKLQotCS8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0cwotCWd1aWQ6IDEsCi0KLQkvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnkKLQkvLyBhcmd1bWVudHMuCi0JcHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHsKLQkJdmFyIGFyZ3MsIHByb3h5LCB0bXA7Ci0KLQkJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7Ci0JCQl0bXAgPSBmblsgY29udGV4dCBdOwotCQkJY29udGV4dCA9IGZuOwotCQkJZm4gPSB0bXA7Ci0JCX0KLQotCQkvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlYwotCQkvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLgotCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKLQkJCXJldHVybiB1bmRlZmluZWQ7Ci0JCX0KLQotCQkvLyBTaW11bGF0ZWQgYmluZAotCQlhcmdzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKLQkJcHJveHkgPSBmdW5jdGlvbigpIHsKLQkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Ci0JCX07Ci0KLQkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCi0JCXByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwotCi0JCXJldHVybiBwcm94eTsKLQl9LAotCi0JLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi0JLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCi0JYWNjZXNzOiBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7Ci0JCXZhciBpID0gMCwKLQkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKLQkJCWJ1bGsgPSBrZXkgPT0gbnVsbDsKLQotCQkvLyBTZXRzIG1hbnkgdmFsdWVzCi0JCWlmICggalF1ZXJ5LnR5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKLQkJCWNoYWluYWJsZSA9IHRydWU7Ci0JCQlmb3IgKCBpIGluIGtleSApIHsKLQkJCQlqUXVlcnkuYWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVtpXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApOwotCQkJfQotCi0JCS8vIFNldHMgb25lIHZhbHVlCi0JCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7Ci0JCQljaGFpbmFibGUgPSB0cnVlOwotCi0JCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKLQkJCQlyYXcgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoIGJ1bGsgKSB7Ci0JCQkJLy8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0Ci0JCQkJaWYgKCByYXcgKSB7Ci0JCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwotCQkJCQlmbiA9IG51bGw7Ci0KLQkJCQkvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzCi0JCQkJfSBlbHNlIHsKLQkJCQkJYnVsayA9IGZuOwotCQkJCQlmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkgewotCQkJCQkJcmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7Ci0JCQkJCX07Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIGZuICkgewotCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewotCQkJCQlmbiggZWxlbXNbaV0sIGtleSwgcmF3ID8gdmFsdWUgOiB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApICk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoYWluYWJsZSA/Ci0JCQllbGVtcyA6Ci0KLQkJCS8vIEdldHMKLQkJCWJ1bGsgPwotCQkJCWZuLmNhbGwoIGVsZW1zICkgOgotCQkJCWxlbmd0aCA/IGZuKCBlbGVtc1swXSwga2V5ICkgOiBlbXB0eUdldDsKLQl9LAotCi0Jbm93OiBmdW5jdGlvbigpIHsKLQkJcmV0dXJuICggbmV3IERhdGUoKSApLmdldFRpbWUoKTsKLQl9LAotCi0JLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucy4KLQkvLyBOb3RlOiB0aGlzIG1ldGhvZCBiZWxvbmdzIHRvIHRoZSBjc3MgbW9kdWxlIGJ1dCBpdCdzIG5lZWRlZCBoZXJlIGZvciB0aGUgc3VwcG9ydCBtb2R1bGUuCi0JLy8gSWYgc3VwcG9ydCBnZXRzIG1vZHVsYXJpemVkLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgY3NzIG1vZHVsZS4KLQlzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Ci0JCXZhciByZXQsIG5hbWUsCi0JCQlvbGQgPSB7fTsKLQotCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKLQkJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewotCQkJb2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07Ci0JCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07Ci0JCX0KLQotCQlyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwotCi0JCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwotCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7Ci0JCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTsKLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfQotfSk7Ci0KLWpRdWVyeS5yZWFkeS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHsKLQlpZiAoICFyZWFkeUxpc3QgKSB7Ci0KLQkJcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7Ci0KLQkJLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuCi0JCS8vIHdlIG9uY2UgdHJpZWQgdG8gdXNlIHJlYWR5U3RhdGUgImludGVyYWN0aXZlIiBoZXJlLCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmUKLQkJLy8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNQotCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7Ci0JCQkvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHkKLQkJCXNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwotCi0JCS8vIFN0YW5kYXJkcy1iYXNlZCBicm93c2VycyBzdXBwb3J0IERPTUNvbnRlbnRMb2FkZWQKLQkJfSBlbHNlIGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKLQkJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKLQkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOwotCi0JCQkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawotCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICJsb2FkIiwgY29tcGxldGVkLCBmYWxzZSApOwotCi0JCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKLQkJfSBlbHNlIHsKLQkJCS8vIEVuc3VyZSBmaXJpbmcgYmVmb3JlIG9ubG9hZCwgbWF5YmUgbGF0ZSBidXQgc2FmZSBhbHNvIGZvciBpZnJhbWVzCi0JCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGNvbXBsZXRlZCApOwotCi0JCQkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawotCQkJd2luZG93LmF0dGFjaEV2ZW50KCAib25sb2FkIiwgY29tcGxldGVkICk7Ci0KLQkJCS8vIElmIElFIGFuZCBub3QgYSBmcmFtZQotCQkJLy8gY29udGludWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeQotCQkJdmFyIHRvcCA9IGZhbHNlOwotCi0JCQl0cnkgewotCQkJCXRvcCA9IHdpbmRvdy5mcmFtZUVsZW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Ci0JCQl9IGNhdGNoKGUpIHt9Ci0KLQkJCWlmICggdG9wICYmIHRvcC5kb1Njcm9sbCApIHsKLQkJCQkoZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHsKLQkJCQkJaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7Ci0KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gVXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKLQkJCQkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwotCQkJCQkJCXRvcC5kb1Njcm9sbCgibGVmdCIpOwotCQkJCQkJfSBjYXRjaChlKSB7Ci0JCQkJCQkJcmV0dXJuIHNldFRpbWVvdXQoIGRvU2Nyb2xsQ2hlY2ssIDUwICk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGRldGFjaCBhbGwgZG9tIHJlYWR5IGV2ZW50cwotCQkJCQkJZGV0YWNoKCk7Ci0KLQkJCQkJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucwotCQkJCQkJalF1ZXJ5LnJlYWR5KCk7Ci0JCQkJCX0KLQkJCQl9KSgpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2JqICk7Ci19OwotCi0vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXAKLWpRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7Ci0JY2xhc3MydHlwZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLX0pOwotCi1mdW5jdGlvbiBpc0FycmF5bGlrZSggb2JqICkgewotCXZhciBsZW5ndGggPSBvYmoubGVuZ3RoLAotCQl0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApOwotCi0JaWYgKCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JaWYgKCBvYmoubm9kZVR5cGUgPT09IDEgJiYgbGVuZ3RoICkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCB0eXBlICE9PSAiZnVuY3Rpb24iICYmCi0JCSggbGVuZ3RoID09PSAwIHx8Ci0JCXR5cGVvZiBsZW5ndGggPT09ICJudW1iZXIiICYmIGxlbmd0aCA+IDAgJiYgKCBsZW5ndGggLSAxICkgaW4gb2JqICk7Ci19Ci0KLS8vIEFsbCBqUXVlcnkgb2JqZWN0cyBzaG91bGQgcG9pbnQgYmFjayB0byB0aGVzZQotcm9vdGpRdWVyeSA9IGpRdWVyeShkb2N1bWVudCk7Ci0vKiEKLSAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYxLjEwLjIKLSAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCi0gKgotICogQ29weXJpZ2h0IDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwotICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCi0gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCi0gKgotICogRGF0ZTogMjAxMy0wNy0wMwotICovCi0oZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZpbmVkICkgewotCi12YXIgaSwKLQlzdXBwb3J0LAotCWNhY2hlZHJ1bnMsCi0JRXhwciwKLQlnZXRUZXh0LAotCWlzWE1MLAotCWNvbXBpbGUsCi0Jb3V0ZXJtb3N0Q29udGV4dCwKLQlzb3J0SW5wdXQsCi0KLQkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCi0Jc2V0RG9jdW1lbnQsCi0JZG9jdW1lbnQsCi0JZG9jRWxlbSwKLQlkb2N1bWVudElzSFRNTCwKLQlyYnVnZ3lRU0EsCi0JcmJ1Z2d5TWF0Y2hlcywKLQltYXRjaGVzLAotCWNvbnRhaW5zLAotCi0JLy8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YQotCWV4cGFuZG8gPSAic2l6emxlIiArIC0obmV3IERhdGUoKSksCi0JcHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LAotCWRpcnJ1bnMgPSAwLAotCWRvbmUgPSAwLAotCWNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAotCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAotCWNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAotCWhhc0R1cGxpY2F0ZSA9IGZhbHNlLAotCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgewotCQlpZiAoIGEgPT09IGIgKSB7Ci0JCQloYXNEdXBsaWNhdGUgPSB0cnVlOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfSwKLQotCS8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHMKLQlzdHJ1bmRlZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkLAotCU1BWF9ORUdBVElWRSA9IDEgPDwgMzEsCi0KLQkvLyBJbnN0YW5jZSBtZXRob2RzCi0JaGFzT3duID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSwKLQlhcnIgPSBbXSwKLQlwb3AgPSBhcnIucG9wLAotCXB1c2hfbmF0aXZlID0gYXJyLnB1c2gsCi0JcHVzaCA9IGFyci5wdXNoLAotCXNsaWNlID0gYXJyLnNsaWNlLAotCS8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBpZiB3ZSBjYW4ndCB1c2UgYSBuYXRpdmUgb25lCi0JaW5kZXhPZiA9IGFyci5pbmRleE9mIHx8IGZ1bmN0aW9uKCBlbGVtICkgewotCQl2YXIgaSA9IDAsCi0JCQlsZW4gPSB0aGlzLmxlbmd0aDsKLQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0JCQlpZiAoIHRoaXNbaV0gPT09IGVsZW0gKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0sCi0KLQlib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCi0KLQkvLyBSZWd1bGFyIGV4cHJlc3Npb25zCi0KLQkvLyBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2UKLQl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAotCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0ZXJzCi0JY2hhcmFjdGVyRW5jb2RpbmcgPSAiKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLAotCi0JLy8gTG9vc2VseSBtb2RlbGVkIG9uIENTUyBpZGVudGlmaWVyIGNoYXJhY3RlcnMKLQkvLyBBbiB1bnF1b3RlZCB2YWx1ZSBzaG91bGQgYmUgYSBDU1MgaWRlbnRpZmllciBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwotCS8vIFByb3BlciBzeW50YXg6IGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgotCWlkZW50aWZpZXIgPSBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3IyIgKSwKLQotCS8vIEFjY2VwdGFibGUgb3BlcmF0b3JzIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwotCWF0dHJpYnV0ZXMgPSAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKyB3aGl0ZXNwYWNlICsKLQkJIiooPzooWypeJHwhfl0/PSkiICsgd2hpdGVzcGFjZSArICIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIiArIGlkZW50aWZpZXIgKyAiKXwpfCkiICsgd2hpdGVzcGFjZSArICIqXFxdIiwKLQotCS8vIFByZWZlciBhcmd1bWVudHMgcXVvdGVkLAotCS8vICAgdGhlbiBub3QgY29udGFpbmluZyBwc2V1ZG9zL2JyYWNrZXRzLAotCS8vICAgdGhlbiBhdHRyaWJ1dGUgc2VsZWN0b3JzL25vbi1wYXJlbnRoZXRpY2FsIGV4cHJlc3Npb25zLAotCS8vICAgdGhlbiBhbnl0aGluZyBlbHNlCi0JLy8gVGhlc2UgcHJlZmVyZW5jZXMgYXJlIGhlcmUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzCi0JLy8gICBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBQU0VVRE8gcHJlRmlsdGVyCi0JcHNldWRvcyA9ICI6KCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpKD86XFwoKChbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IiArIGF0dHJpYnV0ZXMucmVwbGFjZSggMywgOCApICsgIikqKXwuKilcXCl8KSIsCi0KLQkvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyCi0JcnRyaW0gPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIgKyB3aGl0ZXNwYWNlICsgIiskIiwgImciICksCi0KLQlyY29tbWEgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiosIiArIHdoaXRlc3BhY2UgKyAiKiIgKSwKLQlyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiooWz4rfl18IiArIHdoaXRlc3BhY2UgKyAiKSIgKyB3aGl0ZXNwYWNlICsgIioiICksCi0KLQlyc2libGluZyA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyAiKlsrfl0iICksCi0JcmF0dHJpYnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAoICI9IiArIHdoaXRlc3BhY2UgKyAiKihbXlxcXSdcIl0qKSIgKyB3aGl0ZXNwYWNlICsgIipcXF0iLCAiZyIgKSwKLQotCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCi0JcmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCAiXiIgKyBpZGVudGlmaWVyICsgIiQiICksCi0KLQltYXRjaEV4cHIgPSB7Ci0JCSJJRCI6IG5ldyBSZWdFeHAoICJeIygiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwKLQkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGNoYXJhY3RlckVuY29kaW5nICsgIikiICksCi0JCSJUQUciOiBuZXcgUmVnRXhwKCAiXigiICsgY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyoiICkgKyAiKSIgKSwKLQkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCi0JCSJQU0VVRE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCi0JCSJDSElMRCI6IG5ldyBSZWdFeHAoICJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiICsgd2hpdGVzcGFjZSArCi0JCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwotCQkJIiooXFxkKyl8KSkiICsgd2hpdGVzcGFjZSArICIqXFwpfCkiLCAiaSIgKSwKLQkJImJvb2wiOiBuZXcgUmVnRXhwKCAiXig/OiIgKyBib29sZWFucyArICIpJCIsICJpIiApLAotCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKLQkJLy8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YAotCQkibmVlZHNDb250ZXh0IjogbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiICsKLQkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQotCX0sCi0KLQlybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAotCi0JLy8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzCi0JcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCi0KLQlyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKLQlyaGVhZGVyID0gL15oXGQkL2ksCi0KLQlyZXNjYXBlID0gLyd8XFwvZywKLQotCS8vIENTUyBlc2NhcGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKLQlydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCAiXFxcXChbXFxkYS1mXXsxLDZ9IiArIHdoaXRlc3BhY2UgKyAiP3woIiArIHdoaXRlc3BhY2UgKyAiKXwuKSIsICJpZyIgKSwKLQlmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7Ci0JCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwotCQkvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludAotCQkvLyBTdXBwb3J0OiBGaXJlZm94Ci0JCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKLQkJcmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgPwotCQkJZXNjYXBlZCA6Ci0JCQkvLyBCTVAgY29kZXBvaW50Ci0JCQloaWdoIDwgMCA/Ci0JCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6Ci0JCQkJLy8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpCi0JCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Ci0JfTsKLQotLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKLXRyeSB7Ci0JcHVzaC5hcHBseSgKLQkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAotCQlwcmVmZXJyZWREb2MuY2hpbGROb2RlcwotCSk7Ci0JLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKLQkvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5Ci0JYXJyWyBwcmVmZXJyZWREb2MuY2hpbGROb2Rlcy5sZW5ndGggXS5ub2RlVHlwZTsKLX0gY2F0Y2ggKCBlICkgewotCXB1c2ggPSB7IGFwcGx5OiBhcnIubGVuZ3RoID8KLQotCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQotCQlmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7Ci0JCQlwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTsKLQkJfSA6Ci0KLQkJLy8gU3VwcG9ydDogSUU8OQotCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5Ci0JCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKLQkJCXZhciBqID0gdGFyZ2V0Lmxlbmd0aCwKLQkJCQlpID0gMDsKLQkJCS8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aAotCQkJd2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fQotCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwotCQl9Ci0JfTsKLX0KLQotZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsKLQl2YXIgbWF0Y2gsIGVsZW0sIG0sIG5vZGVUeXBlLAotCQkvLyBRU0EgdmFycwotCQlpLCBncm91cHMsIG9sZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjsKLQotCWlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7Ci0JCXNldERvY3VtZW50KCBjb250ZXh0ICk7Ci0JfQotCi0JY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7Ci0JcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107Ci0KLQlpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlpZiAoIChub2RlVHlwZSA9IGNvbnRleHQubm9kZVR5cGUpICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICkgewotCQlyZXR1cm4gW107Ci0JfQotCi0JaWYgKCBkb2N1bWVudElzSFRNTCAmJiAhc2VlZCApIHsKLQotCQkvLyBTaG9ydGN1dHMKLQkJaWYgKCAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewotCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiI0lEIikKLQkJCWlmICggKG0gPSBtYXRjaFsxXSkgKSB7Ci0JCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKLQkJCQkJZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKTsKLQkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKLQkJCQkJLy8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2MwotCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgewotCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXMKLQkJCQkJCS8vIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAotCQkJCQkJaWYgKCBlbGVtLmlkID09PSBtICkgewotCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwotCQkJCQkJCXJldHVybiByZXN1bHRzOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHJlc3VsdHM7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDb250ZXh0IGlzIG5vdCBhIGRvY3VtZW50Ci0JCQkJCWlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCi0JCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmIGVsZW0uaWQgPT09IG0gKSB7Ci0JCQkJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsKLQkJCQkJCXJldHVybiByZXN1bHRzOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkvLyBTcGVlZC11cDogU2l6emxlKCJUQUciKQotCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7Ci0JCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwotCQkJCXJldHVybiByZXN1bHRzOwotCi0JCQkvLyBTcGVlZC11cDogU2l6emxlKCIuQ0xBU1MiKQotCQkJfSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKLQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApOwotCQkJCXJldHVybiByZXN1bHRzOwotCQkJfQotCQl9Ci0KLQkJLy8gUVNBIHBhdGgKLQkJaWYgKCBzdXBwb3J0LnFzYSAmJiAoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkgewotCQkJbmlkID0gb2xkID0gZXhwYW5kbzsKLQkJCW5ld0NvbnRleHQgPSBjb250ZXh0OwotCQkJbmV3U2VsZWN0b3IgPSBub2RlVHlwZSA9PT0gOSAmJiBzZWxlY3RvcjsKLQotCQkJLy8gcVNBIHdvcmtzIHN0cmFuZ2VseSBvbiBFbGVtZW50LXJvb3RlZCBxdWVyaWVzCi0JCQkvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290Ci0JCQkvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSkKLQkJCS8vIElFIDggZG9lc24ndCB3b3JrIG9uIG9iamVjdCBlbGVtZW50cwotCQkJaWYgKCBub2RlVHlwZSA9PT0gMSAmJiBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJvYmplY3QiICkgewotCQkJCWdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApOwotCi0JCQkJaWYgKCAob2xkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoImlkIikpICkgewotCQkJCQluaWQgPSBvbGQucmVwbGFjZSggcmVzY2FwZSwgIlxcJCYiICk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIG5pZCApOwotCQkJCX0KLQkJCQluaWQgPSAiW2lkPSciICsgbmlkICsgIiddICI7Ci0KLQkJCQlpID0gZ3JvdXBzLmxlbmd0aDsKLQkJCQl3aGlsZSAoIGktLSApIHsKLQkJCQkJZ3JvdXBzW2ldID0gbmlkICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7Ci0JCQkJfQotCQkJCW5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0OwotCQkJCW5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIiwiKTsKLQkJCX0KLQotCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKLQkJCQl0cnkgewotCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAotCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCi0JCQkJCSk7Ci0JCQkJCXJldHVybiByZXN1bHRzOwotCQkJCX0gY2F0Y2gocXNhRXJyb3IpIHsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoICFvbGQgKSB7Ci0JCQkJCQljb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgiaWQiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIEFsbCBvdGhlcnMKLQlyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7Ci19Ci0KLS8qKgotICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCi0gKiBAcmV0dXJucyB7RnVuY3Rpb24oc3RyaW5nLCBPYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoCi0gKglwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKQotICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQotICovCi1mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHsKLQl2YXIga2V5cyA9IFtdOwotCi0JZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7Ci0JCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQotCQlpZiAoIGtleXMucHVzaCgga2V5ICs9ICIgIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHsKLQkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwotCQkJZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTsKLQkJfQotCQlyZXR1cm4gKGNhY2hlWyBrZXkgXSA9IHZhbHVlKTsKLQl9Ci0JcmV0dXJuIGNhY2hlOwotfQotCi0vKioKLSAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCi0gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFyawotICovCi1mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewotCWZuWyBleHBhbmRvIF0gPSB0cnVlOwotCXJldHVybiBmbjsKLX0KLQotLyoqCi0gKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAotICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBhIGJvb2xlYW4gcmVzdWx0Ci0gKi8KLWZ1bmN0aW9uIGFzc2VydCggZm4gKSB7Ci0JdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotCi0JdHJ5IHsKLQkJcmV0dXJuICEhZm4oIGRpdiApOwotCX0gY2F0Y2ggKGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZmluYWxseSB7Ci0JCS8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdAotCQlpZiAoIGRpdi5wYXJlbnROb2RlICkgewotCQkJZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApOwotCQl9Ci0JCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCi0JCWRpdiA9IG51bGw7Ci0JfQotfQotCi0vKioKLSAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKLSAqIEBwYXJhbSB7U3RyaW5nfSBhdHRycyBQaXBlLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXMKLSAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgVGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgYXBwbGllZAotICovCi1mdW5jdGlvbiBhZGRIYW5kbGUoIGF0dHJzLCBoYW5kbGVyICkgewotCXZhciBhcnIgPSBhdHRycy5zcGxpdCgifCIpLAotCQlpID0gYXR0cnMubGVuZ3RoOwotCi0Jd2hpbGUgKCBpLS0gKSB7Ci0JCUV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyOwotCX0KLX0KLQotLyoqCi0gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzCi0gKiBAcGFyYW0ge0VsZW1lbnR9IGEKLSAqIEBwYXJhbSB7RWxlbWVudH0gYgotICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiCi0gKi8KLWZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKLQl2YXIgY3VyID0gYiAmJiBhLAotCQlkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJgotCQkJKCB+Yi5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKSAtCi0JCQkoIH5hLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApOwotCi0JLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCi0JaWYgKCBkaWZmICkgewotCQlyZXR1cm4gZGlmZjsKLQl9Ci0KLQkvLyBDaGVjayBpZiBiIGZvbGxvd3MgYQotCWlmICggY3VyICkgewotCQl3aGlsZSAoIChjdXIgPSBjdXIubmV4dFNpYmxpbmcpICkgewotCQkJaWYgKCBjdXIgPT09IGIgKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIGEgPyAxIDogLTE7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwotICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKLSAqLwotZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7Ci0JcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwotCX07Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zCi0gKiBAcGFyYW0ge1N0cmluZ30gdHlwZQotICovCi1mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7Ci0JcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7Ci0JfTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCi0gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgotICovCi1mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKLQlyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBhcmd1bWVudCApIHsKLQkJYXJndW1lbnQgPSArYXJndW1lbnQ7Ci0JCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7Ci0JCQl2YXIgaiwKLQkJCQltYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLAotCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwotCi0JCQkvLyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMKLQkJCXdoaWxlICggaS0tICkgewotCQkJCWlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7Ci0JCQkJCXNlZWRbal0gPSAhKG1hdGNoZXNbal0gPSBzZWVkW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0pOwotfQotCi0vKioKLSAqIERldGVjdCB4bWwKLSAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50Ci0gKi8KLWlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0JLy8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdAotCS8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKQotCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwotCXJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIiA6IGZhbHNlOwotfTsKLQotLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2UKLXN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwotCi0vKioKLSAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnQKLSAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAqLwotc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHsKLQl2YXIgZG9jID0gbm9kZSA/IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlIDogcHJlZmVycmVkRG9jLAotCQlwYXJlbnQgPSBkb2MuZGVmYXVsdFZpZXc7Ci0KLQkvLyBJZiBubyBkb2N1bWVudCBhbmQgZG9jdW1lbnRFbGVtZW50IGlzIGF2YWlsYWJsZSwgcmV0dXJuCi0JaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8vIFNldCBvdXIgZG9jdW1lbnQKLQlkb2N1bWVudCA9IGRvYzsKLQlkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsKLQotCS8vIFN1cHBvcnQgdGVzdHMKLQlkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jICk7Ci0KLQkvLyBTdXBwb3J0OiBJRT44Ci0JLy8gSWYgaWZyYW1lIGRvY3VtZW50IGlzIGFzc2lnbmVkIHRvICJkb2N1bWVudCIgdmFyaWFibGUgYW5kIGlmIGlmcmFtZSBoYXMgYmVlbiByZWxvYWRlZCwKLQkvLyBJRSB3aWxsIHRocm93ICJwZXJtaXNzaW9uIGRlbmllZCIgZXJyb3Igd2hlbiBhY2Nlc3NpbmcgImRvY3VtZW50IiB2YXJpYWJsZSwgc2VlIGpRdWVyeSAjMTM5MzYKLQkvLyBJRTYtOCBkbyBub3Qgc3VwcG9ydCB0aGUgZGVmYXVsdFZpZXcgcHJvcGVydHkgc28gcGFyZW50IHdpbGwgYmUgdW5kZWZpbmVkCi0JaWYgKCBwYXJlbnQgJiYgcGFyZW50LmF0dGFjaEV2ZW50ICYmIHBhcmVudCAhPT0gcGFyZW50LnRvcCApIHsKLQkJcGFyZW50LmF0dGFjaEV2ZW50KCAib25iZWZvcmV1bmxvYWQiLCBmdW5jdGlvbigpIHsKLQkJCXNldERvY3VtZW50KCk7Ci0JCX0pOwotCX0KLQotCS8qIEF0dHJpYnV0ZXMKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQkvLyBTdXBwb3J0OiBJRTw4Ci0JLy8gVmVyaWZ5IHRoYXQgZ2V0QXR0cmlidXRlIHJlYWxseSByZXR1cm5zIGF0dHJpYnV0ZXMgYW5kIG5vdCBwcm9wZXJ0aWVzIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKQotCXN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgewotCQlkaXYuY2xhc3NOYW1lID0gImkiOwotCQlyZXR1cm4gIWRpdi5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpOwotCX0pOwotCi0JLyogZ2V0RWxlbWVudChzKUJ5KgotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCS8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzCi0Jc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgewotCQlkaXYuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVDb21tZW50KCIiKSApOwotCQlyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aDsKLQl9KTsKLQotCS8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlDbGFzc05hbWUgY2FuIGJlIHRydXN0ZWQKLQlzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLQkJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiI7Ci0KLQkJLy8gU3VwcG9ydDogU2FmYXJpPDQKLQkJLy8gQ2F0Y2ggY2xhc3Mgb3Zlci1jYWNoaW5nCi0JCWRpdi5maXJzdENoaWxkLmNsYXNzTmFtZSA9ICJpIjsKLQkJLy8gU3VwcG9ydDogT3BlcmE8MTAKLQkJLy8gQ2F0Y2ggZ0VCQ04gZmFpbHVyZSB0byBmaW5kIG5vbi1sZWFkaW5nIGNsYXNzZXMKLQkJcmV0dXJuIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RoID09PSAyOwotCX0pOwotCi0JLy8gU3VwcG9ydDogSUU8MTAKLQkvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUKLQkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtYXRpY2FsbHktc2V0IG5hbWVzLAotCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAotCXN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkgewotCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pZCA9IGV4cGFuZG87Ci0JCXJldHVybiAhZG9jLmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2MuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGg7Ci0JfSk7Ci0KLQkvLyBJRCBmaW5kIGFuZCBmaWx0ZXIKLQlpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHsKLQkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewotCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmIGRvY3VtZW50SXNIVE1MICkgewotCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKLQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucwotCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKLQkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKLQkJCX0KLQkJfTsKLQkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7Ci0JCQl2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKLQkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKLQkJCX07Ci0JCX07Ci0JfSBlbHNlIHsKLQkJLy8gU3VwcG9ydDogSUU2LzcKLQkJLy8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IHJlbGlhYmxlIGFzIGEgZmluZCBzaG9ydGN1dAotCQlkZWxldGUgRXhwci5maW5kWyJJRCJdOwotCi0JCUV4cHIuZmlsdGVyWyJJRCJdID0gIGZ1bmN0aW9uKCBpZCApIHsKLQkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwotCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotCQkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gc3RydW5kZWZpbmVkICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKLQkJCQlyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBhdHRySWQ7Ci0JCQl9OwotCQl9OwotCX0KLQotCS8vIFRhZwotCUV4cHIuZmluZFsiVEFHIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID8KLQkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKLQkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IHN0cnVuZGVmaW5lZCApIHsKLQkJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7Ci0JCQl9Ci0JCX0gOgotCQlmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgewotCQkJdmFyIGVsZW0sCi0JCQkJdG1wID0gW10sCi0JCQkJaSA9IDAsCi0JCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwotCi0JCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCi0JCQlpZiAoIHRhZyA9PT0gIioiICkgewotCQkJCXdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkgewotCQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7Ci0JCQkJCQl0bXAucHVzaCggZWxlbSApOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRtcDsKLQkJCX0KLQkJCXJldHVybiByZXN1bHRzOwotCQl9OwotCi0JLy8gQ2xhc3MKLQlFeHByLmZpbmRbIkNMQVNTIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHsKLQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBzdHJ1bmRlZmluZWQgJiYgZG9jdW1lbnRJc0hUTUwgKSB7Ci0JCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTsKLQkJfQotCX07Ci0KLQkvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JLy8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydAotCi0JLy8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSkKLQlyYnVnZ3lNYXRjaGVzID0gW107Ci0KLQkvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKQotCS8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvcgotCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKLQkvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvcgotCS8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OAotCXJidWdneVFTQSA9IFtdOwotCi0JaWYgKCAoc3VwcG9ydC5xc2EgPSBybmF0aXZlLnRlc3QoIGRvYy5xdWVyeVNlbGVjdG9yQWxsICkpICkgewotCQkvLyBCdWlsZCBRU0EgcmVnZXgKLQkJLy8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaQotCQlhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLQkJCS8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2UKLQkJCS8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseQotCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCi0JCQkvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaAotCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTkKLQkJCWRpdi5pbm5lckhUTUwgPSAiPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiI7Ci0KLQkJCS8vIFN1cHBvcnQ6IElFOAotCQkJLy8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCAidmFsdWUiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHkKLQkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewotCQkJCXJidWdneVFTQS5wdXNoKCAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKig/OnZhbHVlfCIgKyBib29sZWFucyArICIpIiApOwotCQkJfQotCi0JCQkvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50cwotCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKLQkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCi0JCQlpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7Ci0JCQkJcmJ1Z2d5UVNBLnB1c2goIjpjaGVja2VkIik7Ci0JCQl9Ci0JCX0pOwotCi0JCWFzc2VydChmdW5jdGlvbiggZGl2ICkgewotCi0JCQkvLyBTdXBwb3J0OiBPcGVyYSAxMC0xMi9JRTgKLQkJCS8vIF49ICQ9ICo9IGFuZCBlbXB0eSB2YWx1ZXMKLQkJCS8vIFNob3VsZCBub3Qgc2VsZWN0IGFueXRoaW5nCi0JCQkvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHMKLQkJCS8vIFRoZSB0eXBlIGF0dHJpYnV0ZSBpcyByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnQKLQkJCXZhciBpbnB1dCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotCQkJaW5wdXQuc2V0QXR0cmlidXRlKCAidHlwZSIsICJoaWRkZW4iICk7Ci0JCQlkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAidCIsICIiICk7Ci0KLQkJCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIlt0Xj0nJ10iKS5sZW5ndGggKSB7Ci0JCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7Ci0JCQl9Ci0KLQkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCi0JCQkvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0cwotCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoICkgewotCQkJCXJidWdneVFTQS5wdXNoKCAiOmVuYWJsZWQiLCAiOmRpc2FibGVkIiApOwotCQkJfQotCi0JCQkvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvcwotCQkJZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKLQkJCXJidWdneVFTQS5wdXNoKCIsLio6Iik7Ci0JCX0pOwotCX0KLQotCWlmICggKHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gcm5hdGl2ZS50ZXN0KCAobWF0Y2hlcyA9IGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8Ci0JCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8Ci0JCWRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fAotCQlkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yKSApKSApIHsKLQotCQlhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLQkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgotCQkJLy8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSkKLQkJCXN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgImRpdiIgKTsKLQotCQkJLy8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbgotCQkJLy8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZAotCQkJbWF0Y2hlcy5jYWxsKCBkaXYsICJbcyE9JyddOngiICk7Ci0JCQlyYnVnZ3lNYXRjaGVzLnB1c2goICIhPSIsIHBzZXVkb3MgKTsKLQkJfSk7Ci0JfQotCi0JcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7Ci0JcmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbigifCIpICk7Ci0KLQkvKiBDb250YWlucwotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgotCS8vIFB1cnBvc2VmdWxseSBkb2VzIG5vdCBpbXBsZW1lbnQgaW5jbHVzaXZlIGRlc2NlbmRlbnQKLQkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgotCWNvbnRhaW5zID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgfHwgZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/Ci0JCWZ1bmN0aW9uKCBhLCBiICkgewotCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKLQkJCQlidXAgPSBiICYmIGIucGFyZW50Tm9kZTsKLQkJCXJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKAotCQkJCWFkb3duLmNvbnRhaW5zID8KLQkJCQkJYWRvd24uY29udGFpbnMoIGJ1cCApIDoKLQkJCQkJYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2Ci0JCQkpKTsKLQkJfSA6Ci0JCWZ1bmN0aW9uKCBhLCBiICkgewotCQkJaWYgKCBiICkgewotCQkJCXdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkgewotCQkJCQlpZiAoIGIgPT09IGEgKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfTsKLQotCS8qIFNvcnRpbmcKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQkvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nCi0Jc29ydE9yZGVyID0gZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/Ci0JZnVuY3Rpb24oIGEsIGIgKSB7Ci0KLQkJLy8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWwKLQkJaWYgKCBhID09PSBiICkgewotCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJdmFyIGNvbXBhcmUgPSBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApOwotCi0JCWlmICggY29tcGFyZSApIHsKLQkJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwotCQkJaWYgKCBjb21wYXJlICYgMSB8fAotCQkJCSghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlKSApIHsKLQotCQkJCS8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudAotCQkJCWlmICggYSA9PT0gZG9jIHx8IGNvbnRhaW5zKHByZWZlcnJlZERvYywgYSkgKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaWYgKCBiID09PSBkb2MgfHwgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCi0JCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKLQkJCQlyZXR1cm4gc29ydElucHV0ID8KLQkJCQkJKCBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZi5jYWxsKCBzb3J0SW5wdXQsIGIgKSApIDoKLQkJCQkJMDsKLQkJCX0KLQotCQkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwotCQl9Ci0KLQkJLy8gTm90IGRpcmVjdGx5IGNvbXBhcmFibGUsIHNvcnQgb24gZXhpc3RlbmNlIG9mIG1ldGhvZAotCQlyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/IC0xIDogMTsKLQl9IDoKLQlmdW5jdGlvbiggYSwgYiApIHsKLQkJdmFyIGN1ciwKLQkJCWkgPSAwLAotCQkJYXVwID0gYS5wYXJlbnROb2RlLAotCQkJYnVwID0gYi5wYXJlbnROb2RlLAotCQkJYXAgPSBbIGEgXSwKLQkJCWJwID0gWyBiIF07Ci0KLQkJLy8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbAotCQlpZiAoIGEgPT09IGIgKSB7Ci0JCQloYXNEdXBsaWNhdGUgPSB0cnVlOwotCQkJcmV0dXJuIDA7Ci0KLQkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKLQkJfSBlbHNlIGlmICggIWF1cCB8fCAhYnVwICkgewotCQkJcmV0dXJuIGEgPT09IGRvYyA/IC0xIDoKLQkJCQliID09PSBkb2MgPyAxIDoKLQkJCQlhdXAgPyAtMSA6Ci0JCQkJYnVwID8gMSA6Ci0JCQkJc29ydElucHV0ID8KLQkJCQkoIGluZGV4T2YuY2FsbCggc29ydElucHV0LCBhICkgLSBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwgYiApICkgOgotCQkJCTA7Ci0KLQkJLy8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKLQkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7Ci0JCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7Ci0JCX0KLQotCQkvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvbgotCQljdXIgPSBhOwotCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7Ci0JCQlhcC51bnNoaWZ0KCBjdXIgKTsKLQkJfQotCQljdXIgPSBiOwotCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7Ci0JCQlicC51bnNoaWZ0KCBjdXIgKTsKLQkJfQotCi0JCS8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5Ci0JCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewotCQkJaSsrOwotCQl9Ci0KLQkJcmV0dXJuIGkgPwotCQkJLy8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yCi0JCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKLQotCQkJLy8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0Ci0JCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgotCQkJYnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOgotCQkJMDsKLQl9OwotCi0JcmV0dXJuIGRvYzsKLX07Ci0KLVNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewotCXJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7Ci19OwotCi1TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7Ci0JLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCi0JaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewotCQlzZXREb2N1bWVudCggZWxlbSApOwotCX0KLQotCS8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZAotCWV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsICI9JyQxJ10iICk7Ci0KLQlpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmCi0JCSggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiYKLQkJKCAhcmJ1Z2d5UVNBICAgICB8fCAhcmJ1Z2d5UVNBLnRlc3QoIGV4cHIgKSApICkgewotCi0JCXRyeSB7Ci0JCQl2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7Ci0KLQkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKLQkJCWlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHwKLQkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKLQkJCQkJLy8gZnJhZ21lbnQgaW4gSUUgOQotCQkJCQllbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkgewotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0gY2F0Y2goZSkge30KLQl9Ci0KLQlyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgW2VsZW1dICkubGVuZ3RoID4gMDsKLX07Ci0KLVNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkgewotCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAotCWlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9PSBkb2N1bWVudCApIHsKLQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKLQl9Ci0JcmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7Ci19OwotCi1TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewotCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAotCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKLQkJc2V0RG9jdW1lbnQoIGVsZW0gKTsKLQl9Ci0KLQl2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLAotCQkvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoalF1ZXJ5ICMxMzgwNykKLQkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwotCQkJZm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDoKLQkJCXVuZGVmaW5lZDsKLQotCXJldHVybiB2YWwgPT09IHVuZGVmaW5lZCA/Ci0JCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwotCQkJZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6Ci0JCQkodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lmaWVkID8KLQkJCQl2YWwudmFsdWUgOgotCQkJCW51bGwgOgotCQl2YWw7Ci19OwotCi1TaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgewotCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKLX07Ci0KLS8qKgotICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlcwotICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHMKLSAqLwotU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKLQl2YXIgZWxlbSwKLQkJZHVwbGljYXRlcyA9IFtdLAotCQlqID0gMCwKLQkJaSA9IDA7Ci0KLQkvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlCi0JaGFzRHVwbGljYXRlID0gIXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlczsKLQlzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKLQlyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApOwotCi0JaWYgKCBoYXNEdXBsaWNhdGUgKSB7Ci0JCXdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkgewotCQkJaWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7Ci0JCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwotCQkJfQotCQl9Ci0JCXdoaWxlICggai0tICkgewotCQkJcmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJlc3VsdHM7Ci19OwotCi0vKioKLSAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzCi0gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW0KLSAqLwotZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0JdmFyIG5vZGUsCi0JCXJldCA9ICIiLAotCQlpID0gMCwKLQkJbm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlOwotCi0JaWYgKCAhbm9kZVR5cGUgKSB7Ci0JCS8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5Ci0JCWZvciAoIDsgKG5vZGUgPSBlbGVtW2ldKTsgaSsrICkgewotCQkJLy8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXMKLQkJCXJldCArPSBnZXRUZXh0KCBub2RlICk7Ci0JCX0KLQl9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7Ci0JCS8vIFVzZSB0ZXh0Q29udGVudCBmb3IgZWxlbWVudHMKLQkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoc2VlICMxMTE1MykKLQkJaWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gInN0cmluZyIgKSB7Ci0JCQlyZXR1cm4gZWxlbS50ZXh0Q29udGVudDsKLQkJfSBlbHNlIHsKLQkJCS8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlbgotCQkJZm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7Ci0JCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewotCQlyZXR1cm4gZWxlbS5ub2RlVmFsdWU7Ci0JfQotCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwotCi0JcmV0dXJuIHJldDsKLX07Ci0KLUV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0gewotCi0JLy8gQ2FuIGJlIGFkanVzdGVkIGJ5IHRoZSB1c2VyCi0JY2FjaGVMZW5ndGg6IDUwLAotCi0JY3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sCi0KLQltYXRjaDogbWF0Y2hFeHByLAotCi0JYXR0ckhhbmRsZToge30sCi0KLQlmaW5kOiB7fSwKLQotCXJlbGF0aXZlOiB7Ci0JCSI+IjogeyBkaXI6ICJwYXJlbnROb2RlIiwgZmlyc3Q6IHRydWUgfSwKLQkJIiAiOiB7IGRpcjogInBhcmVudE5vZGUiIH0sCi0JCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAotCQkifiI6IHsgZGlyOiAicHJldmlvdXNTaWJsaW5nIiB9Ci0JfSwKLQotCXByZUZpbHRlcjogewotCQkiQVRUUiI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKLQkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKLQotCQkJLy8gTW92ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gbWF0Y2hbM10gd2hldGhlciBxdW90ZWQgb3IgdW5xdW90ZWQKLQkJCW1hdGNoWzNdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7Ci0KLQkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7Ci0JCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKLQkJCX0KLQotCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7Ci0JCX0sCi0KLQkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewotCQkJLyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwclsiQ0hJTEQiXQotCQkJCTEgdHlwZSAob25seXxudGh8Li4uKQotCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKLQkJCQkzIGFyZ3VtZW50IChldmVufG9kZHxcZCp8XGQqbihbKy1dXGQrKT98Li4uKQotCQkJCTQgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XGQqbnwpCi0JCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAotCQkJCTYgeCBvZiB4bi1jb21wb25lbnQKLQkJCQk3IHNpZ24gb2YgeS1jb21wb25lbnQKLQkJCQk4IHkgb2YgeS1jb21wb25lbnQKLQkJCSovCi0JCQltYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7Ci0KLQkJCWlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gIm50aCIgKSB7Ci0JCQkJLy8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnQKLQkJCQlpZiAoICFtYXRjaFszXSApIHsKLQkJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwotCQkJCX0KLQotCQkJCS8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRAotCQkJCS8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzEKLQkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7Ci0JCQkJbWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gIm9kZCIgKTsKLQotCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCi0JCQl9IGVsc2UgaWYgKCBtYXRjaFszXSApIHsKLQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7Ci0JCQl9Ci0KLQkJCXJldHVybiBtYXRjaDsKLQkJfSwKLQotCQkiUFNFVURPIjogZnVuY3Rpb24oIG1hdGNoICkgewotCQkJdmFyIGV4Y2VzcywKLQkJCQl1bnF1b3RlZCA9ICFtYXRjaFs1XSAmJiBtYXRjaFsyXTsKLQotCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gQWNjZXB0IHF1b3RlZCBhcmd1bWVudHMgYXMtaXMKLQkJCWlmICggbWF0Y2hbM10gJiYgbWF0Y2hbNF0gIT09IHVuZGVmaW5lZCApIHsKLQkJCQltYXRjaFsyXSA9IG1hdGNoWzRdOwotCi0JCQkvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50cwotCQkJfSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmCi0JCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKLQkJCQkoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkpICYmCi0JCQkJLy8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzCi0JCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewotCi0JCQkJLy8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXgKLQkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKLQkJCQltYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTsKLQkJCX0KLQotCQkJLy8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpCi0JCQlyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTsKLQkJfQotCX0sCi0KLQlmaWx0ZXI6IHsKLQotCQkiVEFHIjogZnVuY3Rpb24oIG5vZGVOYW1lU2VsZWN0b3IgKSB7Ci0JCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKLQkJCXJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSAiKiIgPwotCQkJCWZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSA6Ci0JCQkJZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQkJCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWU7Ci0JCQkJfTsKLQkJfSwKLQotCQkiQ0xBU1MiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkgewotCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKLQotCQkJcmV0dXJuIHBhdHRlcm4gfHwKLQkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgotCQkJCWNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQkJCXJldHVybiBwYXR0ZXJuLnRlc3QoIHR5cGVvZiBlbGVtLmNsYXNzTmFtZSA9PT0gInN0cmluZyIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKLQkJCQl9KTsKLQkJfSwKLQotCQkiQVRUUiI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7Ci0JCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7Ci0KLQkJCQlpZiAoIHJlc3VsdCA9PSBudWxsICkgewotCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7Ci0JCQkJfQotCQkJCWlmICggIW9wZXJhdG9yICkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlyZXN1bHQgKz0gIiI7Ci0KLQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICI9IiA/IHJlc3VsdCA9PT0gY2hlY2sgOgotCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgotCQkJCQlvcGVyYXRvciA9PT0gIl49IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDoKLQkJCQkJb3BlcmF0b3IgPT09ICIqPSIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKLQkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgotCQkJCQlvcGVyYXRvciA9PT0gIn49IiA/ICggIiAiICsgcmVzdWx0ICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKLQkJCQkJb3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArICItIiA6Ci0JCQkJCWZhbHNlOwotCQkJfTsKLQkJfSwKLQotCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewotCQkJdmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gIm50aCIsCi0JCQkJZm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09ICJsYXN0IiwKLQkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7Ci0KLQkJCXJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID8KLQotCQkJCS8vIFNob3J0Y3V0IGZvciA6bnRoLSoobikKLQkJCQlmdW5jdGlvbiggZWxlbSApIHsKLQkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwotCQkJCX0gOgotCi0JCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKLQkJCQkJdmFyIGNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBkaWZmLCBub2RlSW5kZXgsIHN0YXJ0LAotCQkJCQkJZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gIm5leHRTaWJsaW5nIiA6ICJwcmV2aW91c1NpYmxpbmciLAotCQkJCQkJcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLAotCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCi0JCQkJCQl1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZTsKLQotCQkJCQlpZiAoIHBhcmVudCApIHsKLQotCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQotCQkJCQkJaWYgKCBzaW1wbGUgKSB7Ci0JCQkJCQkJd2hpbGUgKCBkaXIgKSB7Ci0JCQkJCQkJCW5vZGUgPSBlbGVtOwotCQkJCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0pICkgewotCQkJCQkJCQkJaWYgKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgewotCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKLQkJCQkJCQkJc3RhcnQgPSBkaXIgPSB0eXBlID09PSAib25seSIgJiYgIXN0YXJ0ICYmICJuZXh0U2libGluZyI7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCi0JCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwotCi0JCQkJCQkvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YAotCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewotCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAotCQkJCQkJCW91dGVyQ2FjaGUgPSBwYXJlbnRbIGV4cGFuZG8gXSB8fCAocGFyZW50WyBleHBhbmRvIF0gPSB7fSk7Ci0JCQkJCQkJY2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107Ci0JCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbMF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbMV07Ci0JCQkJCQkJZGlmZiA9IGNhY2hlWzBdID09PSBkaXJydW5zICYmIGNhY2hlWzJdOwotCQkJCQkJCW5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdOwotCi0JCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKLQotCQkJCQkJCQkvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydAotCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKLQotCQkJCQkJCQkvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVhawotCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7Ci0JCQkJCQkJCQlvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCS8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZQotCQkJCQkJfSBlbHNlIGlmICggdXNlQ2FjaGUgJiYgKGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHsKLQkJCQkJCQlkaWZmID0gY2FjaGVbMV07Ci0KLQkJCQkJCS8vIHhtbCA6bnRoLWNoaWxkKC4uLikgb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAotCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8Ci0JCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewotCi0JCQkJCQkJCWlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYgKytkaWZmICkgewotCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAotCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKLQkJCQkJCQkJCQkobm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSkpWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTsKLQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQotCQkJCQkJZGlmZiAtPSBsYXN0OwotCQkJCQkJcmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7Ci0JCQkJCX0KLQkJCQl9OwotCQl9LAotCi0JCSJQU0VVRE8iOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHsKLQkJCS8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQotCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwotCQkJLy8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnMKLQkJCS8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3MKLQkJCXZhciBhcmdzLAotCQkJCWZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHwKLQkJCQkJU2l6emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7Ci0KLQkJCS8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXQKLQkJCS8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uCi0JCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCi0JCQlpZiAoIGZuWyBleHBhbmRvIF0gKSB7Ci0JCQkJcmV0dXJuIGZuKCBhcmd1bWVudCApOwotCQkJfQotCi0JCQkvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXMKLQkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKLQkJCQlhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgIiIsIGFyZ3VtZW50IF07Ci0JCQkJcmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/Ci0JCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKLQkJCQkJCXZhciBpZHgsCi0JCQkJCQkJbWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLAotCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKLQkJCQkJCXdoaWxlICggaS0tICkgewotCQkJCQkJCWlkeCA9IGluZGV4T2YuY2FsbCggc2VlZCwgbWF0Y2hlZFtpXSApOwotCQkJCQkJCXNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7Ci0JCQkJCQl9Ci0JCQkJCX0pIDoKLQkJCQkJZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKLQkJCQkJfTsKLQkJCX0KLQotCQkJcmV0dXJuIGZuOwotCQl9Ci0JfSwKLQotCXBzZXVkb3M6IHsKLQkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCi0JCSJub3QiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgewotCQkJLy8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGUKLQkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCi0JCQkvLyBzcGFjZXMgYXMgY29tYmluYXRvcnMKLQkJCXZhciBpbnB1dCA9IFtdLAotCQkJCXJlc3VsdHMgPSBbXSwKLQkJCQltYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSApOwotCi0JCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KLQkJCQltYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHsKLQkJCQkJdmFyIGVsZW0sCi0JCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCi0JCQkJCQlpID0gc2VlZC5sZW5ndGg7Ci0KLQkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAotCQkJCQl3aGlsZSAoIGktLSApIHsKLQkJCQkJCWlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgewotCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pIDoKLQkJCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewotCQkJCQlpbnB1dFswXSA9IGVsZW07Ci0JCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKLQkJCQkJcmV0dXJuICFyZXN1bHRzLnBvcCgpOwotCQkJCX07Ci0JCX0pLAotCi0JCSJoYXMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgewotCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewotCQkJCXJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDsKLQkJCX07Ci0JCX0pLAotCi0JCSJjb250YWlucyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHsKLQkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCQlyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xOwotCQkJfTsKLQkJfSksCi0KLQkJLy8gIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3IKLQkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKLQkJLy8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQywKLQkJLy8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSAiLSIuCi0JCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgotCQkvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLiIKLQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkbwotCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7Ci0JCQkvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCi0JCQlpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgIiIpICkgewotCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7Ci0JCQl9Ci0JCQlsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7Ci0JCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQkJdmFyIGVsZW1MYW5nOwotCQkJCWRvIHsKLQkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/Ci0JCQkJCQllbGVtLmxhbmcgOgotCQkJCQkJZWxlbS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKSkgKSB7Ci0KLQkJCQkJCWVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTsKLQkJCQkJCXJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgIi0iICkgPT09IDA7Ci0JCQkJCX0KLQkJCQl9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9OwotCQl9KSwKLQotCQkvLyBNaXNjZWxsYW5lb3VzCi0JCSJ0YXJnZXQiOiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCXZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoOwotCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwotCQl9LAotCi0JCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQlyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTsKLQkJfSwKLQotCQkiZm9jdXMiOiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCXJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7Ci0JCX0sCi0KLQkJLy8gQm9vbGVhbiBwcm9wZXJ0aWVzCi0JCSJlbmFibGVkIjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7Ci0JCX0sCi0KLQkJImRpc2FibGVkIjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKLQkJfSwKLQotCQkiY2hlY2tlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewotCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCi0JCQkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZAotCQkJdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwotCQl9LAotCi0JCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewotCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAotCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQotCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7Ci0JCQkJZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOwotCQl9LAotCi0JCS8vIENvbnRlbnRzCi0JCSJlbXB0eSI6IGZ1bmN0aW9uKCBlbGVtICkgewotCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KLQkJCS8vIDplbXB0eSBpcyBvbmx5IGFmZmVjdGVkIGJ5IGVsZW1lbnQgbm9kZXMgYW5kIGNvbnRlbnQgbm9kZXMoaW5jbHVkaW5nIHRleHQoMyksIGNkYXRhKDQpKSwKLQkJCS8vICAgbm90IGNvbW1lbnQsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBvciBvdGhlcnMKLQkJCS8vIFRoYW5rcyB0byBEaWVnbyBQZXJpbmkgZm9yIHRoZSBub2RlTmFtZSBzaG9ydGN1dAotCQkJLy8gICBHcmVhdGVyIHRoYW4gIkAiIG1lYW5zIGFscGhhIGNoYXJhY3RlcnMgKHNwZWNpZmljYWxseSBub3Qgc3RhcnRpbmcgd2l0aCAiIyIgb3IgIj8iKQotCQkJZm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7Ci0JCQkJaWYgKCBlbGVtLm5vZGVOYW1lID4gIkAiIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9LAotCi0JCSJwYXJlbnQiOiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCXJldHVybiAhRXhwci5wc2V1ZG9zWyJlbXB0eSJdKCBlbGVtICk7Ci0JCX0sCi0KLQkJLy8gRWxlbWVudC9pbnB1dCB0eXBlcwotCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQlyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7Ci0JCX0sCi0KLQkJImlucHV0IjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQlyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7Ci0JCX0sCi0KLQkJImJ1dHRvbiI6IGZ1bmN0aW9uKCBlbGVtICkgewotCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQlyZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09ICJidXR0b24iIHx8IG5hbWUgPT09ICJidXR0b24iOwotCQl9LAotCi0JCSJ0ZXh0IjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQl2YXIgYXR0cjsKLQkJCS8vIElFNiBhbmQgNyB3aWxsIG1hcCBlbGVtLnR5cGUgdG8gJ3RleHQnIGZvciBuZXcgSFRNTDUgdHlwZXMgKHNlYXJjaCwgZXRjKQotCQkJLy8gdXNlIGdldEF0dHJpYnV0ZSBpbnN0ZWFkIHRvIHRlc3QgdGhpcyBjYXNlCi0JCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmCi0JCQkJZWxlbS50eXBlID09PSAidGV4dCIgJiYKLQkJCQkoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IGVsZW0udHlwZSApOwotCQl9LAotCi0JCS8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb24KLQkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKLQkJCXJldHVybiBbIDAgXTsKLQkJfSksCi0KLQkJImxhc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKLQkJCXJldHVybiBbIGxlbmd0aCAtIDEgXTsKLQkJfSksCi0KLQkJImVxIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewotCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwotCQl9KSwKLQotCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewotCQkJdmFyIGkgPSAwOwotCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7Ci0JCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKLQkJCX0KLQkJCXJldHVybiBtYXRjaEluZGV4ZXM7Ci0JCX0pLAotCi0JCSJvZGQiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKLQkJCXZhciBpID0gMTsKLQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewotCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7Ci0JCQl9Ci0JCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwotCQl9KSwKLQotCQkibHQiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7Ci0JCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7Ci0JCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKLQkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwotCQkJfQotCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKLQkJfSksCi0KLQkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewotCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwotCQkJZm9yICggOyArK2kgPCBsZW5ndGg7ICkgewotCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7Ci0JCQl9Ci0JCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwotCQl9KQotCX0KLX07Ci0KLUV4cHIucHNldWRvc1sibnRoIl0gPSBFeHByLnBzZXVkb3NbImVxIl07Ci0KLS8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCi1mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHsKLQlFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7Ci19Ci1mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkgewotCUV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7Ci19Ci0KLS8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVycwotZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9Ci1zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvczsKLUV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7Ci0KLWZ1bmN0aW9uIHRva2VuaXplKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkgewotCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAotCQlzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLAotCQljYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArICIgIiBdOwotCi0JaWYgKCBjYWNoZWQgKSB7Ci0JCXJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7Ci0JfQotCi0Jc29GYXIgPSBzZWxlY3RvcjsKLQlncm91cHMgPSBbXTsKLQlwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7Ci0KLQl3aGlsZSAoIHNvRmFyICkgewotCi0JCS8vIENvbW1hIGFuZCBmaXJzdCBydW4KLQkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7Ci0JCQlpZiAoIG1hdGNoICkgewotCQkJCS8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkCi0JCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7Ci0JCQl9Ci0JCQlncm91cHMucHVzaCggdG9rZW5zID0gW10gKTsKLQkJfQotCi0JCW1hdGNoZWQgPSBmYWxzZTsKLQotCQkvLyBDb21iaW5hdG9ycwotCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKLQkJCW1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOwotCQkJdG9rZW5zLnB1c2goewotCQkJCXZhbHVlOiBtYXRjaGVkLAotCQkJCS8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZQotCQkJCXR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCAiICIgKQotCQkJfSk7Ci0JCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOwotCQl9Ci0KLQkJLy8gRmlsdGVycwotCQlmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkgewotCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAotCQkJCShtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgewotCQkJCW1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOwotCQkJCXRva2Vucy5wdXNoKHsKLQkJCQkJdmFsdWU6IG1hdGNoZWQsCi0JCQkJCXR5cGU6IHR5cGUsCi0JCQkJCW1hdGNoZXM6IG1hdGNoCi0JCQkJfSk7Ci0JCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTsKLQkJCX0KLQkJfQotCi0JCWlmICggIW1hdGNoZWQgKSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2VzcwotCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwotCS8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2VucwotCXJldHVybiBwYXJzZU9ubHkgPwotCQlzb0Zhci5sZW5ndGggOgotCQlzb0ZhciA/Ci0JCQlTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOgotCQkJLy8gQ2FjaGUgdGhlIHRva2VucwotCQkJdG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7Ci19Ci0KLWZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKLQl2YXIgaSA9IDAsCi0JCWxlbiA9IHRva2Vucy5sZW5ndGgsCi0JCXNlbGVjdG9yID0gIiI7Ci0JZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0JCXNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTsKLQl9Ci0JcmV0dXJuIHNlbGVjdG9yOwotfQotCi1mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkgewotCXZhciBkaXIgPSBjb21iaW5hdG9yLmRpciwKLQkJY2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSAicGFyZW50Tm9kZSIsCi0JCWRvbmVOYW1lID0gZG9uZSsrOwotCi0JcmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgPwotCQkvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnQKLQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKLQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7Ci0JCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7Ci0JCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gOgotCi0JCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwotCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewotCQkJdmFyIGRhdGEsIGNhY2hlLCBvdXRlckNhY2hlLAotCQkJCWRpcmtleSA9IGRpcnJ1bnMgKyAiICIgKyBkb25lTmFtZTsKLQotCQkJLy8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gZGlyIGNhY2hpbmcKLQkJCWlmICggeG1sICkgewotCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7Ci0JCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewotCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKLQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7Ci0JCQkJCQlvdXRlckNhY2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8IChlbGVtWyBleHBhbmRvIF0gPSB7fSk7Ci0JCQkJCQlpZiAoIChjYWNoZSA9IG91dGVyQ2FjaGVbIGRpciBdKSAmJiBjYWNoZVswXSA9PT0gZGlya2V5ICkgewotCQkJCQkJCWlmICggKGRhdGEgPSBjYWNoZVsxXSkgPT09IHRydWUgfHwgZGF0YSA9PT0gY2FjaGVkcnVucyApIHsKLQkJCQkJCQkJcmV0dXJuIGRhdGEgPT09IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljYWNoZSA9IG91dGVyQ2FjaGVbIGRpciBdID0gWyBkaXJrZXkgXTsKLQkJCQkJCQljYWNoZVsxXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApIHx8IGNhY2hlZHJ1bnM7Ci0JCQkJCQkJaWYgKCBjYWNoZVsxXSA9PT0gdHJ1ZSApIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotfQotCi1mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7Ci0JcmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgPwotCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewotCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7Ci0JCQl3aGlsZSAoIGktLSApIHsKLQkJCQlpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSA6Ci0JCW1hdGNoZXJzWzBdOwotfQotCi1mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkgewotCXZhciBlbGVtLAotCQluZXdVbm1hdGNoZWQgPSBbXSwKLQkJaSA9IDAsCi0JCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCi0JCW1hcHBlZCA9IG1hcCAhPSBudWxsOwotCi0JZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0JCWlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkgewotCQkJaWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7Ci0JCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKLQkJCQlpZiAoIG1hcHBlZCApIHsKLQkJCQkJbWFwLnB1c2goIGkgKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3VW5tYXRjaGVkOwotfQotCi1mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7Ci0JaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7Ci0JCXBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7Ci0JfQotCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewotCQlwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICk7Ci0JfQotCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKLQkJdmFyIHRlbXAsIGksIGVsZW0sCi0JCQlwcmVNYXAgPSBbXSwKLQkJCXBvc3RNYXAgPSBbXSwKLQkJCXByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsCi0KLQkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0Ci0JCQllbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgIioiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSApLAotCi0JCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KLQkJCW1hdGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgPwotCQkJCWNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDoKLQkJCQllbGVtcywKLQotCQkJbWF0Y2hlck91dCA9IG1hdGNoZXIgPwotCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCi0JCQkJcG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgPwotCi0JCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQotCQkJCQlbXSA6Ci0KLQkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5Ci0JCQkJCXJlc3VsdHMgOgotCQkJCW1hdGNoZXJJbjsKLQotCQkvLyBGaW5kIHByaW1hcnkgbWF0Y2hlcwotCQlpZiAoIG1hdGNoZXIgKSB7Ci0JCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwotCQl9Ci0KLQkJLy8gQXBwbHkgcG9zdEZpbHRlcgotCQlpZiAoIHBvc3RGaWx0ZXIgKSB7Ci0JCQl0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTsKLQkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKLQotCQkJLy8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJbgotCQkJaSA9IHRlbXAubGVuZ3RoOwotCQkJd2hpbGUgKCBpLS0gKSB7Ci0JCQkJaWYgKCAoZWxlbSA9IHRlbXBbaV0pICkgewotCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCBzZWVkICkgewotCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKLQkJCQlpZiAoIHBvc3RGaW5kZXIgKSB7Ci0JCQkJCS8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0cwotCQkJCQl0ZW1wID0gW107Ci0JCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKLQkJCQkJd2hpbGUgKCBpLS0gKSB7Ci0JCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7Ci0JCQkJCQkJLy8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2gKLQkJCQkJCQl0ZW1wLnB1c2goIChtYXRjaGVySW5baV0gPSBlbGVtKSApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTsKLQkJCQl9Ci0KLQkJCQkvLyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBzZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVtIHN5bmNocm9uaXplZAotCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKLQkJCQl3aGlsZSAoIGktLSApIHsKLQkJCQkJaWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmCi0JCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mLmNhbGwoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHsKLQotCQkJCQkJc2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAotCQl9IGVsc2UgewotCQkJbWF0Y2hlck91dCA9IGNvbmRlbnNlKAotCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwotCQkJCQltYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOgotCQkJCQltYXRjaGVyT3V0Ci0JCQkpOwotCQkJaWYgKCBwb3N0RmluZGVyICkgewotCQkJCXBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApOwotCQkJfSBlbHNlIHsKLQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7Ci0JCQl9Ci0JCX0KLQl9KTsKLX0KLQotZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHsKLQl2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLAotCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAotCQlsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAotCQlpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIiAiXSwKLQkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAotCi0JCS8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpCi0JCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewotCQkJcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsKLQkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAotCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKLQkJCXJldHVybiBpbmRleE9mLmNhbGwoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7Ci0JCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKLQkJbWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7Ci0JCQlyZXR1cm4gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKLQkJCQkoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgPwotCQkJCQltYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDoKLQkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwotCQl9IF07Ci0KLQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLQkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewotCQkJbWF0Y2hlcnMgPSBbIGFkZENvbWJpbmF0b3IoZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIpIF07Ci0JCX0gZWxzZSB7Ci0JCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7Ci0KLQkJCS8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyCi0JCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKLQkJCQkvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmcKLQkJCQlqID0gKytpOwotCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewotCQkJCQlpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gc2V0TWF0Y2hlcigKLQkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCi0JCQkJCWkgPiAxICYmIHRvU2VsZWN0b3IoCi0JCQkJCQkvLyBJZiB0aGUgcHJlY2VkaW5nIHRva2VuIHdhcyBhIGRlc2NlbmRhbnQgY29tYmluYXRvciwgaW5zZXJ0IGFuIGltcGxpY2l0IGFueS1lbGVtZW50IGAqYAotCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKLQkJCQkJKS5yZXBsYWNlKCBydHJpbSwgIiQxIiApLAotCQkJCQltYXRjaGVyLAotCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKLQkJCQkJaiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLAotCQkJCQlqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApCi0JCQkJKTsKLQkJCX0KLQkJCW1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTsKLQkJfQotCX0KLQotCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKLX0KLQotZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewotCS8vIEEgY291bnRlciB0byBzcGVjaWZ5IHdoaWNoIGVsZW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIG1hdGNoZWQKLQl2YXIgbWF0Y2hlckNhY2hlZFJ1bnMgPSAwLAotCQlieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsCi0JCWJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLAotCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBleHBhbmRDb250ZXh0ICkgewotCQkJdmFyIGVsZW0sIGosIG1hdGNoZXIsCi0JCQkJc2V0TWF0Y2hlZCA9IFtdLAotCQkJCW1hdGNoZWRDb3VudCA9IDAsCi0JCQkJaSA9ICIwIiwKLQkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAotCQkJCW91dGVybW9zdCA9IGV4cGFuZENvbnRleHQgIT0gbnVsbCwKLQkJCQljb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCwKLQkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIGNvbnRleHQKLQkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgZXhwYW5kQ29udGV4dCAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dCApLAotCQkJCS8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyCi0JCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSk7Ci0KLQkJCWlmICggb3V0ZXJtb3N0ICkgewotCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ICE9PSBkb2N1bWVudCAmJiBjb250ZXh0OwotCQkJCWNhY2hlZHJ1bnMgPSBtYXRjaGVyQ2FjaGVkUnVuczsKLQkJCX0KLQotCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKLQkJCS8vIEtlZXAgYGlgIGEgc3RyaW5nIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50cyBzbyBgbWF0Y2hlZENvdW50YCB3aWxsIGJlICIwMCIgYmVsb3cKLQkJCWZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewotCQkJCWlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7Ci0JCQkJCWogPSAwOwotCQkJCQl3aGlsZSAoIChtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzW2orK10pICkgewotCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHsKLQkJCQkJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIG91dGVybW9zdCApIHsKLQkJCQkJCWRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlOwotCQkJCQkJY2FjaGVkcnVucyA9ICsrbWF0Y2hlckNhY2hlZFJ1bnM7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzCi0JCQkJaWYgKCBieVNldCApIHsKLQkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwotCQkJCQlpZiAoIChlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSkgKSB7Ci0JCQkJCQltYXRjaGVkQ291bnQtLTsKLQkJCQkJfQotCi0JCQkJCS8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3QKLQkJCQkJaWYgKCBzZWVkICkgewotCQkJCQkJdW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzCi0JCQltYXRjaGVkQ291bnQgKz0gaTsKLQkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewotCQkJCWogPSAwOwotCQkJCXdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHsKLQkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIHNlZWQgKSB7Ci0JCQkJCS8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmcKLQkJCQkJaWYgKCBtYXRjaGVkQ291bnQgPiAwICkgewotCQkJCQkJd2hpbGUgKCBpLS0gKSB7Ci0JCQkJCQkJaWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHsKLQkJCQkJCQkJc2V0TWF0Y2hlZFtpXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXMKLQkJCQkJc2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7Ci0JCQkJfQotCi0JCQkJLy8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0cwotCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKLQotCQkJCS8vIFNlZWRsZXNzIHNldCBtYXRjaGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29ydGluZwotCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgotCQkJCQkoIG1hdGNoZWRDb3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHsKLQotCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMgYnkgbmVzdGVkIG1hdGNoZXJzCi0JCQlpZiAoIG91dGVybW9zdCApIHsKLQkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKLQkJCQlvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDsKLQkJCX0KLQotCQkJcmV0dXJuIHVubWF0Y2hlZDsKLQkJfTsKLQotCXJldHVybiBieVNldCA/Ci0JCW1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOgotCQlzdXBlck1hdGNoZXI7Ci19Ci0KLWNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgZ3JvdXAgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Ci0JdmFyIGksCi0JCXNldE1hdGNoZXJzID0gW10sCi0JCWVsZW1lbnRNYXRjaGVycyA9IFtdLAotCQljYWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArICIgIiBdOwotCi0JaWYgKCAhY2FjaGVkICkgewotCQkvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnQKLQkJaWYgKCAhZ3JvdXAgKSB7Ci0JCQlncm91cCA9IHRva2VuaXplKCBzZWxlY3RvciApOwotCQl9Ci0JCWkgPSBncm91cC5sZW5ndGg7Ci0JCXdoaWxlICggaS0tICkgewotCQkJY2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIGdyb3VwW2ldICk7Ci0JCQlpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkgewotCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KLQkJY2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7Ci0JfQotCXJldHVybiBjYWNoZWQ7Ci19OwotCi1mdW5jdGlvbiBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciwgY29udGV4dHMsIHJlc3VsdHMgKSB7Ci0JdmFyIGkgPSAwLAotCQlsZW4gPSBjb250ZXh0cy5sZW5ndGg7Ci0JZm9yICggOyBpIDwgbGVuOyBpKysgKSB7Ci0JCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Ci0JfQotCXJldHVybiByZXN1bHRzOwotfQotCi1mdW5jdGlvbiBzZWxlY3QoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewotCXZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLAotCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwotCi0JaWYgKCAhc2VlZCApIHsKLQkJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgZ3JvdXAKLQkJaWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7Ci0KLQkJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECi0JCQl0b2tlbnMgPSBtYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwICk7Ci0JCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgotCQkJCQlzdXBwb3J0LmdldEJ5SWQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJgotCQkJCQlFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewotCi0JCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKLQkJCQlpZiAoICFjb250ZXh0ICkgewotCQkJCQlyZXR1cm4gcmVzdWx0czsKLQkJCQl9Ci0JCQkJc2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7Ci0JCQl9Ci0KLQkJCS8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmcKLQkJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKLQkJCXdoaWxlICggaS0tICkgewotCQkJCXRva2VuID0gdG9rZW5zW2ldOwotCi0JCQkJLy8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvcgotCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKLQkJCQkJLy8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzCi0JCQkJCWlmICggKHNlZWQgPSBmaW5kKAotCQkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAotCQkJCQkJcnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dAotCQkJCQkpKSApIHsKLQotCQkJCQkJLy8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5Ci0JCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7Ci0JCQkJCQlzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApOwotCQkJCQkJaWYgKCAhc2VsZWN0b3IgKSB7Ci0JCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwotCQkJCQkJCXJldHVybiByZXN1bHRzOwotCQkJCQkJfQotCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24KLQkvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlCi0JY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkoCi0JCXNlZWQsCi0JCWNvbnRleHQsCi0JCSFkb2N1bWVudElzSFRNTCwKLQkJcmVzdWx0cywKLQkJcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKQotCSk7Ci0JcmV0dXJuIHJlc3VsdHM7Ci19Ci0KLS8vIE9uZS10aW1lIGFzc2lnbm1lbnRzCi0KLS8vIFNvcnQgc3RhYmlsaXR5Ci1zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KCIiKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKCIiKSA9PT0gZXhwYW5kbzsKLQotLy8gU3VwcG9ydDogQ2hyb21lPDE0Ci0vLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uCi1zdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSBoYXNEdXBsaWNhdGU7Ci0KLS8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudAotc2V0RG9jdW1lbnQoKTsKLQotLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNykKLS8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgotc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdjEgKSB7Ci0JLy8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpCi0JcmV0dXJuIGRpdjEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpICkgJiAxOwotfSk7Ci0KLS8vIFN1cHBvcnQ6IElFPDgKLS8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgotLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAotaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7Ci0JZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKLQlyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Ci19KSApIHsKLQlhZGRIYW5kbGUoICJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewotCQlpZiAoICFpc1hNTCApIHsKLQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSAidHlwZSIgPyAxIDogMiApOwotCQl9Ci0JfSk7Ci19Ci0KLS8vIFN1cHBvcnQ6IElFPDkKLS8vIFVzZSBkZWZhdWx0VmFsdWUgaW4gcGxhY2Ugb2YgZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpCi1pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydChmdW5jdGlvbiggZGl2ICkgewotCWRpdi5pbm5lckhUTUwgPSAiPGlucHV0Lz4iOwotCWRpdi5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSggInZhbHVlIiwgIiIgKTsKLQlyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwotfSkgKSB7Ci0JYWRkSGFuZGxlKCAidmFsdWUiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7Ci0JCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKLQkJCXJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTsKLQkJfQotCX0pOwotfQotCi0vLyBTdXBwb3J0OiBJRTw5Ci0vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzCi1pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKLQlyZXR1cm4gZGl2LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PSBudWxsOwotfSkgKSB7Ci0JYWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewotCQl2YXIgdmFsOwotCQlpZiAoICFpc1hNTCApIHsKLQkJCXJldHVybiAodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVjaWZpZWQgPwotCQkJCXZhbC52YWx1ZSA6Ci0JCQkJZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDsKLQkJfQotCX0pOwotfQotCi1qUXVlcnkuZmluZCA9IFNpenpsZTsKLWpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKLWpRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zOwotalF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0OwotalF1ZXJ5LnRleHQgPSBTaXp6bGUuZ2V0VGV4dDsKLWpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKLWpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWluczsKLQotCi19KSggd2luZG93ICk7Ci0vLyBTdHJpbmcgdG8gT2JqZWN0IG9wdGlvbnMgZm9ybWF0IGNhY2hlCi12YXIgb3B0aW9uc0NhY2hlID0ge307Ci0KLS8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzIGFuZCBzdG9yZSBpbiBjYWNoZQotZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHsKLQl2YXIgb2JqZWN0ID0gb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gPSB7fTsKLQlqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggY29yZV9ybm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7Ci0JCW9iamVjdFsgZmxhZyBdID0gdHJ1ZTsKLQl9KTsKLQlyZXR1cm4gb2JqZWN0OwotfQotCi0vKgotICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0gKgotICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwotICoJCQl0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0Ci0gKgotICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKLSAqICJmaXJlZCIgbXVsdGlwbGUgdGltZXMuCi0gKgotICogUG9zc2libGUgb3B0aW9uczoKLSAqCi0gKglvbmNlOgkJCXdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKLSAqCi0gKgltZW1vcnk6CQkJd2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZAotICoJCQkJCWFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0ICJtZW1vcml6ZWQiCi0gKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCi0gKgotICoJdW5pcXVlOgkJCXdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KQotICoKLSAqCXN0b3BPbkZhbHNlOglpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2UKLSAqCi0gKi8KLWpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKLQotCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKLQkvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpCi0Jb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiA/Ci0JCSggb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gfHwgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApICkgOgotCQlqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApOwotCi0JdmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmcKLQkJZmlyaW5nLAotCQkvLyBMYXN0IGZpcmUgdmFsdWUgKGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMpCi0JCW1lbW9yeSwKLQkJLy8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWQKLQkJZmlyZWQsCi0JCS8vIEVuZCBvZiB0aGUgbG9vcCB3aGVuIGZpcmluZwotCQlmaXJpbmdMZW5ndGgsCi0JCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IHJlbW92ZSBpZiBuZWVkZWQpCi0JCWZpcmluZ0luZGV4LAotCQkvLyBGaXJzdCBjYWxsYmFjayB0byBmaXJlICh1c2VkIGludGVybmFsbHkgYnkgYWRkIGFuZCBmaXJlV2l0aCkKLQkJZmlyaW5nU3RhcnQsCi0JCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0Ci0JCWxpc3QgPSBbXSwKLQkJLy8gU3RhY2sgb2YgZmlyZSBjYWxscyBmb3IgcmVwZWF0YWJsZSBsaXN0cwotCQlzdGFjayA9ICFvcHRpb25zLm9uY2UgJiYgW10sCi0JCS8vIEZpcmUgY2FsbGJhY2tzCi0JCWZpcmUgPSBmdW5jdGlvbiggZGF0YSApIHsKLQkJCW1lbW9yeSA9IG9wdGlvbnMubWVtb3J5ICYmIGRhdGE7Ci0JCQlmaXJlZCA9IHRydWU7Ci0JCQlmaXJpbmdJbmRleCA9IGZpcmluZ1N0YXJ0IHx8IDA7Ci0JCQlmaXJpbmdTdGFydCA9IDA7Ci0JCQlmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDsKLQkJCWZpcmluZyA9IHRydWU7Ci0JCQlmb3IgKCA7IGxpc3QgJiYgZmlyaW5nSW5kZXggPCBmaXJpbmdMZW5ndGg7IGZpcmluZ0luZGV4KysgKSB7Ci0JCQkJaWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBkYXRhWyAwIF0sIGRhdGFbIDEgXSApID09PSBmYWxzZSAmJiBvcHRpb25zLnN0b3BPbkZhbHNlICkgewotCQkJCQltZW1vcnkgPSBmYWxzZTsgLy8gVG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIHVzaW5nIGFkZAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlmaXJpbmcgPSBmYWxzZTsKLQkJCWlmICggbGlzdCApIHsKLQkJCQlpZiAoIHN0YWNrICkgewotCQkJCQlpZiAoIHN0YWNrLmxlbmd0aCApIHsKLQkJCQkJCWZpcmUoIHN0YWNrLnNoaWZ0KCkgKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIG1lbW9yeSApIHsKLQkJCQkJbGlzdCA9IFtdOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGYuZGlzYWJsZSgpOwotCQkJCX0KLQkJCX0KLQkJfSwKLQkJLy8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3QKLQkJc2VsZiA9IHsKLQkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKLQkJCWFkZDogZnVuY3Rpb24oKSB7Ci0JCQkJaWYgKCBsaXN0ICkgewotCQkJCQkvLyBGaXJzdCwgd2Ugc2F2ZSB0aGUgY3VycmVudCBsZW5ndGgKLQkJCQkJdmFyIHN0YXJ0ID0gbGlzdC5sZW5ndGg7Ci0JCQkJCShmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7Ci0JCQkJCQlqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHsKLQkJCQkJCQl2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBhcmcgKTsKLQkJCQkJCQlpZiAoIHR5cGUgPT09ICJmdW5jdGlvbiIgKSB7Ci0JCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7Ci0JCQkJCQkJCQlsaXN0LnB1c2goIGFyZyApOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdHlwZSAhPT0gInN0cmluZyIgKSB7Ci0JCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKLQkJCQkJCQkJYWRkKCBhcmcgKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSkoIGFyZ3VtZW50cyApOwotCQkJCQkvLyBEbyB3ZSBuZWVkIHRvIGFkZCB0aGUgY2FsbGJhY2tzIHRvIHRoZQotCQkJCQkvLyBjdXJyZW50IGZpcmluZyBiYXRjaD8KLQkJCQkJaWYgKCBmaXJpbmcgKSB7Ci0JCQkJCQlmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDsKLQkJCQkJLy8gV2l0aCBtZW1vcnksIGlmIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbgotCQkJCQkvLyB3ZSBzaG91bGQgY2FsbCByaWdodCBhd2F5Ci0JCQkJCX0gZWxzZSBpZiAoIG1lbW9yeSApIHsKLQkJCQkJCWZpcmluZ1N0YXJ0ID0gc3RhcnQ7Ci0JCQkJCQlmaXJlKCBtZW1vcnkgKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0sCi0JCQkvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0Ci0JCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewotCQkJCWlmICggbGlzdCApIHsKLQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKLQkJCQkJCXZhciBpbmRleDsKLQkJCQkJCXdoaWxlKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7Ci0JCQkJCQkJbGlzdC5zcGxpY2UoIGluZGV4LCAxICk7Ci0JCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCi0JCQkJCQkJaWYgKCBmaXJpbmcgKSB7Ci0JCQkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nTGVuZ3RoICkgewotCQkJCQkJCQkJZmlyaW5nTGVuZ3RoLS07Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHsKLQkJCQkJCQkJCWZpcmluZ0luZGV4LS07Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0sCi0JCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgotCQkJLy8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuCi0JCQloYXM6IGZ1bmN0aW9uKCBmbiApIHsKLQkJCQlyZXR1cm4gZm4gPyBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDogISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTsKLQkJCX0sCi0JCQkvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0Ci0JCQllbXB0eTogZnVuY3Rpb24oKSB7Ci0JCQkJbGlzdCA9IFtdOwotCQkJCWZpcmluZ0xlbmd0aCA9IDA7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9LAotCQkJLy8gSGF2ZSB0aGUgbGlzdCBkbyBub3RoaW5nIGFueW1vcmUKLQkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewotCQkJCWxpc3QgPSBzdGFjayA9IG1lbW9yeSA9IHVuZGVmaW5lZDsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0sCi0JCQkvLyBJcyBpdCBkaXNhYmxlZD8KLQkJCWRpc2FibGVkOiBmdW5jdGlvbigpIHsKLQkJCQlyZXR1cm4gIWxpc3Q7Ci0JCQl9LAotCQkJLy8gTG9jayB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZQotCQkJbG9jazogZnVuY3Rpb24oKSB7Ci0JCQkJc3RhY2sgPSB1bmRlZmluZWQ7Ci0JCQkJaWYgKCAhbWVtb3J5ICkgewotCQkJCQlzZWxmLmRpc2FibGUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9LAotCQkJLy8gSXMgaXQgbG9ja2VkPwotCQkJbG9ja2VkOiBmdW5jdGlvbigpIHsKLQkJCQlyZXR1cm4gIXN0YWNrOwotCQkJfSwKLQkJCS8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHMKLQkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKLQkJCQlpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHsKLQkJCQkJYXJncyA9IGFyZ3MgfHwgW107Ci0JCQkJCWFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07Ci0JCQkJCWlmICggZmlyaW5nICkgewotCQkJCQkJc3RhY2sucHVzaCggYXJncyApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZmlyZSggYXJncyApOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzOwotCQkJfSwKLQkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCi0JCQlmaXJlOiBmdW5jdGlvbigpIHsKLQkJCQlzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0sCi0JCQkvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UKLQkJCWZpcmVkOiBmdW5jdGlvbigpIHsKLQkJCQlyZXR1cm4gISFmaXJlZDsKLQkJCX0KLQkJfTsKLQotCXJldHVybiBzZWxmOwotfTsKLWpRdWVyeS5leHRlbmQoewotCi0JRGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkgewotCQl2YXIgdHVwbGVzID0gWwotCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZQotCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZXNvbHZlZCIgXSwKLQkJCQlbICJyZWplY3QiLCAiZmFpbCIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZWplY3RlZCIgXSwKLQkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCJtZW1vcnkiKSBdCi0JCQldLAotCQkJc3RhdGUgPSAicGVuZGluZyIsCi0JCQlwcm9taXNlID0gewotCQkJCXN0YXRlOiBmdW5jdGlvbigpIHsKLQkJCQkJcmV0dXJuIHN0YXRlOwotCQkJCX0sCi0JCQkJYWx3YXlzOiBmdW5jdGlvbigpIHsKLQkJCQkJZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7Ci0JCQkJCXJldHVybiB0aGlzOwotCQkJCX0sCi0JCQkJdGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkgewotCQkJCQl2YXIgZm5zID0gYXJndW1lbnRzOwotCQkJCQlyZXR1cm4galF1ZXJ5LkRlZmVycmVkKGZ1bmN0aW9uKCBuZXdEZWZlciApIHsKLQkJCQkJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKLQkJCQkJCQl2YXIgYWN0aW9uID0gdHVwbGVbIDAgXSwKLQkJCQkJCQkJZm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTsKLQkJCQkJCQkvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXIKLQkJCQkJCQlkZWZlcnJlZFsgdHVwbGVbMV0gXShmdW5jdGlvbigpIHsKLQkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwotCQkJCQkJCQlpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7Ci0JCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKLQkJCQkJCQkJCQkuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApCi0JCQkJCQkJCQkJLmZhaWwoIG5ld0RlZmVyLnJlamVjdCApCi0JCQkJCQkJCQkJLnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCW5ld0RlZmVyWyBhY3Rpb24gKyAiV2l0aCIgXSggdGhpcyA9PT0gcHJvbWlzZSA/IG5ld0RlZmVyLnByb21pc2UoKSA6IHRoaXMsIGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzICk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCX0pOwotCQkJCQkJZm5zID0gbnVsbDsKLQkJCQkJfSkucHJvbWlzZSgpOwotCQkJCX0sCi0JCQkJLy8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZAotCQkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKLQkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewotCQkJCQlyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7Ci0JCQkJfQotCQkJfSwKLQkJCWRlZmVycmVkID0ge307Ci0KLQkJLy8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBhdAotCQlwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47Ci0KLQkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwotCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7Ci0JCQl2YXIgbGlzdCA9IHR1cGxlWyAyIF0sCi0JCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgMyBdOwotCi0JCQkvLyBwcm9taXNlWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gPSBsaXN0LmFkZAotCQkJcHJvbWlzZVsgdHVwbGVbMV0gXSA9IGxpc3QuYWRkOwotCi0JCQkvLyBIYW5kbGUgc3RhdGUKLQkJCWlmICggc3RhdGVTdHJpbmcgKSB7Ci0JCQkJbGlzdC5hZGQoZnVuY3Rpb24oKSB7Ci0JCQkJCS8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF0KLQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKLQotCQkJCS8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0LmxvY2sKLQkJCQl9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTsKLQkJCX0KLQotCQkJLy8gZGVmZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXQotCQkJZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBmdW5jdGlvbigpIHsKLQkJCQlkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9OwotCQkJZGVmZXJyZWRbIHR1cGxlWzBdICsgIldpdGgiIF0gPSBsaXN0LmZpcmVXaXRoOwotCQl9KTsKLQotCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKLQkJcHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApOwotCi0JCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKLQkJaWYgKCBmdW5jICkgewotCQkJZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTsKLQkJfQotCi0JCS8vIEFsbCBkb25lIQotCQlyZXR1cm4gZGVmZXJyZWQ7Ci0JfSwKLQotCS8vIERlZmVycmVkIGhlbHBlcgotCXdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkgewotCQl2YXIgaSA9IDAsCi0JCQlyZXNvbHZlVmFsdWVzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSwKLQkJCWxlbmd0aCA9IHJlc29sdmVWYWx1ZXMubGVuZ3RoLAotCi0JCQkvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCi0JCQlyZW1haW5pbmcgPSBsZW5ndGggIT09IDEgfHwgKCBzdWJvcmRpbmF0ZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3Vib3JkaW5hdGUucHJvbWlzZSApICkgPyBsZW5ndGggOiAwLAotCi0JCQkvLyB0aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC4KLQkJCWRlZmVycmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSwKLQotCQkJLy8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlcwotCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFsdWVzICkgewotCQkJCXJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7Ci0JCQkJCWNvbnRleHRzWyBpIF0gPSB0aGlzOwotCQkJCQl2YWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwotCQkJCQlpZiggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHsKLQkJCQkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTsKLQkJCQkJfSBlbHNlIGlmICggISggLS1yZW1haW5pbmcgKSApIHsKLQkJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSwKLQotCQkJcHJvZ3Jlc3NWYWx1ZXMsIHByb2dyZXNzQ29udGV4dHMsIHJlc29sdmVDb250ZXh0czsKLQotCQkvLyBhZGQgbGlzdGVuZXJzIHRvIERlZmVycmVkIHN1Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFzIHJlc29sdmVkCi0JCWlmICggbGVuZ3RoID4gMSApIHsKLQkJCXByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKLQkJCXByb2dyZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOwotCQkJcmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKLQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewotCQkJCWlmICggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSApICkgewotCQkJCQlyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpCi0JCQkJCQkuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKQotCQkJCQkJLmZhaWwoIGRlZmVycmVkLnJlamVjdCApCi0JCQkJCQkucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKTsKLQkJCQl9IGVsc2UgewotCQkJCQktLXJlbWFpbmluZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyCi0JCWlmICggIXJlbWFpbmluZyApIHsKLQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKLQkJfQotCi0JCXJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7Ci0JfQotfSk7Ci1qUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbiggc3VwcG9ydCApIHsKLQotCXZhciBhbGwsIGEsIGlucHV0LCBzZWxlY3QsIGZyYWdtZW50LCBvcHQsIGV2ZW50TmFtZSwgaXNTdXBwb3J0ZWQsIGksCi0JCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotCi0JLy8gU2V0dXAKLQlkaXYuc2V0QXR0cmlidXRlKCAiY2xhc3NOYW1lIiwgInQiICk7Ci0JZGl2LmlubmVySFRNTCA9ICIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iOwotCi0JLy8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHMKLQlhbGwgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSB8fCBbXTsKLQlhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbIDAgXTsKLQlpZiAoICFhIHx8ICFhLnN0eWxlIHx8ICFhbGwubGVuZ3RoICkgewotCQlyZXR1cm4gc3VwcG9ydDsKLQl9Ci0KLQkvLyBGaXJzdCBiYXRjaCBvZiB0ZXN0cwotCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotCW9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIikgKTsKLQlpbnB1dCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVsgMCBdOwotCi0JYS5zdHlsZS5jc3NUZXh0ID0gInRvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41IjsKLQotCS8vIFRlc3Qgc2V0QXR0cmlidXRlIG9uIGNhbWVsQ2FzZSBjbGFzcy4gSWYgaXQgd29ya3MsIHdlIG5lZWQgYXR0ckZpeGVzIHdoZW4gZG9pbmcgZ2V0L3NldEF0dHJpYnV0ZSAoaWU2LzcpCi0Jc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUgPSBkaXYuY2xhc3NOYW1lICE9PSAidCI7Ci0KLQkvLyBJRSBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gLmlubmVySFRNTCBpcyB1c2VkCi0Jc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSA9IGRpdi5maXJzdENoaWxkLm5vZGVUeXBlID09PSAzOwotCi0JLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKLQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCi0Jc3VwcG9ydC50Ym9keSA9ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoOwotCi0JLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MCi0JLy8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRQotCXN1cHBvcnQuaHRtbFNlcmlhbGl6ZSA9ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoOwotCi0JLy8gR2V0IHRoZSBzdHlsZSBpbmZvcm1hdGlvbiBmcm9tIGdldEF0dHJpYnV0ZQotCS8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlYWQpCi0Jc3VwcG9ydC5zdHlsZSA9IC90b3AvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICk7Ci0KLQkvLyBNYWtlIHN1cmUgdGhhdCBVUkxzIGFyZW4ndCBtYW5pcHVsYXRlZAotCS8vIChJRSBub3JtYWxpemVzIGl0IGJ5IGRlZmF1bHQpCi0Jc3VwcG9ydC5ocmVmTm9ybWFsaXplZCA9IGEuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIvYSI7Ci0KLQkvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzCi0JLy8gKElFIHVzZXMgZmlsdGVyIGluc3RlYWQpCi0JLy8gVXNlIGEgcmVnZXggdG8gd29yayBhcm91bmQgYSBXZWJLaXQgaXNzdWUuIFNlZSAjNTE0NQotCXN1cHBvcnQub3BhY2l0eSA9IC9eMC41Ly50ZXN0KCBhLnN0eWxlLm9wYWNpdHkgKTsKLQotCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKLQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCi0Jc3VwcG9ydC5jc3NGbG9hdCA9ICEhYS5zdHlsZS5jc3NGbG9hdDsKLQotCS8vIENoZWNrIHRoZSBkZWZhdWx0IGNoZWNrYm94L3JhZGlvIHZhbHVlICgiIiBvbiBXZWJLaXQ7ICJvbiIgZWxzZXdoZXJlKQotCXN1cHBvcnQuY2hlY2tPbiA9ICEhaW5wdXQudmFsdWU7Ci0KLQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGVkLWJ5LWRlZmF1bHQgb3B0aW9uIGhhcyBhIHdvcmtpbmcgc2VsZWN0ZWQgcHJvcGVydHkuCi0JLy8gKFdlYktpdCBkZWZhdWx0cyB0byBmYWxzZSBpbnN0ZWFkIG9mIHRydWUsIElFIHRvbywgaWYgaXQncyBpbiBhbiBvcHRncm91cCkKLQlzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkOwotCi0JLy8gVGVzdHMgZm9yIGVuY3R5cGUgc3VwcG9ydCBvbiBhIGZvcm0gKCM2NzQzKQotCXN1cHBvcnQuZW5jdHlwZSA9ICEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGU7Ci0KLQkvLyBNYWtlcyBzdXJlIGNsb25pbmcgYW4gaHRtbDUgZWxlbWVudCBkb2VzIG5vdCBjYXVzZSBwcm9ibGVtcwotCS8vIFdoZXJlIG91dGVySFRNTCBpcyB1bmRlZmluZWQsIHRoaXMgc3RpbGwgd29ya3MKLQlzdXBwb3J0Lmh0bWw1Q2xvbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoIHRydWUgKS5vdXRlckhUTUwgIT09ICI8Om5hdj48LzpuYXY+IjsKLQotCS8vIFdpbGwgYmUgZGVmaW5lZCBsYXRlcgotCXN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9IGZhbHNlOwotCXN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9IGZhbHNlOwotCXN1cHBvcnQucGl4ZWxQb3NpdGlvbiA9IGZhbHNlOwotCXN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IHRydWU7Ci0Jc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSB0cnVlOwotCXN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9IHRydWU7Ci0Jc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSA9IHRydWU7Ci0KLQkvLyBNYWtlIHN1cmUgY2hlY2tlZCBzdGF0dXMgaXMgcHJvcGVybHkgY2xvbmVkCi0JaW5wdXQuY2hlY2tlZCA9IHRydWU7Ci0Jc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9IGlucHV0LmNsb25lTm9kZSggdHJ1ZSApLmNoZWNrZWQ7Ci0KLQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkCi0JLy8gKFdlYktpdCBtYXJrcyB0aGVtIGFzIGRpc2FibGVkKQotCXNlbGVjdC5kaXNhYmxlZCA9IHRydWU7Ci0Jc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7Ci0KLQkvLyBTdXBwb3J0OiBJRTw5Ci0JdHJ5IHsKLQkJZGVsZXRlIGRpdi50ZXN0OwotCX0gY2F0Y2goIGUgKSB7Ci0JCXN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOwotCX0KLQotCS8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBnZXRBdHRyaWJ1dGUoInZhbHVlIikKLQlpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0JaW5wdXQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwotCXN1cHBvcnQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gIiI7Ci0KLQkvLyBDaGVjayBpZiBhbiBpbnB1dCBtYWludGFpbnMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW8KLQlpbnB1dC52YWx1ZSA9ICJ0IjsKLQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInJhZGlvIiApOwotCXN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSAidCI7Ci0KLQkvLyAjMTEyMTcgLSBXZWJLaXQgbG9zZXMgY2hlY2sgd2hlbiB0aGUgbmFtZSBpcyBhZnRlciB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUKLQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInQiICk7Ci0JaW5wdXQuc2V0QXR0cmlidXRlKCAibmFtZSIsICJ0IiApOwotCi0JZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0JZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGlucHV0ICk7Ci0KLQkvLyBDaGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZAotCS8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAoSUU2LzcpCi0Jc3VwcG9ydC5hcHBlbmRDaGVja2VkID0gaW5wdXQuY2hlY2tlZDsKLQotCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwotCXN1cHBvcnQuY2hlY2tDbG9uZSA9IGZyYWdtZW50LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkOwotCi0JLy8gU3VwcG9ydDogSUU8OQotCS8vIE9wZXJhIGRvZXMgbm90IGNsb25lIGV2ZW50cyAoYW5kIHR5cGVvZiBkaXYuYXR0YWNoRXZlbnQgPT09IHVuZGVmaW5lZCkuCi0JLy8gSUU5LTEwIGNsb25lcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50LCBidXQgdGhleSBkb24ndCB0cmlnZ2VyIHdpdGggLmNsaWNrKCkKLQlpZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKLQkJZGl2LmF0dGFjaEV2ZW50KCAib25jbGljayIsIGZ1bmN0aW9uKCkgewotCQkJc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKLQkJfSk7Ci0KLQkJZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsaWNrKCk7Ci0JfQotCi0JLy8gU3VwcG9ydDogSUU8OSAobGFjayBzdWJtaXQvY2hhbmdlIGJ1YmJsZSksIEZpcmVmb3ggMTcrIChsYWNrIGZvY3VzaW4gZXZlbnQpCi0JLy8gQmV3YXJlIG9mIENTUCByZXN0cmljdGlvbnMgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL1NlY3VyaXR5L0NTUCkKLQlmb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCBjaGFuZ2U6IHRydWUsIGZvY3VzaW46IHRydWUgfSkgewotCQlkaXYuc2V0QXR0cmlidXRlKCBldmVudE5hbWUgPSAib24iICsgaSwgInQiICk7Ci0KLQkJc3VwcG9ydFsgaSArICJCdWJibGVzIiBdID0gZXZlbnROYW1lIGluIHdpbmRvdyB8fCBkaXYuYXR0cmlidXRlc1sgZXZlbnROYW1lIF0uZXhwYW5kbyA9PT0gZmFsc2U7Ci0JfQotCi0JZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gImNvbnRlbnQtYm94IjsKLQlkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKLQlzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gImNvbnRlbnQtYm94IjsKLQotCS8vIFN1cHBvcnQ6IElFPDkKLQkvLyBJdGVyYXRpb24gb3ZlciBvYmplY3QncyBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWZvcmUgaXRzIG93bi4KLQlmb3IgKCBpIGluIGpRdWVyeSggc3VwcG9ydCApICkgewotCQlicmVhazsKLQl9Ci0Jc3VwcG9ydC5vd25MYXN0ID0gaSAhPT0gIjAiOwotCi0JLy8gUnVuIHRlc3RzIHRoYXQgbmVlZCBhIGJvZHkgYXQgZG9jIHJlYWR5Ci0JalF1ZXJ5KGZ1bmN0aW9uKCkgewotCQl2YXIgY29udGFpbmVyLCBtYXJnaW5EaXYsIHRkcywKLQkJCWRpdlJlc2V0ID0gInBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDsiLAotCQkJYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07Ci0KLQkJaWYgKCAhYm9keSApIHsKLQkJCS8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKLQkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAiYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHgiOwotCi0JCWJvZHkuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTsKLQotCQkvLyBTdXBwb3J0OiBJRTgKLQkJLy8gQ2hlY2sgaWYgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQgd2hlbiB0aGV5IGFyZSBzZXQKLQkJLy8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhCi0JCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgotCQkvLyBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGhhcyBiZWVuIGhpZGRlbiBkaXJlY3RseSB1c2luZwotCQkvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBpcwotCQkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCi0JCWRpdi5pbm5lckhUTUwgPSAiPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiI7Ci0JCXRkcyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLQkJdGRzWyAwIF0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIjsKLQkJaXNTdXBwb3J0ZWQgPSAoIHRkc1sgMCBdLm9mZnNldEhlaWdodCA9PT0gMCApOwotCi0JCXRkc1sgMCBdLnN0eWxlLmRpc3BsYXkgPSAiIjsKLQkJdGRzWyAxIF0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLQotCQkvLyBTdXBwb3J0OiBJRTgKLQkJLy8gQ2hlY2sgaWYgZW1wdHkgdGFibGUgY2VsbHMgc3RpbGwgaGF2ZSBvZmZzZXRXaWR0aC9IZWlnaHQKLQkJc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgPSBpc1N1cHBvcnRlZCAmJiAoIHRkc1sgMCBdLm9mZnNldEhlaWdodCA9PT0gMCApOwotCi0JCS8vIENoZWNrIGJveC1zaXppbmcgYW5kIG1hcmdpbiBiZWhhdmlvci4KLQkJZGl2LmlubmVySFRNTCA9ICIiOwotCQlkaXYuc3R5bGUuY3NzVGV4dCA9ICJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJTsiOwotCi0JCS8vIFdvcmthcm91bmQgZmFpbGluZyBib3hTaXppbmcgdGVzdCBkdWUgdG8gb2Zmc2V0V2lkdGggcmV0dXJuaW5nIHdyb25nIHZhbHVlCi0JCS8vIHdpdGggc29tZSBub24tMSB2YWx1ZXMgb2YgYm9keSB6b29tLCB0aWNrZXQgIzEzNTQzCi0JCWpRdWVyeS5zd2FwKCBib2R5LCBib2R5LnN0eWxlLnpvb20gIT0gbnVsbCA/IHsgem9vbTogMSB9IDoge30sIGZ1bmN0aW9uKCkgewotCQkJc3VwcG9ydC5ib3hTaXppbmcgPSBkaXYub2Zmc2V0V2lkdGggPT09IDQ7Ci0JCX0pOwotCi0JCS8vIFVzZSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSBiZWNhdXNlIGpzZG9tIG9uIG5vZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0LgotCQlpZiAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICkgewotCQkJc3VwcG9ydC5waXhlbFBvc2l0aW9uID0gKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICkgfHwge30gKS50b3AgIT09ICIxJSI7Ci0JCQlzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlID0gKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICkgfHwgeyB3aWR0aDogIjRweCIgfSApLndpZHRoID09PSAiNHB4IjsKLQotCQkJLy8gQ2hlY2sgaWYgZGl2IHdpdGggZXhwbGljaXQgd2lkdGggYW5kIG5vIG1hcmdpbi1yaWdodCBpbmNvcnJlY3RseQotCQkJLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiAoIzMzMzMpCi0JCQkvLyBGYWlscyBpbiBXZWJLaXQgYmVmb3JlIEZlYiAyMDExIG5pZ2h0bGllcwotCQkJLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0Ci0JCQltYXJnaW5EaXYgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7Ci0JCQltYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2UmVzZXQ7Ci0JCQltYXJnaW5EaXYuc3R5bGUubWFyZ2luUmlnaHQgPSBtYXJnaW5EaXYuc3R5bGUud2lkdGggPSAiMCI7Ci0JCQlkaXYuc3R5bGUud2lkdGggPSAiMXB4IjsKLQotCQkJc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0ID0KLQkJCQkhcGFyc2VGbG9hdCggKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkgfHwge30gKS5tYXJnaW5SaWdodCApOwotCQl9Ci0KLQkJaWYgKCB0eXBlb2YgZGl2LnN0eWxlLnpvb20gIT09IGNvcmVfc3RydW5kZWZpbmVkICkgewotCQkJLy8gU3VwcG9ydDogSUU8OAotCQkJLy8gQ2hlY2sgaWYgbmF0aXZlbHkgYmxvY2stbGV2ZWwgZWxlbWVudHMgYWN0IGxpa2UgaW5saW5lLWJsb2NrCi0JCQkvLyBlbGVtZW50cyB3aGVuIHNldHRpbmcgdGhlaXIgZGlzcGxheSB0byAnaW5saW5lJyBhbmQgZ2l2aW5nCi0JCQkvLyB0aGVtIGxheW91dAotCQkJZGl2LmlubmVySFRNTCA9ICIiOwotCQkJZGl2LnN0eWxlLmNzc1RleHQgPSBkaXZSZXNldCArICJ3aWR0aDoxcHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxIjsKLQkJCXN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9ICggZGl2Lm9mZnNldFdpZHRoID09PSAzICk7Ci0KLQkJCS8vIFN1cHBvcnQ6IElFNgotCQkJLy8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW4KLQkJCWRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKLQkJCWRpdi5pbm5lckhUTUwgPSAiPGRpdj48L2Rpdj4iOwotCQkJZGl2LmZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPSAiNXB4IjsKLQkJCXN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9ICggZGl2Lm9mZnNldFdpZHRoICE9PSAzICk7Ci0KLQkJCWlmICggc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ICkgewotCQkJCS8vIFByZXZlbnQgSUUgNiBmcm9tIGFmZmVjdGluZyBsYXlvdXQgZm9yIHBvc2l0aW9uZWQgZWxlbWVudHMgIzExMDQ4Ci0JCQkJLy8gUHJldmVudCBJRSBmcm9tIHNocmlua2luZyB0aGUgYm9keSBpbiBJRSA3IG1vZGUgIzEyODY5Ci0JCQkJLy8gU3VwcG9ydDogSUU8OAotCQkJCWJvZHkuc3R5bGUuem9vbSA9IDE7Ci0JCQl9Ci0JCX0KLQotCQlib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKLQotCQkvLyBOdWxsIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFCi0JCWNvbnRhaW5lciA9IGRpdiA9IHRkcyA9IG1hcmdpbkRpdiA9IG51bGw7Ci0JfSk7Ci0KLQkvLyBOdWxsIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFCi0JYWxsID0gc2VsZWN0ID0gZnJhZ21lbnQgPSBvcHQgPSBhID0gaW5wdXQgPSBudWxsOwotCi0JcmV0dXJuIHN1cHBvcnQ7Ci19KSh7fSk7Ci0KLXZhciByYnJhY2UgPSAvKD86XHtbXHNcU10qXH18XFtbXHNcU10qXF0pJC8sCi0Jcm11bHRpRGFzaCA9IC8oW0EtWl0pL2c7Ci0KLWZ1bmN0aW9uIGludGVybmFsRGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICl7Ci0JaWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKLQkJcmV0dXJuOwotCX0KLQotCXZhciByZXQsIHRoaXNDYWNoZSwKLQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKLQotCQkvLyBXZSBoYXZlIHRvIGhhbmRsZSBET00gbm9kZXMgYW5kIEpTIG9iamVjdHMgZGlmZmVyZW50bHkgYmVjYXVzZSBJRTYtNwotCQkvLyBjYW4ndCBHQyBvYmplY3QgcmVmZXJlbmNlcyBwcm9wZXJseSBhY3Jvc3MgdGhlIERPTS1KUyBib3VuZGFyeQotCQlpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAotCi0JCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCi0JCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkKLQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAotCi0JCS8vIE9ubHkgZGVmaW5pbmcgYW4gSUQgZm9yIEpTIG9iamVjdHMgaWYgaXRzIGNhY2hlIGFscmVhZHkgZXhpc3RzIGFsbG93cwotCQkvLyB0aGUgY29kZSB0byBzaG9ydGN1dCBvbiB0aGUgc2FtZSBwYXRoIGFzIGEgRE9NIG5vZGUgd2l0aCBubyBjYWNoZQotCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGludGVybmFsS2V5IF0gOiBlbGVtWyBpbnRlcm5hbEtleSBdICYmIGludGVybmFsS2V5OwotCi0JLy8gQXZvaWQgZG9pbmcgYW55IG1vcmUgd29yayB0aGFuIHdlIG5lZWQgdG8gd2hlbiB0cnlpbmcgdG8gZ2V0IGRhdGEgb24gYW4KLQkvLyBvYmplY3QgdGhhdCBoYXMgbm8gZGF0YSBhdCBhbGwKLQlpZiAoICghaWQgfHwgIWNhY2hlW2lkXSB8fCAoIXB2dCAmJiAhY2FjaGVbaWRdLmRhdGEpKSAmJiBkYXRhID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciICkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCAhaWQgKSB7Ci0JCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgYSBuZXcgdW5pcXVlIElEIGZvciBlYWNoIGVsZW1lbnQgc2luY2UgdGhlaXIgZGF0YQotCQkvLyBlbmRzIHVwIGluIHRoZSBnbG9iYWwgY2FjaGUKLQkJaWYgKCBpc05vZGUgKSB7Ci0JCQlpZCA9IGVsZW1bIGludGVybmFsS2V5IF0gPSBjb3JlX2RlbGV0ZWRJZHMucG9wKCkgfHwgalF1ZXJ5Lmd1aWQrKzsKLQkJfSBlbHNlIHsKLQkJCWlkID0gaW50ZXJuYWxLZXk7Ci0JCX0KLQl9Ci0KLQlpZiAoICFjYWNoZVsgaWQgXSApIHsKLQkJLy8gQXZvaWQgZXhwb3NpbmcgalF1ZXJ5IG1ldGFkYXRhIG9uIHBsYWluIEpTIG9iamVjdHMgd2hlbiB0aGUgb2JqZWN0Ci0JCS8vIGlzIHNlcmlhbGl6ZWQgdXNpbmcgSlNPTi5zdHJpbmdpZnkKLQkJY2FjaGVbIGlkIF0gPSBpc05vZGUgPyB7fSA6IHsgdG9KU09OOiBqUXVlcnkubm9vcCB9OwotCX0KLQotCS8vIEFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQgb2YgYSBrZXkvdmFsdWUgcGFpcjsgdGhpcyBnZXRzCi0JLy8gc2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZQotCWlmICggdHlwZW9mIG5hbWUgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iICkgewotCQlpZiAoIHB2dCApIHsKLQkJCWNhY2hlWyBpZCBdID0galF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0sIG5hbWUgKTsKLQkJfSBlbHNlIHsKLQkJCWNhY2hlWyBpZCBdLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXS5kYXRhLCBuYW1lICk7Ci0JCX0KLQl9Ci0KLQl0aGlzQ2FjaGUgPSBjYWNoZVsgaWQgXTsKLQotCS8vIGpRdWVyeSBkYXRhKCkgaXMgc3RvcmVkIGluIGEgc2VwYXJhdGUgb2JqZWN0IGluc2lkZSB0aGUgb2JqZWN0J3MgaW50ZXJuYWwgZGF0YQotCS8vIGNhY2hlIGluIG9yZGVyIHRvIGF2b2lkIGtleSBjb2xsaXNpb25zIGJldHdlZW4gaW50ZXJuYWwgZGF0YSBhbmQgdXNlci1kZWZpbmVkCi0JLy8gZGF0YS4KLQlpZiAoICFwdnQgKSB7Ci0JCWlmICggIXRoaXNDYWNoZS5kYXRhICkgewotCQkJdGhpc0NhY2hlLmRhdGEgPSB7fTsKLQkJfQotCi0JCXRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhOwotCX0KLQotCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewotCQl0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTsKLQl9Ci0KLQkvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lcwotCS8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkCi0JaWYgKCB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIgKSB7Ci0KLQkJLy8gRmlyc3QgVHJ5IHRvIGZpbmQgYXMtaXMgcHJvcGVydHkgZGF0YQotCQlyZXQgPSB0aGlzQ2FjaGVbIG5hbWUgXTsKLQotCQkvLyBUZXN0IGZvciBudWxsfHVuZGVmaW5lZCBwcm9wZXJ0eSBkYXRhCi0JCWlmICggcmV0ID09IG51bGwgKSB7Ci0KLQkJCS8vIFRyeSB0byBmaW5kIHRoZSBjYW1lbENhc2VkIHByb3BlcnR5Ci0JCQlyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0ID0gdGhpc0NhY2hlOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWZ1bmN0aW9uIGludGVybmFsUmVtb3ZlRGF0YSggZWxlbSwgbmFtZSwgcHZ0ICkgewotCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQl2YXIgdGhpc0NhY2hlLCBpLAotCQlpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAotCi0JCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgotCQljYWNoZSA9IGlzTm9kZSA/IGpRdWVyeS5jYWNoZSA6IGVsZW0sCi0JCWlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IGpRdWVyeS5leHBhbmRvOwotCi0JLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vCi0JLy8gcHVycG9zZSBpbiBjb250aW51aW5nCi0JaWYgKCAhY2FjaGVbIGlkIF0gKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIG5hbWUgKSB7Ci0KLQkJdGhpc0NhY2hlID0gcHZ0ID8gY2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5kYXRhOwotCi0JCWlmICggdGhpc0NhY2hlICkgewotCi0JCQkvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgbmFtZXMgZm9yIGRhdGEga2V5cwotCQkJaWYgKCAhalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHsKLQotCQkJCS8vIHRyeSB0aGUgc3RyaW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9uCi0JCQkJaWYgKCBuYW1lIGluIHRoaXNDYWNoZSApIHsKLQkJCQkJbmFtZSA9IFsgbmFtZSBdOwotCQkJCX0gZWxzZSB7Ci0KLQkJCQkJLy8gc3BsaXQgdGhlIGNhbWVsIGNhc2VkIHZlcnNpb24gYnkgc3BhY2VzIHVubGVzcyBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzCi0JCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7Ci0JCQkJCWlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7Ci0JCQkJCQluYW1lID0gWyBuYW1lIF07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQluYW1lID0gbmFtZS5zcGxpdCgiICIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBJZiAibmFtZSIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLgotCQkJCS8vIFdoZW4gZGF0YSBpcyBpbml0aWFsbHkgY3JlYXRlZCwgdmlhICgia2V5IiwgInZhbCIpIHNpZ25hdHVyZSwKLQkJCQkvLyBrZXlzIHdpbGwgYmUgY29udmVydGVkIHRvIGNhbWVsQ2FzZS4KLQkJCQkvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93XyBhIGtleSB3YXMgYWRkZWQsIHJlbW92ZQotCQkJCS8vIGJvdGggcGxhaW4ga2V5IGFuZCBjYW1lbENhc2Uga2V5LiAjMTI3ODYKLQkJCQkvLyBUaGlzIHdpbGwgb25seSBwZW5hbGl6ZSB0aGUgYXJyYXkgYXJndW1lbnQgcGF0aC4KLQkJCQluYW1lID0gbmFtZS5jb25jYXQoIGpRdWVyeS5tYXAoIG5hbWUsIGpRdWVyeS5jYW1lbENhc2UgKSApOwotCQkJfQotCi0JCQlpID0gbmFtZS5sZW5ndGg7Ci0JCQl3aGlsZSAoIGktLSApIHsKLQkJCQlkZWxldGUgdGhpc0NhY2hlWyBuYW1lW2ldIF07Ci0JCQl9Ci0KLQkJCS8vIElmIHRoZXJlIGlzIG5vIGRhdGEgbGVmdCBpbiB0aGUgY2FjaGUsIHdlIHdhbnQgdG8gY29udGludWUKLQkJCS8vIGFuZCBsZXQgdGhlIGNhY2hlIG9iamVjdCBpdHNlbGYgZ2V0IGRlc3Ryb3llZAotCQkJaWYgKCBwdnQgPyAhaXNFbXB0eURhdGFPYmplY3QodGhpc0NhY2hlKSA6ICFqUXVlcnkuaXNFbXB0eU9iamVjdCh0aGlzQ2FjaGUpICkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgotCWlmICggIXB2dCApIHsKLQkJZGVsZXRlIGNhY2hlWyBpZCBdLmRhdGE7Ci0KLQkJLy8gRG9uJ3QgZGVzdHJveSB0aGUgcGFyZW50IGNhY2hlIHVubGVzcyB0aGUgaW50ZXJuYWwgZGF0YSBvYmplY3QKLQkJLy8gaGFkIGJlZW4gdGhlIG9ubHkgdGhpbmcgbGVmdCBpbiBpdAotCQlpZiAoICFpc0VtcHR5RGF0YU9iamVjdCggY2FjaGVbIGlkIF0gKSApIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8vIERlc3Ryb3kgdGhlIGNhY2hlCi0JaWYgKCBpc05vZGUgKSB7Ci0JCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdLCB0cnVlICk7Ci0KLQkvLyBVc2UgZGVsZXRlIHdoZW4gc3VwcG9ydGVkIGZvciBleHBhbmRvcyBvciBgY2FjaGVgIGlzIG5vdCBhIHdpbmRvdyBwZXIgaXNXaW5kb3cgKCMxMDA4MCkKLQkvKiBqc2hpbnQgZXFlcWVxOiBmYWxzZSAqLwotCX0gZWxzZSBpZiAoIGpRdWVyeS5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8gfHwgY2FjaGUgIT0gY2FjaGUud2luZG93ICkgewotCQkvKiBqc2hpbnQgZXFlcWVxOiB0cnVlICovCi0JCWRlbGV0ZSBjYWNoZVsgaWQgXTsKLQotCS8vIFdoZW4gYWxsIGVsc2UgZmFpbHMsIG51bGwKLQl9IGVsc2UgewotCQljYWNoZVsgaWQgXSA9IG51bGw7Ci0JfQotfQotCi1qUXVlcnkuZXh0ZW5kKHsKLQljYWNoZToge30sCi0KLQkvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91Ci0JLy8gYXR0ZW1wdCB0byBhZGQgZXhwYW5kbyBwcm9wZXJ0aWVzIHRvIHRoZW0uCi0Jbm9EYXRhOiB7Ci0JCSJhcHBsZXQiOiB0cnVlLAotCQkiZW1iZWQiOiB0cnVlLAotCQkvLyBCYW4gYWxsIG9iamVjdHMgZXhjZXB0IGZvciBGbGFzaCAod2hpY2ggaGFuZGxlIGV4cGFuZG9zKQotCQkib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIKLQl9LAotCi0JaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCWVsZW0gPSBlbGVtLm5vZGVUeXBlID8galF1ZXJ5LmNhY2hlWyBlbGVtW2pRdWVyeS5leHBhbmRvXSBdIDogZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKLQkJcmV0dXJuICEhZWxlbSAmJiAhaXNFbXB0eURhdGFPYmplY3QoIGVsZW0gKTsKLQl9LAotCi0JZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7Ci0JCXJldHVybiBpbnRlcm5hbERhdGEoIGVsZW0sIG5hbWUsIGRhdGEgKTsKLQl9LAotCi0JcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0JCXJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUgKTsKLQl9LAotCi0JLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgotCV9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsKLQkJcmV0dXJuIGludGVybmFsRGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgdHJ1ZSApOwotCX0sCi0KLQlfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Ci0JCXJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHRydWUgKTsKLQl9LAotCi0JLy8gQSBtZXRob2QgZm9yIGRldGVybWluaW5nIGlmIGEgRE9NIG5vZGUgY2FuIGhhbmRsZSB0aGUgZGF0YSBleHBhbmRvCi0JYWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCS8vIERvIG5vdCBzZXQgZGF0YSBvbiBub24tZWxlbWVudCBiZWNhdXNlIGl0IHdpbGwgbm90IGJlIGNsZWFyZWQgKCM4MzM1KS4KLQkJaWYgKCBlbGVtLm5vZGVUeXBlICYmIGVsZW0ubm9kZVR5cGUgIT09IDEgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXZhciBub0RhdGEgPSBlbGVtLm5vZGVOYW1lICYmIGpRdWVyeS5ub0RhdGFbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwotCi0JCS8vIG5vZGVzIGFjY2VwdCBkYXRhIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkOyByZWplY3Rpb24gY2FuIGJlIGNvbmRpdGlvbmFsCi0JCXJldHVybiAhbm9EYXRhIHx8IG5vRGF0YSAhPT0gdHJ1ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpID09PSBub0RhdGE7Ci0JfQotfSk7Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewotCQl2YXIgYXR0cnMsIG5hbWUsCi0JCQlkYXRhID0gbnVsbCwKLQkJCWkgPSAwLAotCQkJZWxlbSA9IHRoaXNbMF07Ci0KLQkJLy8gU3BlY2lhbCBleHBlY3Rpb25zIG9mIC5kYXRhIGJhc2ljYWxseSB0aHdhcnQgalF1ZXJ5LmFjY2VzcywKLQkJLy8gc28gaW1wbGVtZW50IHRoZSByZWxldmFudCBiZWhhdmlvciBvdXJzZWx2ZXMKLQotCQkvLyBHZXRzIGFsbCB2YWx1ZXMKLQkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKLQkJCWlmICggdGhpcy5sZW5ndGggKSB7Ci0JCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtICk7Ci0KLQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiApICkgewotCQkJCQlhdHRycyA9IGVsZW0uYXR0cmlidXRlczsKLQkJCQkJZm9yICggOyBpIDwgYXR0cnMubGVuZ3RoOyBpKysgKSB7Ci0JCQkJCQluYW1lID0gYXR0cnNbaV0ubmFtZTsKLQotCQkJCQkJaWYgKCBuYW1lLmluZGV4T2YoImRhdGEtIikgPT09IDAgKSB7Ci0JCQkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoNSkgKTsKLQotCQkJCQkJCWRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJwYXJzZWRBdHRycyIsIHRydWUgKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBkYXRhOwotCQl9Ci0KLQkJLy8gU2V0cyBtdWx0aXBsZSB2YWx1ZXMKLQkJaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKLQkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0JCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSApOwotCQkJfSk7Ci0JCX0KLQotCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPwotCi0JCQkvLyBTZXRzIG9uZSB2YWx1ZQotCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7Ci0JCQl9KSA6Ci0KLQkJCS8vIEdldHMgb25lIHZhbHVlCi0JCQkvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QKLQkJCWVsZW0gPyBkYXRhQXR0ciggZWxlbSwga2V5LCBqUXVlcnkuZGF0YSggZWxlbSwga2V5ICkgKSA6IG51bGw7Ci0JfSwKLQotCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7Ci0JCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0JCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7Ci0JCX0pOwotCX0KLX0pOwotCi1mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewotCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKLQkvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGUKLQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewotCi0JCXZhciBuYW1lID0gImRhdGEtIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7Ci0KLQkJZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7Ci0KLQkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7Ci0JCQl0cnkgewotCQkJCWRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKLQkJCQkJZGF0YSA9PT0gImZhbHNlIiA/IGZhbHNlIDoKLQkJCQkJZGF0YSA9PT0gIm51bGwiID8gbnVsbCA6Ci0JCQkJCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCi0JCQkJCStkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6Ci0JCQkJCXJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOgotCQkJCQkJZGF0YTsKLQkJCX0gY2F0Y2goIGUgKSB7fQotCi0JCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKLQkJCWpRdWVyeS5kYXRhKCBlbGVtLCBrZXksIGRhdGEgKTsKLQotCQl9IGVsc2UgewotCQkJZGF0YSA9IHVuZGVmaW5lZDsKLQkJfQotCX0KLQotCXJldHVybiBkYXRhOwotfQotCi0vLyBjaGVja3MgYSBjYWNoZSBvYmplY3QgZm9yIGVtcHRpbmVzcwotZnVuY3Rpb24gaXNFbXB0eURhdGFPYmplY3QoIG9iaiApIHsKLQl2YXIgbmFtZTsKLQlmb3IgKCBuYW1lIGluIG9iaiApIHsKLQotCQkvLyBpZiB0aGUgcHVibGljIGRhdGEgb2JqZWN0IGlzIGVtcHR5LCB0aGUgcHJpdmF0ZSBpcyBzdGlsbCBlbXB0eQotCQlpZiAoIG5hbWUgPT09ICJkYXRhIiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb2JqW25hbWVdICkgKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIG5hbWUgIT09ICJ0b0pTT04iICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci1qUXVlcnkuZXh0ZW5kKHsKLQlxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7Ci0JCXZhciBxdWV1ZTsKLQotCQlpZiAoIGVsZW0gKSB7Ci0JCQl0eXBlID0gKCB0eXBlIHx8ICJmeCIgKSArICJxdWV1ZSI7Ci0JCQlxdWV1ZSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgdHlwZSApOwotCi0JCQkvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwCi0JCQlpZiAoIGRhdGEgKSB7Ci0JCQkJaWYgKCAhcXVldWUgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKSB7Ci0JCQkJCXF1ZXVlID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcXVldWUucHVzaCggZGF0YSApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBxdWV1ZSB8fCBbXTsKLQkJfQotCX0sCi0KLQlkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKLQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKLQotCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKLQkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAotCQkJZm4gPSBxdWV1ZS5zaGlmdCgpLAotCQkJaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSwKLQkJCW5leHQgPSBmdW5jdGlvbigpIHsKLQkJCQlqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApOwotCQkJfTsKLQotCQkvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsCi0JCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKLQkJCWZuID0gcXVldWUuc2hpZnQoKTsKLQkJCXN0YXJ0TGVuZ3RoLS07Ci0JCX0KLQotCQlpZiAoIGZuICkgewotCi0JCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCi0JCQkvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCi0JCQlpZiAoIHR5cGUgPT09ICJmeCIgKSB7Ci0JCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7Ci0JCQl9Ci0KLQkJCS8vIGNsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KLQkJCWRlbGV0ZSBob29rcy5zdG9wOwotCQkJZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKLQkJfQotCi0JCWlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkgewotCQkJaG9va3MuZW1wdHkuZmlyZSgpOwotCQl9Ci0JfSwKLQotCS8vIG5vdCBpbnRlbmRlZCBmb3IgcHVibGljIGNvbnN1bXB0aW9uIC0gZ2VuZXJhdGVzIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybnMgdGhlIGN1cnJlbnQgb25lCi0JX3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgewotCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKLQkJcmV0dXJuIGpRdWVyeS5fZGF0YSggZWxlbSwga2V5ICkgfHwgalF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXksIHsKLQkJCWVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKLQkJCQlqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiICk7Ci0JCQkJalF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCBrZXkgKTsKLQkJCX0pCi0JCX0pOwotCX0KLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLQlxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7Ci0JCXZhciBzZXR0ZXIgPSAyOwotCi0JCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewotCQkJZGF0YSA9IHR5cGU7Ci0JCQl0eXBlID0gImZ4IjsKLQkJCXNldHRlci0tOwotCQl9Ci0KLQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkgewotCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwotCQl9Ci0KLQkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/Ci0JCQl0aGlzIDoKLQkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKLQkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKLQotCQkJCS8vIGVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlCi0JCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7Ci0KLQkJCQlpZiAoIHR5cGUgPT09ICJmeCIgJiYgcXVldWVbMF0gIT09ICJpbnByb2dyZXNzIiApIHsKLQkJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKLQkJCQl9Ci0JCQl9KTsKLQl9LAotCWRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewotCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKLQkJfSk7Ci0JfSwKLQkvLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi0JLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LwotCWRlbGF5OiBmdW5jdGlvbiggdGltZSwgdHlwZSApIHsKLQkJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKLQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKLQotCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkgewotCQkJdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7Ci0JCQlob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7Ci0JCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7Ci0JCQl9OwotCQl9KTsKLQl9LAotCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewotCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCAiZngiLCBbXSApOwotCX0sCi0JLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQotCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQotCXByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7Ci0JCXZhciB0bXAsCi0JCQljb3VudCA9IDEsCi0JCQlkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAotCQkJZWxlbWVudHMgPSB0aGlzLAotCQkJaSA9IHRoaXMubGVuZ3RoLAotCQkJcmVzb2x2ZSA9IGZ1bmN0aW9uKCkgewotCQkJCWlmICggISggLS1jb3VudCApICkgewotCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwotCQkJCX0KLQkJCX07Ci0KLQkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7Ci0JCQlvYmogPSB0eXBlOwotCQkJdHlwZSA9IHVuZGVmaW5lZDsKLQkJfQotCQl0eXBlID0gdHlwZSB8fCAiZngiOwotCi0JCXdoaWxlKCBpLS0gKSB7Ci0JCQl0bXAgPSBqUXVlcnkuX2RhdGEoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyAicXVldWVIb29rcyIgKTsKLQkJCWlmICggdG1wICYmIHRtcC5lbXB0eSApIHsKLQkJCQljb3VudCsrOwotCQkJCXRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTsKLQkJCX0KLQkJfQotCQlyZXNvbHZlKCk7Ci0JCXJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTsKLQl9Ci19KTsKLXZhciBub2RlSG9vaywgYm9vbEhvb2ssCi0JcmNsYXNzID0gL1tcdFxyXG5cZl0vZywKLQlycmV0dXJuID0gL1xyL2csCi0JcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pLAotCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2ksCi0JcnVzZURlZmF1bHQgPSAvXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLAotCWdldFNldEF0dHJpYnV0ZSA9IGpRdWVyeS5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZSwKLQlnZXRTZXRJbnB1dCA9IGpRdWVyeS5zdXBwb3J0LmlucHV0OwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLQlhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7Ci0JCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Ci0JfSwKLQotCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewotCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCQkJalF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTsKLQkJfSk7Ci0JfSwKLQotCXByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKLQkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKLQl9LAotCi0JcmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7Ci0JCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7Ci0JCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0JCQkvLyB0cnkvY2F0Y2ggaGFuZGxlcyBjYXNlcyB3aGVyZSBJRSBiYWxrcyAoc3VjaCBhcyByZW1vdmluZyBhIHByb3BlcnR5IG9uIHdpbmRvdykKLQkJCXRyeSB7Ci0JCQkJdGhpc1sgbmFtZSBdID0gdW5kZWZpbmVkOwotCQkJCWRlbGV0ZSB0aGlzWyBuYW1lIF07Ci0JCQl9IGNhdGNoKCBlICkge30KLQkJfSk7Ci0JfSwKLQotCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7Ci0JCXZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLAotCQkJaSA9IDAsCi0JCQlsZW4gPSB0aGlzLmxlbmd0aCwKLQkJCXByb2NlZWQgPSB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmIHZhbHVlOwotCi0JCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7Ci0JCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewotCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSApICk7Ci0JCQl9KTsKLQkJfQotCi0JCWlmICggcHJvY2VlZCApIHsKLQkJCS8vIFRoZSBkaXNqdW5jdGlvbiBoZXJlIGlzIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgcmVtb3ZlQ2xhc3MpCi0JCQljbGFzc2VzID0gKCB2YWx1ZSB8fCAiIiApLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFtdOwotCi0JCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLQkJCQllbGVtID0gdGhpc1sgaSBdOwotCQkJCWN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBlbGVtLmNsYXNzTmFtZSA/Ci0JCQkJCSggIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5yZXBsYWNlKCByY2xhc3MsICIgIiApIDoKLQkJCQkJIiAiCi0JCQkJKTsKLQotCQkJCWlmICggY3VyICkgewotCQkJCQlqID0gMDsKLQkJCQkJd2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkgewotCQkJCQkJaWYgKCBjdXIuaW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA8IDAgKSB7Ci0JCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW0uY2xhc3NOYW1lID0galF1ZXJ5LnRyaW0oIGN1ciApOwotCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfSwKLQotCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7Ci0JCXZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNsYXp6LCBqLAotCQkJaSA9IDAsCi0JCQlsZW4gPSB0aGlzLmxlbmd0aCwKLQkJCXByb2NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgdmFsdWU7Ci0KLQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKLQkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7Ci0JCQkJalF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lICkgKTsKLQkJCX0pOwotCQl9Ci0JCWlmICggcHJvY2VlZCApIHsKLQkJCWNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107Ci0KLQkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewotCQkJCWVsZW0gPSB0aGlzWyBpIF07Ci0JCQkJLy8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcykKLQkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggZWxlbS5jbGFzc05hbWUgPwotCQkJCQkoICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6Ci0JCQkJCSIiCi0JCQkJKTsKLQotCQkJCWlmICggY3VyICkgewotCQkJCQlqID0gMDsKLQkJCQkJd2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkgewotCQkJCQkJLy8gUmVtb3ZlICphbGwqIGluc3RhbmNlcwotCQkJCQkJd2hpbGUgKCBjdXIuaW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA+PSAwICkgewotCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxlbS5jbGFzc05hbWUgPSB2YWx1ZSA/IGpRdWVyeS50cmltKCBjdXIgKSA6ICIiOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0sCi0KLQl0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKLQkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7Ci0KLQkJaWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09ICJib29sZWFuIiAmJiB0eXBlID09PSAic3RyaW5nIiApIHsKLQkJCXJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApOwotCQl9Ci0KLQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKLQkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7Ci0JCQkJalF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgdGhpcy5jbGFzc05hbWUsIHN0YXRlVmFsKSwgc3RhdGVWYWwgKTsKLQkJCX0pOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLQkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7Ci0JCQkJLy8gdG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXMKLQkJCQl2YXIgY2xhc3NOYW1lLAotCQkJCQlpID0gMCwKLQkJCQkJc2VsZiA9IGpRdWVyeSggdGhpcyApLAotCQkJCQljbGFzc05hbWVzID0gdmFsdWUubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgW107Ci0KLQkJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7Ci0JCQkJCS8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAotCQkJCQlpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkgewotCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKLQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09IGNvcmVfc3RydW5kZWZpbmVkIHx8IHR5cGUgPT09ICJib29sZWFuIiApIHsKLQkJCQlpZiAoIHRoaXMuY2xhc3NOYW1lICkgewotCQkJCQkvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0Ci0JCQkJCWpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iLCB0aGlzLmNsYXNzTmFtZSApOwotCQkJCX0KLQotCQkJCS8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYgd2UncmUgcGFzc2VkICJmYWxzZSIsCi0JCQkJLy8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS4KLQkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAotCQkJCS8vIGZhbGxpbmcgYmFjayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC4KLQkJCQl0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/ICIiIDogalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIjsKLQkJCX0KLQkJfSk7Ci0JfSwKLQotCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0JCXZhciBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIiwKLQkJCWkgPSAwLAotCQkJbCA9IHRoaXMubGVuZ3RoOwotCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0JCQlpZiAoIHRoaXNbaV0ubm9kZVR5cGUgPT09IDEgJiYgKCIgIiArIHRoaXNbaV0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKHJjbGFzcywgIiAiKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+PSAwICkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0sCi0KLQl2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLQkJdmFyIHJldCwgaG9va3MsIGlzRnVuY3Rpb24sCi0JCQllbGVtID0gdGhpc1swXTsKLQotCQlpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgewotCQkJaWYgKCBlbGVtICkgewotCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwotCi0JCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7Ci0JCQkJCXJldHVybiByZXQ7Ci0JCQkJfQotCi0JCQkJcmV0ID0gZWxlbS52YWx1ZTsKLQotCQkJCXJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/Ci0JCQkJCS8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXMKLQkJCQkJcmV0LnJlcGxhY2UocnJldHVybiwgIiIpIDoKLQkJCQkJLy8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCi0JCQkJCXJldCA9PSBudWxsID8gIiIgOiByZXQ7Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKLQotCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewotCQkJdmFyIHZhbDsKLQotCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKCBpc0Z1bmN0aW9uICkgewotCQkJCXZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbCA9IHZhbHVlOwotCQkJfQotCi0JCQkvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyAiIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZwotCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKLQkJCQl2YWwgPSAiIjsKLQkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewotCQkJCXZhbCArPSAiIjsKLQkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsKLQkJCQl2YWwgPSBqUXVlcnkubWFwKHZhbCwgZnVuY3Rpb24gKCB2YWx1ZSApIHsKLQkJCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiI7Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwotCi0JCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwotCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgewotCQkJCXRoaXMudmFsdWUgPSB2YWw7Ci0JCQl9Ci0JCX0pOwotCX0KLX0pOwotCi1qUXVlcnkuZXh0ZW5kKHsKLQl2YWxIb29rczogewotCQlvcHRpb246IHsKLQkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCM2OTMyLCAjMTIwNzIpCi0JCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKLQkJCQlyZXR1cm4gdmFsICE9IG51bGwgPwotCQkJCQl2YWwgOgotCQkJCQllbGVtLnRleHQ7Ci0JCQl9Ci0JCX0sCi0JCXNlbGVjdDogewotCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCQl2YXIgdmFsdWUsIG9wdGlvbiwKLQkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKLQkJCQkJaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCi0JCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiIHx8IGluZGV4IDwgMCwKLQkJCQkJdmFsdWVzID0gb25lID8gbnVsbCA6IFtdLAotCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCwKLQkJCQkJaSA9IGluZGV4IDwgMCA/Ci0JCQkJCQltYXggOgotCQkJCQkJb25lID8gaW5kZXggOiAwOwotCi0JCQkJLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9ucwotCQkJCWZvciAoIDsgaSA8IG1heDsgaSsrICkgewotCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07Ci0KLQkJCQkJLy8gb2xkSUUgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCi0JCQkJCWlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJgotCQkJCQkJCS8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKLQkJCQkJCQkoIGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwgKSAmJgotCQkJCQkJCSggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKLQotCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgotCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwotCi0JCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwotCQkJCQkJaWYgKCBvbmUgKSB7Ci0JCQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCQkJfQotCi0JCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQotCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdmFsdWVzOwotCQkJfSwKLQotCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7Ci0JCQkJdmFyIG9wdGlvblNldCwgb3B0aW9uLAotCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAotCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAotCQkJCQlpID0gb3B0aW9ucy5sZW5ndGg7Ci0KLQkJCQl3aGlsZSAoIGktLSApIHsKLQkJCQkJb3B0aW9uID0gb3B0aW9uc1sgaSBdOwotCQkJCQlpZiAoIChvcHRpb24uc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KG9wdGlvbikudmFsKCksIHZhbHVlcyApID49IDApICkgewotCQkJCQkJb3B0aW9uU2V0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0Ci0JCQkJaWYgKCAhb3B0aW9uU2V0ICkgewotCQkJCQllbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlczsKLQkJCX0KLQkJfQotCX0sCi0KLQlhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7Ci0JCXZhciBob29rcywgcmV0LAotCQkJblR5cGUgPSBlbGVtLm5vZGVUeXBlOwotCi0JCS8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKLQkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCi0JCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBjb3JlX3N0cnVuZGVmaW5lZCApIHsKLQkJCXJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTsKLQkJfQotCi0JCS8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2UKLQkJLy8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVmaW5lZAotCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKLQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQlob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSB8fAotCQkJCSggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IG5vZGVIb29rICk7Ci0JCX0KLQotCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7Ci0KLQkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7Ci0JCQkJalF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTsKLQotCQkJfSBlbHNlIGlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHsKLQkJCQlyZXR1cm4gcmV0OwotCi0JCQl9IGVsc2UgewotCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArICIiICk7Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCi0JCX0gZWxzZSBpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7Ci0JCQlyZXR1cm4gcmV0OwotCi0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7Ci0KLQkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCi0JCQlyZXR1cm4gcmV0ID09IG51bGwgPwotCQkJCXVuZGVmaW5lZCA6Ci0JCQkJcmV0OwotCQl9Ci0JfSwKLQotCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLQkJdmFyIG5hbWUsIHByb3BOYW1lLAotCQkJaSA9IDAsCi0JCQlhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggY29yZV9ybm90d2hpdGUgKTsKLQotCQlpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewotCQkJd2hpbGUgKCAobmFtZSA9IGF0dHJOYW1lc1tpKytdKSApIHsKLQkJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKLQotCQkJCS8vIEJvb2xlYW4gYXR0cmlidXRlcyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgKCMxMDg3MCkKLQkJCQlpZiAoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApICkgewotCQkJCQkvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZQotCQkJCQlpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkgewotCQkJCQkJZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOwotCQkJCQkvLyBTdXBwb3J0OiBJRTw5Ci0JCQkJCS8vIEFsc28gY2xlYXIgZGVmYXVsdENoZWNrZWQvZGVmYXVsdFNlbGVjdGVkIChpZiBhcHByb3ByaWF0ZSkKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1bIGpRdWVyeS5jYW1lbENhc2UoICJkZWZhdWx0LSIgKyBuYW1lICkgXSA9Ci0JCQkJCQkJZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkvLyBTZWUgIzk2OTkgZm9yIGV4cGxhbmF0aW9uIG9mIHRoaXMgYXBwcm9hY2ggKHNldHRpbmcgZmlyc3QsIHRoZW4gcmVtb3ZhbCkKLQkJCQl9IGVsc2UgewotCQkJCQlqUXVlcnkuYXR0ciggZWxlbSwgbmFtZSwgIiIgKTsKLQkJCQl9Ci0KLQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggZ2V0U2V0QXR0cmlidXRlID8gbmFtZSA6IHByb3BOYW1lICk7Ci0JCQl9Ci0JCX0KLQl9LAotCi0JYXR0ckhvb2tzOiB7Ci0JCXR5cGU6IHsKLQkJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewotCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJpbnB1dCIpICkgewotCQkJCQkvLyBTZXR0aW5nIHRoZSB0eXBlIG9uIGEgcmFkaW8gYnV0dG9uIGFmdGVyIHRoZSB2YWx1ZSByZXNldHMgdGhlIHZhbHVlIGluIElFNi05Ci0JCQkJCS8vIFJlc2V0IHZhbHVlIHRvIGRlZmF1bHQgaW4gY2FzZSB0eXBlIGlzIHNldCBhZnRlciB2YWx1ZSBkdXJpbmcgY3JlYXRpb24KLQkJCQkJdmFyIHZhbCA9IGVsZW0udmFsdWU7Ci0JCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7Ci0JCQkJCWlmICggdmFsICkgewotCQkJCQkJZWxlbS52YWx1ZSA9IHZhbDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSwKLQotCXByb3BGaXg6IHsKLQkJImZvciI6ICJodG1sRm9yIiwKLQkJImNsYXNzIjogImNsYXNzTmFtZSIKLQl9LAotCi0JcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewotCQl2YXIgcmV0LCBob29rcywgbm90eG1sLAotCQkJblR5cGUgPSBlbGVtLm5vZGVUeXBlOwotCi0JCS8vIGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKLQkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCW5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTsKLQotCQlpZiAoIG5vdHhtbCApIHsKLQkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKLQkJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7Ci0JCQlob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsKLQkJfQotCi0JCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKLQkJCXJldHVybiBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkID8KLQkJCQlyZXQgOgotCQkJCSggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTsKLQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgPwotCQkJCXJldCA6Ci0JCQkJZWxlbVsgbmFtZSBdOwotCQl9Ci0JfSwKLQotCXByb3BIb29rczogewotCQl0YWJJbmRleDogewotCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JCQkJLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC8KLQkJCQkvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKQotCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKLQotCQkJCXJldHVybiB0YWJpbmRleCA/Ci0JCQkJCXBhcnNlSW50KCB0YWJpbmRleCwgMTAgKSA6Ci0JCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0uaHJlZiA/Ci0JCQkJCQkwIDoKLQkJCQkJCS0xOwotCQkJfQotCQl9Ci0JfQotfSk7Ci0KLS8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKLWJvb2xIb29rID0gewotCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewotCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKLQkJCS8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2UKLQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7Ci0JCX0gZWxzZSBpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkgewotCQkJLy8gSUU8OCBuZWVkcyB0aGUgKnByb3BlcnR5KiBuYW1lCi0JCQllbGVtLnNldEF0dHJpYnV0ZSggIWdldFNldEF0dHJpYnV0ZSAmJiBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUsIG5hbWUgKTsKLQotCQkvLyBVc2UgZGVmYXVsdENoZWNrZWQgYW5kIGRlZmF1bHRTZWxlY3RlZCBmb3Igb2xkSUUKLQkJfSBlbHNlIHsKLQkJCWVsZW1bIGpRdWVyeS5jYW1lbENhc2UoICJkZWZhdWx0LSIgKyBuYW1lICkgXSA9IGVsZW1bIG5hbWUgXSA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gbmFtZTsKLQl9Ci19OwotalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Ci0JdmFyIGdldHRlciA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyOwotCi0JalF1ZXJ5LmV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID0gZ2V0U2V0SW5wdXQgJiYgZ2V0U2V0QXR0cmlidXRlIHx8ICFydXNlRGVmYXVsdC50ZXN0KCBuYW1lICkgPwotCQlmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7Ci0JCQl2YXIgZm4gPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlWyBuYW1lIF0sCi0JCQkJcmV0ID0gaXNYTUwgPwotCQkJCQl1bmRlZmluZWQgOgotCQkJCQkvKiBqc2hpbnQgZXFlcWVxOiBmYWxzZSAqLwotCQkJCQkoalF1ZXJ5LmV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID0gdW5kZWZpbmVkKSAhPQotCQkJCQkJZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApID8KLQotCQkJCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKLQkJCQkJCW51bGw7Ci0JCQlqUXVlcnkuZXhwci5hdHRySGFuZGxlWyBuYW1lIF0gPSBmbjsKLQkJCXJldHVybiByZXQ7Ci0JCX0gOgotCQlmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7Ci0JCQlyZXR1cm4gaXNYTUwgPwotCQkJCXVuZGVmaW5lZCA6Ci0JCQkJZWxlbVsgalF1ZXJ5LmNhbWVsQ2FzZSggImRlZmF1bHQtIiArIG5hbWUgKSBdID8KLQkJCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKLQkJCQkJbnVsbDsKLQkJfTsKLX0pOwotCi0vLyBmaXggb2xkSUUgYXR0cm9wZXJ0aWVzCi1pZiAoICFnZXRTZXRJbnB1dCB8fCAhZ2V0U2V0QXR0cmlidXRlICkgewotCWpRdWVyeS5hdHRySG9va3MudmFsdWUgPSB7Ci0JCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewotCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSApIHsKLQkJCQkvLyBEb2VzIG5vdCByZXR1cm4gc28gdGhhdCBzZXRBdHRyaWJ1dGUgaXMgYWxzbyB1c2VkCi0JCQkJZWxlbS5kZWZhdWx0VmFsdWUgPSB2YWx1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVXNlIG5vZGVIb29rIGlmIGRlZmluZWQgKCMxOTU0KTsgb3RoZXJ3aXNlIHNldEF0dHJpYnV0ZSBpcyBmaW5lCi0JCQkJcmV0dXJuIG5vZGVIb29rICYmIG5vZGVIb29rLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKTsKLQkJCX0KLQkJfQotCX07Ci19Ci0KLS8vIElFNi83IGRvIG5vdCBzdXBwb3J0IGdldHRpbmcvc2V0dGluZyBzb21lIGF0dHJpYnV0ZXMgd2l0aCBnZXQvc2V0QXR0cmlidXRlCi1pZiAoICFnZXRTZXRBdHRyaWJ1dGUgKSB7Ci0KLQkvLyBVc2UgdGhpcyBmb3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNwotCS8vIFRoaXMgZml4ZXMgYWxtb3N0IGV2ZXJ5IElFNi83IGlzc3VlCi0Jbm9kZUhvb2sgPSB7Ci0JCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewotCQkJLy8gU2V0IHRoZSBleGlzdGluZyBvciBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIG5vZGUKLQkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKLQkJCWlmICggIXJldCApIHsKLQkJCQllbGVtLnNldEF0dHJpYnV0ZU5vZGUoCi0JCQkJCShyZXQgPSBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICkpCi0JCQkJKTsKLQkJCX0KLQotCQkJcmV0LnZhbHVlID0gdmFsdWUgKz0gIiI7Ci0KLQkJCS8vIEJyZWFrIGFzc29jaWF0aW9uIHdpdGggY2xvbmVkIGVsZW1lbnRzIGJ5IGFsc28gdXNpbmcgc2V0QXR0cmlidXRlICgjOTY0NikKLQkJCXJldHVybiBuYW1lID09PSAidmFsdWUiIHx8IHZhbHVlID09PSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApID8KLQkJCQl2YWx1ZSA6Ci0JCQkJdW5kZWZpbmVkOwotCQl9Ci0JfTsKLQlqUXVlcnkuZXhwci5hdHRySGFuZGxlLmlkID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZS5uYW1lID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZS5jb29yZHMgPQotCQkvLyBTb21lIGF0dHJpYnV0ZXMgYXJlIGNvbnN0cnVjdGVkIHdpdGggZW1wdHktc3RyaW5nIHZhbHVlcyB3aGVuIG5vdCBkZWZpbmVkCi0JCWZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKLQkJCXZhciByZXQ7Ci0JCQlyZXR1cm4gaXNYTUwgPwotCQkJCXVuZGVmaW5lZCA6Ci0JCQkJKHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiByZXQudmFsdWUgIT09ICIiID8KLQkJCQkJcmV0LnZhbHVlIDoKLQkJCQkJbnVsbDsKLQkJfTsKLQlqUXVlcnkudmFsSG9va3MuYnV0dG9uID0gewotCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewotCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOwotCQkJcmV0dXJuIHJldCAmJiByZXQuc3BlY2lmaWVkID8KLQkJCQlyZXQudmFsdWUgOgotCQkJCXVuZGVmaW5lZDsKLQkJfSwKLQkJc2V0OiBub2RlSG9vay5zZXQKLQl9OwotCi0JLy8gU2V0IGNvbnRlbnRlZGl0YWJsZSB0byBmYWxzZSBvbiByZW1vdmFscygjMTA0MjkpCi0JLy8gU2V0dGluZyB0byBlbXB0eSBzdHJpbmcgdGhyb3dzIGFuIGVycm9yIGFzIGFuIGludmFsaWQgdmFsdWUKLQlqUXVlcnkuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZSA9IHsKLQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7Ci0JCQlub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlID09PSAiIiA/IGZhbHNlIDogdmFsdWUsIG5hbWUgKTsKLQkJfQotCX07Ci0KLQkvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApCi0JLy8gVGhpcyBpcyBmb3IgcmVtb3ZhbHMKLQlqUXVlcnkuZWFjaChbICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewotCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSB7Ci0JCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLQkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKLQkJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsICJhdXRvIiApOwotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0pOwotfQotCi0KLS8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCi0vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4Ci1pZiAoICFqUXVlcnkuc3VwcG9ydC5ocmVmTm9ybWFsaXplZCApIHsKLQkvLyBocmVmL3NyYyBwcm9wZXJ0eSBzaG91bGQgZ2V0IHRoZSBmdWxsIG5vcm1hbGl6ZWQgVVJMICgjMTAyOTkvIzEyOTE1KQotCWpRdWVyeS5lYWNoKFsgImhyZWYiLCAic3JjIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKLQkJalF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdID0gewotCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDQgKTsKLQkJCX0KLQkJfTsKLQl9KTsKLX0KLQotaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7Ci0JalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKLQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKLQkJCS8vIFJldHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nCi0JCQkvLyBOb3RlOiBJRSB1cHBlcmNhc2VzIGNzcyBwcm9wZXJ0eSBuYW1lcywgYnV0IGlmIHdlIHdlcmUgdG8gLnRvTG93ZXJDYXNlKCkKLQkJCS8vIC5jc3NUZXh0LCB0aGF0IHdvdWxkIGRlc3Ryb3kgY2FzZSBzZW5zdGl0aXZpdHkgaW4gVVJMJ3MsIGxpa2UgaW4gImJhY2tncm91bmQiCi0JCQlyZXR1cm4gZWxlbS5zdHlsZS5jc3NUZXh0IHx8IHVuZGVmaW5lZDsKLQkJfSwKLQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7Ci0JCQlyZXR1cm4gKCBlbGVtLnN0eWxlLmNzc1RleHQgPSB2YWx1ZSArICIiICk7Ci0JCX0KLQl9OwotfQotCi0vLyBTYWZhcmkgbWlzLXJlcG9ydHMgdGhlIGRlZmF1bHQgc2VsZWN0ZWQgcHJvcGVydHkgb2YgYW4gb3B0aW9uCi0vLyBBY2Nlc3NpbmcgdGhlIHBhcmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXQKLWlmICggIWpRdWVyeS5zdXBwb3J0Lm9wdFNlbGVjdGVkICkgewotCWpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7Ci0JCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwotCi0JCQlpZiAoIHBhcmVudCApIHsKLQkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGl0IGFsc28gd29ya3Mgd2l0aCBvcHRncm91cHMsIHNlZSAjNTcwMQotCQkJCWlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7Ci0JCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotfQotCi1qUXVlcnkuZWFjaChbCi0JInRhYkluZGV4IiwKLQkicmVhZE9ubHkiLAotCSJtYXhMZW5ndGgiLAotCSJjZWxsU3BhY2luZyIsCi0JImNlbGxQYWRkaW5nIiwKLQkicm93U3BhbiIsCi0JImNvbFNwYW4iLAotCSJ1c2VNYXAiLAotCSJmcmFtZUJvcmRlciIsCi0JImNvbnRlbnRFZGl0YWJsZSIKLV0sIGZ1bmN0aW9uKCkgewotCWpRdWVyeS5wcm9wRml4WyB0aGlzLnRvTG93ZXJDYXNlKCkgXSA9IHRoaXM7Ci19KTsKLQotLy8gSUU2LzcgY2FsbCBlbmN0eXBlIGVuY29kaW5nCi1pZiAoICFqUXVlcnkuc3VwcG9ydC5lbmN0eXBlICkgewotCWpRdWVyeS5wcm9wRml4LmVuY3R5cGUgPSAiZW5jb2RpbmciOwotfQotCi0vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgotalF1ZXJ5LmVhY2goWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewotCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0gewotCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7Ci0JCQkJcmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeShlbGVtKS52YWwoKSwgdmFsdWUgKSA+PSAwICk7Ci0JCQl9Ci0JCX0KLQl9OwotCWlmICggIWpRdWVyeS5zdXBwb3J0LmNoZWNrT24gKSB7Ci0JCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewotCQkJLy8gU3VwcG9ydDogV2Via2l0Ci0JCQkvLyAiIiBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mICJvbiIgaWYgYSB2YWx1ZSBpc24ndCBzcGVjaWZpZWQKLQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgidmFsdWUiKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwotCQl9OwotCX0KLX0pOwotdmFyIHJmb3JtRWxlbXMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCi0JcmtleUV2ZW50ID0gL15rZXkvLAotCXJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLAotCXJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAotCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkkLzsKLQotZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHsKLQl0cnkgewotCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKLQl9IGNhdGNoICggZXJyICkgeyB9Ci19Ci0KLS8qCi0gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuCi0gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgotICovCi1qUXVlcnkuZXZlbnQgPSB7Ci0KLQlnbG9iYWw6IHt9LAotCi0JYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewotCQl2YXIgdG1wLCBldmVudHMsIHQsIGhhbmRsZU9iakluLAotCQkJc3BlY2lhbCwgZXZlbnRIYW5kbGUsIGhhbmRsZU9iaiwKLQkJCWhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKLQkJCWVsZW1EYXRhID0galF1ZXJ5Ll9kYXRhKCBlbGVtICk7Ci0KLQkJLy8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cykKLQkJaWYgKCAhZWxlbURhdGEgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXIKLQkJaWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7Ci0JCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7Ci0JCQloYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjsKLQkJCXNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7Ci0JCX0KLQotCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXIKLQkJaWYgKCAhaGFuZGxlci5ndWlkICkgewotCQkJaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKLQkJfQotCi0JCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3QKLQkJaWYgKCAhKGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cykgKSB7Ci0JCQlldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTsKLQkJfQotCQlpZiAoICEoZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUpICkgewotCQkJZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHsKLQkJCQkvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAotCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKLQkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gY29yZV9zdHJ1bmRlZmluZWQgJiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSkgPwotCQkJCQlqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGV2ZW50SGFuZGxlLmVsZW0sIGFyZ3VtZW50cyApIDoKLQkJCQkJdW5kZWZpbmVkOwotCQkJfTsKLQkJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBJRSBub24tbmF0aXZlIGV2ZW50cwotCQkJZXZlbnRIYW5kbGUuZWxlbSA9IGVsZW07Ci0JCX0KLQotCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCi0JCXR5cGVzID0gKCB0eXBlcyB8fCAiIiApLm1hdGNoKCBjb3JlX3Jub3R3aGl0ZSApIHx8IFsiIl07Ci0JCXQgPSB0eXBlcy5sZW5ndGg7Ci0JCXdoaWxlICggdC0tICkgewotCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTsKLQkJCXR5cGUgPSBvcmlnVHlwZSA9IHRtcFsxXTsKLQkJCW5hbWVzcGFjZXMgPSAoIHRtcFsyXSB8fCAiIiApLnNwbGl0KCAiLiIgKS5zb3J0KCk7Ci0KLQkJCS8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVycwotCQkJaWYgKCAhdHlwZSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCi0JCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKLQotCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCi0JCQl0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7Ci0KLQkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKLQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwotCi0JCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwotCQkJaGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7Ci0JCQkJdHlwZTogdHlwZSwKLQkJCQlvcmlnVHlwZTogb3JpZ1R5cGUsCi0JCQkJZGF0YTogZGF0YSwKLQkJCQloYW5kbGVyOiBoYW5kbGVyLAotCQkJCWd1aWQ6IGhhbmRsZXIuZ3VpZCwKLQkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCi0JCQkJbmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSwKLQkJCQluYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbigiLiIpCi0JCQl9LCBoYW5kbGVPYmpJbiApOwotCi0JCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAotCQkJaWYgKCAhKGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkgewotCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKLQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDsKLQotCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQotCQkJCWlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKLQkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKLQkJCQkJaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7Ci0JCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApOwotCi0JCQkJCX0gZWxzZSBpZiAoIGVsZW0uYXR0YWNoRXZlbnQgKSB7Ci0JCQkJCQllbGVtLmF0dGFjaEV2ZW50KCAib24iICsgdHlwZSwgZXZlbnRIYW5kbGUgKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCBzcGVjaWFsLmFkZCApIHsKLQkJCQlzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKLQotCQkJCWlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7Ci0JCQkJCWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAotCQkJaWYgKCBzZWxlY3RvciApIHsKLQkJCQloYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7Ci0JCQl9IGVsc2UgewotCQkJCWhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOwotCQkJfQotCi0JCQkvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uCi0JCQlqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwotCQl9Ci0KLQkJLy8gTnVsbGlmeSBlbGVtIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCi0JCWVsZW0gPSBudWxsOwotCX0sCi0KLQkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKLQlyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkgewotCQl2YXIgaiwgaGFuZGxlT2JqLCB0bXAsCi0JCQlvcmlnQ291bnQsIHQsIGV2ZW50cywKLQkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLAotCQkJbmFtZXNwYWNlcywgb3JpZ1R5cGUsCi0JCQllbGVtRGF0YSA9IGpRdWVyeS5oYXNEYXRhKCBlbGVtICkgJiYgalF1ZXJ5Ll9kYXRhKCBlbGVtICk7Ci0KLQkJaWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZAotCQl0eXBlcyA9ICggdHlwZXMgfHwgIiIgKS5tYXRjaCggY29yZV9ybm90d2hpdGUgKSB8fCBbIiJdOwotCQl0ID0gdHlwZXMubGVuZ3RoOwotCQl3aGlsZSAoIHQtLSApIHsKLQkJCXRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107Ci0JCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbMV07Ci0JCQluYW1lc3BhY2VzID0gKCB0bXBbMl0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwotCi0JCQkvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnQKLQkJCWlmICggIXR5cGUgKSB7Ci0JCQkJZm9yICggdHlwZSBpbiBldmVudHMgKSB7Ci0JCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307Ci0JCQl0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7Ci0JCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwotCQkJdG1wID0gdG1wWzJdICYmIG5ldyBSZWdFeHAoICIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC58KSIpICsgIihcXC58JCkiICk7Ci0KLQkJCS8vIFJlbW92ZSBtYXRjaGluZyBldmVudHMKLQkJCW9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7Ci0JCQl3aGlsZSAoIGotLSApIHsKLQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBdOwotCi0JCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgotCQkJCQkoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgotCQkJCQkoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmCi0JCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7Ci0JCQkJCWhhbmRsZXJzLnNwbGljZSggaiwgMSApOwotCi0JCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewotCQkJCQkJaGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tOwotCQkJCQl9Ci0JCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7Ci0JCQkJCQlzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAotCQkJLy8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpCi0JCQlpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkgewotCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBlbGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7Ci0JCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7Ci0JCQkJfQotCi0JCQkJZGVsZXRlIGV2ZW50c1sgdHlwZSBdOwotCQkJfQotCQl9Ci0KLQkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKLQkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7Ci0JCQlkZWxldGUgZWxlbURhdGEuaGFuZGxlOwotCi0JCQkvLyByZW1vdmVEYXRhIGFsc28gY2hlY2tzIGZvciBlbXB0aW5lc3MgYW5kIGNsZWFycyB0aGUgZXhwYW5kbyBpZiBlbXB0eQotCQkJLy8gc28gdXNlIGl0IGluc3RlYWQgb2YgZGVsZXRlCi0JCQlqUXVlcnkuX3JlbW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7Ci0JCX0KLQl9LAotCi0JdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7Ci0JCXZhciBoYW5kbGUsIG9udHlwZSwgY3VyLAotCQkJYnViYmxlVHlwZSwgc3BlY2lhbCwgdG1wLCBpLAotCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCi0JCQl0eXBlID0gY29yZV9oYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAotCQkJbmFtZXNwYWNlcyA9IGNvcmVfaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCIuIikgOiBbXTsKLQotCQljdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDsKLQotCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwotCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vdwotCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIHR5cGUuaW5kZXhPZigiLiIpID49IDAgKSB7Ci0JCQkvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpCi0JCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwotCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKLQkJCW5hbWVzcGFjZXMuc29ydCgpOwotCQl9Ci0JCW9udHlwZSA9IHR5cGUuaW5kZXhPZigiOiIpIDwgMCAmJiAib24iICsgdHlwZTsKLQotCQkvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmcKLQkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/Ci0JCQlldmVudCA6Ci0JCQluZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiICYmIGV2ZW50ICk7Ci0KLQkJLy8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKQotCQlldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMzsKLQkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCIuIik7Ci0JCWV2ZW50Lm5hbWVzcGFjZV9yZSA9IGV2ZW50Lm5hbWVzcGFjZSA/Ci0JCQluZXcgUmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIiApIDoKLQkJCW51bGw7Ci0KLQkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCi0JCWV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDsKLQkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgewotCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKLQkJfQotCi0JCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKLQkJZGF0YSA9IGRhdGEgPT0gbnVsbCA/Ci0JCQlbIGV2ZW50IF0gOgotCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7Ci0KLQkJLy8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lcwotCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKLQkJaWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSkKLQkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKLQkJaWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHsKLQotCQkJYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7Ci0JCQlpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkgewotCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwotCQkJfQotCQkJZm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkgewotCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKLQkJCQl0bXAgPSBjdXI7Ci0JCQl9Ci0KLQkJCS8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKQotCQkJaWYgKCB0bXAgPT09IChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpICkgewotCQkJCWV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTsKLQkJCX0KLQkJfQotCi0JCS8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGgKLQkJaSA9IDA7Ci0JCXdoaWxlICggKGN1ciA9IGV2ZW50UGF0aFtpKytdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKLQotCQkJZXZlbnQudHlwZSA9IGkgPiAxID8KLQkJCQlidWJibGVUeXBlIDoKLQkJCQlzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7Ci0KLQkJCS8vIGpRdWVyeSBoYW5kbGVyCi0JCQloYW5kbGUgPSAoIGpRdWVyeS5fZGF0YSggY3VyLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJiBqUXVlcnkuX2RhdGEoIGN1ciwgImhhbmRsZSIgKTsKLQkJCWlmICggaGFuZGxlICkgewotCQkJCWhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7Ci0JCQl9Ci0KLQkJCS8vIE5hdGl2ZSBoYW5kbGVyCi0JCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKLQkJCWlmICggaGFuZGxlICYmIGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSAmJiBoYW5kbGUuYXBwbHkgJiYgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKSA9PT0gZmFsc2UgKSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJfQotCQlldmVudC50eXBlID0gdHlwZTsKLQotCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93Ci0JCWlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7Ci0KLQkJCWlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSkgJiYKLQkJCQlqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewotCi0JCQkJLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgotCQkJCS8vIENhbid0IHVzZSBhbiAuaXNGdW5jdGlvbigpIGNoZWNrIGhlcmUgYmVjYXVzZSBJRTYvNyBmYWlscyB0aGF0IHRlc3QuCi0JCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQotCQkJCWlmICggb250eXBlICYmIGVsZW1bIHR5cGUgXSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7Ci0KLQkJCQkJLy8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZAotCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKLQotCQkJCQlpZiAoIHRtcCApIHsKLQkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKLQkJCQkJfQotCi0JCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCi0JCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwotCQkJCQl0cnkgewotCQkJCQkJZWxlbVsgdHlwZSBdKCk7Ci0JCQkJCX0gY2F0Y2ggKCBlICkgewotCQkJCQkJLy8gSUU8OSBkaWVzIG9uIGZvY3VzL2JsdXIgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2LCMxMjUxOCkKLQkJCQkJCS8vIG9ubHkgcmVwcm9kdWNpYmxlIG9uIHdpblhQIElFOCBuYXRpdmUsIG5vdCBJRTkgaW4gSUU4IG1vZGUKLQkJCQkJfQotCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwotCi0JCQkJCWlmICggdG1wICkgewotCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZXZlbnQucmVzdWx0OwotCX0sCi0KLQlkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgewotCi0JCS8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdAotCQlldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICk7Ci0KLQkJdmFyIGksIHJldCwgaGFuZGxlT2JqLCBtYXRjaGVkLCBqLAotCQkJaGFuZGxlclF1ZXVlID0gW10sCi0JCQlhcmdzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSwKLQkJCWhhbmRsZXJzID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdIHx8IFtdLAotCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307Ci0KLQkJLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnQKLQkJYXJnc1swXSA9IGV2ZW50OwotCQlldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7Ci0KLQkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAotCQlpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIERldGVybWluZSBoYW5kbGVycwotCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7Ci0KLQkJLy8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXMKLQkJaSA9IDA7Ci0JCXdoaWxlICggKG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKLQkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07Ci0KLQkJCWogPSAwOwotCQkJd2hpbGUgKCAoaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0pICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewotCi0JCQkJLy8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgotCQkJCS8vIDIpIGhhdmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgotCQkJCWlmICggIWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewotCi0JCQkJCWV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajsKLQkJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhOwotCi0JCQkJCXJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyICkKLQkJCQkJCQkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApOwotCi0JCQkJCWlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7Ci0JCQkJCQlpZiAoIChldmVudC5yZXN1bHQgPSByZXQpID09PSBmYWxzZSApIHsKLQkJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQotCQlpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkgewotCQkJc3BlY2lhbC5wb3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTsKLQkJfQotCi0JCXJldHVybiBldmVudC5yZXN1bHQ7Ci0JfSwKLQotCWhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkgewotCQl2YXIgc2VsLCBoYW5kbGVPYmosIG1hdGNoZXMsIGksCi0JCQloYW5kbGVyUXVldWUgPSBbXSwKLQkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAotCQkJY3VyID0gZXZlbnQudGFyZ2V0OwotCi0JCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKLQkJLy8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKCMxMzE4MCkKLQkJLy8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpCi0JCWlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9kZVR5cGUgJiYgKCFldmVudC5idXR0b24gfHwgZXZlbnQudHlwZSAhPT0gImNsaWNrIikgKSB7Ci0KLQkJCS8qIGpzaGludCBlcWVxZXE6IGZhbHNlICovCi0JCQlmb3IgKCA7IGN1ciAhPSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkgewotCQkJCS8qIGpzaGludCBlcWVxZXE6IHRydWUgKi8KLQotCQkJCS8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KQotCQkJCS8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KQotCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmIChjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gImNsaWNrIikgKSB7Ci0JCQkJCW1hdGNoZXMgPSBbXTsKLQkJCQkJZm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7Ci0JCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwotCi0JCQkJCQkvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKQotCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwotCi0JCQkJCQlpZiAoIG1hdGNoZXNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7Ci0JCQkJCQkJbWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KLQkJCQkJCQkJalF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPj0gMCA6Ci0JCQkJCQkJCWpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIG1hdGNoZXNbIHNlbCBdICkgewotCQkJCQkJCW1hdGNoZXMucHVzaCggaGFuZGxlT2JqICk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCBtYXRjaGVzLmxlbmd0aCApIHsKLQkJCQkJCWhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlcyB9KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMKLQkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewotCQkJaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsKLQkJfQotCi0JCXJldHVybiBoYW5kbGVyUXVldWU7Ci0JfSwKLQotCWZpeDogZnVuY3Rpb24oIGV2ZW50ICkgewotCQlpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkgewotCQkJcmV0dXJuIGV2ZW50OwotCQl9Ci0KLQkJLy8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzCi0JCXZhciBpLCBwcm9wLCBjb3B5LAotCQkJdHlwZSA9IGV2ZW50LnR5cGUsCi0JCQlvcmlnaW5hbEV2ZW50ID0gZXZlbnQsCi0JCQlmaXhIb29rID0gdGhpcy5maXhIb29rc1sgdHlwZSBdOwotCi0JCWlmICggIWZpeEhvb2sgKSB7Ci0JCQl0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBmaXhIb29rID0KLQkJCQlybW91c2VFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLm1vdXNlSG9va3MgOgotCQkJCXJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLmtleUhvb2tzIDoKLQkJCQl7fTsKLQkJfQotCQljb3B5ID0gZml4SG9vay5wcm9wcyA/IHRoaXMucHJvcHMuY29uY2F0KCBmaXhIb29rLnByb3BzICkgOiB0aGlzLnByb3BzOwotCi0JCWV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwotCi0JCWkgPSBjb3B5Lmxlbmd0aDsKLQkJd2hpbGUgKCBpLS0gKSB7Ci0JCQlwcm9wID0gY29weVsgaSBdOwotCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKLQkJfQotCi0JCS8vIFN1cHBvcnQ6IElFPDkKLQkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSAoIzE5MjUpCi0JCWlmICggIWV2ZW50LnRhcmdldCApIHsKLQkJCWV2ZW50LnRhcmdldCA9IG9yaWdpbmFsRXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsKLQkJfQotCi0JCS8vIFN1cHBvcnQ6IENocm9tZSAyMyssIFNhZmFyaT8KLQkJLy8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsICMxMzE0MykKLQkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7Ci0JCQlldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTsKLQkJfQotCi0JCS8vIFN1cHBvcnQ6IElFPDkKLQkJLy8gRm9yIG1vdXNlL2tleSBldmVudHMsIG1ldGFLZXk9PWZhbHNlIGlmIGl0J3MgdW5kZWZpbmVkICgjMzM2OCwgIzExMzI4KQotCQlldmVudC5tZXRhS2V5ID0gISFldmVudC5tZXRhS2V5OwotCi0JCXJldHVybiBmaXhIb29rLmZpbHRlciA/IGZpeEhvb2suZmlsdGVyKCBldmVudCwgb3JpZ2luYWxFdmVudCApIDogZXZlbnQ7Ci0JfSwKLQotCS8vIEluY2x1ZGVzIHNvbWUgZXZlbnQgcHJvcHMgc2hhcmVkIGJ5IEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50Ci0JcHJvcHM6ICJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksCi0KLQlmaXhIb29rczoge30sCi0KLQlrZXlIb29rczogewotCQlwcm9wczogImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksCi0JCWZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHsKLQotCQkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCi0JCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7Ci0JCQkJZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlOwotCQkJfQotCi0JCQlyZXR1cm4gZXZlbnQ7Ci0JCX0KLQl9LAotCi0JbW91c2VIb29rczogewotCQlwcm9wczogImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSwKLQkJZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgewotCQkJdmFyIGJvZHksIGV2ZW50RG9jLCBkb2MsCi0JCQkJYnV0dG9uID0gb3JpZ2luYWwuYnV0dG9uLAotCQkJCWZyb21FbGVtZW50ID0gb3JpZ2luYWwuZnJvbUVsZW1lbnQ7Ci0KLQkJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKLQkJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7Ci0JCQkJZXZlbnREb2MgPSBldmVudC50YXJnZXQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsKLQkJCQlkb2MgPSBldmVudERvYy5kb2N1bWVudEVsZW1lbnQ7Ci0JCQkJYm9keSA9IGV2ZW50RG9jLmJvZHk7Ci0KLQkJCQlldmVudC5wYWdlWCA9IG9yaWdpbmFsLmNsaWVudFggKyAoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLSAoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwICk7Ci0JCQkJZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICsgKCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApOwotCQkJfQotCi0JCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5Ci0JCQlpZiAoICFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGZyb21FbGVtZW50ICkgewotCQkJCWV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0ID8gb3JpZ2luYWwudG9FbGVtZW50IDogZnJvbUVsZW1lbnQ7Ci0JCQl9Ci0KLQkJCS8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHQKLQkJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0Ci0JCQlpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCApIHsKLQkJCQlldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7Ci0JCQl9Ci0KLQkJCXJldHVybiBldmVudDsKLQkJfQotCX0sCi0KLQlzcGVjaWFsOiB7Ci0JCWxvYWQ6IHsKLQkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKLQkJCW5vQnViYmxlOiB0cnVlCi0JCX0sCi0JCWZvY3VzOiB7Ci0JCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKLQkJCXRyaWdnZXI6IGZ1bmN0aW9uKCkgewotCQkJCWlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkgewotCQkJCQl0cnkgewotCQkJCQkJdGhpcy5mb2N1cygpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGNhdGNoICggZSApIHsKLQkJCQkJCS8vIFN1cHBvcnQ6IElFPDkKLQkJCQkJCS8vIElmIHdlIGVycm9yIG9uIGZvY3VzIHRvIGhpZGRlbiBlbGVtZW50ICgjMTQ4NiwgIzEyNTE4KSwKLQkJCQkJCS8vIGxldCAudHJpZ2dlcigpIHJ1biB0aGUgaGFuZGxlcnMKLQkJCQkJfQotCQkJCX0KLQkJCX0sCi0JCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgotCQl9LAotCQlibHVyOiB7Ci0JCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKLQkJCQlpZiAoIHRoaXMgPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5ibHVyICkgewotCQkJCQl0aGlzLmJsdXIoKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0sCi0JCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKLQkJfSwKLQkJY2xpY2s6IHsKLQkJCS8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0Ci0JCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKLQkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImlucHV0IiApICYmIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiAmJiB0aGlzLmNsaWNrICkgewotCQkJCQl0aGlzLmNsaWNrKCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9LAotCi0JCQkvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3MKLQkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7Ci0JCQkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZXZlbnQudGFyZ2V0LCAiYSIgKTsKLQkJCX0KLQkJfSwKLQotCQliZWZvcmV1bmxvYWQ6IHsKLQkJCXBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgewotCi0JCQkJLy8gRXZlbiB3aGVuIHJldHVyblZhbHVlIGVxdWFscyB0byB1bmRlZmluZWQgRmlyZWZveCB3aWxsIHN0aWxsIHNob3cgYWxlcnQKLQkJCQlpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICkgewotCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQotCX0sCi0KLQlzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50LCBidWJibGUgKSB7Ci0JCS8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZS4KLQkJLy8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlCi0JCS8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgotCQl2YXIgZSA9IGpRdWVyeS5leHRlbmQoCi0JCQluZXcgalF1ZXJ5LkV2ZW50KCksCi0JCQlldmVudCwKLQkJCXsKLQkJCQl0eXBlOiB0eXBlLAotCQkJCWlzU2ltdWxhdGVkOiB0cnVlLAotCQkJCW9yaWdpbmFsRXZlbnQ6IHt9Ci0JCQl9Ci0JCSk7Ci0JCWlmICggYnViYmxlICkgewotCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTsKLQkJfSBlbHNlIHsKLQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5jYWxsKCBlbGVtLCBlICk7Ci0JCX0KLQkJaWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkgewotCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJfQotCX0KLX07Ci0KLWpRdWVyeS5yZW1vdmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPwotCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7Ci0JCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgewotCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7Ci0JCX0KLQl9IDoKLQlmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgewotCQl2YXIgbmFtZSA9ICJvbiIgKyB0eXBlOwotCi0JCWlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKLQotCQkJLy8gIzg1NDUsICM3MDU0LCBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcyBmb3IgY3VzdG9tIGV2ZW50cyBpbiBJRTYtOAotCQkJLy8gZGV0YWNoRXZlbnQgbmVlZGVkIHByb3BlcnR5IG9uIGVsZW1lbnQsIGJ5IG5hbWUgb2YgdGhhdCBldmVudCwgdG8gcHJvcGVybHkgZXhwb3NlIGl0IHRvIEdDCi0JCQlpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09IGNvcmVfc3RydW5kZWZpbmVkICkgewotCQkJCWVsZW1bIG5hbWUgXSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWVsZW0uZGV0YWNoRXZlbnQoIG5hbWUsIGhhbmRsZSApOwotCQl9Ci0JfTsKLQotalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7Ci0JLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCi0JaWYgKCAhKHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQpICkgewotCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwotCX0KLQotCS8vIEV2ZW50IG9iamVjdAotCWlmICggc3JjICYmIHNyYy50eXBlICkgewotCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7Ci0JCXRoaXMudHlwZSA9IHNyYy50eXBlOwotCi0JCS8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCi0JCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgotCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9ICggc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwgc3JjLnJldHVyblZhbHVlID09PSBmYWxzZSB8fAotCQkJc3JjLmdldFByZXZlbnREZWZhdWx0ICYmIHNyYy5nZXRQcmV2ZW50RGVmYXVsdCgpICkgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7Ci0KLQkvLyBFdmVudCB0eXBlCi0JfSBlbHNlIHsKLQkJdGhpcy50eXBlID0gc3JjOwotCX0KLQotCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0Ci0JaWYgKCBwcm9wcyApIHsKLQkJalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKLQl9Ci0KLQkvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQotCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpOwotCi0JLy8gTWFyayBpdCBhcyBmaXhlZAotCXRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOwotfTsKLQotLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi0vLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKLWpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Ci0JaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKLQlpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCi0JaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAotCi0JcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewotCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKLQotCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7Ci0JCWlmICggIWUgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBJZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMsIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKLQkJaWYgKCBlLnByZXZlbnREZWZhdWx0ICkgewotCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwotCi0JCS8vIFN1cHBvcnQ6IElFCi0JCS8vIE90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZQotCQl9IGVsc2UgewotCQkJZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQl9Ci0JfSwKLQlzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewotCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKLQotCQl0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKLQkJaWYgKCAhZSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBJZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzLCBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50Ci0JCWlmICggZS5zdG9wUHJvcGFnYXRpb24gKSB7Ci0JCQllLnN0b3BQcm9wYWdhdGlvbigpOwotCQl9Ci0KLQkJLy8gU3VwcG9ydDogSUUKLQkJLy8gU2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIHRydWUKLQkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwotCX0sCi0Jc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKLQkJdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7Ci0JCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7Ci0JfQotfTsKLQotLy8gQ3JlYXRlIG1vdXNlZW50ZXIvbGVhdmUgZXZlbnRzIHVzaW5nIG1vdXNlb3Zlci9vdXQgYW5kIGV2ZW50LXRpbWUgY2hlY2tzCi1qUXVlcnkuZWFjaCh7Ci0JbW91c2VlbnRlcjogIm1vdXNlb3ZlciIsCi0JbW91c2VsZWF2ZTogIm1vdXNlb3V0IgotfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKLQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewotCQlkZWxlZ2F0ZVR5cGU6IGZpeCwKLQkJYmluZFR5cGU6IGZpeCwKLQotCQloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKLQkJCXZhciByZXQsCi0JCQkJdGFyZ2V0ID0gdGhpcywKLQkJCQlyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCwKLQkJCQloYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7Ci0KLQkJCS8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KLQkJCS8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93Ci0JCQlpZiAoICFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkpICkgewotCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7Ci0JCQkJcmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwotCQkJCWV2ZW50LnR5cGUgPSBmaXg7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfTsKLX0pOwotCi0vLyBJRSBzdWJtaXQgZGVsZWdhdGlvbgotaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3VibWl0QnViYmxlcyApIHsKLQotCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKLQkJc2V0dXA6IGZ1bmN0aW9uKCkgewotCQkJLy8gT25seSBuZWVkIHRoaXMgZm9yIGRlbGVnYXRlZCBmb3JtIHN1Ym1pdCBldmVudHMKLQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9ybSIgKSApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIExhenktYWRkIGEgc3VibWl0IGhhbmRsZXIgd2hlbiBhIGRlc2NlbmRhbnQgZm9ybSBtYXkgcG90ZW50aWFsbHkgYmUgc3VibWl0dGVkCi0JCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7Ci0JCQkJLy8gTm9kZSBuYW1lIGNoZWNrIGF2b2lkcyBhIFZNTC1yZWxhdGVkIGNyYXNoIGluIElFICgjOTgwNykKLQkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0LAotCQkJCQlmb3JtID0galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApID8gZWxlbS5mb3JtIDogdW5kZWZpbmVkOwotCQkJCWlmICggZm9ybSAmJiAhalF1ZXJ5Ll9kYXRhKCBmb3JtLCAic3VibWl0QnViYmxlcyIgKSApIHsKLQkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggZm9ybSwgInN1Ym1pdC5fc3VibWl0IiwgZnVuY3Rpb24oIGV2ZW50ICkgewotCQkJCQkJZXZlbnQuX3N1Ym1pdF9idWJibGUgPSB0cnVlOwotCQkJCQl9KTsKLQkJCQkJalF1ZXJ5Ll9kYXRhKCBmb3JtLCAic3VibWl0QnViYmxlcyIsIHRydWUgKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCS8vIHJldHVybiB1bmRlZmluZWQgc2luY2Ugd2UgZG9uJ3QgbmVlZCBhbiBldmVudCBsaXN0ZW5lcgotCQl9LAotCi0JCXBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkgewotCQkJLy8gSWYgZm9ybSB3YXMgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLCBidWJibGUgdGhlIGV2ZW50IHVwIHRoZSB0cmVlCi0JCQlpZiAoIGV2ZW50Ll9zdWJtaXRfYnViYmxlICkgewotCQkJCWRlbGV0ZSBldmVudC5fc3VibWl0X2J1YmJsZTsKLQkJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewotCQkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoICJzdWJtaXQiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50LCB0cnVlICk7Ci0JCQkJfQotCQkJfQotCQl9LAotCi0JCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKLQkJCS8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzCi0JCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBSZW1vdmUgZGVsZWdhdGVkIGhhbmRsZXJzOyBjbGVhbkRhdGEgZXZlbnR1YWxseSByZWFwcyBzdWJtaXQgaGFuZGxlcnMgYXR0YWNoZWQgYWJvdmUKLQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuX3N1Ym1pdCIgKTsKLQkJfQotCX07Ci19Ci0KLS8vIElFIGNoYW5nZSBkZWxlZ2F0aW9uIGFuZCBjaGVja2JveC9yYWRpbyBmaXgKLWlmICggIWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7Ci0KLQlqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UgPSB7Ci0KLQkJc2V0dXA6IGZ1bmN0aW9uKCkgewotCi0JCQlpZiAoIHJmb3JtRWxlbXMudGVzdCggdGhpcy5ub2RlTmFtZSApICkgewotCQkJCS8vIElFIGRvZXNuJ3QgZmlyZSBjaGFuZ2Ugb24gYSBjaGVjay9yYWRpbyB1bnRpbCBibHVyOyB0cmlnZ2VyIGl0IG9uIGNsaWNrCi0JCQkJLy8gYWZ0ZXIgYSBwcm9wZXJ0eWNoYW5nZS4gRWF0IHRoZSBibHVyLWNoYW5nZSBpbiBzcGVjaWFsLmNoYW5nZS5oYW5kbGUuCi0JCQkJLy8gVGhpcyBzdGlsbCBmaXJlcyBvbmNoYW5nZSBhIHNlY29uZCB0aW1lIGZvciBjaGVjay9yYWRpbyBhZnRlciBibHVyLgotCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giIHx8IHRoaXMudHlwZSA9PT0gInJhZGlvIiApIHsKLQkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZXZlbnQgKSB7Ci0JCQkJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lID09PSAiY2hlY2tlZCIgKSB7Ci0JCQkJCQkJdGhpcy5fanVzdF9jaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJjbGljay5fY2hhbmdlIiwgZnVuY3Rpb24oIGV2ZW50ICkgewotCQkJCQkJaWYgKCB0aGlzLl9qdXN0X2NoYW5nZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKLQkJCQkJCQl0aGlzLl9qdXN0X2NoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCS8vIEFsbG93IHRyaWdnZXJlZCwgc2ltdWxhdGVkIGNoYW5nZSBldmVudHMgKCMxMTUwMCkKLQkJCQkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggImNoYW5nZSIsIHRoaXMsIGV2ZW50LCB0cnVlICk7Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBEZWxlZ2F0ZWQgZXZlbnQ7IGxhenktYWRkIGEgY2hhbmdlIGhhbmRsZXIgb24gZGVzY2VuZGFudCBpbnB1dHMKLQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIiwgZnVuY3Rpb24oIGUgKSB7Ci0JCQkJdmFyIGVsZW0gPSBlLnRhcmdldDsKLQotCQkJCWlmICggcmZvcm1FbGVtcy50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgImNoYW5nZUJ1YmJsZXMiICkgKSB7Ci0JCQkJCWpRdWVyeS5ldmVudC5hZGQoIGVsZW0sICJjaGFuZ2UuX2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVudCApIHsKLQkJCQkJCWlmICggdGhpcy5wYXJlbnROb2RlICYmICFldmVudC5pc1NpbXVsYXRlZCAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewotCQkJCQkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggImNoYW5nZSIsIHRoaXMucGFyZW50Tm9kZSwgZXZlbnQsIHRydWUgKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCWpRdWVyeS5fZGF0YSggZWxlbSwgImNoYW5nZUJ1YmJsZXMiLCB0cnVlICk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0sCi0KLQkJaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7Ci0JCQl2YXIgZWxlbSA9IGV2ZW50LnRhcmdldDsKLQotCQkJLy8gU3dhbGxvdyBuYXRpdmUgY2hhbmdlIGV2ZW50cyBmcm9tIGNoZWNrYm94L3JhZGlvLCB3ZSBhbHJlYWR5IHRyaWdnZXJlZCB0aGVtIGFib3ZlCi0JCQlpZiAoIHRoaXMgIT09IGVsZW0gfHwgZXZlbnQuaXNTaW11bGF0ZWQgfHwgZXZlbnQuaXNUcmlnZ2VyIHx8IChlbGVtLnR5cGUgIT09ICJyYWRpbyIgJiYgZWxlbS50eXBlICE9PSAiY2hlY2tib3giKSApIHsKLQkJCQlyZXR1cm4gZXZlbnQuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwotCQkJfQotCQl9LAotCi0JCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKLQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuX2NoYW5nZSIgKTsKLQotCQkJcmV0dXJuICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKLQkJfQotCX07Ci19Ci0KLS8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50cwotaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXMgKSB7Ci0JalF1ZXJ5LmVhY2goeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7Ci0KLQkJLy8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAotCQl2YXIgYXR0YWNoZXMgPSAwLAotCQkJaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKLQkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7Ci0JCQl9OwotCi0JCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKLQkJCXNldHVwOiBmdW5jdGlvbigpIHsKLQkJCQlpZiAoIGF0dGFjaGVzKysgPT09IDAgKSB7Ci0JCQkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKLQkJCQl9Ci0JCQl9LAotCQkJdGVhcmRvd246IGZ1bmN0aW9uKCkgewotCQkJCWlmICggLS1hdHRhY2hlcyA9PT0gMCApIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9KTsKLX0KLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0KLQlvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7Ci0JCXZhciB0eXBlLCBvcmlnRm47Ci0KLQkJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCi0JCWlmICggdHlwZW9mIHR5cGVzID09PSAib2JqZWN0IiApIHsKLQkJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCi0JCQlpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmluZyIgKSB7Ci0JCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQotCQkJCWRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yOwotCQkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwotCQkJfQotCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKLQkJCQl0aGlzLm9uKCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7Ci0JCQkvLyAoIHR5cGVzLCBmbiApCi0JCQlmbiA9IHNlbGVjdG9yOwotCQkJZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkOwotCQl9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkgewotCQkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewotCQkJCS8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApCi0JCQkJZm4gPSBkYXRhOwotCQkJCWRhdGEgPSB1bmRlZmluZWQ7Ci0JCQl9IGVsc2UgewotCQkJCS8vICggdHlwZXMsIGRhdGEsIGZuICkKLQkJCQlmbiA9IGRhdGE7Ci0JCQkJZGF0YSA9IHNlbGVjdG9yOwotCQkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwotCQkJfQotCQl9Ci0JCWlmICggZm4gPT09IGZhbHNlICkgewotCQkJZm4gPSByZXR1cm5GYWxzZTsKLQkJfSBlbHNlIGlmICggIWZuICkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQotCQlpZiAoIG9uZSA9PT0gMSApIHsKLQkJCW9yaWdGbiA9IGZuOwotCQkJZm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7Ci0JCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCi0JCQkJalF1ZXJ5KCkub2ZmKCBldmVudCApOwotCQkJCXJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwotCQkJfTsKLQkJCS8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCi0JCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKLQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKLQkJfSk7Ci0JfSwKLQlvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewotCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApOwotCX0sCi0Jb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKLQkJdmFyIGhhbmRsZU9iaiwgdHlwZTsKLQkJaWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7Ci0JCQkvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50Ci0JCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7Ci0JCQlqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKAotCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPyBoYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDogaGFuZGxlT2JqLm9yaWdUeXBlLAotCQkJCWhhbmRsZU9iai5zZWxlY3RvciwKLQkJCQloYW5kbGVPYmouaGFuZGxlcgotCQkJKTsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmICggdHlwZW9mIHR5cGVzID09PSAib2JqZWN0IiApIHsKLQkJCS8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApCi0JCQlmb3IgKCB0eXBlIGluIHR5cGVzICkgewotCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwotCQkJfQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSAiZnVuY3Rpb24iICkgewotCQkJLy8gKCB0eXBlcyBbLCBmbl0gKQotCQkJZm4gPSBzZWxlY3RvcjsKLQkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwotCQl9Ci0JCWlmICggZm4gPT09IGZhbHNlICkgewotCQkJZm4gPSByZXR1cm5GYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApOwotCQl9KTsKLQl9LAotCi0JdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7Ci0JCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0JCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwotCQl9KTsKLQl9LAotCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKLQkJdmFyIGVsZW0gPSB0aGlzWzBdOwotCQlpZiAoIGVsZW0gKSB7Ci0JCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKLQkJfQotCX0KLX0pOwotdmFyIGlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKLQlycGFyZW50c3ByZXYgPSAvXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLywKLQlybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LAotCS8vIG1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0Ci0JZ3VhcmFudGVlZFVuaXF1ZSA9IHsKLQkJY2hpbGRyZW46IHRydWUsCi0JCWNvbnRlbnRzOiB0cnVlLAotCQluZXh0OiB0cnVlLAotCQlwcmV2OiB0cnVlCi0JfTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0JZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewotCQl2YXIgaSwKLQkJCXJldCA9IFtdLAotCQkJc2VsZiA9IHRoaXMsCi0JCQlsZW4gPSBzZWxmLmxlbmd0aDsKLQotCQlpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmluZyIgKSB7Ci0JCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7Ci0JCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLQkJCQkJaWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KSApOwotCQl9Ci0KLQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLQkJCWpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTsKLQkJfQotCi0JCS8vIE5lZWRlZCBiZWNhdXNlICQoIHNlbGVjdG9yLCBjb250ZXh0ICkgYmVjb21lcyAkKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKQotCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7Ci0JCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgPyB0aGlzLnNlbGVjdG9yICsgIiAiICsgc2VsZWN0b3IgOiBzZWxlY3RvcjsKLQkJcmV0dXJuIHJldDsKLQl9LAotCi0JaGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkgewotCQl2YXIgaSwKLQkJCXRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLAotCQkJbGVuID0gdGFyZ2V0cy5sZW5ndGg7Ci0KLQkJcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkgewotCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0sCi0KLQlub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKLQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUpICk7Ci0JfSwKLQotCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewotCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UpICk7Ci0JfSwKLQotCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7Ci0JCXJldHVybiAhIXdpbm5vdygKLQkJCXRoaXMsCi0KLQkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKLQkJCS8vIHNvICQoInA6Zmlyc3QiKS5pcygicDpsYXN0Iikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvICJwIi4KLQkJCXR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID8KLQkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgotCQkJCXNlbGVjdG9yIHx8IFtdLAotCQkJZmFsc2UKLQkJKS5sZW5ndGg7Ci0JfSwKLQotCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7Ci0JCXZhciBjdXIsCi0JCQlpID0gMCwKLQkJCWwgPSB0aGlzLmxlbmd0aCwKLQkJCXJldCA9IFtdLAotCQkJcG9zID0gcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSAic3RyaW5nIiA/Ci0JCQkJalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgotCQkJCTA7Ci0KLQkJZm9yICggOyBpIDwgbDsgaSsrICkgewotCQkJZm9yICggY3VyID0gdGhpc1tpXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7Ci0JCQkJLy8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzCi0JCQkJaWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAocG9zID8KLQkJCQkJcG9zLmluZGV4KGN1cikgPiAtMSA6Ci0KLQkJCQkJLy8gRG9uJ3QgcGFzcyBub24tZWxlbWVudHMgdG8gU2l6emxlCi0JCQkJCWN1ci5ub2RlVHlwZSA9PT0gMSAmJgotCQkJCQkJalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSkgKSB7Ci0KLQkJCQkJY3VyID0gcmV0LnB1c2goIGN1ciApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQgKTsKLQl9LAotCi0JLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbgotCS8vIHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cwotCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKLQotCQkvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudAotCQlpZiAoICFlbGVtICkgewotCQkJcmV0dXJuICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7Ci0JCX0KLQotCQkvLyBpbmRleCBpbiBzZWxlY3RvcgotCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKLQkJCXJldHVybiBqUXVlcnkuaW5BcnJheSggdGhpc1swXSwgalF1ZXJ5KCBlbGVtICkgKTsKLQkJfQotCi0JCS8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudAotCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCi0JCQkvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWQKLQkJCWVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0sIHRoaXMgKTsKLQl9LAotCi0JYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7Ci0JCXZhciBzZXQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KLQkJCQlqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgOgotCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICYmIHNlbGVjdG9yLm5vZGVUeXBlID8gWyBzZWxlY3RvciBdIDogc2VsZWN0b3IgKSwKLQkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7Ci0KLQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKGFsbCkgKTsKLQl9LAotCi0JYWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkgewotCQlyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPwotCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlcihzZWxlY3RvcikKLQkJKTsKLQl9Ci19KTsKLQotZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7Ci0JZG8gewotCQljdXIgPSBjdXJbIGRpciBdOwotCX0gd2hpbGUgKCBjdXIgJiYgY3VyLm5vZGVUeXBlICE9PSAxICk7Ci0KLQlyZXR1cm4gY3VyOwotfQotCi1qUXVlcnkuZWFjaCh7Ci0JcGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHsKLQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKLQkJcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDsKLQl9LAotCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewotCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiICk7Ci0JfSwKLQlwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKLQkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKLQl9LAotCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgewotCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwotCX0sCi0JcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwotCX0sCi0JbmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciICk7Ci0JfSwKLQlwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKLQkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciICk7Ci0JfSwKLQluZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKLQkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Ci0JfSwKLQlwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKLQkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciLCB1bnRpbCApOwotCX0sCi0Jc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewotCQlyZXR1cm4galF1ZXJ5LnNpYmxpbmcoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApOwotCX0sCi0JY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewotCQlyZXR1cm4galF1ZXJ5LnNpYmxpbmcoIGVsZW0uZmlyc3RDaGlsZCApOwotCX0sCi0JY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewotCQlyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaWZyYW1lIiApID8KLQkJCWVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6Ci0JCQlqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTsKLQl9Ci19LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7Ci0JalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkgewotCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7Ci0KLQkJaWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSAiVW50aWwiICkgewotCQkJc2VsZWN0b3IgPSB1bnRpbDsKLQkJfQotCi0JCWlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKLQkJCXJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKLQkJfQotCi0JCWlmICggdGhpcy5sZW5ndGggPiAxICkgewotCQkJLy8gUmVtb3ZlIGR1cGxpY2F0ZXMKLQkJCWlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHsKLQkJCQlyZXQgPSBqUXVlcnkudW5pcXVlKCByZXQgKTsKLQkJCX0KLQotCQkJLy8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXMKLQkJCWlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHsKLQkJCQlyZXQgPSByZXQucmV2ZXJzZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKLQl9OwotfSk7Ci0KLWpRdWVyeS5leHRlbmQoewotCWZpbHRlcjogZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Ci0JCXZhciBlbGVtID0gZWxlbXNbIDAgXTsKLQotCQlpZiAoIG5vdCApIHsKLQkJCWV4cHIgPSAiOm5vdCgiICsgZXhwciArICIpIjsKLQkJfQotCi0JCXJldHVybiBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSA/Ci0JCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW10gOgotCQkJalF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKLQkJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKLQkJCX0pKTsKLQl9LAotCi0JZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHsKLQkJdmFyIG1hdGNoZWQgPSBbXSwKLQkJCWN1ciA9IGVsZW1bIGRpciBdOwotCi0JCXdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gOSAmJiAodW50aWwgPT09IHVuZGVmaW5lZCB8fCBjdXIubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeSggY3VyICkuaXMoIHVudGlsICkpICkgewotCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7Ci0JCQkJbWF0Y2hlZC5wdXNoKCBjdXIgKTsKLQkJCX0KLQkJCWN1ciA9IGN1cltkaXJdOwotCQl9Ci0JCXJldHVybiBtYXRjaGVkOwotCX0sCi0KLQlzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHsKLQkJdmFyIHIgPSBbXTsKLQotCQlmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgewotCQkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7Ci0JCQkJci5wdXNoKCBuICk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcjsKLQl9Ci19KTsKLQotLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3QKLWZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewotCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHF1YWxpZmllciApICkgewotCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKLQkJCS8qIGpzaGludCAtVzAxOCAqLwotCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwotCQl9KTsKLQotCX0KLQotCWlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkgewotCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKLQkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7Ci0JCX0pOwotCi0JfQotCi0JaWYgKCB0eXBlb2YgcXVhbGlmaWVyID09PSAic3RyaW5nIiApIHsKLQkJaWYgKCBpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHsKLQkJCXJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTsKLQkJfQotCi0JCXF1YWxpZmllciA9IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMgKTsKLQl9Ci0KLQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKLQkJcmV0dXJuICggalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHF1YWxpZmllciApID49IDAgKSAhPT0gbm90OwotCX0pOwotfQotZnVuY3Rpb24gY3JlYXRlU2FmZUZyYWdtZW50KCBkb2N1bWVudCApIHsKLQl2YXIgbGlzdCA9IG5vZGVOYW1lcy5zcGxpdCggInwiICksCi0JCXNhZmVGcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwotCi0JaWYgKCBzYWZlRnJhZy5jcmVhdGVFbGVtZW50ICkgewotCQl3aGlsZSAoIGxpc3QubGVuZ3RoICkgewotCQkJc2FmZUZyYWcuY3JlYXRlRWxlbWVudCgKLQkJCQlsaXN0LnBvcCgpCi0JCQkpOwotCQl9Ci0JfQotCXJldHVybiBzYWZlRnJhZzsKLX0KLQotdmFyIG5vZGVOYW1lcyA9ICJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfCIgKwotCQkiaGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLAotCXJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLAotCXJub3NoaW1jYWNoZSA9IG5ldyBSZWdFeHAoIjwoPzoiICsgbm9kZU5hbWVzICsgIilbXFxzLz5dIiwgImkiKSwKLQlybGVhZGluZ1doaXRlc3BhY2UgPSAvXlxzKy8sCi0JcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSwKLQlydGFnTmFtZSA9IC88KFtcdzpdKykvLAotCXJ0Ym9keSA9IC88dGJvZHkvaSwKLQlyaHRtbCA9IC88fCYjP1x3KzsvLAotCXJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksCi0JbWFuaXB1bGF0aW9uX3JjaGVja2FibGVUeXBlID0gL14oPzpjaGVja2JveHxyYWRpbykkL2ksCi0JLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAotCXJjaGVja2VkID0gL2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksCi0JcnNjcmlwdFR5cGUgPSAvXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksCi0JcnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcLyguKikvLAotCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZywKLQotCS8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApCi0Jd3JhcE1hcCA9IHsKLQkJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKLQkJbGVnZW5kOiBbIDEsICI8ZmllbGRzZXQ+IiwgIjwvZmllbGRzZXQ+IiBdLAotCQlhcmVhOiBbIDEsICI8bWFwPiIsICI8L21hcD4iIF0sCi0JCXBhcmFtOiBbIDEsICI8b2JqZWN0PiIsICI8L29iamVjdD4iIF0sCi0JCXRoZWFkOiBbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdLAotCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKLQkJY29sOiBbIDIsICI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAotCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKLQotCQkvLyBJRTYtOCBjYW4ndCBzZXJpYWxpemUgbGluaywgc2NyaXB0LCBzdHlsZSwgb3IgYW55IGh0bWw1IChOb1Njb3BlKSB0YWdzLAotCQkvLyB1bmxlc3Mgd3JhcHBlZCBpbiBhIGRpdiB3aXRoIG5vbi1icmVha2luZyBjaGFyYWN0ZXJzIGluIGZyb250IG9mIGl0LgotCQlfZGVmYXVsdDogalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSA/IFsgMCwgIiIsICIiIF0gOiBbIDEsICJYPGRpdj4iLCAiPC9kaXY+IiAgXQotCX0sCi0Jc2FmZUZyYWdtZW50ID0gY3JlYXRlU2FmZUZyYWdtZW50KCBkb2N1bWVudCApLAotCWZyYWdtZW50RGl2ID0gc2FmZUZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSApOwotCi13cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Ci13cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwotd3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotCXRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKLQkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKLQkJCXJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KLQkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKLQkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCAoIHRoaXNbMF0gJiYgdGhpc1swXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkuY3JlYXRlVGV4dE5vZGUoIHZhbHVlICkgKTsKLQkJfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKLQl9LAotCi0JYXBwZW5kOiBmdW5jdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKLQkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7Ci0JCQkJdGFyZ2V0LmFwcGVuZENoaWxkKCBlbGVtICk7Ci0JCQl9Ci0JCX0pOwotCX0sCi0KLQlwcmVwZW5kOiBmdW5jdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKLQkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7Ci0JCQkJdGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTsKLQkJCX0KLQkJfSk7Ci0JfSwKLQotCWJlZm9yZTogZnVuY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRvbU1hbmlwKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewotCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7Ci0JCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOwotCQkJfQotCQl9KTsKLQl9LAotCi0JYWZ0ZXI6IGZ1bmN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKLQkJCWlmICggdGhpcy5wYXJlbnROb2RlICkgewotCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKLQkJCX0KLQkJfSk7Ci0JfSwKLQotCS8vIGtlZXBEYXRhIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS0tZG8gbm90IGRvY3VtZW50Ci0JcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IsIGtlZXBEYXRhICkgewotCQl2YXIgZWxlbSwKLQkJCWVsZW1zID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgdGhpcyApIDogdGhpcywKLQkJCWkgPSAwOwotCi0JCWZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewotCi0JCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewotCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSApICk7Ci0JCQl9Ci0KLQkJCWlmICggZWxlbS5wYXJlbnROb2RlICkgewotCQkJCWlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHsKLQkJCQkJc2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBlbGVtLCAic2NyaXB0IiApICk7Ci0JCQkJfQotCQkJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfSwKLQotCWVtcHR5OiBmdW5jdGlvbigpIHsKLQkJdmFyIGVsZW0sCi0JCQlpID0gMDsKLQotCQlmb3IgKCA7IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgewotCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCi0JCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7Ci0JCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7Ci0JCQl9Ci0KLQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCi0JCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKLQkJCQllbGVtLnJlbW92ZUNoaWxkKCBlbGVtLmZpcnN0Q2hpbGQgKTsKLQkJCX0KLQotCQkJLy8gSWYgdGhpcyBpcyBhIHNlbGVjdCwgZW5zdXJlIHRoYXQgaXQgZGlzcGxheXMgZW1wdHkgKCMxMjMzNikKLQkJCS8vIFN1cHBvcnQ6IElFPDkKLQkJCWlmICggZWxlbS5vcHRpb25zICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKLQkJCQllbGVtLm9wdGlvbnMubGVuZ3RoID0gMDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0sCi0KLQljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewotCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwotCQlkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7Ci0KLQkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7Ci0JCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwotCQl9KTsKLQl9LAotCi0JaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewotCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewotCQkJdmFyIGVsZW0gPSB0aGlzWzBdIHx8IHt9LAotCQkJCWkgPSAwLAotCQkJCWwgPSB0aGlzLmxlbmd0aDsKLQotCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewotCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxID8KLQkJCQkJZWxlbS5pbm5lckhUTUwucmVwbGFjZSggcmlubGluZWpRdWVyeSwgIiIgKSA6Ci0JCQkJCXVuZGVmaW5lZDsKLQkJCX0KLQotCQkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAotCQkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJgotCQkJCSggalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoIHZhbHVlICkgICkgJiYKLQkJCQkoIGpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSApICYmCi0JCQkJIXdyYXBNYXBbICggcnRhZ05hbWUuZXhlYyggdmFsdWUgKSB8fCBbIiIsICIiXSApWzFdLnRvTG93ZXJDYXNlKCkgXSApIHsKLQotCQkJCXZhbHVlID0gdmFsdWUucmVwbGFjZSggcnhodG1sVGFnLCAiPCQxPjwvJDI+IiApOwotCi0JCQkJdHJ5IHsKLQkJCQkJZm9yICg7IGkgPCBsOyBpKysgKSB7Ci0JCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKLQkJCQkJCWVsZW0gPSB0aGlzW2ldIHx8IHt9OwotCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewotCQkJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwotCQkJCQkJCWVsZW0uaW5uZXJIVE1MID0gdmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQllbGVtID0gMDsKLQotCQkJCS8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZAotCQkJCX0gY2F0Y2goZSkge30KLQkJCX0KLQotCQkJaWYgKCBlbGVtICkgewotCQkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Ci0JCQl9Ci0JCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Ci0JfSwKLQotCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKLQkJdmFyCi0JCQkvLyBTbmFwc2hvdCB0aGUgRE9NIGluIGNhc2UgLmRvbU1hbmlwIHN3ZWVwcyBzb21ldGhpbmcgcmVsZXZhbnQgaW50byBpdHMgZnJhZ21lbnQKLQkJCWFyZ3MgPSBqUXVlcnkubWFwKCB0aGlzLCBmdW5jdGlvbiggZWxlbSApIHsKLQkJCQlyZXR1cm4gWyBlbGVtLm5leHRTaWJsaW5nLCBlbGVtLnBhcmVudE5vZGUgXTsKLQkJCX0pLAotCQkJaSA9IDA7Ci0KLQkJLy8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50Ci0JCXRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCQl2YXIgbmV4dCA9IGFyZ3NbIGkrKyBdLAotCQkJCXBhcmVudCA9IGFyZ3NbIGkrKyBdOwotCi0JCQlpZiAoIHBhcmVudCApIHsKLQkJCQkvLyBEb24ndCB1c2UgdGhlIHNuYXBzaG90IG5leHQgaWYgaXQgaGFzIG1vdmVkICgjMTM4MTApCi0JCQkJaWYgKCBuZXh0ICYmIG5leHQucGFyZW50Tm9kZSAhPT0gcGFyZW50ICkgewotCQkJCQluZXh0ID0gdGhpcy5uZXh0U2libGluZzsKLQkJCQl9Ci0JCQkJalF1ZXJ5KCB0aGlzICkucmVtb3ZlKCk7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZSggZWxlbSwgbmV4dCApOwotCQkJfQotCQkvLyBBbGxvdyBuZXcgY29udGVudCB0byBpbmNsdWRlIGVsZW1lbnRzIGZyb20gdGhlIGNvbnRleHQgc2V0Ci0JCX0sIHRydWUgKTsKLQotCQkvLyBGb3JjZSByZW1vdmFsIGlmIHRoZXJlIHdhcyBubyBuZXcgY29udGVudCAoZS5nLiwgZnJvbSBlbXB0eSBhcmd1bWVudHMpCi0JCXJldHVybiBpID8gdGhpcyA6IHRoaXMucmVtb3ZlKCk7Ci0JfSwKLQotCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7Ci0JfSwKLQotCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgY2FsbGJhY2ssIGFsbG93SW50ZXJzZWN0aW9uICkgewotCi0JCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKLQkJYXJncyA9IGNvcmVfY29uY2F0LmFwcGx5KCBbXSwgYXJncyApOwotCi0JCXZhciBmaXJzdCwgbm9kZSwgaGFzU2NyaXB0cywKLQkJCXNjcmlwdHMsIGRvYywgZnJhZ21lbnQsCi0JCQlpID0gMCwKLQkJCWwgPSB0aGlzLmxlbmd0aCwKLQkJCXNldCA9IHRoaXMsCi0JCQlpTm9DbG9uZSA9IGwgLSAxLAotCQkJdmFsdWUgPSBhcmdzWzBdLAotCQkJaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwotCi0JCS8vIFdlIGNhbid0IGNsb25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktpdAotCQlpZiAoIGlzRnVuY3Rpb24gfHwgISggbCA8PSAxIHx8IHR5cGVvZiB2YWx1ZSAhPT0gInN0cmluZyIgfHwgalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSB8fCAhcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkgewotCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaW5kZXggKSB7Ci0JCQkJdmFyIHNlbGYgPSBzZXQuZXEoIGluZGV4ICk7Ci0JCQkJaWYgKCBpc0Z1bmN0aW9uICkgewotCQkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7Ci0JCQkJfQotCQkJCXNlbGYuZG9tTWFuaXAoIGFyZ3MsIGNhbGxiYWNrLCBhbGxvd0ludGVyc2VjdGlvbiApOwotCQkJfSk7Ci0JCX0KLQotCQlpZiAoIGwgKSB7Ci0JCQlmcmFnbWVudCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsICFhbGxvd0ludGVyc2VjdGlvbiAmJiB0aGlzICk7Ci0JCQlmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7Ci0KLQkJCWlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7Ci0JCQkJZnJhZ21lbnQgPSBmaXJzdDsKLQkJCX0KLQotCQkJaWYgKCBmaXJzdCApIHsKLQkJCQlzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgInNjcmlwdCIgKSwgZGlzYWJsZVNjcmlwdCApOwotCQkJCWhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDsKLQotCQkJCS8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0ZW0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwCi0JCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KLQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7Ci0JCQkJCW5vZGUgPSBmcmFnbWVudDsKLQotCQkJCQlpZiAoIGkgIT09IGlOb0Nsb25lICkgewotCQkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwotCi0JCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCi0JCQkJCQlpZiAoIGhhc1NjcmlwdHMgKSB7Ci0JCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWNhbGxiYWNrLmNhbGwoIHRoaXNbaV0sIG5vZGUsIGkgKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIGhhc1NjcmlwdHMgKSB7Ci0JCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7Ci0KLQkJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwotCQkJCQlqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7Ci0KLQkJCQkJLy8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvbgotCQkJCQlmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHsKLQkJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07Ci0JCQkJCQlpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCAiIiApICYmCi0JCQkJCQkJIWpRdWVyeS5fZGF0YSggbm9kZSwgImdsb2JhbEV2YWwiICkgJiYgalF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHsKLQotCQkJCQkJCWlmICggbm9kZS5zcmMgKSB7Ci0JCQkJCQkJCS8vIEhvcGUgYWpheCBpcyBhdmFpbGFibGUuLi4KLQkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWpRdWVyeS5nbG9iYWxFdmFsKCAoIG5vZGUudGV4dCB8fCBub2RlLnRleHRDb250ZW50IHx8IG5vZGUuaW5uZXJIVE1MIHx8ICIiICkucmVwbGFjZSggcmNsZWFuU2NyaXB0LCAiIiApICk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gRml4ICMxMTgwOTogQXZvaWQgbGVha2luZyBtZW1vcnkKLQkJCQlmcmFnbWVudCA9IGZpcnN0ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLX0pOwotCi0vLyBTdXBwb3J0OiBJRTw4Ci0vLyBNYW5pcHVsYXRpbmcgdGFibGVzIHJlcXVpcmVzIGEgdGJvZHkKLWZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHsKLQlyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKLQkJalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlID09PSAxID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgInRyIiApID8KLQotCQllbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8Ci0JCQllbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSApIDoKLQkJZWxlbTsKLX0KLQotLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgotZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHsKLQllbGVtLnR5cGUgPSAoalF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgInR5cGUiICkgIT09IG51bGwpICsgIi8iICsgZWxlbS50eXBlOwotCXJldHVybiBlbGVtOwotfQotZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHsKLQl2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTsKLQlpZiAoIG1hdGNoICkgewotCQllbGVtLnR5cGUgPSBtYXRjaFsxXTsKLQl9IGVsc2UgewotCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQlyZXR1cm4gZWxlbTsKLX0KLQotLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkCi1mdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Ci0JdmFyIGVsZW0sCi0JCWkgPSAwOwotCWZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewotCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJnbG9iYWxFdmFsIiwgIXJlZkVsZW1lbnRzIHx8IGpRdWVyeS5fZGF0YSggcmVmRWxlbWVudHNbaV0sICJnbG9iYWxFdmFsIiApICk7Ci0JfQotfQotCi1mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewotCi0JaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQl2YXIgdHlwZSwgaSwgbCwKLQkJb2xkRGF0YSA9IGpRdWVyeS5fZGF0YSggc3JjICksCi0JCWN1ckRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QsIG9sZERhdGEgKSwKLQkJZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7Ci0KLQlpZiAoIGV2ZW50cyApIHsKLQkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOwotCQljdXJEYXRhLmV2ZW50cyA9IHt9OwotCi0JCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgewotCQkJZm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7Ci0JCQkJalF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gbWFrZSB0aGUgY2xvbmVkIHB1YmxpYyBkYXRhIG9iamVjdCBhIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwKLQlpZiAoIGN1ckRhdGEuZGF0YSApIHsKLQkJY3VyRGF0YS5kYXRhID0galF1ZXJ5LmV4dGVuZCgge30sIGN1ckRhdGEuZGF0YSApOwotCX0KLX0KLQotZnVuY3Rpb24gZml4Q2xvbmVOb2RlSXNzdWVzKCBzcmMsIGRlc3QgKSB7Ci0JdmFyIG5vZGVOYW1lLCBlLCBkYXRhOwotCi0JLy8gV2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50cwotCWlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHsKLQkJcmV0dXJuOwotCX0KLQotCW5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotCi0JLy8gSUU2LTggY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuCi0JaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmIGRlc3RbIGpRdWVyeS5leHBhbmRvIF0gKSB7Ci0JCWRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QgKTsKLQotCQlmb3IgKCBlIGluIGRhdGEuZXZlbnRzICkgewotCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBkZXN0LCBlLCBkYXRhLmhhbmRsZSApOwotCQl9Ci0KLQkJLy8gRXZlbnQgZGF0YSBnZXRzIHJlZmVyZW5jZWQgaW5zdGVhZCBvZiBjb3BpZWQgaWYgdGhlIGV4cGFuZG8gZ2V0cyBjb3BpZWQgdG9vCi0JCWRlc3QucmVtb3ZlQXR0cmlidXRlKCBqUXVlcnkuZXhwYW5kbyApOwotCX0KLQotCS8vIElFIGJsYW5rcyBjb250ZW50cyB3aGVuIGNsb25pbmcgc2NyaXB0cywgYW5kIHRyaWVzIHRvIGV2YWx1YXRlIG5ld2x5LXNldCB0ZXh0Ci0JaWYgKCBub2RlTmFtZSA9PT0gInNjcmlwdCIgJiYgZGVzdC50ZXh0ICE9PSBzcmMudGV4dCApIHsKLQkJZGlzYWJsZVNjcmlwdCggZGVzdCApLnRleHQgPSBzcmMudGV4dDsKLQkJcmVzdG9yZVNjcmlwdCggZGVzdCApOwotCi0JLy8gSUU2LTEwIGltcHJvcGVybHkgY2xvbmVzIGNoaWxkcmVuIG9mIG9iamVjdCBlbGVtZW50cyB1c2luZyBjbGFzc2lkLgotCS8vIElFMTAgdGhyb3dzIE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yIGlmIHBhcmVudCBpcyBudWxsLCAjMTIxMzIuCi0JfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJvYmplY3QiICkgewotCQlpZiAoIGRlc3QucGFyZW50Tm9kZSApIHsKLQkJCWRlc3Qub3V0ZXJIVE1MID0gc3JjLm91dGVySFRNTDsKLQkJfQotCi0JCS8vIFRoaXMgcGF0aCBhcHBlYXJzIHVuYXZvaWRhYmxlIGZvciBJRTkuIFdoZW4gY2xvbmluZyBhbiBvYmplY3QKLQkJLy8gZWxlbWVudCBpbiBJRTksIHRoZSBvdXRlckhUTUwgc3RyYXRlZ3kgYWJvdmUgaXMgbm90IHN1ZmZpY2llbnQuCi0JCS8vIElmIHRoZSBzcmMgaGFzIGlubmVySFRNTCBhbmQgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90LAotCQkvLyBjb3B5IHRoZSBzcmMuaW5uZXJIVE1MIGludG8gdGhlIGRlc3QuaW5uZXJIVE1MLiAjMTAzMjQKLQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5odG1sNUNsb25lICYmICggc3JjLmlubmVySFRNTCAmJiAhalF1ZXJ5LnRyaW0oZGVzdC5pbm5lckhUTUwpICkgKSB7Ci0JCQlkZXN0LmlubmVySFRNTCA9IHNyYy5pbm5lckhUTUw7Ci0JCX0KLQotCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiICYmIG1hbmlwdWxhdGlvbl9yY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkgewotCQkvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94Ci0JCS8vIG9yIHJhZGlvIGJ1dHRvbi4gV29yc2UsIElFNi03IGZhaWwgdG8gZ2l2ZSB0aGUgY2xvbmVkIGVsZW1lbnQKLQkJLy8gYSBjaGVja2VkIGFwcGVhcmFuY2UgaWYgdGhlIGRlZmF1bHRDaGVja2VkIHZhbHVlIGlzbid0IGFsc28gc2V0Ci0KLQkJZGVzdC5kZWZhdWx0Q2hlY2tlZCA9IGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkOwotCi0JCS8vIElFNi03IGdldCBjb25mdXNlZCBhbmQgZW5kIHVwIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY2xvbmVkCi0JCS8vIGNoZWNrYm94L3JhZGlvIGJ1dHRvbiB0byBhbiBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiAib24iCi0JCWlmICggZGVzdC52YWx1ZSAhPT0gc3JjLnZhbHVlICkgewotCQkJZGVzdC52YWx1ZSA9IHNyYy52YWx1ZTsKLQkJfQotCi0JLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKLQkvLyBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwotCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib3B0aW9uIiApIHsKLQkJZGVzdC5kZWZhdWx0U2VsZWN0ZWQgPSBkZXN0LnNlbGVjdGVkID0gc3JjLmRlZmF1bHRTZWxlY3RlZDsKLQotCS8vIElFNi04IGZhaWxzIHRvIHNldCB0aGUgZGVmYXVsdFZhbHVlIHRvIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4KLQkvLyBjbG9uaW5nIG90aGVyIHR5cGVzIG9mIGlucHV0IGZpZWxkcwotCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgewotCQlkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7Ci0JfQotfQotCi1qUXVlcnkuZWFjaCh7Ci0JYXBwZW5kVG86ICJhcHBlbmQiLAotCXByZXBlbmRUbzogInByZXBlbmQiLAotCWluc2VydEJlZm9yZTogImJlZm9yZSIsCi0JaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCi0JcmVwbGFjZUFsbDogInJlcGxhY2VXaXRoIgotfSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkgewotCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewotCQl2YXIgZWxlbXMsCi0JCQlpID0gMCwKLQkJCXJldCA9IFtdLAotCQkJaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAotCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxOwotCi0JCWZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7Ci0JCQllbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDogdGhpcy5jbG9uZSh0cnVlKTsKLQkJCWpRdWVyeSggaW5zZXJ0W2ldIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7Ci0KLQkJCS8vIE1vZGVybiBicm93c2VycyBjYW4gYXBwbHkgalF1ZXJ5IGNvbGxlY3Rpb25zIGFzIGFycmF5cywgYnV0IG9sZElFIG5lZWRzIGEgLmdldCgpCi0JCQljb3JlX3B1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7Ci0JfTsKLX0pOwotCi1mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKLQl2YXIgZWxlbXMsIGVsZW0sCi0JCWkgPSAwLAotCQlmb3VuZCA9IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBjb3JlX3N0cnVuZGVmaW5lZCA/IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKSA6Ci0JCQl0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBjb3JlX3N0cnVuZGVmaW5lZCA/IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8ICIqIiApIDoKLQkJCXVuZGVmaW5lZDsKLQotCWlmICggIWZvdW5kICkgewotCQlmb3IgKCBmb3VuZCA9IFtdLCBlbGVtcyA9IGNvbnRleHQuY2hpbGROb2RlcyB8fCBjb250ZXh0OyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7Ci0JCQlpZiAoICF0YWcgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCB0YWcgKSApIHsKLQkJCQlmb3VuZC5wdXNoKCBlbGVtICk7Ci0JCQl9IGVsc2UgewotCQkJCWpRdWVyeS5tZXJnZSggZm91bmQsIGdldEFsbCggZWxlbSwgdGFnICkgKTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/Ci0JCWpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIGZvdW5kICkgOgotCQlmb3VuZDsKLX0KLQotLy8gVXNlZCBpbiBidWlsZEZyYWdtZW50LCBmaXhlcyB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcGVydHkKLWZ1bmN0aW9uIGZpeERlZmF1bHRDaGVja2VkKCBlbGVtICkgewotCWlmICggbWFuaXB1bGF0aW9uX3JjaGVja2FibGVUeXBlLnRlc3QoIGVsZW0udHlwZSApICkgewotCQllbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOwotCX0KLX0KLQotalF1ZXJ5LmV4dGVuZCh7Ci0JY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKLQkJdmFyIGRlc3RFbGVtZW50cywgbm9kZSwgY2xvbmUsIGksIHNyY0VsZW1lbnRzLAotCQkJaW5QYWdlID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTsKLQotCQlpZiAoIGpRdWVyeS5zdXBwb3J0Lmh0bWw1Q2xvbmUgfHwgalF1ZXJ5LmlzWE1MRG9jKGVsZW0pIHx8ICFybm9zaGltY2FjaGUudGVzdCggIjwiICsgZWxlbS5ub2RlTmFtZSArICI+IiApICkgewotCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApOwotCi0JCS8vIElFPD04IGRvZXMgbm90IHByb3Blcmx5IGNsb25lIGRldGFjaGVkLCB1bmtub3duIGVsZW1lbnQgbm9kZXMKLQkJfSBlbHNlIHsKLQkJCWZyYWdtZW50RGl2LmlubmVySFRNTCA9IGVsZW0ub3V0ZXJIVE1MOwotCQkJZnJhZ21lbnREaXYucmVtb3ZlQ2hpbGQoIGNsb25lID0gZnJhZ21lbnREaXYuZmlyc3RDaGlsZCApOwotCQl9Ci0KLQkJaWYgKCAoIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCB8fCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpICYmCi0JCQkJKGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEpICYmICFqUXVlcnkuaXNYTUxEb2MoZWxlbSkgKSB7Ci0KLQkJCS8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yCi0JCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7Ci0JCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwotCi0JCQkvLyBGaXggYWxsIElFIGNsb25pbmcgaXNzdWVzCi0JCQlmb3IgKCBpID0gMDsgKG5vZGUgPSBzcmNFbGVtZW50c1tpXSkgIT0gbnVsbDsgKytpICkgewotCQkJCS8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4NwotCQkJCWlmICggZGVzdEVsZW1lbnRzW2ldICkgewotCQkJCQlmaXhDbG9uZU5vZGVJc3N1ZXMoIG5vZGUsIGRlc3RFbGVtZW50c1tpXSApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUKLQkJaWYgKCBkYXRhQW5kRXZlbnRzICkgewotCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKLQkJCQlzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApOwotCQkJCWRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7Ci0KLQkJCQlmb3IgKCBpID0gMDsgKG5vZGUgPSBzcmNFbGVtZW50c1tpXSkgIT0gbnVsbDsgaSsrICkgewotCQkJCQljbG9uZUNvcHlFdmVudCggbm9kZSwgZGVzdEVsZW1lbnRzW2ldICk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTsKLQkJCX0KLQkJfQotCi0JCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKLQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgInNjcmlwdCIgKTsKLQkJaWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHsKLQkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKLQkJfQotCi0JCWRlc3RFbGVtZW50cyA9IHNyY0VsZW1lbnRzID0gbm9kZSA9IG51bGw7Ci0KLQkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0Ci0JCXJldHVybiBjbG9uZTsKLQl9LAotCi0JYnVpbGRGcmFnbWVudDogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24gKSB7Ci0JCXZhciBqLCBlbGVtLCBjb250YWlucywKLQkJCXRtcCwgdGFnLCB0Ym9keSwgd3JhcCwKLQkJCWwgPSBlbGVtcy5sZW5ndGgsCi0KLQkJCS8vIEVuc3VyZSBhIHNhZmUgZnJhZ21lbnQKLQkJCXNhZmUgPSBjcmVhdGVTYWZlRnJhZ21lbnQoIGNvbnRleHQgKSwKLQotCQkJbm9kZXMgPSBbXSwKLQkJCWkgPSAwOwotCi0JCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKLQkJCWVsZW0gPSBlbGVtc1sgaSBdOwotCi0JCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKLQotCQkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQotCQkJCWlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gIm9iamVjdCIgKSB7Ci0JCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKLQotCQkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQotCQkJCX0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7Ci0JCQkJCW5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKSApOwotCi0JCQkJLy8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzCi0JCQkJfSBlbHNlIHsKLQkJCQkJdG1wID0gdG1wIHx8IHNhZmUuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2IikgKTsKLQotCQkJCQkvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uCi0JCQkJCXRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsiIiwgIiJdIClbMV0udG9Mb3dlckNhc2UoKTsKLQkJCQkJd3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7Ci0KLQkJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKSArIHdyYXBbMl07Ci0KLQkJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50Ci0JCQkJCWogPSB3cmFwWzBdOwotCQkJCQl3aGlsZSAoIGotLSApIHsKLQkJCQkJCXRtcCA9IHRtcC5sYXN0Q2hpbGQ7Ci0JCQkJCX0KLQotCQkJCQkvLyBNYW51YWxseSBhZGQgbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQgYnkgSUUKLQkJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgJiYgcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIGVsZW0gKSApIHsKLQkJCQkJCW5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIHJsZWFkaW5nV2hpdGVzcGFjZS5leGVjKCBlbGVtIClbMF0gKSApOwotCQkJCQl9Ci0KLQkJCQkJLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKLQkJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7Ci0KLQkJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KLQkJCQkJCWVsZW0gPSB0YWcgPT09ICJ0YWJsZSIgJiYgIXJ0Ym9keS50ZXN0KCBlbGVtICkgPwotCQkJCQkJCXRtcC5maXJzdENoaWxkIDoKLQotCQkJCQkJCS8vIFN0cmluZyB3YXMgYSBiYXJlIDx0aGVhZD4gb3IgPHRmb290PgotCQkJCQkJCXdyYXBbMV0gPT09ICI8dGFibGU+IiAmJiAhcnRib2R5LnRlc3QoIGVsZW0gKSA/Ci0JCQkJCQkJCXRtcCA6Ci0JCQkJCQkJCTA7Ci0KLQkJCQkJCWogPSBlbGVtICYmIGVsZW0uY2hpbGROb2Rlcy5sZW5ndGg7Ci0JCQkJCQl3aGlsZSAoIGotLSApIHsKLQkJCQkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggKHRib2R5ID0gZWxlbS5jaGlsZE5vZGVzW2pdKSwgInRib2R5IiApICYmICF0Ym9keS5jaGlsZE5vZGVzLmxlbmd0aCApIHsKLQkJCQkJCQkJZWxlbS5yZW1vdmVDaGlsZCggdGJvZHkgKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApOwotCi0JCQkJCS8vIEZpeCAjMTIzOTIgZm9yIFdlYktpdCBhbmQgSUUgPiA5Ci0JCQkJCXRtcC50ZXh0Q29udGVudCA9ICIiOwotCi0JCQkJCS8vIEZpeCAjMTIzOTIgZm9yIG9sZElFCi0JCQkJCXdoaWxlICggdG1wLmZpcnN0Q2hpbGQgKSB7Ci0JCQkJCQl0bXAucmVtb3ZlQ2hpbGQoIHRtcC5maXJzdENoaWxkICk7Ci0JCQkJCX0KLQotCQkJCQkvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgcHJvcGVyIGNsZWFudXAKLQkJCQkJdG1wID0gc2FmZS5sYXN0Q2hpbGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gRml4ICMxMTM1NjogQ2xlYXIgZWxlbWVudHMgZnJvbSBmcmFnbWVudAotCQlpZiAoIHRtcCApIHsKLQkJCXNhZmUucmVtb3ZlQ2hpbGQoIHRtcCApOwotCQl9Ci0KLQkJLy8gUmVzZXQgZGVmYXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKLQkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQotCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkgewotCQkJalF1ZXJ5LmdyZXAoIGdldEFsbCggbm9kZXMsICJpbnB1dCIgKSwgZml4RGVmYXVsdENoZWNrZWQgKTsKLQkJfQotCi0JCWkgPSAwOwotCQl3aGlsZSAoIChlbGVtID0gbm9kZXNbIGkrKyBdKSApIHsKLQotCQkJLy8gIzQwODcgLSBJZiBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSwgYW5kIHRoaXMgaXMKLQkJCS8vIHRoYXQgZWxlbWVudCwgZG8gbm90IGRvIGFueXRoaW5nCi0JCQlpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgIT09IC0xICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQljb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7Ci0KLQkJCS8vIEFwcGVuZCB0byBmcmFnbWVudAotCQkJdG1wID0gZ2V0QWxsKCBzYWZlLmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7Ci0KLQkJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKLQkJCWlmICggY29udGFpbnMgKSB7Ci0JCQkJc2V0R2xvYmFsRXZhbCggdG1wICk7Ci0JCQl9Ci0KLQkJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKLQkJCWlmICggc2NyaXB0cyApIHsKLQkJCQlqID0gMDsKLQkJCQl3aGlsZSAoIChlbGVtID0gdG1wWyBqKysgXSkgKSB7Ci0JCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7Ci0JCQkJCQlzY3JpcHRzLnB1c2goIGVsZW0gKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRtcCA9IG51bGw7Ci0KLQkJcmV0dXJuIHNhZmU7Ci0JfSwKLQotCWNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zLCAvKiBpbnRlcm5hbCAqLyBhY2NlcHREYXRhICkgewotCQl2YXIgZWxlbSwgdHlwZSwgaWQsIGRhdGEsCi0JCQlpID0gMCwKLQkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sCi0JCQljYWNoZSA9IGpRdWVyeS5jYWNoZSwKLQkJCWRlbGV0ZUV4cGFuZG8gPSBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvLAotCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsOwotCi0JCWZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewotCi0JCQlpZiAoIGFjY2VwdERhdGEgfHwgalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKLQotCQkJCWlkID0gZWxlbVsgaW50ZXJuYWxLZXkgXTsKLQkJCQlkYXRhID0gaWQgJiYgY2FjaGVbIGlkIF07Ci0KLQkJCQlpZiAoIGRhdGEgKSB7Ci0JCQkJCWlmICggZGF0YS5ldmVudHMgKSB7Ci0JCQkJCQlmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkgewotCQkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgewotCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7Ci0KLQkJCQkJCQkvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIFJlbW92ZSBjYWNoZSBvbmx5IGlmIGl0IHdhcyBub3QgYWxyZWFkeSByZW1vdmVkIGJ5IGpRdWVyeS5ldmVudC5yZW1vdmUKLQkJCQkJaWYgKCBjYWNoZVsgaWQgXSApIHsKLQotCQkJCQkJZGVsZXRlIGNhY2hlWyBpZCBdOwotCi0JCQkJCQkvLyBJRSBkb2VzIG5vdCBhbGxvdyB1cyB0byBkZWxldGUgZXhwYW5kbyBwcm9wZXJ0aWVzIGZyb20gbm9kZXMsCi0JCQkJCQkvLyBub3IgZG9lcyBpdCBoYXZlIGEgcmVtb3ZlQXR0cmlidXRlIGZ1bmN0aW9uIG9uIERvY3VtZW50IG5vZGVzOwotCQkJCQkJLy8gd2UgbXVzdCBoYW5kbGUgYWxsIG9mIHRoZXNlIGNhc2VzCi0JCQkJCQlpZiAoIGRlbGV0ZUV4cGFuZG8gKSB7Ci0JCQkJCQkJZGVsZXRlIGVsZW1bIGludGVybmFsS2V5IF07Ci0KLQkJCQkJCX0gZWxzZSBpZiAoIHR5cGVvZiBlbGVtLnJlbW92ZUF0dHJpYnV0ZSAhPT0gY29yZV9zdHJ1bmRlZmluZWQgKSB7Ci0JCQkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGludGVybmFsS2V5ICk7Ci0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWxlbVsgaW50ZXJuYWxLZXkgXSA9IG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCWNvcmVfZGVsZXRlZElkcy5wdXNoKCBpZCApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSwKLQotCV9ldmFsVXJsOiBmdW5jdGlvbiggdXJsICkgewotCQlyZXR1cm4galF1ZXJ5LmFqYXgoewotCQkJdXJsOiB1cmwsCi0JCQl0eXBlOiAiR0VUIiwKLQkJCWRhdGFUeXBlOiAic2NyaXB0IiwKLQkJCWFzeW5jOiBmYWxzZSwKLQkJCWdsb2JhbDogZmFsc2UsCi0JCQkidGhyb3dzIjogdHJ1ZQotCQl9KTsKLQl9Ci19KTsKLWpRdWVyeS5mbi5leHRlbmQoewotCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewotCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7Ci0JCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKLQkJCQlqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7Ci0JCQl9KTsKLQkJfQotCi0JCWlmICggdGhpc1swXSApIHsKLQkJCS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCi0JCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7Ci0KLQkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkgewotCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7Ci0JCQl9Ci0KLQkJCXdyYXAubWFwKGZ1bmN0aW9uKCkgewotCQkJCXZhciBlbGVtID0gdGhpczsKLQotCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKLQkJCQkJZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZWxlbTsKLQkJCX0pLmFwcGVuZCggdGhpcyApOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfSwKLQotCXdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7Ci0JCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKLQkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewotCQkJCWpRdWVyeSh0aGlzKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApOwotCQkJfSk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSwKLQkJCQljb250ZW50cyA9IHNlbGYuY29udGVudHMoKTsKLQotCQkJaWYgKCBjb250ZW50cy5sZW5ndGggKSB7Ci0JCQkJY29udGVudHMud3JhcEFsbCggaHRtbCApOwotCi0JCQl9IGVsc2UgewotCQkJCXNlbGYuYXBwZW5kKCBodG1sICk7Ci0JCQl9Ci0JCX0pOwotCX0sCi0KLQl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKLQkJdmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApOwotCi0JCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewotCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCh0aGlzLCBpKSA6IGh0bWwgKTsKLQkJfSk7Ci0JfSwKLQotCXVud3JhcDogZnVuY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKSB7Ci0JCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgewotCQkJCWpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTsKLQkJCX0KLQkJfSkuZW5kKCk7Ci0JfQotfSk7Ci12YXIgaWZyYW1lLCBnZXRTdHlsZXMsIGN1ckNTUywKLQlyYWxwaGEgPSAvYWxwaGFcKFteKV0qXCkvaSwKLQlyb3BhY2l0eSA9IC9vcGFjaXR5XHMqPVxzKihbXildKikvLAotCXJwb3NpdGlvbiA9IC9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLywKLQkvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgotCS8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheQotCXJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLywKLQlybWFyZ2luID0gL15tYXJnaW4vLAotCXJudW1zcGxpdCA9IG5ldyBSZWdFeHAoICJeKCIgKyBjb3JlX3BudW0gKyAiKSguKikkIiwgImkiICksCi0Jcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggIl4oIiArIGNvcmVfcG51bSArICIpKD8hcHgpW2EteiVdKyQiLCAiaSIgKSwKLQlycmVsTnVtID0gbmV3IFJlZ0V4cCggIl4oWystXSk9KCIgKyBjb3JlX3BudW0gKyAiKSIsICJpIiApLAotCWVsZW1kaXNwbGF5ID0geyBCT0RZOiAiYmxvY2siIH0sCi0KLQljc3NTaG93ID0geyBwb3NpdGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwKLQljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7Ci0JCWxldHRlclNwYWNpbmc6IDAsCi0JCWZvbnRXZWlnaHQ6IDQwMAotCX0sCi0KLQljc3NFeHBhbmQgPSBbICJUb3AiLCAiUmlnaHQiLCAiQm90dG9tIiwgIkxlZnQiIF0sCi0JY3NzUHJlZml4ZXMgPSBbICJXZWJraXQiLCAiTyIsICJNb3oiLCAibXMiIF07Ci0KLS8vIHJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkKLWZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBzdHlsZSwgbmFtZSApIHsKLQotCS8vIHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkCi0JaWYgKCBuYW1lIGluIHN0eWxlICkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzCi0JdmFyIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwKLQkJb3JpZ05hbWUgPSBuYW1lLAotCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwotCi0Jd2hpbGUgKCBpLS0gKSB7Ci0JCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKLQkJaWYgKCBuYW1lIGluIHN0eWxlICkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gb3JpZ05hbWU7Ci19Ci0KLWZ1bmN0aW9uIGlzSGlkZGVuKCBlbGVtLCBlbCApIHsKLQkvLyBpc0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwotCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAotCWVsZW0gPSBlbCB8fCBlbGVtOwotCXJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiIHx8ICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwotfQotCi1mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Ci0JdmFyIGRpc3BsYXksIGVsZW0sIGhpZGRlbiwKLQkJdmFsdWVzID0gW10sCi0JCWluZGV4ID0gMCwKLQkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwotCi0JZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKLQkJZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOwotCQlpZiAoICFlbGVtLnN0eWxlICkgewotCQkJY29udGludWU7Ci0JCX0KLQotCQl2YWx1ZXNbIGluZGV4IF0gPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiApOwotCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwotCQlpZiAoIHNob3cgKSB7Ci0JCQkvLyBSZXNldCB0aGUgaW5saW5lIGRpc3BsYXkgb2YgdGhpcyBlbGVtZW50IHRvIGxlYXJuIGlmIGl0IGlzCi0JCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90Ci0JCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewotCQkJCWVsZW0uc3R5bGUuZGlzcGxheSA9ICIiOwotCQkJfQotCi0JCQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCi0JCQkvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHlsZSBpcwotCQkJLy8gZm9yIHN1Y2ggYW4gZWxlbWVudAotCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7Ci0JCQkJdmFsdWVzWyBpbmRleCBdID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIsIGNzc19kZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApOwotCQkJfQotCQl9IGVsc2UgewotCi0JCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7Ci0JCQkJaGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTsKLQotCQkJCWlmICggZGlzcGxheSAmJiBkaXNwbGF5ICE9PSAibm9uZSIgfHwgIWhpZGRlbiApIHsKLQkJCQkJalF1ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIsIGhpZGRlbiA/IGRpc3BsYXkgOiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wCi0JLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwotCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7Ci0JCWVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTsKLQkJaWYgKCAhZWxlbS5zdHlsZSApIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICggIXNob3cgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSAibm9uZSIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSAiIiApIHsKLQkJCWVsZW0uc3R5bGUuZGlzcGxheSA9IHNob3cgPyB2YWx1ZXNbIGluZGV4IF0gfHwgIiIgOiAibm9uZSI7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZWxlbWVudHM7Ci19Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotCWNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewotCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewotCQkJdmFyIGxlbiwgc3R5bGVzLAotCQkJCW1hcCA9IHt9LAotCQkJCWkgPSAwOwotCi0JCQlpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7Ci0JCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7Ci0JCQkJbGVuID0gbmFtZS5sZW5ndGg7Ci0KLQkJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKLQkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwotCQkJCX0KLQotCQkJCXJldHVybiBtYXA7Ci0JCQl9Ci0KLQkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KLQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOgotCQkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKLQkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Ci0JfSwKLQlzaG93OiBmdW5jdGlvbigpIHsKLQkJcmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7Ci0JfSwKLQloaWRlOiBmdW5jdGlvbigpIHsKLQkJcmV0dXJuIHNob3dIaWRlKCB0aGlzICk7Ci0JfSwKLQl0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHsKLQkJaWYgKCB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIiApIHsKLQkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCQkJaWYgKCBpc0hpZGRlbiggdGhpcyApICkgewotCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKLQkJCX0gZWxzZSB7Ci0JCQkJalF1ZXJ5KCB0aGlzICkuaGlkZSgpOwotCQkJfQotCQl9KTsKLQl9Ci19KTsKLQotalF1ZXJ5LmV4dGVuZCh7Ci0JLy8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0Ci0JLy8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5Ci0JY3NzSG9va3M6IHsKLQkJb3BhY2l0eTogewotCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Ci0JCQkJaWYgKCBjb21wdXRlZCApIHsKLQkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKLQkJCQkJdmFyIHJldCA9IGN1ckNTUyggZWxlbSwgIm9wYWNpdHkiICk7Ci0JCQkJCXJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0OwotCQkJCX0KLQkJCX0KLQkJfQotCX0sCi0KLQkvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCAicHgiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXMKLQljc3NOdW1iZXI6IHsKLQkJImNvbHVtbkNvdW50IjogdHJ1ZSwKLQkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKLQkJImZvbnRXZWlnaHQiOiB0cnVlLAotCQkibGluZUhlaWdodCI6IHRydWUsCi0JCSJvcGFjaXR5IjogdHJ1ZSwKLQkJIm9yZGVyIjogdHJ1ZSwKLQkJIm9ycGhhbnMiOiB0cnVlLAotCQkid2lkb3dzIjogdHJ1ZSwKLQkJInpJbmRleCI6IHRydWUsCi0JCSJ6b29tIjogdHJ1ZQotCX0sCi0KLQkvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlCi0JLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQotCWNzc1Byb3BzOiB7Ci0JCS8vIG5vcm1hbGl6ZSBmbG9hdCBjc3MgcHJvcGVydHkKLQkJImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCi0JfSwKLQotCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCi0Jc3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7Ci0JCS8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwotCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQotCQl2YXIgcmV0LCB0eXBlLCBob29rcywKLQkJCW9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLAotCQkJc3R5bGUgPSBlbGVtLnN0eWxlOwotCi0JCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgKCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG9yaWdOYW1lICkgKTsKLQotCQkvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uCi0JCS8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb24KLQkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07Ci0KLQkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCi0JCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKLQkJCXR5cGUgPSB0eXBlb2YgdmFsdWU7Ci0KLQkJCS8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQotCQkJaWYgKCB0eXBlID09PSAic3RyaW5nIiAmJiAocmV0ID0gcnJlbE51bS5leGVjKCB2YWx1ZSApKSApIHsKLQkJCQl2YWx1ZSA9ICggcmV0WzFdICsgMSApICogcmV0WzJdICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7Ci0JCQkJLy8gRml4ZXMgYnVnICM5MjM3Ci0JCQkJdHlwZSA9ICJudW1iZXIiOwotCQkJfQotCi0JCQkvLyBNYWtlIHN1cmUgdGhhdCBOYU4gYW5kIG51bGwgdmFsdWVzIGFyZW4ndCBzZXQuIFNlZTogIzcxMTYKLQkJCWlmICggdmFsdWUgPT0gbnVsbCB8fCB0eXBlID09PSAibnVtYmVyIiAmJiBpc05hTiggdmFsdWUgKSApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKQotCQkJaWYgKCB0eXBlID09PSAibnVtYmVyIiAmJiAhalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSApIHsKLQkJCQl2YWx1ZSArPSAicHgiOwotCQkJfQotCi0JCQkvLyBGaXhlcyAjODkwOCwgaXQgY2FuIGJlIGRvbmUgbW9yZSBjb3JyZWN0bHkgYnkgc3BlY2lmaW5nIHNldHRlcnMgaW4gY3NzSG9va3MsCi0JCQkvLyBidXQgaXQgd291bGQgbWVhbiB0byBkZWZpbmUgZWlnaHQgKGZvciBldmVyeSBwcm9ibGVtYXRpYyBwcm9wZXJ0eSkgaWRlbnRpY2FsIGZ1bmN0aW9ucwotCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSAiIiAmJiBuYW1lLmluZGV4T2YoImJhY2tncm91bmQiKSA9PT0gMCApIHsKLQkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwotCQkJfQotCi0JCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKLQkJCWlmICggIWhvb2tzIHx8ICEoInNldCIgaW4gaG9va3MpIHx8ICh2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7Ci0KLQkJCQkvLyBXcmFwcGVkIHRvIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBlcnJvcnMgd2hlbiAnaW52YWxpZCcgdmFsdWVzIGFyZSBwcm92aWRlZAotCQkJCS8vIEZpeGVzIGJ1ZyAjNTUwOQotCQkJCXRyeSB7Ci0JCQkJCXN0eWxlWyBuYW1lIF0gPSB2YWx1ZTsKLQkJCQl9IGNhdGNoKGUpIHt9Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQotCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSkgIT09IHVuZGVmaW5lZCApIHsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCi0JCQkvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdAotCQkJcmV0dXJuIHN0eWxlWyBuYW1lIF07Ci0JCX0KLQl9LAotCi0JY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKLQkJdmFyIG51bSwgdmFsLCBob29rcywKLQkJCW9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQotCQluYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTsKLQotCQkvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uCi0JCS8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb24KLQkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07Ci0KLQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKLQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKLQkJCXZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTsKLQkJfQotCi0JCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0Ci0JCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7Ci0JCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwotCQl9Ci0KLQkJLy9jb252ZXJ0ICJub3JtYWwiIHRvIGNvbXB1dGVkIHZhbHVlCi0JCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKLQkJCXZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdOwotCQl9Ci0KLQkJLy8gUmV0dXJuLCBjb252ZXJ0aW5nIHRvIG51bWJlciBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpYwotCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKLQkJCW51bSA9IHBhcnNlRmxvYXQoIHZhbCApOwotCQkJcmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7Ci0JCX0KLQkJcmV0dXJuIHZhbDsKLQl9Ci19KTsKLQotLy8gTk9URTogd2UndmUgaW5jbHVkZWQgdGhlICJ3aW5kb3ciIGluIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlCi0vLyBiZWNhdXNlIGpzZG9tIG9uIG5vZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0LgotaWYgKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKLQlnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHsKLQkJcmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7Ci0JfTsKLQotCWN1ckNTUyA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBfY29tcHV0ZWQgKSB7Ci0JCXZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLAotCQkJY29tcHV0ZWQgPSBfY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICksCi0KLQkJCS8vIGdldFByb3BlcnR5VmFsdWUgaXMgb25seSBuZWVkZWQgZm9yIC5jc3MoJ2ZpbHRlcicpIGluIElFOSwgc2VlICMxMjUzNwotCQkJcmV0ID0gY29tcHV0ZWQgPyBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZCwKLQkJCXN0eWxlID0gZWxlbS5zdHlsZTsKLQotCQlpZiAoIGNvbXB1dGVkICkgewotCi0JCQlpZiAoIHJldCA9PT0gIiIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7Ci0JCQkJcmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7Ci0JCQl9Ci0KLQkJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCi0JCQkvLyBDaHJvbWUgPCAxNyBhbmQgU2FmYXJpIDUuMCB1c2VzICJjb21wdXRlZCB2YWx1ZSIgaW5zdGVhZCBvZiAidXNlZCB2YWx1ZSIgZm9yIG1hcmdpbi1yaWdodAotCQkJLy8gU2FmYXJpIDUuMS43IChhdCBsZWFzdCkgcmV0dXJucyBwZXJjZW50YWdlIGZvciBhIGxhcmdlciBzZXQgb2YgdmFsdWVzLCBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzCi0JCQkvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKLQkJCWlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkgewotCi0JCQkJLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcwotCQkJCXdpZHRoID0gc3R5bGUud2lkdGg7Ci0JCQkJbWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDsKLQkJCQltYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoOwotCi0JCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAotCQkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKLQkJCQlyZXQgPSBjb21wdXRlZC53aWR0aDsKLQotCQkJCS8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXMKLQkJCQlzdHlsZS53aWR0aCA9IHdpZHRoOwotCQkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7Ci0JCQkJc3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfTsKLX0gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUgKSB7Ci0JZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCXJldHVybiBlbGVtLmN1cnJlbnRTdHlsZTsKLQl9OwotCi0JY3VyQ1NTID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIF9jb21wdXRlZCApIHsKLQkJdmFyIGxlZnQsIHJzLCByc0xlZnQsCi0JCQljb21wdXRlZCA9IF9jb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKSwKLQkJCXJldCA9IGNvbXB1dGVkID8gY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZCwKLQkJCXN0eWxlID0gZWxlbS5zdHlsZTsKLQotCQkvLyBBdm9pZCBzZXR0aW5nIHJldCB0byBlbXB0eSBzdHJpbmcgaGVyZQotCQkvLyBzbyB3ZSBkb24ndCBkZWZhdWx0IHRvIGF1dG8KLQkJaWYgKCByZXQgPT0gbnVsbCAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkgewotCQkJcmV0ID0gc3R5bGVbIG5hbWUgXTsKLQkJfQotCi0JCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKLQkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQotCi0JCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgotCQkvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHMKLQkJLy8gYnV0IG5vdCBwb3NpdGlvbiBjc3MgYXR0cmlidXRlcywgYXMgdGhvc2UgYXJlIHByb3BvcnRpb25hbCB0byB0aGUgcGFyZW50IGVsZW1lbnQgaW5zdGVhZAotCQkvLyBhbmQgd2UgY2FuJ3QgbWVhc3VyZSB0aGUgcGFyZW50IGluc3RlYWQgYmVjYXVzZSBpdCBtaWdodCB0cmlnZ2VyIGEgInN0YWNraW5nIGRvbGxzIiBwcm9ibGVtCi0JCWlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmICFycG9zaXRpb24udGVzdCggbmFtZSApICkgewotCi0JCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCi0JCQlsZWZ0ID0gc3R5bGUubGVmdDsKLQkJCXJzID0gZWxlbS5ydW50aW1lU3R5bGU7Ci0JCQlyc0xlZnQgPSBycyAmJiBycy5sZWZ0OwotCi0JCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0Ci0JCQlpZiAoIHJzTGVmdCApIHsKLQkJCQlycy5sZWZ0ID0gZWxlbS5jdXJyZW50U3R5bGUubGVmdDsKLQkJCX0KLQkJCXN0eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUiID8gIjFlbSIgOiByZXQ7Ci0JCQlyZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwotCi0JCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCi0JCQlzdHlsZS5sZWZ0ID0gbGVmdDsKLQkJCWlmICggcnNMZWZ0ICkgewotCQkJCXJzLmxlZnQgPSByc0xlZnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0ID09PSAiIiA/ICJhdXRvIiA6IHJldDsKLQl9OwotfQotCi1mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewotCXZhciBtYXRjaGVzID0gcm51bXNwbGl0LmV4ZWMoIHZhbHVlICk7Ci0JcmV0dXJuIG1hdGNoZXMgPwotCQkvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCAic3VidHJhY3QiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3MKLQkJTWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDIgXSB8fCAicHgiICkgOgotCQl2YWx1ZTsKLX0KLQotZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCwgc3R5bGVzICkgewotCXZhciBpID0gZXh0cmEgPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApID8KLQkJLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uCi0JCTQgOgotCQkvLyBPdGhlcndpc2UgaW5pdGlhbGl6ZSBmb3IgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBwcm9wZXJ0aWVzCi0JCW5hbWUgPT09ICJ3aWR0aCIgPyAxIDogMCwKLQotCQl2YWwgPSAwOwotCi0JZm9yICggOyBpIDwgNDsgaSArPSAyICkgewotCQkvLyBib3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0Ci0JCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewotCQkJdmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApOwotCQl9Ci0KLQkJaWYgKCBpc0JvcmRlckJveCApIHsKLQkJCS8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudAotCQkJaWYgKCBleHRyYSA9PT0gImNvbnRlbnQiICkgewotCQkJCXZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7Ci0JCQl9Ci0KLQkJCS8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyCi0JCQlpZiAoIGV4dHJhICE9PSAibWFyZ2luIiApIHsKLQkJCQl2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmcKLQkJCXZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7Ci0KLQkJCS8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXIKLQkJCWlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKLQkJCQl2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHZhbDsKLX0KLQotZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7Ci0KLQkvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZQotCXZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSwKLQkJdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKLQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCi0JCWlzQm9yZGVyQm94ID0galF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nICYmIGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IjsKLQotCS8vIHNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZAotCS8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NQotCS8vIE1hdGhNTCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ5MTY2OAotCWlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7Ci0JCS8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeQotCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwotCQlpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7Ci0JCQl2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07Ci0JCX0KLQotCQkvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLgotCQlpZiAoIHJudW1ub25weC50ZXN0KHZhbCkgKSB7Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0KLQkJLy8gd2UgbmVlZCB0aGUgY2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKLQkJLy8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZQotCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3ggJiYgKCBqUXVlcnkuc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSApOwotCi0JCS8vIE5vcm1hbGl6ZSAiIiwgYXV0bywgYW5kIHByZXBhcmUgZm9yIGV4dHJhCi0JCXZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7Ci0JfQotCi0JLy8gdXNlIHRoZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxldmFudCBzdHlsZXMKLQlyZXR1cm4gKCB2YWwgKwotCQlhdWdtZW50V2lkdGhPckhlaWdodCgKLQkJCWVsZW0sCi0JCQluYW1lLAotCQkJZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICksCi0JCQl2YWx1ZUlzQm9yZGVyQm94LAotCQkJc3R5bGVzCi0JCSkKLQkpICsgInB4IjsKLX0KLQotLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnQKLWZ1bmN0aW9uIGNzc19kZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7Ci0JdmFyIGRvYyA9IGRvY3VtZW50LAotCQlkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07Ci0KLQlpZiAoICFkaXNwbGF5ICkgewotCQlkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApOwotCi0JCS8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLCByZWFkIGZyb20gaW5zaWRlIGFuIGlmcmFtZQotCQlpZiAoIGRpc3BsYXkgPT09ICJub25lIiB8fCAhZGlzcGxheSApIHsKLQkJCS8vIFVzZSB0aGUgYWxyZWFkeS1jcmVhdGVkIGlmcmFtZSBpZiBwb3NzaWJsZQotCQkJaWZyYW1lID0gKCBpZnJhbWUgfHwKLQkJCQlqUXVlcnkoIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKQotCQkJCS5jc3MoICJjc3NUZXh0IiwgImRpc3BsYXk6YmxvY2sgIWltcG9ydGFudCIgKQotCQkJKS5hcHBlbmRUbyggZG9jLmRvY3VtZW50RWxlbWVudCApOwotCi0JCQkvLyBBbHdheXMgd3JpdGUgYSBuZXcgSFRNTCBza2VsZXRvbiBzbyBXZWJraXQgYW5kIEZpcmVmb3ggZG9uJ3QgY2hva2Ugb24gcmV1c2UKLQkJCWRvYyA9ICggaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lWzBdLmNvbnRlbnREb2N1bWVudCApLmRvY3VtZW50OwotCQkJZG9jLndyaXRlKCI8IWRvY3R5cGUgaHRtbD48aHRtbD48Ym9keT4iKTsKLQkJCWRvYy5jbG9zZSgpOwotCi0JCQlkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApOwotCQkJaWZyYW1lLmRldGFjaCgpOwotCQl9Ci0KLQkJLy8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5Ci0JCWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKLQl9Ci0KLQlyZXR1cm4gZGlzcGxheTsKLX0KLQotLy8gQ2FsbGVkIE9OTFkgZnJvbSB3aXRoaW4gY3NzX2RlZmF1bHREaXNwbGF5Ci1mdW5jdGlvbiBhY3R1YWxEaXNwbGF5KCBuYW1lLCBkb2MgKSB7Ci0JdmFyIGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9jLmJvZHkgKSwKLQkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW1bMF0sICJkaXNwbGF5IiApOwotCWVsZW0ucmVtb3ZlKCk7Ci0JcmV0dXJuIGRpc3BsYXk7Ci19Ci0KLWpRdWVyeS5lYWNoKFsgImhlaWdodCIsICJ3aWR0aCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Ci0JalF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7Ci0JCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKLQkJCWlmICggY29tcHV0ZWQgKSB7Ci0JCQkJLy8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtCi0JCQkJLy8gaG93ZXZlciwgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdCBmcm9tIHRoaXMKLQkJCQlyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCAmJiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgKSA/Ci0JCQkJCWpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKLQkJCQkJCXJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOwotCQkJCQl9KSA6Ci0JCQkJCWdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7Ci0JCQl9Ci0JCX0sCi0KLQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkgewotCQkJdmFyIHN0eWxlcyA9IGV4dHJhICYmIGdldFN0eWxlcyggZWxlbSApOwotCQkJcmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgPwotCQkJCWF1Z21lbnRXaWR0aE9ySGVpZ2h0KAotCQkJCQllbGVtLAotCQkJCQluYW1lLAotCQkJCQlleHRyYSwKLQkJCQkJalF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nICYmIGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKLQkJCQkJc3R5bGVzCi0JCQkJKSA6IDAKLQkJCSk7Ci0JCX0KLQl9OwotfSk7Ci0KLWlmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7Ci0JalF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7Ci0JCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewotCQkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5Ci0JCQlyZXR1cm4gcm9wYWNpdHkudGVzdCggKGNvbXB1dGVkICYmIGVsZW0uY3VycmVudFN0eWxlID8gZWxlbS5jdXJyZW50U3R5bGUuZmlsdGVyIDogZWxlbS5zdHlsZS5maWx0ZXIpIHx8ICIiICkgPwotCQkJCSggMC4wMSAqIHBhcnNlRmxvYXQoIFJlZ0V4cC4kMSApICkgKyAiIiA6Ci0JCQkJY29tcHV0ZWQgPyAiMSIgOiAiIjsKLQkJfSwKLQotCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKLQkJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUsCi0JCQkJY3VycmVudFN0eWxlID0gZWxlbS5jdXJyZW50U3R5bGUsCi0JCQkJb3BhY2l0eSA9IGpRdWVyeS5pc051bWVyaWMoIHZhbHVlICkgPyAiYWxwaGEob3BhY2l0eT0iICsgdmFsdWUgKiAxMDAgKyAiKSIgOiAiIiwKLQkJCQlmaWx0ZXIgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmZpbHRlciB8fCBzdHlsZS5maWx0ZXIgfHwgIiI7Ci0KLQkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAotCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAotCQkJc3R5bGUuem9vbSA9IDE7Ci0KLQkJCS8vIGlmIHNldHRpbmcgb3BhY2l0eSB0byAxLCBhbmQgbm8gb3RoZXIgZmlsdGVycyBleGlzdCAtIGF0dGVtcHQgdG8gcmVtb3ZlIGZpbHRlciBhdHRyaWJ1dGUgIzY2NTIKLQkJCS8vIGlmIHZhbHVlID09PSAiIiwgdGhlbiByZW1vdmUgaW5saW5lIG9wYWNpdHkgIzEyNjg1Ci0JCQlpZiAoICggdmFsdWUgPj0gMSB8fCB2YWx1ZSA9PT0gIiIgKSAmJgotCQkJCQlqUXVlcnkudHJpbSggZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgIiIgKSApID09PSAiIiAmJgotCQkJCQlzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgKSB7Ci0KLQkJCQkvLyBTZXR0aW5nIHN0eWxlLmZpbHRlciB0byBudWxsLCAiIiAmICIgIiBzdGlsbCBsZWF2ZSAiZmlsdGVyOiIgaW4gdGhlIGNzc1RleHQKLQkJCQkvLyBpZiAiZmlsdGVyOiIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzCi0JCQkJLy8gc3R5bGUucmVtb3ZlQXR0cmlidXRlIGlzIElFIE9ubHksIGJ1dCBzbyBhcHBhcmVudGx5IGlzIHRoaXMgY29kZSBwYXRoLi4uCi0JCQkJc3R5bGUucmVtb3ZlQXR0cmlidXRlKCAiZmlsdGVyIiApOwotCi0JCQkJLy8gaWYgdGhlcmUgaXMgbm8gZmlsdGVyIHN0eWxlIGFwcGxpZWQgaW4gYSBjc3MgcnVsZSBvciB1bnNldCBpbmxpbmUgb3BhY2l0eSwgd2UgYXJlIGRvbmUKLQkJCQlpZiAoIHZhbHVlID09PSAiIiB8fCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG90aGVyd2lzZSwgc2V0IG5ldyBmaWx0ZXIgdmFsdWVzCi0JCQlzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPwotCQkJCWZpbHRlci5yZXBsYWNlKCByYWxwaGEsIG9wYWNpdHkgKSA6Ci0JCQkJZmlsdGVyICsgIiAiICsgb3BhY2l0eTsKLQkJfQotCX07Ci19Ci0KLS8vIFRoZXNlIGhvb2tzIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0Ci0vLyBmb3IgaXQgaXMgbm90IHJ1biB1bnRpbCBhZnRlciBET00gcmVhZHkKLWpRdWVyeShmdW5jdGlvbigpIHsKLQlpZiAoICFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0ICkgewotCQlqUXVlcnkuY3NzSG9va3MubWFyZ2luUmlnaHQgPSB7Ci0JCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKLQkJCQlpZiAoIGNvbXB1dGVkICkgewotCQkJCQkvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKLQkJCQkJLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCi0JCQkJCXJldHVybiBqUXVlcnkuc3dhcCggZWxlbSwgeyAiZGlzcGxheSI6ICJpbmxpbmUtYmxvY2siIH0sCi0JCQkJCQljdXJDU1MsIFsgZWxlbSwgIm1hcmdpblJpZ2h0IiBdICk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NAotCS8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQKLQkvLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwgd2UganVzdCBjaGVjayBmb3IgaXQgaGVyZQotCWlmICggIWpRdWVyeS5zdXBwb3J0LnBpeGVsUG9zaXRpb24gJiYgalF1ZXJ5LmZuLnBvc2l0aW9uICkgewotCQlqUXVlcnkuZWFjaCggWyAidG9wIiwgImxlZnQiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkgewotCQkJalF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSB7Ci0JCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7Ci0JCQkJCWlmICggY29tcHV0ZWQgKSB7Ci0JCQkJCQljb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApOwotCQkJCQkJLy8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0Ci0JCQkJCQlyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgPwotCQkJCQkJCWpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArICJweCIgOgotCQkJCQkJCWNvbXB1dGVkOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfSk7Ci0JfQotCi19KTsKLQotaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewotCWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7Ci0JCS8vIFN1cHBvcnQ6IE9wZXJhIDw9IDEyLjEyCi0JCS8vIE9wZXJhIHJlcG9ydHMgb2Zmc2V0V2lkdGhzIGFuZCBvZmZzZXRIZWlnaHRzIGxlc3MgdGhhbiB6ZXJvIG9uIHNvbWUgZWxlbWVudHMKLQkJcmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPD0gMCAmJiBlbGVtLm9mZnNldEhlaWdodCA8PSAwIHx8Ci0JCQkoIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyAmJiAoKGVsZW0uc3R5bGUgJiYgZWxlbS5zdHlsZS5kaXNwbGF5KSB8fCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7Ci0JfTsKLQotCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewotCQlyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7Ci0JfTsKLX0KLQotLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllcwotalF1ZXJ5LmVhY2goewotCW1hcmdpbjogIiIsCi0JcGFkZGluZzogIiIsCi0JYm9yZGVyOiAiV2lkdGgiCi19LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7Ci0JalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKLQkJZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7Ci0JCQl2YXIgaSA9IDAsCi0JCQkJZXhwYW5kZWQgPSB7fSwKLQotCQkJCS8vIGFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZwotCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCIgIikgOiBbIHZhbHVlIF07Ci0KLQkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKLQkJCQlleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9Ci0JCQkJCXBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTsKLQkJCX0KLQotCQkJcmV0dXJuIGV4cGFuZGVkOwotCQl9Ci0JfTsKLQotCWlmICggIXJtYXJnaW4udGVzdCggcHJlZml4ICkgKSB7Ci0JCWpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7Ci0JfQotfSk7Ci12YXIgcjIwID0gLyUyMC9nLAotCXJicmFja2V0ID0gL1xbXF0kLywKLQlyQ1JMRiA9IC9ccj9cbi9nLAotCXJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSwKLQlyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7Ci0KLWpRdWVyeS5mbi5leHRlbmQoewotCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7Ci0JCXJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOwotCX0sCi0Jc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsKLQkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCi0JCQl2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgImVsZW1lbnRzIiApOwotCQkJcmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7Ci0JCX0pCi0JCS5maWx0ZXIoZnVuY3Rpb24oKXsKLQkJCXZhciB0eXBlID0gdGhpcy50eXBlOwotCQkJLy8gVXNlIC5pcygiOmRpc2FibGVkIikgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKLQkJCXJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCAiOmRpc2FibGVkIiApICYmCi0JCQkJcnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJgotCQkJCSggdGhpcy5jaGVja2VkIHx8ICFtYW5pcHVsYXRpb25fcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7Ci0JCX0pCi0JCS5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKXsKLQkJCXZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTsKLQotCQkJcmV0dXJuIHZhbCA9PSBudWxsID8KLQkJCQludWxsIDoKLQkJCQlqUXVlcnkuaXNBcnJheSggdmFsICkgPwotCQkJCQlqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKXsKLQkJCQkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKLQkJCQkJfSkgOgotCQkJCQl7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKLQkJfSkuZ2V0KCk7Ci0JfQotfSk7Ci0KLS8vU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKLS8va2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCi1qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Ci0JdmFyIHByZWZpeCwKLQkJcyA9IFtdLAotCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKLQkJCS8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZQotCQkJdmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICk7Ci0JCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKLQkJfTsKLQotCS8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuCi0JaWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkgewotCQl0cmFkaXRpb25hbCA9IGpRdWVyeS5hamF4U2V0dGluZ3MgJiYgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKLQl9Ci0KLQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLgotCWlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7Ci0JCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwotCQlqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7Ci0JCQlhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApOwotCQl9KTsKLQotCX0gZWxzZSB7Ci0JCS8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlICJvbGQiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlcgotCQkvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS4KLQkJZm9yICggcHJlZml4IGluIGEgKSB7Ci0JCQlidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApOwotCQl9Ci0JfQotCi0JLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgotCXJldHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwgIisiICk7Ci19OwotCi1mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7Ci0JdmFyIG5hbWU7Ci0KLQlpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHsKLQkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCi0JCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewotCQkJaWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHsKLQkJCQkvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuCi0JCQkJYWRkKCBwcmVmaXgsIHYgKTsKLQotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC4KLQkJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOwotCQkJfQotCQl9KTsKLQotCX0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09ICJvYmplY3QiICkgewotCQkvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uCi0JCWZvciAoIG5hbWUgaW4gb2JqICkgewotCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KLQkJYWRkKCBwcmVmaXgsIG9iaiApOwotCX0KLX0KLWpRdWVyeS5lYWNoKCAoImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrICIgKwotCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSAiICsKLQkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIpLnNwbGl0KCIgIiksIGZ1bmN0aW9uKCBpLCBuYW1lICkgewotCi0JLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKLQlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHsKLQkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KLQkJCXRoaXMub24oIG5hbWUsIG51bGwsIGRhdGEsIGZuICkgOgotCQkJdGhpcy50cmlnZ2VyKCBuYW1lICk7Ci0JfTsKLX0pOwotCi1qUXVlcnkuZm4uZXh0ZW5kKHsKLQlob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7Ci0JCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwotCX0sCi0KLQliaW5kOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkgewotCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Ci0JfSwKLQl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7Ci0JCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Ci0JfSwKLQotCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKLQkJcmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTsKLQl9LAotCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewotCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCi0JCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gdGhpcy5vZmYoIHNlbGVjdG9yLCAiKioiICkgOiB0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8ICIqKiIsIGZuICk7Ci0JfQotfSk7Ci12YXIKLQkvLyBEb2N1bWVudCBsb2NhdGlvbgotCWFqYXhMb2NQYXJ0cywKLQlhamF4TG9jYXRpb24sCi0JYWpheF9ub25jZSA9IGpRdWVyeS5ub3coKSwKLQotCWFqYXhfcnF1ZXJ5ID0gL1w/LywKLQlyaGFzaCA9IC8jLiokLywKLQlydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCi0JcmhlYWRlcnMgPSAvXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL21nLCAvLyBJRSBsZWF2ZXMgYW4gXHIgY2hhcmFjdGVyIGF0IEVPTAotCS8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvbgotCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCi0Jcm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sCi0JcnByb3RvY29sID0gL15cL1wvLywKLQlydXJsID0gL14oW1x3ListXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLAotCi0JLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZAotCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCi0KLQkvKiBQcmVmaWx0ZXJzCi0JICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKLQkgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOgotCSAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnQKLQkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCi0JICogMykga2V5IGlzIHRoZSBkYXRhVHlwZQotCSAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCi0JICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCi0JICovCi0JcHJlZmlsdGVycyA9IHt9LAotCi0JLyogVHJhbnNwb3J0cyBiaW5kaW5ncwotCSAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKLQkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAotCSAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvICIqIiBpZiBuZWVkZWQKLQkgKi8KLQl0cmFuc3BvcnRzID0ge30sCi0KLQkvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KLQlhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCIqIik7Ci0KLS8vICM4MTM4LCBJRSBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nCi0vLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKLXRyeSB7Ci0JYWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZjsKLX0gY2F0Y2goIGUgKSB7Ci0JLy8gVXNlIHRoZSBocmVmIGF0dHJpYnV0ZSBvZiBhbiBBIGVsZW1lbnQKLQkvLyBzaW5jZSBJRSB3aWxsIG1vZGlmeSBpdCBnaXZlbiBkb2N1bWVudC5sb2NhdGlvbgotCWFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwotCWFqYXhMb2NhdGlvbi5ocmVmID0gIiI7Ci0JYWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7Ci19Ci0KLS8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBwYXJ0cwotYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOwotCi0vLyBCYXNlICJjb25zdHJ1Y3RvciIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydAotZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7Ci0KLQkvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgotCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewotCi0JCWlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gInN0cmluZyIgKSB7Ci0JCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwotCQkJZGF0YVR5cGVFeHByZXNzaW9uID0gIioiOwotCQl9Ci0KLQkJdmFyIGRhdGFUeXBlLAotCQkJaSA9IDAsCi0JCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggY29yZV9ybm90d2hpdGUgKSB8fCBbXTsKLQotCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7Ci0JCQkvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uCi0JCQl3aGlsZSAoIChkYXRhVHlwZSA9IGRhdGFUeXBlc1tpKytdKSApIHsKLQkJCQkvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZAotCQkJCWlmICggZGF0YVR5cGVbMF0gPT09ICIrIiApIHsKLQkJCQkJZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8ICIqIjsKLQkJCQkJKHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSkudW5zaGlmdCggZnVuYyApOwotCi0JCQkJLy8gT3RoZXJ3aXNlIGFwcGVuZAotCQkJCX0gZWxzZSB7Ci0JCQkJCShzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnB1c2goIGZ1bmMgKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotfQotCi0vLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKLWZ1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKSB7Ci0KLQl2YXIgaW5zcGVjdGVkID0ge30sCi0JCXNlZWtpbmdUcmFuc3BvcnQgPSAoIHN0cnVjdHVyZSA9PT0gdHJhbnNwb3J0cyApOwotCi0JZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7Ci0JCXZhciBzZWxlY3RlZDsKLQkJaW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTsKLQkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKLQkJCXZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7Ci0JCQlpZiggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09ICJzdHJpbmciICYmICFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKLQkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7Ci0JCQkJaW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7Ci0JCQkJcmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLQotCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Ci19Ci0KLS8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwotLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCi0vLyBGaXhlcyAjOTg4NwotZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Ci0JdmFyIGRlZXAsIGtleSwKLQkJZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9OwotCi0JZm9yICgga2V5IGluIHNyYyApIHsKLQkJaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7Ci0JCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoZGVlcCA9IHt9KSApIClbIGtleSBdID0gc3JjWyBrZXkgXTsKLQkJfQotCX0KLQlpZiAoIGRlZXAgKSB7Ci0JCWpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOwotCX0KLQotCXJldHVybiB0YXJnZXQ7Ci19Ci0KLWpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKLQlpZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgewotCQlyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwotCX0KLQotCXZhciBzZWxlY3RvciwgcmVzcG9uc2UsIHR5cGUsCi0JCXNlbGYgPSB0aGlzLAotCQlvZmYgPSB1cmwuaW5kZXhPZigiICIpOwotCi0JaWYgKCBvZmYgPj0gMCApIHsKLQkJc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApOwotCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwotCX0KLQotCS8vIElmIGl0J3MgYSBmdW5jdGlvbgotCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgewotCi0JCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCi0JCWNhbGxiYWNrID0gcGFyYW1zOwotCQlwYXJhbXMgPSB1bmRlZmluZWQ7Ci0KLQkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCi0JfSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgewotCQl0eXBlID0gIlBPU1QiOwotCX0KLQotCS8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0Ci0JaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7Ci0JCWpRdWVyeS5hamF4KHsKLQkJCXVybDogdXJsLAotCi0JCQkvLyBpZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQKLQkJCXR5cGU6IHR5cGUsCi0JCQlkYXRhVHlwZTogImh0bWwiLAotCQkJZGF0YTogcGFyYW1zCi0JCX0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHsKLQotCQkJLy8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrCi0JCQlyZXNwb25zZSA9IGFyZ3VtZW50czsKLQotCQkJc2VsZi5odG1sKCBzZWxlY3RvciA/Ci0KLQkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKLQkJCQkvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnMKLQkJCQlqUXVlcnkoIjxkaXY+IikuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgotCi0JCQkJLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHQKLQkJCQlyZXNwb25zZVRleHQgKTsKLQotCQl9KS5jb21wbGV0ZSggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7Ci0JCQlzZWxmLmVhY2goIGNhbGxiYWNrLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7Ci0JCX0pOwotCX0KLQotCXJldHVybiB0aGlzOwotfTsKLQotLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKLWpRdWVyeS5lYWNoKCBbICJhamF4U3RhcnQiLCAiYWpheFN0b3AiLCAiYWpheENvbXBsZXRlIiwgImFqYXhFcnJvciIsICJhamF4U3VjY2VzcyIsICJhamF4U2VuZCIgXSwgZnVuY3Rpb24oIGksIHR5cGUgKXsKLQlqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApewotCQlyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTsKLQl9OwotfSk7Ci0KLWpRdWVyeS5leHRlbmQoewotCi0JLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCi0JYWN0aXZlOiAwLAotCi0JLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAotCWxhc3RNb2RpZmllZDoge30sCi0JZXRhZzoge30sCi0KLQlhamF4U2V0dGluZ3M6IHsKLQkJdXJsOiBhamF4TG9jYXRpb24sCi0JCXR5cGU6ICJHRVQiLAotCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAotCQlnbG9iYWw6IHRydWUsCi0JCXByb2Nlc3NEYXRhOiB0cnVlLAotCQlhc3luYzogdHJ1ZSwKLQkJY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLAotCQkvKgotCQl0aW1lb3V0OiAwLAotCQlkYXRhOiBudWxsLAotCQlkYXRhVHlwZTogbnVsbCwKLQkJdXNlcm5hbWU6IG51bGwsCi0JCXBhc3N3b3JkOiBudWxsLAotCQljYWNoZTogbnVsbCwKLQkJdGhyb3dzOiBmYWxzZSwKLQkJdHJhZGl0aW9uYWw6IGZhbHNlLAotCQloZWFkZXJzOiB7fSwKLQkJKi8KLQotCQlhY2NlcHRzOiB7Ci0JCQkiKiI6IGFsbFR5cGVzLAotCQkJdGV4dDogInRleHQvcGxhaW4iLAotCQkJaHRtbDogInRleHQvaHRtbCIsCi0JCQl4bWw6ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIiwKLQkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCi0JCX0sCi0KLQkJY29udGVudHM6IHsKLQkJCXhtbDogL3htbC8sCi0JCQlodG1sOiAvaHRtbC8sCi0JCQlqc29uOiAvanNvbi8KLQkJfSwKLQotCQlyZXNwb25zZUZpZWxkczogewotCQkJeG1sOiAicmVzcG9uc2VYTUwiLAotCQkJdGV4dDogInJlc3BvbnNlVGV4dCIsCi0JCQlqc29uOiAicmVzcG9uc2VKU09OIgotCQl9LAotCi0JCS8vIERhdGEgY29udmVydGVycwotCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQotCQljb252ZXJ0ZXJzOiB7Ci0KLQkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAotCQkJIiogdGV4dCI6IFN0cmluZywKLQotCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCi0JCQkidGV4dCBodG1sIjogdHJ1ZSwKLQotCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgotCQkJInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04sCi0KLQkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCi0JCQkidGV4dCB4bWwiOiBqUXVlcnkucGFyc2VYTUwKLQkJfSwKLQotCQkvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOgotCQkvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCi0JCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCi0JCS8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQotCQlmbGF0T3B0aW9uczogewotCQkJdXJsOiB0cnVlLAotCQkJY29udGV4dDogdHJ1ZQotCQl9Ci0JfSwKLQotCS8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0Ci0JLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgotCS8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCi0JYWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHsKLQkJcmV0dXJuIHNldHRpbmdzID8KLQotCQkJLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3QKLQkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKLQotCQkJLy8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5ncwotCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Ci0JfSwKLQotCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAotCWFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLAotCi0JLy8gTWFpbiBtZXRob2QKLQlhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkgewotCi0JCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCi0JCWlmICggdHlwZW9mIHVybCA9PT0gIm9iamVjdCIgKSB7Ci0JCQlvcHRpb25zID0gdXJsOwotCQkJdXJsID0gdW5kZWZpbmVkOwotCQl9Ci0KLQkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKLQkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0KLQkJdmFyIC8vIENyb3NzLWRvbWFpbiBkZXRlY3Rpb24gdmFycwotCQkJcGFydHMsCi0JCQkvLyBMb29wIHZhcmlhYmxlCi0JCQlpLAotCQkJLy8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbQotCQkJY2FjaGVVUkwsCi0JCQkvLyBSZXNwb25zZSBoZWFkZXJzIGFzIHN0cmluZwotCQkJcmVzcG9uc2VIZWFkZXJzU3RyaW5nLAotCQkJLy8gdGltZW91dCBoYW5kbGUKLQkJCXRpbWVvdXRUaW1lciwKLQotCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCi0JCQlmaXJlR2xvYmFscywKLQotCQkJdHJhbnNwb3J0LAotCQkJLy8gUmVzcG9uc2UgaGVhZGVycwotCQkJcmVzcG9uc2VIZWFkZXJzLAotCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAotCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCi0JCQkvLyBDYWxsYmFja3MgY29udGV4dAotCQkJY2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsCi0JCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uCi0JCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYgKCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID8KLQkJCQlqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDoKLQkJCQlqUXVlcnkuZXZlbnQsCi0JCQkvLyBEZWZlcnJlZHMKLQkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCi0JCQljb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwKLQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCi0JCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAotCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKLQkJCXJlcXVlc3RIZWFkZXJzID0ge30sCi0JCQlyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sCi0JCQkvLyBUaGUganFYSFIgc3RhdGUKLQkJCXN0YXRlID0gMCwKLQkJCS8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZQotCQkJc3RyQWJvcnQgPSAiY2FuY2VsZWQiLAotCQkJLy8gRmFrZSB4aHIKLQkJCWpxWEhSID0gewotCQkJCXJlYWR5U3RhdGU6IDAsCi0KLQkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCi0JCQkJZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7Ci0JCQkJCXZhciBtYXRjaDsKLQkJCQkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKLQkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKLQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB7fTsKLQkJCQkJCQl3aGlsZSAoIChtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApKSApIHsKLQkJCQkJCQkJcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOwotCQkJCQl9Ci0JCQkJCXJldHVybiBtYXRjaCA9PSBudWxsID8gbnVsbCA6IG1hdGNoOwotCQkJCX0sCi0KLQkJCQkvLyBSYXcgc3RyaW5nCi0JCQkJZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsKLQkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKLQkJCQl9LAotCi0JCQkJLy8gQ2FjaGVzIHRoZSBoZWFkZXIKLQkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7Ci0JCQkJCXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQkJaWYgKCAhc3RhdGUgKSB7Ci0JCQkJCQluYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gfHwgbmFtZTsKLQkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdGhpczsKLQkJCQl9LAotCi0JCQkJLy8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXIKLQkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKLQkJCQkJaWYgKCAhc3RhdGUgKSB7Ci0JCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdGhpczsKLQkJCQl9LAotCi0JCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKLQkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewotCQkJCQl2YXIgY29kZTsKLQkJCQkJaWYgKCBtYXAgKSB7Ci0JCQkJCQlpZiAoIHN0YXRlIDwgMiApIHsKLQkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKLQkJCQkJCQkJLy8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lcwotCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcwotCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0aGlzOwotCQkJCX0sCi0KLQkJCQkvLyBDYW5jZWwgdGhlIHJlcXVlc3QKLQkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7Ci0JCQkJCXZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0OwotCQkJCQlpZiAoIHRyYW5zcG9ydCApIHsKLQkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7Ci0JCQkJCX0KLQkJCQkJZG9uZSggMCwgZmluYWxUZXh0ICk7Ci0JCQkJCXJldHVybiB0aGlzOwotCQkJCX0KLQkJCX07Ci0KLQkJLy8gQXR0YWNoIGRlZmVycmVkcwotCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApLmNvbXBsZXRlID0gY29tcGxldGVEZWZlcnJlZC5hZGQ7Ci0JCWpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lOwotCQlqcVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7Ci0KLQkJLy8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pCi0JCS8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90b2NvbC1sZXNzIHVybHMpCi0JCS8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpCi0JCS8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZQotCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgYWpheExvY2F0aW9uICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7Ci0KLQkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0Ci0JCXMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7Ci0KLQkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAotCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIGNvcmVfcm5vdHdoaXRlICkgfHwgWyIiXTsKLQotCQkvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2ZSBhIHByb3RvY29sOmhvc3Q6cG9ydCBtaXNtYXRjaAotCQlpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHsKLQkJCXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7Ci0JCQlzLmNyb3NzRG9tYWluID0gISEoIHBhcnRzICYmCi0JCQkJKCBwYXJ0c1sgMSBdICE9PSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9PSBhamF4TG9jUGFydHNbIDIgXSB8fAotCQkJCQkoIHBhcnRzWyAzIF0gfHwgKCBwYXJ0c1sgMSBdID09PSAiaHR0cDoiID8gIjgwIiA6ICI0NDMiICkgKSAhPT0KLQkJCQkJCSggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gImh0dHA6IiA/ICI4MCIgOiAiNDQzIiApICkgKQotCQkJKTsKLQkJfQotCi0JCS8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZwotCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewotCQkJcy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKLQkJfQotCi0JCS8vIEFwcGx5IHByZWZpbHRlcnMKLQkJaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7Ci0KLQkJLy8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmUKLQkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKLQkJCXJldHVybiBqcVhIUjsKLQkJfQotCi0JCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCi0JCWZpcmVHbG9iYWxzID0gcy5nbG9iYWw7Ci0KLQkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0cwotCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKLQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTsKLQkJfQotCi0JCS8vIFVwcGVyY2FzZSB0aGUgdHlwZQotCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKLQotCQkvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudAotCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKLQotCQkvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2UKLQkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCi0JCWNhY2hlVVJMID0gcy51cmw7Ci0KLQkJLy8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnQKLQkJaWYgKCAhcy5oYXNDb250ZW50ICkgewotCi0JCQkvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsCi0JCQlpZiAoIHMuZGF0YSApIHsKLQkJCQljYWNoZVVSTCA9ICggcy51cmwgKz0gKCBhamF4X3JxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gIiYiIDogIj8iICkgKyBzLmRhdGEgKTsKLQkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5Ci0JCQkJZGVsZXRlIHMuZGF0YTsKLQkJCX0KLQotCQkJLy8gQWRkIGFudGktY2FjaGUgaW4gdXJsIGlmIG5lZWRlZAotCQkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHsKLQkJCQlzLnVybCA9IHJ0cy50ZXN0KCBjYWNoZVVSTCApID8KLQotCQkJCQkvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgJ18nIHBhcmFtZXRlciwgc2V0IGl0cyB2YWx1ZQotCQkJCQljYWNoZVVSTC5yZXBsYWNlKCBydHMsICIkMV89IiArIGFqYXhfbm9uY2UrKyApIDoKLQotCQkJCQkvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0aGUgZW5kCi0JCQkJCWNhY2hlVVJMICsgKCBhamF4X3JxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgYWpheF9ub25jZSsrOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KLQkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7Ci0JCQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7Ci0JCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU1vZGlmaWVkLVNpbmNlIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApOwotCQkJfQotCQkJaWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHsKLQkJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiSWYtTm9uZS1NYXRjaCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKLQkJaWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7Ci0JCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiQ29udGVudC1UeXBlIiwgcy5jb250ZW50VHlwZSApOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQotCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAotCQkJIkFjY2VwdCIsCi0JCQlzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSA/Ci0JCQkJcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdICsgKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6Ci0JCQkJcy5hY2NlcHRzWyAiKiIgXQotCQkpOwotCi0JCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvbgotCQlmb3IgKCBpIGluIHMuaGVhZGVycyApIHsKLQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7Ci0JCX0KLQotCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0Ci0JCWlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKLQkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgotCQkJcmV0dXJuIGpxWEhSLmFib3J0KCk7Ci0JCX0KLQotCQkvLyBhYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb24KLQkJc3RyQWJvcnQgPSAiYWJvcnQiOwotCi0JCS8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkcwotCQlmb3IgKCBpIGluIHsgc3VjY2VzczogMSwgZXJyb3I6IDEsIGNvbXBsZXRlOiAxIH0gKSB7Ci0JCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsKLQkJfQotCi0JCS8vIEdldCB0cmFuc3BvcnQKLQkJdHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7Ci0KLQkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0Ci0JCWlmICggIXRyYW5zcG9ydCApIHsKLQkJCWRvbmUoIC0xLCAiTm8gVHJhbnNwb3J0IiApOwotCQl9IGVsc2UgewotCQkJanFYSFIucmVhZHlTdGF0ZSA9IDE7Ci0KLQkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50Ci0JCQlpZiAoIGZpcmVHbG9iYWxzICkgewotCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0gKTsKLQkJCX0KLQkJCS8vIFRpbWVvdXQKLQkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewotCQkJCXRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7Ci0JCQkJCWpxWEhSLmFib3J0KCJ0aW1lb3V0Iik7Ci0JCQkJfSwgcy50aW1lb3V0ICk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJc3RhdGUgPSAxOwotCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOwotCQkJfSBjYXRjaCAoIGUgKSB7Ci0JCQkJLy8gUHJvcGFnYXRlIGV4Y2VwdGlvbiBhcyBlcnJvciBpZiBub3QgZG9uZQotCQkJCWlmICggc3RhdGUgPCAyICkgewotCQkJCQlkb25lKCAtMSwgZSApOwotCQkJCS8vIFNpbXBseSByZXRocm93IG90aGVyd2lzZQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lCi0JCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewotCQkJdmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCwKLQkJCQlzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDsKLQotCQkJLy8gQ2FsbGVkIG9uY2UKLQkJCWlmICggc3RhdGUgPT09IDIgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBTdGF0ZSBpcyAiZG9uZSIgbm93Ci0JCQlzdGF0ZSA9IDI7Ci0KLQkJCS8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCi0JCQlpZiAoIHRpbWVvdXRUaW1lciApIHsKLQkJCQljbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApOwotCQkJfQotCi0JCQkvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbgotCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKLQkJCXRyYW5zcG9ydCA9IHVuZGVmaW5lZDsKLQotCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwotCQkJcmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCAiIjsKLQotCQkJLy8gU2V0IHJlYWR5U3RhdGUKLQkJCWpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7Ci0KLQkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCi0JCQlpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDsKLQotCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKLQkJCWlmICggcmVzcG9uc2VzICkgewotCQkJCXJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApOwotCQkJfQotCi0JCQkvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpCi0JCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwotCi0JCQkvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZwotCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7Ci0KLQkJCQkvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgotCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewotCQkJCQltb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7Ci0JCQkJCWlmICggbW9kaWZpZWQgKSB7Ci0JCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7Ci0JCQkJCX0KLQkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpOwotCQkJCQlpZiAoIG1vZGlmaWVkICkgewotCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIG5vIGNvbnRlbnQKLQkJCQlpZiAoIHN0YXR1cyA9PT0gMjA0IHx8IHMudHlwZSA9PT0gIkhFQUQiICkgewotCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7Ci0KLQkJCQkvLyBpZiBub3QgbW9kaWZpZWQKLQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKLQkJCQkJc3RhdHVzVGV4dCA9ICJub3Rtb2RpZmllZCI7Ci0KLQkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKLQkJCQl9IGVsc2UgewotCQkJCQlzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7Ci0JCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwotCQkJCQllcnJvciA9IHJlc3BvbnNlLmVycm9yOwotCQkJCQlpc1N1Y2Nlc3MgPSAhZXJyb3I7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBXZSBleHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dAotCQkJCS8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cwotCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKLQkJCQlpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHsKLQkJCQkJc3RhdHVzVGV4dCA9ICJlcnJvciI7Ci0JCQkJCWlmICggc3RhdHVzIDwgMCApIHsKLQkJCQkJCXN0YXR1cyA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0Ci0JCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7Ci0JCQlqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArICIiOwotCi0JCQkvLyBTdWNjZXNzL0Vycm9yCi0JCQlpZiAoIGlzU3VjY2VzcyApIHsKLQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7Ci0JCQl9Ci0KLQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCi0JCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7Ci0JCQlzdGF0dXNDb2RlID0gdW5kZWZpbmVkOwotCi0JCQlpZiAoIGZpcmVHbG9iYWxzICkgewotCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyAiYWpheFN1Y2Nlc3MiIDogImFqYXhFcnJvciIsCi0JCQkJCVsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7Ci0JCQl9Ci0KLQkJCS8vIENvbXBsZXRlCi0JCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwotCi0JCQlpZiAoIGZpcmVHbG9iYWxzICkgewotCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7Ci0JCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCi0JCQkJaWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHsKLQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGpxWEhSOwotCX0sCi0KLQlnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKLQkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwotCX0sCi0KLQlnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewotCQlyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCAic2NyaXB0IiApOwotCX0KLX0pOwotCi1qUXVlcnkuZWFjaCggWyAiZ2V0IiwgInBvc3QiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7Ci0JalF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgewotCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZAotCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7Ci0JCQl0eXBlID0gdHlwZSB8fCBjYWxsYmFjazsKLQkJCWNhbGxiYWNrID0gZGF0YTsKLQkJCWRhdGEgPSB1bmRlZmluZWQ7Ci0JCX0KLQotCQlyZXR1cm4galF1ZXJ5LmFqYXgoewotCQkJdXJsOiB1cmwsCi0JCQl0eXBlOiBtZXRob2QsCi0JCQlkYXRhVHlwZTogdHlwZSwKLQkJCWRhdGE6IGRhdGEsCi0JCQlzdWNjZXNzOiBjYWxsYmFjawotCQl9KTsKLQl9OwotfSk7Ci0KLS8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDoKLSAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCi0gKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKLSAqLwotZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKLQl2YXIgZmlyc3REYXRhVHlwZSwgY3QsIGZpbmFsRGF0YVR5cGUsIHR5cGUsCi0JCWNvbnRlbnRzID0gcy5jb250ZW50cywKLQkJZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7Ci0KLQkvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2VzcwotCXdoaWxlKCBkYXRhVHlwZXNbIDAgXSA9PT0gIioiICkgewotCQlkYXRhVHlwZXMuc2hpZnQoKTsKLQkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewotCQkJY3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKTsKLQkJfQotCX0KLQotCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQotCWlmICggY3QgKSB7Ci0JCWZvciAoIHR5cGUgaW4gY29udGVudHMgKSB7Ci0JCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewotCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGUKLQlpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHsKLQkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwotCX0gZWxzZSB7Ci0JCS8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXMKLQkJZm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7Ci0JCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbMF0gXSApIHsKLQkJCQlmaW5hbERhdGFUeXBlID0gdHlwZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICggIWZpcnN0RGF0YVR5cGUgKSB7Ci0JCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7Ci0JCQl9Ci0JCX0KLQkJLy8gT3IganVzdCB1c2UgZmlyc3Qgb25lCi0JCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Ci0JfQotCi0JLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQotCS8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkCi0JLy8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQotCWlmICggZmluYWxEYXRhVHlwZSApIHsKLQkJaWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHsKLQkJCWRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNlc1sgZmluYWxEYXRhVHlwZSBdOwotCX0KLX0KLQotLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQotICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCi0gKi8KLWZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHsKLQl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKLQkJY29udmVydGVycyA9IHt9LAotCQkvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uCi0JCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7Ci0KLQkvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXMKLQlpZiAoIGRhdGFUeXBlc1sgMSBdICkgewotCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKLQkJCWNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07Ci0JCX0KLQl9Ci0KLQljdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7Ci0KLQkvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZQotCXdoaWxlICggY3VycmVudCApIHsKLQotCQlpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHsKLQkJCWpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlOwotCQl9Ci0KLQkJLy8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKLQkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewotCQkJcmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7Ci0JCX0KLQotCQlwcmV2ID0gY3VycmVudDsKLQkJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwotCi0JCWlmICggY3VycmVudCApIHsKLQotCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwotCQkJaWYgKCBjdXJyZW50ID09PSAiKiIgKSB7Ci0KLQkJCQljdXJyZW50ID0gcHJldjsKLQotCQkJLy8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudAotCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7Ci0KLQkJCQkvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlcgotCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07Ci0KLQkJCQkvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpcgotCQkJCWlmICggIWNvbnYgKSB7Ci0JCQkJCWZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7Ci0KLQkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAotCQkJCQkJdG1wID0gY29udjIuc3BsaXQoICIgIiApOwotCQkJCQkJaWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHsKLQotCQkJCQkJCS8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dAotCQkJCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgdG1wWyAwIF0gXSB8fAotCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKLQkJCQkJCQlpZiAoIGNvbnYgKSB7Ci0JCQkJCQkJCS8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnMKLQkJCQkJCQkJaWYgKCBjb252ID09PSB0cnVlICkgewotCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07Ci0KLQkJCQkJCQkJLy8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZQotCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewotCQkJCQkJCQkJY3VycmVudCA9IHRtcFsgMCBdOwotCQkJCQkJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpCi0JCQkJaWYgKCBjb252ICE9PSB0cnVlICkgewotCi0JCQkJCS8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW0KLQkJCQkJaWYgKCBjb252ICYmIHNbICJ0aHJvd3MiIF0gKSB7Ci0JCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKLQkJCQkJCX0gY2F0Y2ggKCBlICkgewotCQkJCQkJCXJldHVybiB7IHN0YXRlOiAicGFyc2VyZXJyb3IiLCBlcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudCB9OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHsgc3RhdGU6ICJzdWNjZXNzIiwgZGF0YTogcmVzcG9uc2UgfTsKLX0KLS8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlCi1qUXVlcnkuYWpheFNldHVwKHsKLQlhY2NlcHRzOiB7Ci0JCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IgotCX0sCi0JY29udGVudHM6IHsKLQkJc2NyaXB0OiAvKD86amF2YXxlY21hKXNjcmlwdC8KLQl9LAotCWNvbnZlcnRlcnM6IHsKLQkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7Ci0JCQlqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQl9Ci19KTsKLQotLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBnbG9iYWwKLWpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7Ci0JaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7Ci0JCXMuY2FjaGUgPSBmYWxzZTsKLQl9Ci0JaWYgKCBzLmNyb3NzRG9tYWluICkgewotCQlzLnR5cGUgPSAiR0VUIjsKLQkJcy5nbG9iYWwgPSBmYWxzZTsKLQl9Ci19KTsKLQotLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0Ci1qUXVlcnkuYWpheFRyYW5zcG9ydCggInNjcmlwdCIsIGZ1bmN0aW9uKHMpIHsKLQotCS8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHMKLQlpZiAoIHMuY3Jvc3NEb21haW4gKSB7Ci0KLQkJdmFyIHNjcmlwdCwKLQkJCWhlYWQgPSBkb2N1bWVudC5oZWFkIHx8IGpRdWVyeSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKLQotCQlyZXR1cm4gewotCi0JCQlzZW5kOiBmdW5jdGlvbiggXywgY2FsbGJhY2sgKSB7Ci0KLQkJCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKLQotCQkJCXNjcmlwdC5hc3luYyA9IHRydWU7Ci0KLQkJCQlpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKLQkJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7Ci0JCQkJfQotCi0JCQkJc2NyaXB0LnNyYyA9IHMudXJsOwotCi0JCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKLQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCBfLCBpc0Fib3J0ICkgewotCi0JCQkJCWlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHsKLQotCQkJCQkJLy8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFCi0JCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7Ci0KLQkJCQkJCS8vIFJlbW92ZSB0aGUgc2NyaXB0Ci0JCQkJCQlpZiAoIHNjcmlwdC5wYXJlbnROb2RlICkgewotCQkJCQkJCXNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdAotCQkJCQkJc2NyaXB0ID0gbnVsbDsKLQotCQkJCQkJLy8gQ2FsbGJhY2sgaWYgbm90IGFib3J0Ci0JCQkJCQlpZiAoICFpc0Fib3J0ICkgewotCQkJCQkJCWNhbGxiYWNrKCAyMDAsICJzdWNjZXNzIiApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8vIENpcmN1bXZlbnQgSUU2IGJ1Z3Mgd2l0aCBiYXNlIGVsZW1lbnRzICgjMjcwOSBhbmQgIzQzNzgpIGJ5IHByZXBlbmRpbmcKLQkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKLQkJCQloZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQgKTsKLQkJCX0sCi0KLQkJCWFib3J0OiBmdW5jdGlvbigpIHsKLQkJCQlpZiAoIHNjcmlwdCApIHsKLQkJCQkJc2NyaXB0Lm9ubG9hZCggdW5kZWZpbmVkLCB0cnVlICk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLX0pOwotdmFyIG9sZENhbGxiYWNrcyA9IFtdLAotCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87Ci0KLS8vIERlZmF1bHQganNvbnAgc2V0dGluZ3MKLWpRdWVyeS5hamF4U2V0dXAoewotCWpzb25wOiAiY2FsbGJhY2siLAotCWpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgewotCQl2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArICJfIiArICggYWpheF9ub25jZSsrICkgKTsKLQkJdGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7Ci0JCXJldHVybiBjYWxsYmFjazsKLQl9Ci19KTsKLQotLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCi1qUXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7Ci0KLQl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCi0JCWpzb25Qcm9wID0gcy5qc29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/Ci0JCQkidXJsIiA6Ci0JCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJiAhKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikgJiYgcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgotCQkpOwotCi0JLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKLQlpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09ICJqc29ucCIgKSB7Ci0KLQkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAotCQljYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgPwotCQkJcy5qc29ucENhbGxiYWNrKCkgOgotCQkJcy5qc29ucENhbGxiYWNrOwotCi0JCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKLQkJaWYgKCBqc29uUHJvcCApIHsKLQkJCXNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgIiQxIiArIGNhbGxiYWNrTmFtZSApOwotCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKLQkJCXMudXJsICs9ICggYWpheF9ycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKLQkJfQotCi0JCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KLQkJcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7Ci0JCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKLQkJCQlqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArICIgd2FzIG5vdCBjYWxsZWQiICk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKLQkJfTsKLQotCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCi0JCXMuZGF0YVR5cGVzWyAwIF0gPSAianNvbiI7Ci0KLQkJLy8gSW5zdGFsbCBjYWxsYmFjawotCQlvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07Ci0JCXdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHsKLQkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwotCQl9OwotCi0JCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQotCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7Ci0JCQkvLyBSZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCi0JCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47Ci0KLQkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCi0JCQlpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgewotCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZAotCQkJCXMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjazsKLQotCQkJCS8vIHNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2UKLQkJCQlvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7Ci0JCQl9Ci0KLQkJCS8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQotCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHsKLQkJCQlvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApOwotCQkJfQotCi0JCQlyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkOwotCQl9KTsKLQotCQkvLyBEZWxlZ2F0ZSB0byBzY3JpcHQKLQkJcmV0dXJuICJzY3JpcHQiOwotCX0KLX0pOwotdmFyIHhockNhbGxiYWNrcywgeGhyU3VwcG9ydGVkLAotCXhocklkID0gMCwKLQkvLyAjNTI4MDogSW50ZXJuZXQgRXhwbG9yZXIgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGlmIHdlIGRvbid0IGFib3J0IG9uIHVubG9hZAotCXhock9uVW5sb2FkQWJvcnQgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCAmJiBmdW5jdGlvbigpIHsKLQkJLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKLQkJdmFyIGtleTsKLQkJZm9yICgga2V5IGluIHhockNhbGxiYWNrcyApIHsKLQkJCXhockNhbGxiYWNrc1sga2V5IF0oIHVuZGVmaW5lZCwgdHJ1ZSApOwotCQl9Ci0JfTsKLQotLy8gRnVuY3Rpb25zIHRvIGNyZWF0ZSB4aHJzCi1mdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHsKLQl0cnkgewotCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwotCX0gY2F0Y2goIGUgKSB7fQotfQotCi1mdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7Ci0JdHJ5IHsKLQkJcmV0dXJuIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsKLQl9IGNhdGNoKCBlICkge30KLX0KLQotLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAotLy8gKFRoaXMgaXMgc3RpbGwgYXR0YWNoZWQgdG8gYWpheFNldHRpbmdzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KQotalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/Ci0JLyogTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQotCSAqIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3IChjYW4ndCByZXF1ZXN0IGxvY2FsIGZpbGVzKSwKLQkgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKLQkgKiBBZGRpdGlvbmFsbHkgWE1MSHR0cFJlcXVlc3QgY2FuIGJlIGRpc2FibGVkIGluIElFNy9JRTggc28KLQkgKiB3ZSBuZWVkIGEgZmFsbGJhY2suCi0JICovCi0JZnVuY3Rpb24oKSB7Ci0JCXJldHVybiAhdGhpcy5pc0xvY2FsICYmIGNyZWF0ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCk7Ci0JfSA6Ci0JLy8gRm9yIGFsbCBvdGhlciBicm93c2VycywgdXNlIHRoZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBvYmplY3QKLQljcmVhdGVTdGFuZGFyZFhIUjsKLQotLy8gRGV0ZXJtaW5lIHN1cHBvcnQgcHJvcGVydGllcwoteGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTsKLWpRdWVyeS5zdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwoteGhyU3VwcG9ydGVkID0galF1ZXJ5LnN1cHBvcnQuYWpheCA9ICEheGhyU3VwcG9ydGVkOwotCi0vLyBDcmVhdGUgdHJhbnNwb3J0IGlmIHRoZSBicm93c2VyIGNhbiBwcm92aWRlIGFuIHhocgotaWYgKCB4aHJTdXBwb3J0ZWQgKSB7Ci0KLQlqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggcyApIHsKLQkJLy8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdAotCQlpZiAoICFzLmNyb3NzRG9tYWluIHx8IGpRdWVyeS5zdXBwb3J0LmNvcnMgKSB7Ci0KLQkJCXZhciBjYWxsYmFjazsKLQotCQkJcmV0dXJuIHsKLQkJCQlzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7Ci0KLQkJCQkJLy8gR2V0IGEgbmV3IHhocgotCQkJCQl2YXIgaGFuZGxlLCBpLAotCQkJCQkJeGhyID0gcy54aHIoKTsKLQotCQkJCQkvLyBPcGVuIHRoZSBzb2NrZXQKLQkJCQkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCi0JCQkJCWlmICggcy51c2VybmFtZSApIHsKLQkJCQkJCXhoci5vcGVuKCBzLnR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkICk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOwotCQkJCQl9Ci0KLQkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAotCQkJCQlpZiAoIHMueGhyRmllbGRzICkgewotCQkJCQkJZm9yICggaSBpbiBzLnhockZpZWxkcyApIHsKLQkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkCi0JCQkJCWlmICggcy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKLQkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7Ci0JCQkJCX0KLQotCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgotCQkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCi0JCQkJCS8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuCi0JCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQotCQkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KLQkJCQkJaWYgKCAhcy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdICkgewotCQkJCQkJaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdID0gIlhNTEh0dHBSZXF1ZXN0IjsKLQkJCQkJfQotCi0JCQkJCS8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZveCAzCi0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKCBpIGluIGhlYWRlcnMgKSB7Ci0JCQkJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoKCBlcnIgKSB7fQotCi0JCQkJCS8vIERvIHNlbmQgdGhlIHJlcXVlc3QKLQkJCQkJLy8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5Ci0JCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQotCQkJCQl4aHIuc2VuZCggKCBzLmhhc0NvbnRlbnQgJiYgcy5kYXRhICkgfHwgbnVsbCApOwotCi0JCQkJCS8vIExpc3RlbmVyCi0JCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7Ci0JCQkJCQl2YXIgc3RhdHVzLCByZXNwb25zZUhlYWRlcnMsIHN0YXR1c1RleHQsIHJlc3BvbnNlczsKLQotCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzCi0JCQkJCQkvLyBvZiBhbiB4aHIgd2hlbiBhIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQKLQkJCQkJCS8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSkKLQkJCQkJCXRyeSB7Ci0KLQkJCQkJCQkvLyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlCi0JCQkJCQkJaWYgKCBjYWxsYmFjayAmJiAoIGlzQWJvcnQgfHwgeGhyLnJlYWR5U3RhdGUgPT09IDQgKSApIHsKLQotCQkJCQkJCQkvLyBPbmx5IGNhbGxlZCBvbmNlCi0JCQkJCQkJCWNhbGxiYWNrID0gdW5kZWZpbmVkOwotCi0JCQkJCQkJCS8vIERvIG5vdCBrZWVwIGFzIGFjdGl2ZSBhbnltb3JlCi0JCQkJCQkJCWlmICggaGFuZGxlICkgewotCQkJCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGpRdWVyeS5ub29wOwotCQkJCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewotCQkJCQkJCQkJCWRlbGV0ZSB4aHJDYWxsYmFja3NbIGhhbmRsZSBdOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJLy8gSWYgaXQncyBhbiBhYm9ydAotCQkJCQkJCQlpZiAoIGlzQWJvcnQgKSB7Ci0JCQkJCQkJCQkvLyBBYm9ydCBpdCBtYW51YWxseSBpZiBuZWVkZWQKLQkJCQkJCQkJCWlmICggeGhyLnJlYWR5U3RhdGUgIT09IDQgKSB7Ci0JCQkJCQkJCQkJeGhyLmFib3J0KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlyZXNwb25zZXMgPSB7fTsKLQkJCQkJCQkJCXN0YXR1cyA9IHhoci5zdGF0dXM7Ci0JCQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7Ci0KLQkJCQkJCQkJCS8vIFdoZW4gcmVxdWVzdGluZyBiaW5hcnkgZGF0YSwgSUU2LTkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24KLQkJCQkJCQkJCS8vIG9uIGFueSBhdHRlbXB0IHRvIGFjY2VzcyByZXNwb25zZVRleHQgKCMxMTQyNikKLQkJCQkJCQkJCWlmICggdHlwZW9mIHhoci5yZXNwb25zZVRleHQgPT09ICJzdHJpbmciICkgewotCQkJCQkJCQkJCXJlc3BvbnNlcy50ZXh0ID0geGhyLnJlc3BvbnNlVGV4dDsKLQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gYWNjZXNzaW5nCi0JCQkJCQkJCQkvLyBzdGF0dXNUZXh0IGZvciBmYXVsdHkgY3Jvc3MtZG9tYWluIHJlcXVlc3RzCi0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCXN0YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dDsKLQkJCQkJCQkJCX0gY2F0Y2goIGUgKSB7Ci0JCQkJCQkJCQkJLy8gV2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNUZXh0Ci0JCQkJCQkJCQkJc3RhdHVzVGV4dCA9ICIiOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkvLyBGaWx0ZXIgc3RhdHVzIGZvciBub24gc3RhbmRhcmQgYmVoYXZpb3JzCi0KLQkJCQkJCQkJCS8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MKLQkJCQkJCQkJCS8vIChzdWNjZXNzIHdpdGggbm8gZGF0YSB3b24ndCBnZXQgbm90aWZpZWQsIHRoYXQncyB0aGUgYmVzdCB3ZQotCQkJCQkJCQkJLy8gY2FuIGRvIGdpdmVuIGN1cnJlbnQgaW1wbGVtZW50YXRpb25zKQotCQkJCQkJCQkJaWYgKCAhc3RhdHVzICYmIHMuaXNMb2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsKLQkJCQkJCQkJCQlzdGF0dXMgPSByZXNwb25zZXMudGV4dCA/IDIwMCA6IDQwNDsKLQkJCQkJCQkJCS8vIElFIC0gIzE0NTA6IHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7Ci0JCQkJCQkJCQkJc3RhdHVzID0gMjA0OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCggZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApIHsKLQkJCQkJCQlpZiAoICFpc0Fib3J0ICkgewotCQkJCQkJCQljb21wbGV0ZSggLTEsIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIENhbGwgY29tcGxldGUgaWYgbmVlZGVkCi0JCQkJCQlpZiAoIHJlc3BvbnNlcyApIHsKLQkJCQkJCQljb21wbGV0ZSggc3RhdHVzLCBzdGF0dXNUZXh0LCByZXNwb25zZXMsIHJlc3BvbnNlSGVhZGVycyApOwotCQkJCQkJfQotCQkJCQl9OwotCi0JCQkJCWlmICggIXMuYXN5bmMgKSB7Ci0JCQkJCQkvLyBpZiB3ZSdyZSBpbiBzeW5jIG1vZGUgd2UgZmlyZSB0aGUgY2FsbGJhY2sKLQkJCQkJCWNhbGxiYWNrKCk7Ci0JCQkJCX0gZWxzZSBpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkgewotCQkJCQkJLy8gKElFNiAmIElFNykgaWYgaXQncyBpbiBjYWNoZSBhbmQgaGFzIGJlZW4KLQkJCQkJCS8vIHJldHJpZXZlZCBkaXJlY3RseSB3ZSBuZWVkIHRvIGZpcmUgdGhlIGNhbGxiYWNrCi0JCQkJCQlzZXRUaW1lb3V0KCBjYWxsYmFjayApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaGFuZGxlID0gKyt4aHJJZDsKLQkJCQkJCWlmICggeGhyT25VbmxvYWRBYm9ydCApIHsKLQkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZAotCQkJCQkJCS8vIGFuZCBhdHRhY2ggdGhlIHVubG9hZCBoYW5kbGVyCi0JCQkJCQkJaWYgKCAheGhyQ2FsbGJhY2tzICkgewotCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsKLQkJCQkJCQkJalF1ZXJ5KCB3aW5kb3cgKS51bmxvYWQoIHhock9uVW5sb2FkQWJvcnQgKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzCi0JCQkJCQkJeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXSA9IGNhbGxiYWNrOwotCQkJCQkJfQotCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOwotCQkJCQl9Ci0JCQkJfSwKLQotCQkJCWFib3J0OiBmdW5jdGlvbigpIHsKLQkJCQkJaWYgKCBjYWxsYmFjayApIHsKLQkJCQkJCWNhbGxiYWNrKCB1bmRlZmluZWQsIHRydWUgKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQl9KTsKLX0KLXZhciBmeE5vdywgdGltZXJJZCwKLQlyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLywKLQlyZnhudW0gPSBuZXcgUmVnRXhwKCAiXig/OihbKy1dKT18KSgiICsgY29yZV9wbnVtICsgIikoW2EteiVdKikkIiwgImkiICksCi0JcnJ1biA9IC9xdWV1ZUhvb2tzJC8sCi0JYW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZpbHRlciBdLAotCXR3ZWVuZXJzID0gewotCQkiKiI6IFtmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7Ci0JCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApLAotCQkJCXRhcmdldCA9IHR3ZWVuLmN1cigpLAotCQkJCXBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbHVlICksCi0JCQkJdW5pdCA9IHBhcnRzICYmIHBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKSwKLQotCQkJCS8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzCi0JCQkJc3RhcnQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICt0YXJnZXQgKSAmJgotCQkJCQlyZnhudW0uZXhlYyggalF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJvcCApICksCi0JCQkJc2NhbGUgPSAxLAotCQkJCW1heEl0ZXJhdGlvbnMgPSAyMDsKLQotCQkJaWYgKCBzdGFydCAmJiBzdGFydFsgMyBdICE9PSB1bml0ICkgewotCQkJCS8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3MKLQkJCQl1bml0ID0gdW5pdCB8fCBzdGFydFsgMyBdOwotCi0JCQkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgotCQkJCXBhcnRzID0gcGFydHMgfHwgW107Ci0KLQkJCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAotCQkJCXN0YXJ0ID0gK3RhcmdldCB8fCAxOwotCi0JCQkJZG8gewotCQkJCQkvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKgotCQkJCQkvLyBVc2UgYSBzdHJpbmcgZm9yIGRvdWJsaW5nIGZhY3RvciBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvdwotCQkJCQlzY2FsZSA9IHNjYWxlIHx8ICIuNSI7Ci0KLQkJCQkJLy8gQWRqdXN0IGFuZCBhcHBseQotCQkJCQlzdGFydCA9IHN0YXJ0IC8gc2NhbGU7Ci0JCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgcHJvcCwgc3RhcnQgKyB1bml0ICk7Ci0KLQkJCQkvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKQotCQkJCS8vIEFuZCBicmVha2luZyB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoCi0JCQkJfSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIoKSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7Ci0JCQl9Ci0KLQkJCS8vIFVwZGF0ZSB0d2VlbiBwcm9wZXJ0aWVzCi0JCQlpZiAoIHBhcnRzICkgewotCQkJCXN0YXJ0ID0gdHdlZW4uc3RhcnQgPSArc3RhcnQgfHwgK3RhcmdldCB8fCAwOwotCQkJCXR3ZWVuLnVuaXQgPSB1bml0OwotCQkJCS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgotCQkJCXR3ZWVuLmVuZCA9IHBhcnRzWyAxIF0gPwotCQkJCQlzdGFydCArICggcGFydHNbIDEgXSArIDEgKSAqIHBhcnRzWyAyIF0gOgotCQkJCQkrcGFydHNbIDIgXTsKLQkJCX0KLQotCQkJcmV0dXJuIHR3ZWVuOwotCQl9XQotCX07Ci0KLS8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKLWZ1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkgewotCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7Ci0JCWZ4Tm93ID0gdW5kZWZpbmVkOwotCX0pOwotCXJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7Ci19Ci0KLWZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkgewotCXZhciB0d2VlbiwKLQkJY29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdlZW5lcnNbICIqIiBdICksCi0JCWluZGV4ID0gMCwKLQkJbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7Ci0JZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKLQkJaWYgKCAodHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSkgKSB7Ci0KLQkJCS8vIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5Ci0JCQlyZXR1cm4gdHdlZW47Ci0JCX0KLQl9Ci19Ci0KLWZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKLQl2YXIgcmVzdWx0LAotCQlzdG9wcGVkLAotCQlpbmRleCA9IDAsCi0JCWxlbmd0aCA9IGFuaW1hdGlvblByZWZpbHRlcnMubGVuZ3RoLAotCQlkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7Ci0JCQkvLyBkb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3IKLQkJCWRlbGV0ZSB0aWNrLmVsZW07Ci0JCX0pLAotCQl0aWNrID0gZnVuY3Rpb24oKSB7Ci0JCQlpZiAoIHN0b3BwZWQgKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJdmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKLQkJCQlyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksCi0JCQkJLy8gYXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIDEgLSAoIDAuNSB8fCAwICkgKCMxMjQ5NykKLQkJCQl0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsCi0JCQkJcGVyY2VudCA9IDEgLSB0ZW1wLAotCQkJCWluZGV4ID0gMCwKLQkJCQlsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDsKLQotCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7Ci0JCQkJYW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTsKLQkJCX0KLQotCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdKTsKLQotCQkJaWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7Ci0JCQkJcmV0dXJuIHJlbWFpbmluZzsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0sCi0JCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoewotCQkJZWxlbTogZWxlbSwKLQkJCXByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLAotCQkJb3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksCi0JCQlvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsCi0JCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCi0JCQlzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCi0JCQlkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbiwKLQkJCXR3ZWVuczogW10sCi0JCQljcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHsKLQkJCQl2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsCi0JCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7Ci0JCQkJYW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApOwotCQkJCXJldHVybiB0d2VlbjsKLQkJCX0sCi0JCQlzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHsKLQkJCQl2YXIgaW5kZXggPSAwLAotCQkJCQkvLyBpZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnMKLQkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0Ci0JCQkJCWxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7Ci0JCQkJaWYgKCBzdG9wcGVkICkgewotCQkJCQlyZXR1cm4gdGhpczsKLQkJCQl9Ci0JCQkJc3RvcHBlZCA9IHRydWU7Ci0JCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7Ci0JCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7Ci0JCQkJfQotCi0JCQkJLy8gcmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZQotCQkJCS8vIG90aGVyd2lzZSwgcmVqZWN0Ci0JCQkJaWYgKCBnb3RvRW5kICkgewotCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXM7Ci0JCQl9Ci0JCX0pLAotCQlwcm9wcyA9IGFuaW1hdGlvbi5wcm9wczsKLQotCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7Ci0KLQlmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKLQkJcmVzdWx0ID0gYW5pbWF0aW9uUHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQlqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApOwotCi0JaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHsKLQkJYW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7Ci0JfQotCi0JalF1ZXJ5LmZ4LnRpbWVyKAotCQlqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7Ci0JCQllbGVtOiBlbGVtLAotCQkJYW5pbTogYW5pbWF0aW9uLAotCQkJcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlCi0JCX0pCi0JKTsKLQotCS8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCi0JcmV0dXJuIGFuaW1hdGlvbi5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKQotCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQotCQkuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApCi0JCS5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApOwotfQotCi1mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHsKLQl2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzOwotCi0JLy8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzCi0JZm9yICggaW5kZXggaW4gcHJvcHMgKSB7Ci0JCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApOwotCQllYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07Ci0JCXZhbHVlID0gcHJvcHNbIGluZGV4IF07Ci0JCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7Ci0JCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwotCQkJdmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07Ci0JCX0KLQotCQlpZiAoIGluZGV4ICE9PSBuYW1lICkgewotCQkJcHJvcHNbIG5hbWUgXSA9IHZhbHVlOwotCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwotCQl9Ci0KLQkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKLQkJaWYgKCBob29rcyAmJiAiZXhwYW5kIiBpbiBob29rcyApIHsKLQkJCXZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApOwotCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07Ci0KLQkJCS8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC4KLQkJCS8vIGFsc28gLSByZXVzaW5nICdpbmRleCcgZnJvbSBhYm92ZSBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCi0JCQlmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHsKLQkJCQlpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7Ci0JCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07Ci0JCQkJCXNwZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nOwotCQl9Ci0JfQotfQotCi1qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7Ci0KLQl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewotCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkgewotCQkJY2FsbGJhY2sgPSBwcm9wczsKLQkJCXByb3BzID0gWyAiKiIgXTsKLQkJfSBlbHNlIHsKLQkJCXByb3BzID0gcHJvcHMuc3BsaXQoIiAiKTsKLQkJfQotCi0JCXZhciBwcm9wLAotCQkJaW5kZXggPSAwLAotCQkJbGVuZ3RoID0gcHJvcHMubGVuZ3RoOwotCi0JCWZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgewotCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwotCQkJdHdlZW5lcnNbIHByb3AgXSA9IHR3ZWVuZXJzWyBwcm9wIF0gfHwgW107Ci0JCQl0d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7Ci0JCX0KLQl9LAotCi0JcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7Ci0JCWlmICggcHJlcGVuZCApIHsKLQkJCWFuaW1hdGlvblByZWZpbHRlcnMudW5zaGlmdCggY2FsbGJhY2sgKTsKLQkJfSBlbHNlIHsKLQkJCWFuaW1hdGlvblByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTsKLQkJfQotCX0KLX0pOwotCi1mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHsKLQkvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovCi0JdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwKLQkJYW5pbSA9IHRoaXMsCi0JCW9yaWcgPSB7fSwKLQkJc3R5bGUgPSBlbGVtLnN0eWxlLAotCQloaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICksCi0JCWRhdGFTaG93ID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCAiZnhzaG93IiApOwotCi0JLy8gaGFuZGxlIHF1ZXVlOiBmYWxzZSBwcm9taXNlcwotCWlmICggIW9wdHMucXVldWUgKSB7Ci0JCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7Ci0JCWlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHsKLQkJCWhvb2tzLnVucXVldWVkID0gMDsKLQkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwotCQkJaG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkgewotCQkJCWlmICggIWhvb2tzLnVucXVldWVkICkgewotCQkJCQlvbGRmaXJlKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlob29rcy51bnF1ZXVlZCsrOwotCi0JCWFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgewotCQkJLy8gZG9pbmcgdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGNvbXBsZXRlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQKLQkJCS8vIGJlZm9yZSB0aGlzIGNvbXBsZXRlcwotCQkJYW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7Ci0JCQkJaG9va3MudW5xdWV1ZWQtLTsKLQkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7Ci0JCQkJCWhvb2tzLmVtcHR5LmZpcmUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfSk7Ci0JfQotCi0JLy8gaGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3MKLQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCAiaGVpZ2h0IiBpbiBwcm9wcyB8fCAid2lkdGgiIGluIHByb3BzICkgKSB7Ci0JCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAotCQkvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90Ci0JCS8vIGNoYW5nZSB0aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAotCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQotCQlvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTsKLQotCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAotCQkvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkCi0JCWlmICggalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgPT09ICJpbmxpbmUiICYmCi0JCQkJalF1ZXJ5LmNzcyggZWxlbSwgImZsb2F0IiApID09PSAibm9uZSIgKSB7Ci0KLQkJCS8vIGlubGluZS1sZXZlbCBlbGVtZW50cyBhY2NlcHQgaW5saW5lLWJsb2NrOwotCQkJLy8gYmxvY2stbGV2ZWwgZWxlbWVudHMgbmVlZCB0byBiZSBpbmxpbmUgd2l0aCBsYXlvdXQKLQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgfHwgY3NzX2RlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgPT09ICJpbmxpbmUiICkgewotCQkJCXN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKLQotCQkJfSBlbHNlIHsKLQkJCQlzdHlsZS56b29tID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCWlmICggb3B0cy5vdmVyZmxvdyApIHsKLQkJc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKLQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyApIHsKLQkJCWFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkgewotCQkJCXN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdOwotCQkJCXN0eWxlLm92ZXJmbG93WCA9IG9wdHMub3ZlcmZsb3dbIDEgXTsKLQkJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07Ci0JCQl9KTsKLQkJfQotCX0KLQotCi0JLy8gc2hvdy9oaWRlIHBhc3MKLQlmb3IgKCBwcm9wIGluIHByb3BzICkgewotCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07Ci0JCWlmICggcmZ4dHlwZXMuZXhlYyggdmFsdWUgKSApIHsKLQkJCWRlbGV0ZSBwcm9wc1sgcHJvcCBdOwotCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKLQkJCWlmICggdmFsdWUgPT09ICggaGlkZGVuID8gImhpZGUiIDogInNob3ciICkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApOwotCQl9Ci0JfQotCi0JaWYgKCAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKLQkJaWYgKCBkYXRhU2hvdyApIHsKLQkJCWlmICggImhpZGRlbiIgaW4gZGF0YVNob3cgKSB7Ci0JCQkJaGlkZGVuID0gZGF0YVNob3cuaGlkZGVuOwotCQkJfQotCQl9IGVsc2UgewotCQkJZGF0YVNob3cgPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJmeHNob3ciLCB7fSApOwotCQl9Ci0KLQkJLy8gc3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2dsZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byAicmV2ZXJzZSIKLQkJaWYgKCB0b2dnbGUgKSB7Ci0JCQlkYXRhU2hvdy5oaWRkZW4gPSAhaGlkZGVuOwotCQl9Ci0JCWlmICggaGlkZGVuICkgewotCQkJalF1ZXJ5KCBlbGVtICkuc2hvdygpOwotCQl9IGVsc2UgewotCQkJYW5pbS5kb25lKGZ1bmN0aW9uKCkgewotCQkJCWpRdWVyeSggZWxlbSApLmhpZGUoKTsKLQkJCX0pOwotCQl9Ci0JCWFuaW0uZG9uZShmdW5jdGlvbigpIHsKLQkJCXZhciBwcm9wOwotCQkJalF1ZXJ5Ll9yZW1vdmVEYXRhKCBlbGVtLCAiZnhzaG93IiApOwotCQkJZm9yICggcHJvcCBpbiBvcmlnICkgewotCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7Ci0JCQl9Ci0JCX0pOwotCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7Ci0JCQl0d2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwgcHJvcCwgYW5pbSApOwotCi0JCQlpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHsKLQkJCQlkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7Ci0JCQkJaWYgKCBoaWRkZW4gKSB7Ci0JCQkJCXR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0OwotCQkJCQl0d2Vlbi5zdGFydCA9IHByb3AgPT09ICJ3aWR0aCIgfHwgcHJvcCA9PT0gImhlaWdodCIgPyAxIDogMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHsKLQlyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwotfQotalF1ZXJ5LlR3ZWVuID0gVHdlZW47Ci0KLVR3ZWVuLnByb3RvdHlwZSA9IHsKLQljb25zdHJ1Y3RvcjogVHdlZW4sCi0JaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewotCQl0aGlzLmVsZW0gPSBlbGVtOwotCQl0aGlzLnByb3AgPSBwcm9wOwotCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCAic3dpbmciOwotCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotCQl0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpOwotCQl0aGlzLmVuZCA9IGVuZDsKLQkJdGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApOwotCX0sCi0JY3VyOiBmdW5jdGlvbigpIHsKLQkJdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKLQotCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KLQkJCWhvb2tzLmdldCggdGhpcyApIDoKLQkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTsKLQl9LAotCXJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7Ci0JCXZhciBlYXNlZCwKLQkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKLQotCQlpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHsKLQkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAotCQkJCXBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvbgotCQkJKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50OwotCQl9Ci0JCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKLQotCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkgewotCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwotCQl9Ci0KLQkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7Ci0JCQlob29rcy5zZXQoIHRoaXMgKTsKLQkJfSBlbHNlIHsKLQkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci19OwotCi1Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7Ci0KLVR3ZWVuLnByb3BIb29rcyA9IHsKLQlfZGVmYXVsdDogewotCQlnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKLQkJCXZhciByZXN1bHQ7Ci0KLQkJCWlmICggdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYKLQkJCQkoIXR3ZWVuLmVsZW0uc3R5bGUgfHwgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwpICkgewotCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07Ci0JCQl9Ci0KLQkJCS8vIHBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQotCQkJLy8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscwotCQkJLy8gc28sIHNpbXBsZSB2YWx1ZXMgc3VjaCBhcyAiMTBweCIgYXJlIHBhcnNlZCB0byBGbG9hdC4KLQkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzIGlzLgotCQkJcmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgIiIgKTsKLQkJCS8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgImF1dG8iIGFyZSBjb252ZXJ0ZWQgdG8gMC4KLQkJCXJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gImF1dG8iID8gMCA6IHJlc3VsdDsKLQkJfSwKLQkJc2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7Ci0JCQkvLyB1c2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdCAtIHVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZSAtIHVzZSAuc3R5bGUgaWYgaXRzCi0JCQkvLyBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZQotCQkJaWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkgewotCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7Ci0JCQl9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLnN0eWxlICYmICggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8IGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7Ci0JCQkJalF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7Ci0JCQl9IGVsc2UgewotCQkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKLQkJCX0KLQkJfQotCX0KLX07Ci0KLS8vIFN1cHBvcnQ6IElFIDw9OQotLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzCi0KLVR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKLQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKLQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHsKLQkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKLQkJfQotCX0KLX07Ci0KLWpRdWVyeS5lYWNoKFsgInRvZ2dsZSIsICJzaG93IiwgImhpZGUiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewotCXZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdOwotCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewotCQlyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJib29sZWFuIiA/Ci0JCQljc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgotCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwotCX07Ci19KTsKLQotalF1ZXJ5LmZuLmV4dGVuZCh7Ci0JZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewotCi0JCS8vIHNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMAotCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCAib3BhY2l0eSIsIDAgKS5zaG93KCkKLQotCQkJLy8gYW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkCi0JCQkuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7Ci0JfSwKLQlhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7Ci0JCXZhciBlbXB0eSA9IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICksCi0JCQlvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksCi0JCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewotCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0Ci0JCQkJdmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApOwotCi0JCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5Ci0JCQkJaWYgKCBlbXB0eSB8fCBqUXVlcnkuX2RhdGEoIHRoaXMsICJmaW5pc2giICkgKSB7Ci0JCQkJCWFuaW0uc3RvcCggdHJ1ZSApOwotCQkJCX0KLQkJCX07Ci0JCQlkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjsKLQotCQlyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/Ci0JCQl0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOgotCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwotCX0sCi0Jc3RvcDogZnVuY3Rpb24oIHR5cGUsIGNsZWFyUXVldWUsIGdvdG9FbmQgKSB7Ci0JCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7Ci0JCQl2YXIgc3RvcCA9IGhvb2tzLnN0b3A7Ci0JCQlkZWxldGUgaG9va3Muc3RvcDsKLQkJCXN0b3AoIGdvdG9FbmQgKTsKLQkJfTsKLQotCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKLQkJCWdvdG9FbmQgPSBjbGVhclF1ZXVlOwotCQkJY2xlYXJRdWV1ZSA9IHR5cGU7Ci0JCQl0eXBlID0gdW5kZWZpbmVkOwotCQl9Ci0JCWlmICggY2xlYXJRdWV1ZSAmJiB0eXBlICE9PSBmYWxzZSApIHsKLQkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7Ci0JCQl2YXIgZGVxdWV1ZSA9IHRydWUsCi0JCQkJaW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArICJxdWV1ZUhvb2tzIiwKLQkJCQl0aW1lcnMgPSBqUXVlcnkudGltZXJzLAotCQkJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKTsKLQotCQkJaWYgKCBpbmRleCApIHsKLQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewotCQkJCQlzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoIGluZGV4IGluIGRhdGEgKSB7Ci0JCQkJCWlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkgewotCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7Ci0JCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiAodHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSkgKSB7Ci0JCQkJCXRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTsKLQkJCQkJZGVxdWV1ZSA9IGZhbHNlOwotCQkJCQl0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAotCQkJLy8gdGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaCB3aWxsIGRlcXVldWUKLQkJCS8vIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kCi0JCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7Ci0JCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKLQkJCX0KLQkJfSk7Ci0JfSwKLQlmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkgewotCQlpZiAoIHR5cGUgIT09IGZhbHNlICkgewotCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKLQkJfQotCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCQkJdmFyIGluZGV4LAotCQkJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKSwKLQkJCQlxdWV1ZSA9IGRhdGFbIHR5cGUgKyAicXVldWUiIF0sCi0JCQkJaG9va3MgPSBkYXRhWyB0eXBlICsgInF1ZXVlSG9va3MiIF0sCi0JCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKLQkJCQlsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7Ci0KLQkJCS8vIGVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKLQkJCWRhdGEuZmluaXNoID0gdHJ1ZTsKLQotCQkJLy8gZW1wdHkgdGhlIHF1ZXVlIGZpcnN0Ci0JCQlqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7Ci0KLQkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKLQkJCQlob29rcy5zdG9wLmNhbGwoIHRoaXMsIHRydWUgKTsKLQkJCX0KLQotCQkJLy8gbG9vayBmb3IgYW55IGFjdGl2ZSBhbmltYXRpb25zLCBhbmQgZmluaXNoIHRoZW0KLQkJCWZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7Ci0JCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7Ci0JCQkJCXRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIHRydWUgKTsKLQkJCQkJdGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGxvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCi0JCQlmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgewotCQkJCWlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkgewotCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdHVybiBvZmYgZmluaXNoaW5nIGZsYWcKLQkJCWRlbGV0ZSBkYXRhLmZpbmlzaDsKLQkJfSk7Ci0JfQotfSk7Ci0KLS8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCi1mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewotCXZhciB3aGljaCwKLQkJYXR0cnMgPSB7IGhlaWdodDogdHlwZSB9LAotCQlpID0gMDsKLQotCS8vIGlmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcywKLQkvLyBpZiB3ZSBkb24ndCBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0Ci0JaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoPyAxIDogMDsKLQlmb3IoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7Ci0JCXdoaWNoID0gY3NzRXhwYW5kWyBpIF07Ci0JCWF0dHJzWyAibWFyZ2luIiArIHdoaWNoIF0gPSBhdHRyc1sgInBhZGRpbmciICsgd2hpY2ggXSA9IHR5cGU7Ci0JfQotCi0JaWYgKCBpbmNsdWRlV2lkdGggKSB7Ci0JCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Ci0JfQotCi0JcmV0dXJuIGF0dHJzOwotfQotCi0vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zCi1qUXVlcnkuZWFjaCh7Ci0Jc2xpZGVEb3duOiBnZW5GeCgic2hvdyIpLAotCXNsaWRlVXA6IGdlbkZ4KCJoaWRlIiksCi0Jc2xpZGVUb2dnbGU6IGdlbkZ4KCJ0b2dnbGUiKSwKLQlmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCi0JZmFkZU91dDogeyBvcGFjaXR5OiAiaGlkZSIgfSwKLQlmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6ICJ0b2dnbGUiIH0KLX0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKLQlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKLQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7Ci0JfTsKLX0pOwotCi1qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Ci0JdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHsKLQkJY29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwKLQkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLAotCQlkdXJhdGlvbjogc3BlZWQsCi0JCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZwotCX07Ci0KLQlvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0aW9uIDoKLQkJb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7Ci0KLQkvLyBub3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCi0JaWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7Ci0JCW9wdC5xdWV1ZSA9ICJmeCI7Ci0JfQotCi0JLy8gUXVldWVpbmcKLQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwotCi0Jb3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7Ci0JCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHsKLQkJCW9wdC5vbGQuY2FsbCggdGhpcyApOwotCQl9Ci0KLQkJaWYgKCBvcHQucXVldWUgKSB7Ci0JCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7Ci0JCX0KLQl9OwotCi0JcmV0dXJuIG9wdDsKLX07Ci0KLWpRdWVyeS5lYXNpbmcgPSB7Ci0JbGluZWFyOiBmdW5jdGlvbiggcCApIHsKLQkJcmV0dXJuIHA7Ci0JfSwKLQlzd2luZzogZnVuY3Rpb24oIHAgKSB7Ci0JCXJldHVybiAwLjUgLSBNYXRoLmNvcyggcCpNYXRoLlBJICkgLyAyOwotCX0KLX07Ci0KLWpRdWVyeS50aW1lcnMgPSBbXTsKLWpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0OwotalF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHsKLQl2YXIgdGltZXIsCi0JCXRpbWVycyA9IGpRdWVyeS50aW1lcnMsCi0JCWkgPSAwOwotCi0JZnhOb3cgPSBqUXVlcnkubm93KCk7Ci0KLQlmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7Ci0JCXRpbWVyID0gdGltZXJzWyBpIF07Ci0JCS8vIENoZWNrcyB0aGUgdGltZXIgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVtb3ZlZAotCQlpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHsKLQkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwotCQl9Ci0JfQotCi0JaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKLQkJalF1ZXJ5LmZ4LnN0b3AoKTsKLQl9Ci0JZnhOb3cgPSB1bmRlZmluZWQ7Ci19OwotCi1qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7Ci0JaWYgKCB0aW1lcigpICYmIGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKSApIHsKLQkJalF1ZXJ5LmZ4LnN0YXJ0KCk7Ci0JfQotfTsKLQotalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7Ci0KLWpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewotCWlmICggIXRpbWVySWQgKSB7Ci0JCXRpbWVySWQgPSBzZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApOwotCX0KLX07Ci0KLWpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7Ci0JY2xlYXJJbnRlcnZhbCggdGltZXJJZCApOwotCXRpbWVySWQgPSBudWxsOwotfTsKLQotalF1ZXJ5LmZ4LnNwZWVkcyA9IHsKLQlzbG93OiA2MDAsCi0JZmFzdDogMjAwLAotCS8vIERlZmF1bHQgc3BlZWQKLQlfZGVmYXVsdDogNDAwCi19OwotCi0vLyBCYWNrIENvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludAotalF1ZXJ5LmZ4LnN0ZXAgPSB7fTsKLQotaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewotCWpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHsKLQkJcmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKLQkJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwotCQl9KS5sZW5ndGg7Ci0JfTsKLX0KLWpRdWVyeS5mbi5vZmZzZXQgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKLQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7Ci0JCXJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgPwotCQkJdGhpcyA6Ci0JCQl0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7Ci0JCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKLQkJCX0pOwotCX0KLQotCXZhciBkb2NFbGVtLCB3aW4sCi0JCWJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH0sCi0JCWVsZW0gPSB0aGlzWyAwIF0sCi0JCWRvYyA9IGVsZW0gJiYgZWxlbS5vd25lckRvY3VtZW50OwotCi0JaWYgKCAhZG9jICkgewotCQlyZXR1cm47Ci0JfQotCi0JZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7Ci0KLQkvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKLQlpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKLQkJcmV0dXJuIGJveDsKLQl9Ci0KLQkvLyBJZiB3ZSBkb24ndCBoYXZlIGdCQ1IsIGp1c3QgdXNlIDAsMCByYXRoZXIgdGhhbiBlcnJvcgotCS8vIEJsYWNrQmVycnkgNSwgaU9TIDMgKG9yaWdpbmFsIGlQaG9uZSkKLQlpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gY29yZV9zdHJ1bmRlZmluZWQgKSB7Ci0JCWJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Ci0JfQotCXdpbiA9IGdldFdpbmRvdyggZG9jICk7Ci0JcmV0dXJuIHsKLQkJdG9wOiBib3gudG9wICArICggd2luLnBhZ2VZT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsVG9wICkgIC0gKCBkb2NFbGVtLmNsaWVudFRvcCAgfHwgMCApLAotCQlsZWZ0OiBib3gubGVmdCArICggd2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCApIC0gKCBkb2NFbGVtLmNsaWVudExlZnQgfHwgMCApCi0JfTsKLX07Ci0KLWpRdWVyeS5vZmZzZXQgPSB7Ci0KLQlzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgewotCQl2YXIgcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCAicG9zaXRpb24iICk7Ci0KLQkJLy8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbQotCQlpZiAoIHBvc2l0aW9uID09PSAic3RhdGljIiApIHsKLQkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwotCQl9Ci0KLQkJdmFyIGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSwKLQkJCWN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCksCi0JCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApLAotCQkJY3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sICJsZWZ0IiApLAotCQkJY2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKLQkJCXByb3BzID0ge30sIGN1clBvc2l0aW9uID0ge30sIGN1clRvcCwgY3VyTGVmdDsKLQotCQkvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKLQkJaWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHsKLQkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwotCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOwotCQkJY3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7Ci0JCX0gZWxzZSB7Ci0JCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwotCQkJY3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwOwotCQl9Ci0KLQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkgewotCQkJb3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7Ci0JCX0KLQotCQlpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7Ci0JCQlwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wOwotCQl9Ci0JCWlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7Ci0JCQlwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDsKLQkJfQotCi0JCWlmICggInVzaW5nIiBpbiBvcHRpb25zICkgewotCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwotCQl9IGVsc2UgewotCQkJY3VyRWxlbS5jc3MoIHByb3BzICk7Ci0JCX0KLQl9Ci19OwotCi0KLWpRdWVyeS5mbi5leHRlbmQoewotCi0JcG9zaXRpb246IGZ1bmN0aW9uKCkgewotCQlpZiAoICF0aGlzWyAwIF0gKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsCi0JCQlwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9LAotCQkJZWxlbSA9IHRoaXNbIDAgXTsKLQotCQkvLyBmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LCBiZWNhdXNlIGl0IGlzIGl0J3Mgb25seSBvZmZzZXQgcGFyZW50Ci0JCWlmICggalF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApID09PSAiZml4ZWQiICkgewotCQkJLy8gd2UgYXNzdW1lIHRoYXQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIGF2YWlsYWJsZSB3aGVuIGNvbXB1dGVkIHBvc2l0aW9uIGlzIGZpeGVkCi0JCQlvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwotCQl9IGVsc2UgewotCQkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKLQkJCW9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7Ci0KLQkJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKLQkJCW9mZnNldCA9IHRoaXMub2Zmc2V0KCk7Ci0JCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIG9mZnNldFBhcmVudFsgMCBdLCAiaHRtbCIgKSApIHsKLQkJCQlwYXJlbnRPZmZzZXQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0KCk7Ci0JCQl9Ci0KLQkJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycwotCQkJcGFyZW50T2Zmc2V0LnRvcCAgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKLQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCAiYm9yZGVyTGVmdFdpZHRoIiwgdHJ1ZSApOwotCQl9Ci0KLQkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwotCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdAotCQkvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5jb3JyZWN0bHkgYmUgMAotCQlyZXR1cm4gewotCQkJdG9wOiAgb2Zmc2V0LnRvcCAgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpblRvcCIsIHRydWUgKSwKLQkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRydWUpCi0JCX07Ci0JfSwKLQotCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHsKLQkJCXZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCB8fCBkb2NFbGVtOwotCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZzZXRQYXJlbnQsICJodG1sIiApICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgInBvc2l0aW9uIikgPT09ICJzdGF0aWMiICkgKSB7Ci0JCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKLQkJCX0KLQkJCXJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jRWxlbTsKLQkJfSk7Ci0JfQotfSk7Ci0KLQotLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCi1qUXVlcnkuZWFjaCgge3Njcm9sbExlZnQ6ICJwYWdlWE9mZnNldCIsIHNjcm9sbFRvcDogInBhZ2VZT2Zmc2V0In0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Ci0JdmFyIHRvcCA9IC9ZLy50ZXN0KCBwcm9wICk7Ci0KLQlqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKLQkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHsKLQkJCXZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTsKLQotCQkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKLQkJCQlyZXR1cm4gd2luID8gKHByb3AgaW4gd2luKSA/IHdpblsgcHJvcCBdIDoKLQkJCQkJd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgbWV0aG9kIF0gOgotCQkJCQllbGVtWyBtZXRob2QgXTsKLQkJCX0KLQotCQkJaWYgKCB3aW4gKSB7Ci0JCQkJd2luLnNjcm9sbFRvKAotCQkJCQkhdG9wID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxMZWZ0KCksCi0JCQkJCXRvcCA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsVG9wKCkKLQkJCQkpOwotCi0JCQl9IGVsc2UgewotCQkJCWVsZW1bIG1ldGhvZCBdID0gdmFsOwotCQkJfQotCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApOwotCX07Ci19KTsKLQotZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkgewotCXJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/Ci0JCWVsZW0gOgotCQllbGVtLm5vZGVUeXBlID09PSA5ID8KLQkJCWVsZW0uZGVmYXVsdFZpZXcgfHwgZWxlbS5wYXJlbnRXaW5kb3cgOgotCQkJZmFsc2U7Ci19Ci0vLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHMKLWpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewotCWpRdWVyeS5lYWNoKCB7IHBhZGRpbmc6ICJpbm5lciIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCAiIjogIm91dGVyIiArIG5hbWUgfSwgZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7Ci0JCS8vIG1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0ZXJXaWR0aAotCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKLQkJCXZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09ICJib29sZWFuIiApLAotCQkJCWV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApOwotCi0JCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkgewotCQkJCXZhciBkb2M7Ci0KLQkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewotCQkJCQkvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZQotCQkJCQkvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBwdWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246Ci0JCQkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNzY0Ci0JCQkJCXJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgImNsaWVudCIgKyBuYW1lIF07Ci0JCQkJfQotCi0JCQkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAotCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKLQkJCQkJZG9jID0gZWxlbS5kb2N1bWVudEVsZW1lbnQ7Ci0KLQkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlc3QKLQkJCQkJLy8gdW5mb3J0dW5hdGVseSwgdGhpcyBjYXVzZXMgYnVnICMzODM4IGluIElFNi84IG9ubHksIGJ1dCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZ29vZCwgc21hbGwgd2F5IHRvIGZpeCBpdC4KLQkJCQkJcmV0dXJuIE1hdGgubWF4KAotCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKLQkJCQkJCWVsZW0uYm9keVsgIm9mZnNldCIgKyBuYW1lIF0sIGRvY1sgIm9mZnNldCIgKyBuYW1lIF0sCi0JCQkJCQlkb2NbICJjbGllbnQiICsgbmFtZSBdCi0JCQkJCSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwotCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0Ci0JCQkJCWpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOgotCi0JCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKLQkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTsKLQkJCX0sIHR5cGUsIGNoYWluYWJsZSA/IG1hcmdpbiA6IHVuZGVmaW5lZCwgY2hhaW5hYmxlLCBudWxsICk7Ci0JCX07Ci0JfSk7Ci19KTsKLS8vIExpbWl0IHNjb3BlIHBvbGx1dGlvbiBmcm9tIGFueSBkZXByZWNhdGVkIEFQSQotLy8gKGZ1bmN0aW9uKCkgewotCi0vLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAotalF1ZXJ5LmZuLnNpemUgPSBmdW5jdGlvbigpIHsKLQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci19OwotCi1qUXVlcnkuZm4uYW5kU2VsZiA9IGpRdWVyeS5mbi5hZGRCYWNrOwotCi0vLyB9KSgpOwotaWYgKCB0eXBlb2YgbW9kdWxlID09PSAib2JqZWN0IiAmJiBtb2R1bGUgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAib2JqZWN0IiApIHsKLQkvLyBFeHBvc2UgalF1ZXJ5IGFzIG1vZHVsZS5leHBvcnRzIGluIGxvYWRlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIE5vZGUKLQkvLyBtb2R1bGUgcGF0dGVybiAoaW5jbHVkaW5nIGJyb3dzZXJpZnkpLiBEbyBub3QgY3JlYXRlIHRoZSBnbG9iYWwsIHNpbmNlCi0JLy8gdGhlIHVzZXIgd2lsbCBiZSBzdG9yaW5nIGl0IHRoZW1zZWx2ZXMgbG9jYWxseSwgYW5kIGdsb2JhbHMgYXJlIGZyb3duZWQKLQkvLyB1cG9uIGluIHRoZSBOb2RlIG1vZHVsZSB3b3JsZC4KLQltb2R1bGUuZXhwb3J0cyA9IGpRdWVyeTsKLX0gZWxzZSB7Ci0JLy8gT3RoZXJ3aXNlIGV4cG9zZSBqUXVlcnkgdG8gdGhlIGdsb2JhbCBvYmplY3QgYXMgdXN1YWwKLQl3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7Ci0KLQkvLyBSZWdpc3RlciBhcyBhIG5hbWVkIEFNRCBtb2R1bGUsIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXIKLQkvLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci0JLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0Ci0JLy8gd2F5IHRvIHJlZ2lzdGVyLiBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZQotCS8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQotCS8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cwotCS8vIHRvIGNhbGwgbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay4KLQlpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKLQkJZGVmaW5lKCAianF1ZXJ5IiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpRdWVyeTsgfSApOwotCX0KLX0KLQotfSkoIHdpbmRvdyApOwpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWJnX2RpYWdvbmFscy10aGlja185MF9lZWVlZWVfNDB4NDAucG5nIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWJnX2RpYWdvbmFscy10aGlja185MF9lZWVlZWVfNDB4NDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM5YTFkLi4wMDAwMDAwCi0tLSBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19kaWFnb25hbHMtdGhpY2tfOTBfZWVlZWVlXzQweDQwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19nbGFzc18xMDBfZTRmMWZiXzF4NDAwLnBuZyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19nbGFzc18xMDBfZTRmMWZiXzF4NDAwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjMzM5My4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktYmdfZ2xhc3NfMTAwX2U0ZjFmYl8xeDQwMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktYmdfZ2xhc3NfNTBfM2JhYWUzXzF4NDAwLnBuZyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19nbGFzc181MF8zYmFhZTNfMXg0MDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzIwMjQ1Li4wMDAwMDAwCi0tLSBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19nbGFzc181MF8zYmFhZTNfMXg0MDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWJnX2dsYXNzXzgwX2Q3ZWJmOV8xeDQwMC5wbmcgYi9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktYmdfZ2xhc3NfODBfZDdlYmY5XzF4NDAwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNWRkYS4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktYmdfZ2xhc3NfODBfZDdlYmY5XzF4NDAwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtaGFyZF8xMDBfZjJmNWY3XzF4MTAwLnBuZyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtaGFyZF8xMDBfZjJmNWY3XzF4MTAwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkMWQyOC4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktYmdfaGlnaGxpZ2h0LWhhcmRfMTAwX2YyZjVmN18xeDEwMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktYmdfaGlnaGxpZ2h0LWhhcmRfNzBfMDAwMDAwXzF4MTAwLnBuZyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtaGFyZF83MF8wMDAwMDBfMXgxMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFiNDFjLi4wMDAwMDAwCi0tLSBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtaGFyZF83MF8wMDAwMDBfMXgxMDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0XzEwMF9kZWVkZjdfMXgxMDAucG5nIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0XzEwMF9kZWVkZjdfMXgxMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDczY2EzLi4wMDAwMDAwCi0tLSBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8xMDBfZGVlZGY3XzF4MTAwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8yNV9mZmVmOGZfMXgxMDAucG5nIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0XzI1X2ZmZWY4Zl8xeDEwMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMjMxNDAuLjAwMDAwMDAKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0XzI1X2ZmZWY4Zl8xeDEwMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktaWNvbnNfMjY5NGU4XzI1NngyNDAucG5nIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWljb25zXzI2OTRlOF8yNTZ4MjQwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzYWU3OC4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktaWNvbnNfMjY5NGU4XzI1NngyNDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWljb25zXzJlODNmZl8yNTZ4MjQwLnBuZyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1pY29uc18yZTgzZmZfMjU2eDI0MC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYmY4MzguLjAwMDAwMDAKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWljb25zXzJlODNmZl8yNTZ4MjQwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1pY29uc18zZDgwYjNfMjU2eDI0MC5wbmcgYi9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktaWNvbnNfM2Q4MGIzXzI1NngyNDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhjNjhhLi4wMDAwMDAwCi0tLSBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1pY29uc18zZDgwYjNfMjU2eDI0MC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktaWNvbnNfNzJhN2NmXzI1NngyNDAucG5nIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWljb25zXzcyYTdjZl8yNTZ4MjQwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4ZjIyYS4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9pbWFnZXMvdWktaWNvbnNfNzJhN2NmXzI1NngyNDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWljb25zX2ZmZmZmZl8yNTZ4MjQwLnBuZyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2ltYWdlcy91aS1pY29uc19mZmZmZmZfMjU2eDI0MC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjZmNTkuLjAwMDAwMDAKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vaW1hZ2VzL3VpLWljb25zX2ZmZmZmZl8yNTZ4MjQwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2pxdWVyeS11aS5taW4uY3NzIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vanF1ZXJ5LXVpLm1pbi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTM2NDYuLjAwMDAwMDAKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vanF1ZXJ5LXVpLm1pbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8qISBqUXVlcnkgVUkgLSB2MS4xMS40IC0gMjAxNi0wMy0wMQotKiBodHRwOi8vanF1ZXJ5dWkuY29tCi0qIEluY2x1ZGVzOiBjb3JlLmNzcywgZHJhZ2dhYmxlLmNzcywgcmVzaXphYmxlLmNzcywgc2VsZWN0YWJsZS5jc3MsIHNvcnRhYmxlLmNzcywgYWNjb3JkaW9uLmNzcywgYXV0b2NvbXBsZXRlLmNzcywgYnV0dG9uLmNzcywgZGF0ZXBpY2tlci5jc3MsIGRpYWxvZy5jc3MsIG1lbnUuY3NzLCBwcm9ncmVzc2Jhci5jc3MsIHNlbGVjdG1lbnUuY3NzLCBzbGlkZXIuY3NzLCBzcGlubmVyLmNzcywgdGFicy5jc3MsIHRvb2x0aXAuY3NzLCB0aGVtZS5jc3MKLSogVG8gdmlldyBhbmQgbW9kaWZ5IHRoaXMgdGhlbWUsIHZpc2l0IGh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvP2ZmRGVmYXVsdD1MdWNpZGElMjBHcmFuZGUlMkNMdWNpZGElMjBTYW5zJTJDQXJpYWwlMkNzYW5zLXNlcmlmJmZ3RGVmYXVsdD1ib2xkJmZzRGVmYXVsdD0xLjFlbSZjb3JuZXJSYWRpdXM9NnB4JmJnQ29sb3JIZWFkZXI9ZGVlZGY3JmJnVGV4dHVyZUhlYWRlcj1oaWdobGlnaHRfc29mdCZiZ0ltZ09wYWNpdHlIZWFkZXI9MTAwJmJvcmRlckNvbG9ySGVhZGVyPWFlZDBlYSZmY0hlYWRlcj0yMjIyMjImaWNvbkNvbG9ySGVhZGVyPTcyYTdjZiZiZ0NvbG9yQ29udGVudD1mMmY1ZjcmYmdUZXh0dXJlQ29udGVudD1oaWdobGlnaHRfaGFyZCZiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmZjQ29udGVudD0zNjJiMzYmaWNvbkNvbG9yQ29udGVudD03MmE3Y2YmYmdDb2xvckRlZmF1bHQ9ZDdlYmY5JmJnVGV4dHVyZURlZmF1bHQ9Z2xhc3MmYmdJbWdPcGFjaXR5RGVmYXVsdD04MCZib3JkZXJDb2xvckRlZmF1bHQ9YWVkMGVhJmZjRGVmYXVsdD0yNzc5YWEmaWNvbkNvbG9yRGVmYXVsdD0zZDgwYjMmYmdDb2xvckhvdmVyPWU0ZjFmYiZiZ1RleHR1cmVIb3Zlcj1nbGFzcyZiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYm9yZGVyQ29sb3JIb3Zlcj03NGIyZTImZmNIb3Zlcj0wMDcwYTMmaWNvbkNvbG9ySG92ZXI9MjY5NGU4JmJnQ29sb3JBY3RpdmU9M2JhYWUzJmJnVGV4dHVyZUFjdGl2ZT1nbGFzcyZiZ0ltZ09wYWNpdHlBY3RpdmU9NTAmYm9yZGVyQ29sb3JBY3RpdmU9MjY5NGU4JmZjQWN0aXZlPWZmZmZmZiZpY29uQ29sb3JBY3RpdmU9ZmZmZmZmJmJnQ29sb3JIaWdobGlnaHQ9ZmZlZjhmJmJnVGV4dHVyZUhpZ2hsaWdodD1oaWdobGlnaHRfc29mdCZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9MjUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZjlkZDM0JmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9MmU4M2ZmJmJnQ29sb3JFcnJvcj1jZDBhMGEmYmdUZXh0dXJlRXJyb3I9ZmxhdCZiZ0ltZ09wYWNpdHlFcnJvcj0xNSZib3JkZXJDb2xvckVycm9yPWNkMGEwYSZmY0Vycm9yPWZmZmZmZiZpY29uQ29sb3JFcnJvcj1mZmZmZmYmYmdDb2xvck92ZXJsYXk9ZWVlZWVlJmJnVGV4dHVyZU92ZXJsYXk9ZGlhZ29uYWxzX3RoaWNrJmJnSW1nT3BhY2l0eU92ZXJsYXk9OTAmb3BhY2l0eU92ZXJsYXk9ODAmYmdDb2xvclNoYWRvdz0wMDAwMDAmYmdUZXh0dXJlU2hhZG93PWhpZ2hsaWdodF9oYXJkJmJnSW1nT3BhY2l0eVNoYWRvdz03MCZvcGFjaXR5U2hhZG93PTMwJnRoaWNrbmVzc1NoYWRvdz03cHgmb2Zmc2V0VG9wU2hhZG93PS03cHgmb2Zmc2V0TGVmdFNoYWRvdz0tN3B4JmNvcm5lclJhZGl1c1NoYWRvdz04cHgKLSogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnM7IExpY2Vuc2VkIE1JVCAqLwotCi0udWktaGVscGVyLWhpZGRlbntkaXNwbGF5Om5vbmV9LnVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweH0udWktaGVscGVyLXJlc2V0e21hcmdpbjowO3BhZGRpbmc6MDtib3JkZXI6MDtvdXRsaW5lOjA7bGluZS1oZWlnaHQ6MS4zO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxMDAlO2xpc3Qtc3R5bGU6bm9uZX0udWktaGVscGVyLWNsZWFyZml4OmJlZm9yZSwudWktaGVscGVyLWNsZWFyZml4OmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTp0YWJsZTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2V9LnVpLWhlbHBlci1jbGVhcmZpeDphZnRlcntjbGVhcjpib3RofS51aS1oZWxwZXItY2xlYXJmaXh7bWluLWhlaWdodDowfS51aS1oZWxwZXItemZpeHt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MCl9LnVpLWZyb250e3otaW5kZXg6MTAwfS51aS1zdGF0ZS1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdCFpbXBvcnRhbnR9LnVpLWljb257ZGlzcGxheTpibG9jazt0ZXh0LWluZGVudDotOTk5OTlweDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS51aS13aWRnZXQtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0udWktZHJhZ2dhYmxlLWhhbmRsZXstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLXJlc2l6YWJsZXtwb3NpdGlvbjpyZWxhdGl2ZX0udWktcmVzaXphYmxlLWhhbmRsZXtwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6MC4xcHg7ZGlzcGxheTpibG9jazstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLXJlc2l6YWJsZS1kaXNhYmxlZCAudWktcmVzaXphYmxlLWhhbmRsZSwudWktcmVzaXphYmxlLWF1dG9oaWRlIC51aS1yZXNpemFibGUtaGFuZGxle2Rpc3BsYXk6bm9uZX0udWktcmVzaXphYmxlLW57Y3Vyc29yOm4tcmVzaXplO2hlaWdodDo3cHg7d2lkdGg6MTAwJTt0b3A6LTVweDtsZWZ0OjB9LnVpLXJlc2l6YWJsZS1ze2N1cnNvcjpzLXJlc2l6ZTtoZWlnaHQ6N3B4O3dpZHRoOjEwMCU7Ym90dG9tOi01cHg7bGVmdDowfS51aS1yZXNpemFibGUtZXtjdXJzb3I6ZS1yZXNpemU7d2lkdGg6N3B4O3JpZ2h0Oi01cHg7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXJlc2l6YWJsZS13e2N1cnNvcjp3LXJlc2l6ZTt3aWR0aDo3cHg7bGVmdDotNXB4O3RvcDowO2hlaWdodDoxMDAlfS51aS1yZXNpemFibGUtc2V7Y3Vyc29yOnNlLXJlc2l6ZTt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O3JpZ2h0OjFweDtib3R0b206MXB4fS51aS1yZXNpemFibGUtc3d7Y3Vyc29yOnN3LXJlc2l6ZTt3aWR0aDo5cHg7aGVpZ2h0OjlweDtsZWZ0Oi01cHg7Ym90dG9tOi01cHh9LnVpLXJlc2l6YWJsZS1ud3tjdXJzb3I6bnctcmVzaXplO3dpZHRoOjlweDtoZWlnaHQ6OXB4O2xlZnQ6LTVweDt0b3A6LTVweH0udWktcmVzaXphYmxlLW5le2N1cnNvcjpuZS1yZXNpemU7d2lkdGg6OXB4O2hlaWdodDo5cHg7cmlnaHQ6LTVweDt0b3A6LTVweH0udWktc2VsZWN0YWJsZXstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLXNlbGVjdGFibGUtaGVscGVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwO2JvcmRlcjoxcHggZG90dGVkIGJsYWNrfS51aS1zb3J0YWJsZS1oYW5kbGV7LW1zLXRvdWNoLWFjdGlvbjpub25lO3RvdWNoLWFjdGlvbjpub25lfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXJ7ZGlzcGxheTpibG9jaztjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MnB4IDAgMCAwO3BhZGRpbmc6LjVlbSAuNWVtIC41ZW0gLjdlbTttaW4taGVpZ2h0OjA7Zm9udC1zaXplOjEwMCV9LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWljb25ze3BhZGRpbmctbGVmdDoyLjJlbX0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taWNvbnMgLnVpLWFjY29yZGlvbi1pY29uc3twYWRkaW5nLWxlZnQ6Mi4yZW19LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWhlYWRlciAudWktYWNjb3JkaW9uLWhlYWRlci1pY29ue3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6LjVlbTt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24tY29udGVudHtwYWRkaW5nOjFlbSAyLjJlbTtib3JkZXItdG9wOjA7b3ZlcmZsb3c6YXV0b30udWktYXV0b2NvbXBsZXRle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtjdXJzb3I6ZGVmYXVsdH0udWktYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6MDtsaW5lLWhlaWdodDpub3JtYWw7bWFyZ2luLXJpZ2h0Oi4xZW07Y3Vyc29yOnBvaW50ZXI7dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyO292ZXJmbG93OnZpc2libGV9LnVpLWJ1dHRvbiwudWktYnV0dG9uOmxpbmssLnVpLWJ1dHRvbjp2aXNpdGVkLC51aS1idXR0b246aG92ZXIsLnVpLWJ1dHRvbjphY3RpdmV7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLWJ1dHRvbi1pY29uLW9ubHl7d2lkdGg6Mi4yZW19YnV0dG9uLnVpLWJ1dHRvbi1pY29uLW9ubHl7d2lkdGg6Mi40ZW19LnVpLWJ1dHRvbi1pY29ucy1vbmx5e3dpZHRoOjMuNGVtfWJ1dHRvbi51aS1idXR0b24taWNvbnMtb25seXt3aWR0aDozLjdlbX0udWktYnV0dG9uIC51aS1idXR0b24tdGV4dHtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0Om5vcm1hbH0udWktYnV0dG9uLXRleHQtb25seSAudWktYnV0dG9uLXRleHR7cGFkZGluZzouNGVtIDFlbX0udWktYnV0dG9uLWljb24tb25seSAudWktYnV0dG9uLXRleHQsLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24tdGV4dHtwYWRkaW5nOi40ZW07dGV4dC1pbmRlbnQ6LTk5OTk5OTlweH0udWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IC51aS1idXR0b24tdGV4dCwudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmc6LjRlbSAxZW0gLjRlbSAyLjFlbX0udWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWJ1dHRvbi10ZXh0LC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLXRleHR7cGFkZGluZzouNGVtIDIuMWVtIC40ZW0gMWVtfS51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLXRleHR7cGFkZGluZy1sZWZ0OjIuMWVtO3BhZGRpbmctcmlnaHQ6Mi4xZW19aW5wdXQudWktYnV0dG9ue3BhZGRpbmc6LjRlbSAxZW19LnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb24sLnVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSAudWktaWNvbiwudWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWljb24sLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1pY29uLC51aS1idXR0b24taWNvbnMtb25seSAudWktaWNvbntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktYnV0dG9uLWljb24tb25seSAudWktaWNvbntsZWZ0OjUwJTttYXJnaW4tbGVmdDotOHB4fS51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnksLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1wcmltYXJ5LC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tcHJpbWFyeXtsZWZ0Oi41ZW19LnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnl7cmlnaHQ6LjVlbX0udWktYnV0dG9uc2V0e21hcmdpbi1yaWdodDo3cHh9LnVpLWJ1dHRvbnNldCAudWktYnV0dG9ue21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0Oi0uM2VtfWlucHV0LnVpLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixidXR0b24udWktYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowO3BhZGRpbmc6MH0udWktZGF0ZXBpY2tlcnt3aWR0aDoxN2VtO3BhZGRpbmc6LjJlbSAuMmVtIDA7ZGlzcGxheTpub25lfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOi4yZW0gMH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDt3aWR0aDoxLjhlbTtoZWlnaHQ6MS44ZW19LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciwudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVye3RvcDoxcHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldntsZWZ0OjJweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0e3JpZ2h0OjJweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVye2xlZnQ6MXB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQtaG92ZXJ7cmlnaHQ6MXB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYgc3BhbiwudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0IHNwYW57ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotOHB4O3RvcDo1MCU7bWFyZ2luLXRvcDotOHB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXRpdGxle21hcmdpbjowIDIuM2VtO2xpbmUtaGVpZ2h0OjEuOGVtO3RleHQtYWxpZ246Y2VudGVyfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXRpdGxlIHNlbGVjdHtmb250LXNpemU6MWVtO21hcmdpbjoxcHggMH0udWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwudWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFye3dpZHRoOjQ1JX0udWktZGF0ZXBpY2tlciB0YWJsZXt3aWR0aDoxMDAlO2ZvbnQtc2l6ZTouOWVtO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTttYXJnaW46MCAwIC40ZW19LnVpLWRhdGVwaWNrZXIgdGh7cGFkZGluZzouN2VtIC4zZW07dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDtib3JkZXI6MH0udWktZGF0ZXBpY2tlciB0ZHtib3JkZXI6MDtwYWRkaW5nOjFweH0udWktZGF0ZXBpY2tlciB0ZCBzcGFuLC51aS1kYXRlcGlja2VyIHRkIGF7ZGlzcGxheTpibG9jaztwYWRkaW5nOi4yZW07dGV4dC1hbGlnbjpyaWdodDt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2JhY2tncm91bmQtaW1hZ2U6bm9uZTttYXJnaW46LjdlbSAwIDAgMDtwYWRkaW5nOjAgLjJlbTtib3JkZXItbGVmdDowO2JvcmRlci1yaWdodDowO2JvcmRlci1ib3R0b206MH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbntmbG9hdDpyaWdodDttYXJnaW46LjVlbSAuMmVtIC40ZW07Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzouMmVtIC42ZW0gLjNlbSAuNmVtO3dpZHRoOmF1dG87b3ZlcmZsb3c6dmlzaWJsZX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnR7ZmxvYXQ6bGVmdH0udWktZGF0ZXBpY2tlci51aS1kYXRlcGlja2VyLW11bHRpe3dpZHRoOmF1dG99LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXB7ZmxvYXQ6bGVmdH0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cCB0YWJsZXt3aWR0aDo5NSU7bWFyZ2luOjAgYXV0byAuNGVtfS51aS1kYXRlcGlja2VyLW11bHRpLTIgLnVpLWRhdGVwaWNrZXItZ3JvdXB7d2lkdGg6NTAlfS51aS1kYXRlcGlja2VyLW11bHRpLTMgLnVpLWRhdGVwaWNrZXItZ3JvdXB7d2lkdGg6MzMuMyV9LnVpLWRhdGVwaWNrZXItbXVsdGktNCAudWktZGF0ZXBpY2tlci1ncm91cHt3aWR0aDoyNSV9LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCAudWktZGF0ZXBpY2tlci1oZWFkZXIsLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIC51aS1kYXRlcGlja2VyLWhlYWRlcntib3JkZXItbGVmdC13aWR0aDowfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmV7Y2xlYXI6bGVmdH0udWktZGF0ZXBpY2tlci1yb3ctYnJlYWt7Y2xlYXI6Ym90aDt3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowfS51aS1kYXRlcGlja2VyLXJ0bHtkaXJlY3Rpb246cnRsfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1wcmV2e3JpZ2h0OjJweDtsZWZ0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLW5leHR7bGVmdDoycHg7cmlnaHQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItcHJldjpob3ZlcntyaWdodDoxcHg7bGVmdDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0OmhvdmVye2xlZnQ6MXB4O3JpZ2h0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmV7Y2xlYXI6cmlnaHR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9ue2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uLnVpLWRhdGVwaWNrZXItY3VycmVudCwudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXB7ZmxvYXQ6cmlnaHR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVyLC51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUgLnVpLWRhdGVwaWNrZXItaGVhZGVye2JvcmRlci1yaWdodC13aWR0aDowO2JvcmRlci1sZWZ0LXdpZHRoOjFweH0udWktZGlhbG9ne292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cGFkZGluZzouMmVtO291dGxpbmU6MH0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXJ7cGFkZGluZzouNGVtIDFlbTtwb3NpdGlvbjpyZWxhdGl2ZX0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGV7ZmxvYXQ6bGVmdDttYXJnaW46LjFlbSAwO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDo5MCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9LnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3Nle3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi4zZW07dG9wOjUwJTt3aWR0aDoyMHB4O21hcmdpbjotMTBweCAwIDAgMDtwYWRkaW5nOjFweDtoZWlnaHQ6MjBweH0udWktZGlhbG9nIC51aS1kaWFsb2ctY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXI6MDtwYWRkaW5nOi41ZW0gMWVtO2JhY2tncm91bmQ6bm9uZTtvdmVyZmxvdzphdXRvfS51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5le3RleHQtYWxpZ246bGVmdDtib3JkZXItd2lkdGg6MXB4IDAgMCAwO2JhY2tncm91bmQtaW1hZ2U6bm9uZTttYXJnaW4tdG9wOi41ZW07cGFkZGluZzouM2VtIDFlbSAuNWVtIC40ZW19LnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgLnVpLWRpYWxvZy1idXR0b25zZXR7ZmxvYXQ6cmlnaHR9LnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgYnV0dG9ue21hcmdpbjouNWVtIC40ZW0gLjVlbSAwO2N1cnNvcjpwb2ludGVyfS51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1zZXt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O3JpZ2h0Oi01cHg7Ym90dG9tOi01cHg7YmFja2dyb3VuZC1wb3NpdGlvbjoxNnB4IDE2cHh9LnVpLWRyYWdnYWJsZSAudWktZGlhbG9nLXRpdGxlYmFye2N1cnNvcjptb3ZlfS51aS1tZW51e2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOjA7bWFyZ2luOjA7ZGlzcGxheTpibG9jaztvdXRsaW5lOm5vbmV9LnVpLW1lbnUgLnVpLW1lbnV7cG9zaXRpb246YWJzb2x1dGV9LnVpLW1lbnUgLnVpLW1lbnUtaXRlbXtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MDtwYWRkaW5nOjNweCAxZW0gM3B4IC40ZW07Y3Vyc29yOnBvaW50ZXI7bWluLWhlaWdodDowO2xpc3Qtc3R5bGUtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTciKX0udWktbWVudSAudWktbWVudS1kaXZpZGVye21hcmdpbjo1cHggMDtoZWlnaHQ6MDtmb250LXNpemU6MDtsaW5lLWhlaWdodDowO2JvcmRlci13aWR0aDoxcHggMCAwIDB9LnVpLW1lbnUgLnVpLXN0YXRlLWZvY3VzLC51aS1tZW51IC51aS1zdGF0ZS1hY3RpdmV7bWFyZ2luOi0xcHh9LnVpLW1lbnUtaWNvbnN7cG9zaXRpb246cmVsYXRpdmV9LnVpLW1lbnUtaWNvbnMgLnVpLW1lbnUtaXRlbXtwYWRkaW5nLWxlZnQ6MmVtfS51aS1tZW51IC51aS1pY29ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6LjJlbTttYXJnaW46YXV0byAwfS51aS1tZW51IC51aS1tZW51LWljb257bGVmdDphdXRvO3JpZ2h0OjB9LnVpLXByb2dyZXNzYmFye2hlaWdodDoyZW07dGV4dC1hbGlnbjpsZWZ0O292ZXJmbG93OmhpZGRlbn0udWktcHJvZ3Jlc3NiYXIgLnVpLXByb2dyZXNzYmFyLXZhbHVle21hcmdpbjotMXB4O2hlaWdodDoxMDAlfS51aS1wcm9ncmVzc2JhciAudWktcHJvZ3Jlc3NiYXItb3ZlcmxheXtiYWNrZ3JvdW5kOnVybCgiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoS0FBb0FJQUJBQUFBQVAvLy95SC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFKQVFBQkFDd0FBQUFBS0FBb0FBQUNrWXdOcVhyZEM1MkRTMDZhN01GWkkrNEZIQkNLb0RlV0tYcXltUHFHcXh2SnJYWmJNeDdUdGMrdzlYZ1UyRkIzbE95UVJXRVQySUZHaVU5bTFmckRWcHhaWmM2YmZId3Y0YzFZWFA2azFWZHkyOTJGYjZVa3V2RnRYcHZXU3pBK0h5Y1hKSFVYaUdZSWlNZzJSNlc0NTlnbldHZkhOZGpJcURXVnFlbUgyZWtwT2JrcE9scHBXVXFaaXFyNmVkcXFXUUFBSWZrRUNRRUFBUUFzQUFBQUFDZ0FLQUFBQXBTTWdabkdmYXFjZzFFMnV1ekRtbUhVQlI4UWlsOTVoaVBLcVduM2FxdExzUzE4eTdHMVN6TmVvd1dCRU50UWQrVDFKa3RQMDVuelBUZEpabFI2dlV4TldXalYrdlVXaFdOa1dGd3hsOVZwWlJlZFljZmxJT0xhZmFhMjhYZHNIL3lubGNjMXVQVkRaeFFJUjBLMjUrY0lDQ21vcUNlNW1HaFpPZmVZU1VoNXlKY0p5cmtaV1dwYVI4ZG9KMm80TllxNjJsQUFBQ0g1QkFrQkFBRUFMQUFBQUFBb0FDZ0FBQUtWREk0WXkyMlpuSU5STnFvc3cwQnY3aTFneUhVa0ZqN29TYVdsdTNvdkM4R3hOc281Zmx1ejNxTFZoQlZlVC9MejdaVEh5eEw1ZERhbFFXUFZPc1FXdFJudXdYYUZUajlqVlZoOHBtYTlKalo0ellTajVaT3ltYTd1dW9sZmZoK0lSNWFXOTdjSHVCVVhLR0tYbEtqbitEaUhXTWNZSmFoNE4wbFlDTWxKT1hpcEdScjVxZGdvU1RycVdTcTZXRmwyeXBvYVVBQUFJZmtFQ1FFQUFRQXNBQUFBQUNnQUtBQUFBcGFFYjZITGdkL2lPN0ZOV3RjRldlK3VmT0RHalJmb2lKMmFrU2hidWViMHd0STUwem0wMnBidndmV0VNV0JRMXpLR2xMSWhza2lFUG05UjZ2Ulh4VjRaeldUMnlIT0dwV015b3JibEtsTnA4SG1IRWIvbENYamNXN2JtdFhQOFh0MjI5T1ZXUjFmb2QyZVdxTmZIdU1qWENQa0lHTmlsZU9pSW1WbUNPRW1vU2ZuM3lYbEpXbW9IR2hxcDZpbFl1V1lwbVRxS1VnQUFJZmtFQ1FFQUFRQXNBQUFBQUNnQUtBQUFBcGlFSDZrYjU4YmlRM0ZOV3RNRldXM2VOVmNvanVGR2ZxblpxU2VidVMwNnc1VjgwL1gwMnBLZTh6RndQNkVGV09UMWxERms4ckdFUmgxVFROT29jUTYxSG00WG0yVmV4VUhwemp5bVZpSHJGYmlFTHNlZlZybjZYS2ZudDJROUcvK1hkaWU0OTlYSGQyZzRoN2lvT0doWEdKYm9HQW5YU0Jub0J3S1l5ZmlvdWJaSjJIbjBSdVJaYWZsWk9pbDU2WnA2aWlvS1NYcFVBQUFoK1FRSkFRQUJBQ3dBQUFBQUtBQW9BQUFDa29RUnFSdm54dUk3a1UxYTFVVTViZDV0blNlT1pYaG1uNWxXSzNxTlRXdlJkUXhQOHF2YUMrL3lhWVF6WE83Qk12YVVFbUpSZDNUc2lNQWdzd21OWXJTZ1pkWXJUWDZ0U0hHWk83M2V6dUF3MnV4dVErQmJlWmZNeHNleFkzNSsvUWU0SjFpblYwZzR4M1dIdU1oSWwyalhPS1QyUStWVTVmZ29TVUk1MlZmWnlma0pHa2hhNmptWSthYVlkaXJxK2xRQUFDSDVCQWtCQUFFQUxBQUFBQUFvQUNnQUFBS1dCSUtwWWUwTDNZTktUb3Fzd1VsdnpuaWdkNHdpUjRLaFpyS3Q5VXBxaXA2MWk5RTN2TXZ4UmRIbGJFRmlFWGZrOVlBUll4T1paRDZWUTJwVXVuQm10UlhvMUxmOGhNVlZjTmw4SmFmVjM4YU0yL0Z1NVYxNkJuNjNyNnh0OTdqMDkrTVhTRmk0Qm5pR0ZhZTNoemJIOStoWUJ6a3B1VWg1YVptSHVhblpPWmdJdXZiR2lOZW9tQ25heHhhcDJ1cGFDWnNxKzFrQUFDSDVCQWtCQUFFQUxBQUFBQUFvQUNnQUFBS1hqSThCeTV6ZjRrT3hUVnJYTlZsdjFYMGQ4SUdaR0tMbk5wWXRtOExyOWNxVmV1T1N2Zk9XNzlEOWFESGl6TmhESmlkRlpoTnlkRWFoT2FESDZub210SmpwMXR1dEtvTldrdkE2SnFmUlZMSFUvUVVmYXU5bDJ4N0c1NGQxZmw5OTV4Y0lHQWRYcU1mQk5hZG9ZcmhIK01nMktCbHBWcGJsdUNpWG1NbloyU2g0R0JxSitja0lPcXFKNkxtS1NsbFptc29xNndwUUFBQWgrUVFKQVFBQkFDd0FBQUFBS0FBb0FBQUNsWXgvb0x2b3h1SkRrVTFhMVlVWmJKNTluU2QyWlhoV3FiUmEyL2dGOEd1MkRZM2lxczd5cnEreEJZRWtZdkZTTThhU1NPYkUrWmdSbDFCSEZaTnI3cFJDYXZaNUJXMjE0MmhZM0FOL3pXdHNtZjEycDlYeHhGbDJscExuMXJzZXp0ZlhaamRJV0lmMnM1ZEl0d2pZS0Jnbzl5ZzVwSGd6SlhURWVHbFp1ZW5weVBtcEdRb0tPV2tZbVNwYVNucUtpbGVJMkZBQUFDSDVCQWtCQUFFQUxBQUFBQUFvQUNnQUFBS1ZqQitndStqRzRrT1JUVnJWaFJsc25uMmRKM1psZUZhcHRGcmIrQ1htTzlPb3plTDVWZlA5OUh2QVdocGlVZGN3a3BCSDM4MjVBd1lkVTh4VHFsTEdodENvc0FyS01wdmZhMW1NUmFlOVZ2V1pmZUIyWGZQa2VMbW0xOGxVY0JqK3A1ZG5OOGpYWjNZSUdFaFl1T1VuNDVhb0NEa3AxNmhsNUlqWUp2aldLY25vR1FwcXlQbHBPaHIzYUVsYXFycTU2QnE3VkFBQU93PT0iKTtoZWlnaHQ6MTAwJTtmaWx0ZXI6YWxwaGEob3BhY2l0eT0yNSk7b3BhY2l0eTowLjI1fS51aS1wcm9ncmVzc2Jhci1pbmRldGVybWluYXRlIC51aS1wcm9ncmVzc2Jhci12YWx1ZXtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLXNlbGVjdG1lbnUtbWVudXtwYWRkaW5nOjA7bWFyZ2luOjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2Rpc3BsYXk6bm9uZX0udWktc2VsZWN0bWVudS1tZW51IC51aS1tZW51e292ZXJmbG93OmF1dG87b3ZlcmZsb3cteDpoaWRkZW47cGFkZGluZy1ib3R0b206MXB4fS51aS1zZWxlY3RtZW51LW1lbnUgLnVpLW1lbnUgLnVpLXNlbGVjdG1lbnUtb3B0Z3JvdXB7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjEuNTtwYWRkaW5nOjJweCAwLjRlbTttYXJnaW46MC41ZW0gMCAwIDA7aGVpZ2h0OmF1dG87Ym9yZGVyOjB9LnVpLXNlbGVjdG1lbnUtb3BlbntkaXNwbGF5OmJsb2NrfS51aS1zZWxlY3RtZW51LWJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXJ9LnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktaWNvbntyaWdodDowLjVlbTtsZWZ0OmF1dG87bWFyZ2luLXRvcDotOHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCV9LnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktc2VsZWN0bWVudS10ZXh0e3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjAuNGVtIDIuMWVtIDAuNGVtIDFlbTtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjEuNDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLXNsaWRlcntwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmxlZnR9LnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7d2lkdGg6MS4yZW07aGVpZ2h0OjEuMmVtO2N1cnNvcjpkZWZhdWx0Oy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc2xpZGVyIC51aS1zbGlkZXItcmFuZ2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO2ZvbnQtc2l6ZTouN2VtO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOjA7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9LnVpLXNsaWRlci51aS1zdGF0ZS1kaXNhYmxlZCAudWktc2xpZGVyLWhhbmRsZSwudWktc2xpZGVyLnVpLXN0YXRlLWRpc2FibGVkIC51aS1zbGlkZXItcmFuZ2V7ZmlsdGVyOmluaGVyaXR9LnVpLXNsaWRlci1ob3Jpem9udGFse2hlaWdodDouOGVtfS51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLWhhbmRsZXt0b3A6LS4zZW07bWFyZ2luLWxlZnQ6LS42ZW19LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2V7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWlue2xlZnQ6MH0udWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZS1tYXh7cmlnaHQ6MH0udWktc2xpZGVyLXZlcnRpY2Fse3dpZHRoOi44ZW07aGVpZ2h0OjEwMHB4fS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1oYW5kbGV7bGVmdDotLjNlbTttYXJnaW4tbGVmdDowO21hcmdpbi1ib3R0b206LS42ZW19LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdle2xlZnQ6MDt3aWR0aDoxMDAlfS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZS1taW57Ym90dG9tOjB9LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1heHt0b3A6MH0udWktc3Bpbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWktc3Bpbm5lci1pbnB1dHtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7Y29sb3I6aW5oZXJpdDtwYWRkaW5nOjA7bWFyZ2luOi4yZW0gMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLWxlZnQ6LjRlbTttYXJnaW4tcmlnaHQ6MjJweH0udWktc3Bpbm5lci1idXR0b257d2lkdGg6MTZweDtoZWlnaHQ6NTAlO2ZvbnQtc2l6ZTouNWVtO3BhZGRpbmc6MDttYXJnaW46MDt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtjdXJzb3I6ZGVmYXVsdDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtyaWdodDowfS51aS1zcGlubmVyIGEudWktc3Bpbm5lci1idXR0b257Ym9yZGVyLXRvcDpub25lO2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItcmlnaHQ6bm9uZX0udWktc3Bpbm5lciAudWktaWNvbntwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tdG9wOi04cHg7dG9wOjUwJTtsZWZ0OjB9LnVpLXNwaW5uZXItdXB7dG9wOjB9LnVpLXNwaW5uZXItZG93bntib3R0b206MH0udWktc3Bpbm5lciAudWktaWNvbi10cmlhbmdsZS0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjVweCAtMTZweH0udWktdGFic3twb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOi4yZW19LnVpLXRhYnMgLnVpLXRhYnMtbmF2e21hcmdpbjowO3BhZGRpbmc6LjJlbSAuMmVtIDB9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpe2xpc3Qtc3R5bGU6bm9uZTtmbG9hdDpsZWZ0O3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDowO21hcmdpbjoxcHggLjJlbSAwIDA7Ym9yZGVyLWJvdHRvbS13aWR0aDowO3BhZGRpbmc6MDt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IC51aS10YWJzLWFuY2hvcntmbG9hdDpsZWZ0O3BhZGRpbmc6LjVlbSAxZW07dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZle21hcmdpbi1ib3R0b206LTFweDtwYWRkaW5nLWJvdHRvbToxcHh9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZlIC51aS10YWJzLWFuY2hvciwudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtZGlzYWJsZWQgLnVpLXRhYnMtYW5jaG9yLC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWxvYWRpbmcgLnVpLXRhYnMtYW5jaG9ye2N1cnNvcjp0ZXh0fS51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSAudWktdGFicy1hbmNob3J7Y3Vyc29yOnBvaW50ZXJ9LnVpLXRhYnMgLnVpLXRhYnMtcGFuZWx7ZGlzcGxheTpibG9jaztib3JkZXItd2lkdGg6MDtwYWRkaW5nOjFlbSAxLjRlbTtiYWNrZ3JvdW5kOm5vbmV9LnVpLXRvb2x0aXB7cGFkZGluZzo4cHg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo5OTk5O21heC13aWR0aDozMDBweDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDVweCAjYWFhO2JveC1zaGFkb3c6MCAwIDVweCAjYWFhfWJvZHkgLnVpLXRvb2x0aXB7Ym9yZGVyLXdpZHRoOjJweH0udWktd2lkZ2V0e2ZvbnQtZmFtaWx5Okx1Y2lkYSBHcmFuZGUsTHVjaWRhIFNhbnMsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MS4xZW19LnVpLXdpZGdldCAudWktd2lkZ2V0e2ZvbnQtc2l6ZToxZW19LnVpLXdpZGdldCBpbnB1dCwudWktd2lkZ2V0IHNlbGVjdCwudWktd2lkZ2V0IHRleHRhcmVhLC51aS13aWRnZXQgYnV0dG9ue2ZvbnQtZmFtaWx5Okx1Y2lkYSBHcmFuZGUsTHVjaWRhIFNhbnMsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MWVtfS51aS13aWRnZXQtY29udGVudHtib3JkZXI6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZjJmNWY3IHVybCgiaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1oYXJkXzEwMF9mMmY1ZjdfMXgxMDAucG5nIikgNTAlIHRvcCByZXBlYXQteDtjb2xvcjojMzYyYjM2fS51aS13aWRnZXQtY29udGVudCBhe2NvbG9yOiMzNjJiMzZ9LnVpLXdpZGdldC1oZWFkZXJ7Ym9yZGVyOjFweCBzb2xpZCAjYWVkMGVhO2JhY2tncm91bmQ6I2RlZWRmNyB1cmwoImltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8xMDBfZGVlZGY3XzF4MTAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7Y29sb3I6IzIyMjtmb250LXdlaWdodDpib2xkfS51aS13aWRnZXQtaGVhZGVyIGF7Y29sb3I6IzIyMn0udWktc3RhdGUtZGVmYXVsdCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRlZmF1bHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHR7Ym9yZGVyOjFweCBzb2xpZCAjYWVkMGVhO2JhY2tncm91bmQ6I2Q3ZWJmOSB1cmwoImltYWdlcy91aS1iZ19nbGFzc184MF9kN2ViZjlfMXg0MDAucG5nIikgNTAlIDUwJSByZXBlYXQteDtmb250LXdlaWdodDpib2xkO2NvbG9yOiMyNzc5YWF9LnVpLXN0YXRlLWRlZmF1bHQgYSwudWktc3RhdGUtZGVmYXVsdCBhOmxpbmssLnVpLXN0YXRlLWRlZmF1bHQgYTp2aXNpdGVke2NvbG9yOiMyNzc5YWE7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXN0YXRlLWhvdmVyLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaG92ZXIsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhvdmVyLC51aS1zdGF0ZS1mb2N1cywudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWZvY3VzLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1mb2N1c3tib3JkZXI6MXB4IHNvbGlkICM3NGIyZTI7YmFja2dyb3VuZDojZTRmMWZiIHVybCgiaW1hZ2VzL3VpLWJnX2dsYXNzXzEwMF9lNGYxZmJfMXg0MDAucG5nIikgNTAlIDUwJSByZXBlYXQteDtmb250LXdlaWdodDpib2xkO2NvbG9yOiMwMDcwYTN9LnVpLXN0YXRlLWhvdmVyIGEsLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIsLnVpLXN0YXRlLWhvdmVyIGE6bGluaywudWktc3RhdGUtaG92ZXIgYTp2aXNpdGVkLC51aS1zdGF0ZS1mb2N1cyBhLC51aS1zdGF0ZS1mb2N1cyBhOmhvdmVyLC51aS1zdGF0ZS1mb2N1cyBhOmxpbmssLnVpLXN0YXRlLWZvY3VzIGE6dmlzaXRlZHtjb2xvcjojMDA3MGEzO3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1zdGF0ZS1hY3RpdmUsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1hY3RpdmUsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWFjdGl2ZXtib3JkZXI6MXB4IHNvbGlkICMyNjk0ZTg7YmFja2dyb3VuZDojM2JhYWUzIHVybCgiaW1hZ2VzL3VpLWJnX2dsYXNzXzUwXzNiYWFlM18xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6I2ZmZn0udWktc3RhdGUtYWN0aXZlIGEsLnVpLXN0YXRlLWFjdGl2ZSBhOmxpbmssLnVpLXN0YXRlLWFjdGl2ZSBhOnZpc2l0ZWR7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktc3RhdGUtaGlnaGxpZ2h0LC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0LC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHR7Ym9yZGVyOjFweCBzb2xpZCAjZjlkZDM0O2JhY2tncm91bmQ6I2ZmZWY4ZiB1cmwoImltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8yNV9mZmVmOGZfMXgxMDAucG5nIikgNTAlIHRvcCByZXBlYXQteDtjb2xvcjojMzYzNjM2fS51aS1zdGF0ZS1oaWdobGlnaHQgYSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCBhLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHQgYXtjb2xvcjojMzYzNjM2fS51aS1zdGF0ZS1lcnJvciwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvcntib3JkZXI6MXB4IHNvbGlkICNjZDBhMGE7YmFja2dyb3VuZDojY2QwYTBhO2NvbG9yOiNmZmZ9LnVpLXN0YXRlLWVycm9yIGEsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciBhLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvciBhe2NvbG9yOiNmZmZ9LnVpLXN0YXRlLWVycm9yLXRleHQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvci10ZXh0LC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvci10ZXh0e2NvbG9yOiNmZmZ9LnVpLXByaW9yaXR5LXByaW1hcnksLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1wcmltYXJ5LC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1wcmltYXJ5e2ZvbnQtd2VpZ2h0OmJvbGR9LnVpLXByaW9yaXR5LXNlY29uZGFyeSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXNlY29uZGFyeSwudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktc2Vjb25kYXJ5e29wYWNpdHk6Ljc7ZmlsdGVyOkFscGhhKE9wYWNpdHk9NzApO2ZvbnQtd2VpZ2h0Om5vcm1hbH0udWktc3RhdGUtZGlzYWJsZWQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kaXNhYmxlZCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGlzYWJsZWR7b3BhY2l0eTouMzU7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzUpO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWktc3RhdGUtZGlzYWJsZWQgLnVpLWljb257ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzUpfS51aS1pY29ue3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHh9LnVpLWljb24sLnVpLXdpZGdldC1jb250ZW50IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfNzJhN2NmXzI1NngyNDAucG5nIil9LnVpLXdpZGdldC1oZWFkZXIgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc183MmE3Y2ZfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtZGVmYXVsdCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zXzNkODBiM18yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1ob3ZlciAudWktaWNvbiwudWktc3RhdGUtZm9jdXMgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc18yNjk0ZThfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtYWN0aXZlIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZmZmZmZmXzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWhpZ2hsaWdodCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zXzJlODNmZl8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1lcnJvciAudWktaWNvbiwudWktc3RhdGUtZXJyb3ItdGV4dCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zX2ZmZmZmZl8yNTZ4MjQwLnBuZyIpfS51aS1pY29uLWJsYW5re2JhY2tncm91bmQtcG9zaXRpb246MTZweCAxNnB4fS51aS1pY29uLWNhcmF0LTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH0udWktaWNvbi1jYXJhdC0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggMH0udWktaWNvbi1jYXJhdC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAwfS51aS1pY29uLWNhcmF0LTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAwfS51aS1pY29uLWNhcmF0LTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IDB9LnVpLWljb24tY2FyYXQtMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IDB9LnVpLWljb24tY2FyYXQtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggMH0udWktaWNvbi1jYXJhdC0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IDB9LnVpLWljb24tY2FyYXQtMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggMH0udWktaWNvbi1jYXJhdC0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAwfS51aS1pY29uLXRyaWFuZ2xlLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTZweH0udWktaWNvbi1hcnJvdy0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIC0zMnB4fS51aS1pY29uLWFycm93LTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1uZS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLXNlLW53e2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTMycHh9LnVpLWljb24tYXJyb3d0aGljay0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMi1uZS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMi1zZS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTQ4cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjowIC02NHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJuLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJuLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJuLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJuLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC02NHB4fS51aS1pY29uLWFycm93LTR7YmFja2dyb3VuZC1wb3NpdGlvbjowIC04MHB4fS51aS1pY29uLWFycm93LTQtZGlhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC04MHB4fS51aS1pY29uLWV4dGxpbmt7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtODBweH0udWktaWNvbi1uZXd3aW57YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtODBweH0udWktaWNvbi1yZWZyZXNoe2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTgwcHh9LnVpLWljb24tc2h1ZmZsZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC04MHB4fS51aS1pY29uLXRyYW5zZmVyLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC04MHB4fS51aS1pY29uLXRyYW5zZmVydGhpY2stZS13e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC04MHB4fS51aS1pY29uLWZvbGRlci1jb2xsYXBzZWR7YmFja2dyb3VuZC1wb3NpdGlvbjowIC05NnB4fS51aS1pY29uLWZvbGRlci1vcGVue2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTk2cHh9LnVpLWljb24tZG9jdW1lbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtOTZweH0udWktaWNvbi1kb2N1bWVudC1ie2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTk2cHh9LnVpLWljb24tbm90ZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC05NnB4fS51aS1pY29uLW1haWwtY2xvc2Vke2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTk2cHh9LnVpLWljb24tbWFpbC1vcGVue2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTk2cHh9LnVpLWljb24tc3VpdGNhc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTk2cHh9LnVpLWljb24tY29tbWVudHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtOTZweH0udWktaWNvbi1wZXJzb257YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTk2cHh9LnVpLWljb24tcHJpbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTk2cHh9LnVpLWljb24tdHJhc2h7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTk2cHh9LnVpLWljb24tbG9ja2Vke2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC05NnB4fS51aS1pY29uLXVubG9ja2Vke2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC05NnB4fS51aS1pY29uLWJvb2ttYXJre2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC05NnB4fS51aS1pY29uLXRhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtOTZweH0udWktaWNvbi1ob21le2JhY2tncm91bmQtcG9zaXRpb246MCAtMTEycHh9LnVpLWljb24tZmxhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xMTJweH0udWktaWNvbi1jYWxlbmRhcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xMTJweH0udWktaWNvbi1jYXJ0e2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTExMnB4fS51aS1pY29uLXBlbmNpbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xMTJweH0udWktaWNvbi1jbG9ja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xMTJweH0udWktaWNvbi1kaXNre2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTExMnB4fS51aS1pY29uLWNhbGN1bGF0b3J7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTExMnB4fS51aS1pY29uLXpvb21pbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTEycHh9LnVpLWljb24tem9vbW91dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTEycHh9LnVpLWljb24tc2VhcmNoe2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0xMTJweH0udWktaWNvbi13cmVuY2h7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTExMnB4fS51aS1pY29uLWdlYXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTExMnB4fS51aS1pY29uLWhlYXJ0e2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0xMTJweH0udWktaWNvbi1zdGFye2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC0xMTJweH0udWktaWNvbi1saW5re2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0xMTJweH0udWktaWNvbi1jYW5jZWx7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMjhweH0udWktaWNvbi1wbHVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTEyOHB4fS51aS1pY29uLXBsdXN0aGlja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xMjhweH0udWktaWNvbi1taW51c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xMjhweH0udWktaWNvbi1taW51c3RoaWNre2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTEyOHB4fS51aS1pY29uLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTEyOHB4fS51aS1pY29uLWNsb3NldGhpY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTI4cHh9LnVpLWljb24ta2V5e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xMjhweH0udWktaWNvbi1saWdodGJ1bGJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTEyOHB4fS51aS1pY29uLXNjaXNzb3Jze2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xMjhweH0udWktaWNvbi1jbGlwYm9hcmR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTEyOHB4fS51aS1pY29uLWNvcHl7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTEyOHB4fS51aS1pY29uLWNvbnRhY3R7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTEyOHB4fS51aS1pY29uLWltYWdle2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0xMjhweH0udWktaWNvbi12aWRlb3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMTI4cHh9LnVpLWljb24tc2NyaXB0e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0xMjhweH0udWktaWNvbi1hbGVydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE0NHB4fS51aS1pY29uLWluZm97YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTQ0cHh9LnVpLWljb24tbm90aWNle2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE0NHB4fS51aS1pY29uLWhlbHB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTQ0cHh9LnVpLWljb24tY2hlY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTQ0cHh9LnVpLWljb24tYnVsbGV0e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE0NHB4fS51aS1pY29uLXJhZGlvLW9ue2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE0NHB4fS51aS1pY29uLXJhZGlvLW9mZntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTQ0cHh9LnVpLWljb24tcGluLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE0NHB4fS51aS1pY29uLXBpbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xNDRweH0udWktaWNvbi1wbGF5e2JhY2tncm91bmQtcG9zaXRpb246MCAtMTYwcHh9LnVpLWljb24tcGF1c2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTYwcHh9LnVpLWljb24tc2Vlay1uZXh0e2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE2MHB4fS51aS1pY29uLXNlZWstcHJldntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNjBweH0udWktaWNvbi1zZWVrLWVuZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNjBweH0udWktaWNvbi1zZWVrLXN0YXJ0e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE2MHB4fS51aS1pY29uLXNlZWstZmlyc3R7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTYwcHh9LnVpLWljb24tc3RvcHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNjBweH0udWktaWNvbi1lamVjdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTYwcHh9LnVpLWljb24tdm9sdW1lLW9mZntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTYwcHh9LnVpLWljb24tdm9sdW1lLW9ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xNjBweH0udWktaWNvbi1wb3dlcntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE3NnB4fS51aS1pY29uLXNpZ25hbC1kaWFne2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE3NnB4fS51aS1pY29uLXNpZ25hbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTB7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0xe2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktMntiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTN7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTc2cHh9LnVpLWljb24tY2lyY2xlLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xOTJweH0udWktaWNvbi1jaXJjbGUtbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1le2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS13e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1ue2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy1le2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy1ue2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtem9vbWlue2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtem9vbW91dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWNoZWNre2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGVzbWFsbC1wbHVze2JhY2tncm91bmQtcG9zaXRpb246MCAtMjA4cHh9LnVpLWljb24tY2lyY2xlc21hbGwtbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMjA4cHh9LnVpLWljb24tY2lyY2xlc21hbGwtY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0yMDhweH0udWktaWNvbi1zcXVhcmVzbWFsbC1taW51c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0yMDhweH0udWktaWNvbi1zcXVhcmVzbWFsbC1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0yMDhweH0udWktaWNvbi1ncmlwLWRvdHRlZC12ZXJ0aWNhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIyNHB4fS51aS1pY29uLWdyaXAtZG90dGVkLWhvcml6b250YWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMjI0cHh9LnVpLWljb24tZ3JpcC1zb2xpZC12ZXJ0aWNhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0yMjRweH0udWktaWNvbi1ncmlwLXNvbGlkLWhvcml6b250YWx7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMjI0cHh9LnVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNle2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTIyNHB4fS51aS1pY29uLWdyaXAtZGlhZ29uYWwtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMjI0cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci10b3AsLnVpLWNvcm5lci1sZWZ0LC51aS1jb3JuZXItdGx7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo2cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci10b3AsLnVpLWNvcm5lci1yaWdodCwudWktY29ybmVyLXRye2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjZweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLWJvdHRvbSwudWktY29ybmVyLWxlZnQsLnVpLWNvcm5lci1ibHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjZweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLWJvdHRvbSwudWktY29ybmVyLXJpZ2h0LC51aS1jb3JuZXItYnJ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NnB4fS51aS13aWRnZXQtb3ZlcmxheXtiYWNrZ3JvdW5kOiNlZWUgdXJsKCJpbWFnZXMvdWktYmdfZGlhZ29uYWxzLXRoaWNrXzkwX2VlZWVlZV80MHg0MC5wbmciKSA1MCUgNTAlIHJlcGVhdDtvcGFjaXR5Oi44O2ZpbHRlcjpBbHBoYShPcGFjaXR5PTgwKX0udWktd2lkZ2V0LXNoYWRvd3ttYXJnaW46LTdweCAwIDAgLTdweDtwYWRkaW5nOjdweDtiYWNrZ3JvdW5kOiMwMDAgdXJsKCJpbWFnZXMvdWktYmdfaGlnaGxpZ2h0LWhhcmRfNzBfMDAwMDAwXzF4MTAwLnBuZyIpIDUwJSB0b3AgcmVwZWF0LXg7b3BhY2l0eTouMztmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zMCk7Ym9yZGVyLXJhZGl1czo4cHh9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vanF1ZXJ5LXVpLm1pbi5qcyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2pxdWVyeS11aS5taW4uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODA0NmYuLjAwMDAwMDAKLS0tIGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vanF1ZXJ5LXVpLm1pbi5qcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qISBqUXVlcnkgVUkgLSB2MS4xMS40IC0gMjAxNi0wMi0yOAotKiBodHRwOi8vanF1ZXJ5dWkuY29tCi0qIEluY2x1ZGVzOiBjb3JlLmpzLCB3aWRnZXQuanMsIG1vdXNlLmpzLCBwb3NpdGlvbi5qcywgZHJhZ2dhYmxlLmpzLCBkcm9wcGFibGUuanMsIHJlc2l6YWJsZS5qcywgc2VsZWN0YWJsZS5qcywgc29ydGFibGUuanMsIGFjY29yZGlvbi5qcywgYXV0b2NvbXBsZXRlLmpzLCBidXR0b24uanMsIGRhdGVwaWNrZXIuanMsIGRpYWxvZy5qcywgbWVudS5qcywgcHJvZ3Jlc3NiYXIuanMsIHNlbGVjdG1lbnUuanMsIHNsaWRlci5qcywgc3Bpbm5lci5qcywgdGFicy5qcywgdG9vbHRpcC5qcywgZWZmZWN0LmpzLCBlZmZlY3QtYmxpbmQuanMsIGVmZmVjdC1ib3VuY2UuanMsIGVmZmVjdC1jbGlwLmpzLCBlZmZlY3QtZHJvcC5qcywgZWZmZWN0LWV4cGxvZGUuanMsIGVmZmVjdC1mYWRlLmpzLCBlZmZlY3QtZm9sZC5qcywgZWZmZWN0LWhpZ2hsaWdodC5qcywgZWZmZWN0LXB1ZmYuanMsIGVmZmVjdC1wdWxzYXRlLmpzLCBlZmZlY3Qtc2NhbGUuanMsIGVmZmVjdC1zaGFrZS5qcywgZWZmZWN0LXNpemUuanMsIGVmZmVjdC1zbGlkZS5qcywgZWZmZWN0LXRyYW5zZmVyLmpzCi0qIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KLQotKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5Il0sZSk6ZShqUXVlcnkpfSkoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LHMpe3ZhciBuLGEsbyxyPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iYXJlYSI9PT1yPyhuPXQucGFyZW50Tm9kZSxhPW4ubmFtZSx0LmhyZWYmJmEmJiJtYXAiPT09bi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPyhvPWUoImltZ1t1c2VtYXA9JyMiK2ErIiddIilbMF0sISFvJiZpKG8pKTohMSk6KC9eKGlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvLnRlc3Qocik/IXQuZGlzYWJsZWQ6ImEiPT09cj90LmhyZWZ8fHM6cykmJmkodCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZS5leHByLmZpbHRlcnMudmlzaWJsZSh0KSYmIWUodCkucGFyZW50cygpLmFkZEJhY2soKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4iaGlkZGVuIj09PWUuY3NzKHRoaXMsInZpc2liaWxpdHkiKX0pLmxlbmd0aH1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgdCxpO2UubGVuZ3RoJiZlWzBdIT09ZG9jdW1lbnQ7KXtpZih0PWUuY3NzKCJwb3NpdGlvbiIpLCgiYWJzb2x1dGUiPT09dHx8InJlbGF0aXZlIj09PXR8fCJmaXhlZCI9PT10KSYmKGk9cGFyc2VJbnQoZS5jc3MoInpJbmRleCIpLDEwKSwhaXNOYU4oaSkmJjAhPT1pKSlyZXR1cm4gaTtlPWUucGFyZW50KCl9cmV0dXJuIDB9ZnVuY3Rpb24gbigpe3RoaXMuX2N1ckluc3Q9bnVsbCx0aGlzLl9rZXlFdmVudD0hMSx0aGlzLl9kaXNhYmxlZElucHV0cz1bXSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSx0aGlzLl9pbkRpYWxvZz0hMSx0aGlzLl9tYWluRGl2SWQ9InVpLWRhdGVwaWNrZXItZGl2Iix0aGlzLl9pbmxpbmVDbGFzcz0idWktZGF0ZXBpY2tlci1pbmxpbmUiLHRoaXMuX2FwcGVuZENsYXNzPSJ1aS1kYXRlcGlja2VyLWFwcGVuZCIsdGhpcy5fdHJpZ2dlckNsYXNzPSJ1aS1kYXRlcGlja2VyLXRyaWdnZXIiLHRoaXMuX2RpYWxvZ0NsYXNzPSJ1aS1kYXRlcGlja2VyLWRpYWxvZyIsdGhpcy5fZGlzYWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWRpc2FibGVkIix0aGlzLl91bnNlbGVjdGFibGVDbGFzcz0idWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUiLHRoaXMuX2N1cnJlbnRDbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSIsdGhpcy5fZGF5T3ZlckNsYXNzPSJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyIix0aGlzLnJlZ2lvbmFsPVtdLHRoaXMucmVnaW9uYWxbIiJdPXtjbG9zZVRleHQ6IkRvbmUiLHByZXZUZXh0OiJQcmV2IixuZXh0VGV4dDoiTmV4dCIsY3VycmVudFRleHQ6IlRvZGF5Iixtb250aE5hbWVzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxtb250aE5hbWVzU2hvcnQ6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxkYXlOYW1lczpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sZGF5TmFtZXNTaG9ydDpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLGRheU5hbWVzTWluOlsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSx3ZWVrSGVhZGVyOiJXayIsZGF0ZUZvcm1hdDoibW0vZGQveXkiLGZpcnN0RGF5OjAsaXNSVEw6ITEsc2hvd01vbnRoQWZ0ZXJZZWFyOiExLHllYXJTdWZmaXg6IiJ9LHRoaXMuX2RlZmF1bHRzPXtzaG93T246ImZvY3VzIixzaG93QW5pbToiZmFkZUluIixzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0ZTpudWxsLGFwcGVuZFRleHQ6IiIsYnV0dG9uVGV4dDoiLi4uIixidXR0b25JbWFnZToiIixidXR0b25JbWFnZU9ubHk6ITEsaGlkZUlmTm9QcmV2TmV4dDohMSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OiExLGdvdG9DdXJyZW50OiExLGNoYW5nZU1vbnRoOiExLGNoYW5nZVllYXI6ITEseWVhclJhbmdlOiJjLTEwOmMrMTAiLHNob3dPdGhlck1vbnRoczohMSxzZWxlY3RPdGhlck1vbnRoczohMSxzaG93V2VlazohMSxjYWxjdWxhdGVXZWVrOnRoaXMuaXNvODYwMVdlZWssc2hvcnRZZWFyQ3V0b2ZmOiIrMTAiLG1pbkRhdGU6bnVsbCxtYXhEYXRlOm51bGwsZHVyYXRpb246ImZhc3QiLGJlZm9yZVNob3dEYXk6bnVsbCxiZWZvcmVTaG93Om51bGwsb25TZWxlY3Q6bnVsbCxvbkNoYW5nZU1vbnRoWWVhcjpudWxsLG9uQ2xvc2U6bnVsbCxudW1iZXJPZk1vbnRoczoxLHNob3dDdXJyZW50QXRQb3M6MCxzdGVwTW9udGhzOjEsc3RlcEJpZ01vbnRoczoxMixhbHRGaWVsZDoiIixhbHRGb3JtYXQ6IiIsY29uc3RyYWluSW5wdXQ6ITAsc2hvd0J1dHRvblBhbmVsOiExLGF1dG9TaXplOiExLGRpc2FibGVkOiExfSxlLmV4dGVuZCh0aGlzLl9kZWZhdWx0cyx0aGlzLnJlZ2lvbmFsWyIiXSksdGhpcy5yZWdpb25hbC5lbj1lLmV4dGVuZCghMCx7fSx0aGlzLnJlZ2lvbmFsWyIiXSksdGhpcy5yZWdpb25hbFsiZW4tVVMiXT1lLmV4dGVuZCghMCx7fSx0aGlzLnJlZ2lvbmFsLmVuKSx0aGlzLmRwRGl2PWEoZSgiPGRpdiBpZD0nIit0aGlzLl9tYWluRGl2SWQrIicgY2xhc3M9J3VpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsJz48L2Rpdj4iKSl9ZnVuY3Rpb24gYSh0KXt2YXIgaT0iYnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1uZXh0LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhIjtyZXR1cm4gdC5kZWxlZ2F0ZShpLCJtb3VzZW91dCIsZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikmJmUodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1uZXh0IikmJmUodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpfSkuZGVsZWdhdGUoaSwibW91c2VvdmVyIixvKX1mdW5jdGlvbiBvKCl7ZS5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcih2LmlubGluZT92LmRwRGl2LnBhcmVudCgpWzBdOnYuaW5wdXRbMF0pfHwoZSh0aGlzKS5wYXJlbnRzKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpLmZpbmQoImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKSxlKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikmJmUodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpLC0xIT09dGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1uZXh0IikmJmUodGhpcykuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpKX1mdW5jdGlvbiByKHQsaSl7ZS5leHRlbmQodCxpKTtmb3IodmFyIHMgaW4gaSludWxsPT1pW3NdJiYodFtzXT1pW3NdKTtyZXR1cm4gdH1mdW5jdGlvbiBoKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudC52YWwoKTtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9yZWZyZXNoKCksdCE9PXRoaXMuZWxlbWVudC52YWwoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIil9fWUudWk9ZS51aXx8e30sZS5leHRlbmQoZS51aSx7dmVyc2lvbjoiMS4xMS40IixrZXlDb2RlOntCQUNLU1BBQ0U6OCxDT01NQToxODgsREVMRVRFOjQ2LERPV046NDAsRU5EOjM1LEVOVEVSOjEzLEVTQ0FQRToyNyxIT01FOjM2LExFRlQ6MzcsUEFHRV9ET1dOOjM0LFBBR0VfVVA6MzMsUEVSSU9EOjE5MCxSSUdIVDozOSxTUEFDRTozMixUQUI6OSxVUDozOH19KSxlLmZuLmV4dGVuZCh7c2Nyb2xsUGFyZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY3NzKCJwb3NpdGlvbiIpLHM9ImFic29sdXRlIj09PWksbj10Py8oYXV0b3xzY3JvbGx8aGlkZGVuKS86LyhhdXRvfHNjcm9sbCkvLGE9dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gcyYmInN0YXRpYyI9PT10LmNzcygicG9zaXRpb24iKT8hMTpuLnRlc3QodC5jc3MoIm92ZXJmbG93IikrdC5jc3MoIm92ZXJmbG93LXkiKSt0LmNzcygib3ZlcmZsb3cteCIpKX0pLmVxKDApO3JldHVybiJmaXhlZCIhPT1pJiZhLmxlbmd0aD9hOmUodGhpc1swXS5vd25lckRvY3VtZW50fHxkb2N1bWVudCl9LHVuaXF1ZUlkOmZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5pZHx8KHRoaXMuaWQ9InVpLWlkLSIrICsrZSl9KX19KCkscmVtb3ZlVW5pcXVlSWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7L151aS1pZC1cZCskLy50ZXN0KHRoaXMuaWQpJiZlKHRoaXMpLnJlbW92ZUF0dHIoImlkIil9KX19KSxlLmV4dGVuZChlLmV4cHJbIjoiXSx7ZGF0YTplLmV4cHIuY3JlYXRlUHNldWRvP2UuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiEhZS5kYXRhKGksdCl9fSk6ZnVuY3Rpb24odCxpLHMpe3JldHVybiEhZS5kYXRhKHQsc1szXSl9LGZvY3VzYWJsZTpmdW5jdGlvbihpKXtyZXR1cm4gdChpLCFpc05hTihlLmF0dHIoaSwidGFiaW5kZXgiKSkpfSx0YWJiYWJsZTpmdW5jdGlvbihpKXt2YXIgcz1lLmF0dHIoaSwidGFiaW5kZXgiKSxuPWlzTmFOKHMpO3JldHVybihufHxzPj0wKSYmdChpLCFuKX19KSxlKCI8YT4iKS5vdXRlcldpZHRoKDEpLmpxdWVyeXx8ZS5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHModCxpLHMsYSl7cmV0dXJuIGUuZWFjaChuLGZ1bmN0aW9uKCl7aS09cGFyc2VGbG9hdChlLmNzcyh0LCJwYWRkaW5nIit0aGlzKSl8fDAscyYmKGktPXBhcnNlRmxvYXQoZS5jc3ModCwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MCksYSYmKGktPXBhcnNlRmxvYXQoZS5jc3ModCwibWFyZ2luIit0aGlzKSl8fDApfSksaX12YXIgbj0iV2lkdGgiPT09aT9bIkxlZnQiLCJSaWdodCJdOlsiVG9wIiwiQm90dG9tIl0sYT1pLnRvTG93ZXJDYXNlKCksbz17aW5uZXJXaWR0aDplLmZuLmlubmVyV2lkdGgsaW5uZXJIZWlnaHQ6ZS5mbi5pbm5lckhlaWdodCxvdXRlcldpZHRoOmUuZm4ub3V0ZXJXaWR0aCxvdXRlckhlaWdodDplLmZuLm91dGVySGVpZ2h0fTtlLmZuWyJpbm5lciIraV09ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/b1siaW5uZXIiK2ldLmNhbGwodGhpcyk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3MoYSxzKHRoaXMsdCkrInB4Iil9KX0sZS5mblsib3V0ZXIiK2ldPWZ1bmN0aW9uKHQsbil7cmV0dXJuIm51bWJlciIhPXR5cGVvZiB0P29bIm91dGVyIitpXS5jYWxsKHRoaXMsdCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jc3MoYSxzKHRoaXMsdCwhMCxuKSsicHgiKX0pfX0pLGUuZm4uYWRkQmFja3x8KGUuZm4uYWRkQmFjaz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9KSxlKCI8YT4iKS5kYXRhKCJhLWIiLCJhIikucmVtb3ZlRGF0YSgiYS1iIikuZGF0YSgiYS1iIikmJihlLmZuLnJlbW92ZURhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuY2FsbCh0aGlzLGUuY2FtZWxDYXNlKGkpKTp0LmNhbGwodGhpcyl9fShlLmZuLnJlbW92ZURhdGEpKSxlLnVpLmllPSEhL21zaWUgW1x3Ll0rLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSksZS5mbi5leHRlbmQoe2ZvY3VzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMpe3JldHVybiJudW1iZXIiPT10eXBlb2YgaT90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlKHQpLmZvY3VzKCkscyYmcy5jYWxsKHQpfSxpKX0pOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oZS5mbi5mb2N1cyksZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3ZhciBlPSJvbnNlbGVjdHN0YXJ0ImluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpPyJzZWxlY3RzdGFydCI6Im1vdXNlZG93biI7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmluZChlKyIudWktZGlzYWJsZVNlbGVjdGlvbiIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfSl9fSgpLGVuYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuYmluZCgiLnVpLWRpc2FibGVTZWxlY3Rpb24iKX0sekluZGV4OmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpcmV0dXJuIHRoaXMuY3NzKCJ6SW5kZXgiLHQpO2lmKHRoaXMubGVuZ3RoKWZvcih2YXIgaSxzLG49ZSh0aGlzWzBdKTtuLmxlbmd0aCYmblswXSE9PWRvY3VtZW50Oyl7aWYoaT1uLmNzcygicG9zaXRpb24iKSwoImFic29sdXRlIj09PWl8fCJyZWxhdGl2ZSI9PT1pfHwiZml4ZWQiPT09aSkmJihzPXBhcnNlSW50KG4uY3NzKCJ6SW5kZXgiKSwxMCksIWlzTmFOKHMpJiYwIT09cykpcmV0dXJuIHM7bj1uLnBhcmVudCgpfXJldHVybiAwfX0pLGUudWkucGx1Z2luPXthZGQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGE9ZS51aVt0XS5wcm90b3R5cGU7Zm9yKG4gaW4gcylhLnBsdWdpbnNbbl09YS5wbHVnaW5zW25dfHxbXSxhLnBsdWdpbnNbbl0ucHVzaChbaSxzW25dXSl9LGNhbGw6ZnVuY3Rpb24oZSx0LGkscyl7dmFyIG4sYT1lLnBsdWdpbnNbdF07aWYoYSYmKHN8fGUuZWxlbWVudFswXS5wYXJlbnROb2RlJiYxMSE9PWUuZWxlbWVudFswXS5wYXJlbnROb2RlLm5vZGVUeXBlKSlmb3Iobj0wO2EubGVuZ3RoPm47bisrKWUub3B0aW9uc1thW25dWzBdXSYmYVtuXVsxXS5hcHBseShlLmVsZW1lbnQsaSl9fTt2YXIgbD0wLHU9QXJyYXkucHJvdG90eXBlLnNsaWNlO2UuY2xlYW5EYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcyxuLGE7Zm9yKGE9MDtudWxsIT0obj1pW2FdKTthKyspdHJ5e3M9ZS5fZGF0YShuLCJldmVudHMiKSxzJiZzLnJlbW92ZSYmZShuKS50cmlnZ2VySGFuZGxlcigicmVtb3ZlIil9Y2F0Y2gobyl7fXQoaSl9fShlLmNsZWFuRGF0YSksZS53aWRnZXQ9ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbyxyLGg9e30sbD10LnNwbGl0KCIuIilbMF07cmV0dXJuIHQ9dC5zcGxpdCgiLiIpWzFdLG49bCsiLSIrdCxzfHwocz1pLGk9ZS5XaWRnZXQpLGUuZXhwclsiOiJdW24udG9Mb3dlckNhc2UoKV09ZnVuY3Rpb24odCl7cmV0dXJuISFlLmRhdGEodCxuKX0sZVtsXT1lW2xdfHx7fSxhPWVbbF1bdF0sbz1lW2xdW3RdPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2NyZWF0ZVdpZGdldD8oYXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KGUsdCksdm9pZCAwKTpuZXcgbyhlLHQpfSxlLmV4dGVuZChvLGEse3ZlcnNpb246cy52ZXJzaW9uLF9wcm90bzplLmV4dGVuZCh7fSxzKSxfY2hpbGRDb25zdHJ1Y3RvcnM6W119KSxyPW5ldyBpLHIub3B0aW9ucz1lLndpZGdldC5leHRlbmQoe30sci5vcHRpb25zKSxlLmVhY2gocyxmdW5jdGlvbih0LHMpe3JldHVybiBlLmlzRnVuY3Rpb24ocyk/KGhbdF09ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe3JldHVybiBpLnByb3RvdHlwZVt0XS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG49ZnVuY3Rpb24oZSl7cmV0dXJuIGkucHJvdG90eXBlW3RdLmFwcGx5KHRoaXMsZSl9O3JldHVybiBmdW5jdGlvbigpe3ZhciB0LGk9dGhpcy5fc3VwZXIsYT10aGlzLl9zdXBlckFwcGx5O3JldHVybiB0aGlzLl9zdXBlcj1lLHRoaXMuX3N1cGVyQXBwbHk9bix0PXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3N1cGVyPWksdGhpcy5fc3VwZXJBcHBseT1hLHR9fSgpLHZvaWQgMCk6KGhbdF09cyx2b2lkIDApfSksby5wcm90b3R5cGU9ZS53aWRnZXQuZXh0ZW5kKHIse3dpZGdldEV2ZW50UHJlZml4OmE/ci53aWRnZXRFdmVudFByZWZpeHx8dDp0fSxoLHtjb25zdHJ1Y3RvcjpvLG5hbWVzcGFjZTpsLHdpZGdldE5hbWU6dCx3aWRnZXRGdWxsTmFtZTpufSksYT8oZS5lYWNoKGEuX2NoaWxkQ29uc3RydWN0b3JzLGZ1bmN0aW9uKHQsaSl7dmFyIHM9aS5wcm90b3R5cGU7ZS53aWRnZXQocy5uYW1lc3BhY2UrIi4iK3Mud2lkZ2V0TmFtZSxvLGkuX3Byb3RvKX0pLGRlbGV0ZSBhLl9jaGlsZENvbnN0cnVjdG9ycyk6aS5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaChvKSxlLndpZGdldC5icmlkZ2UodCxvKSxvfSxlLndpZGdldC5leHRlbmQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBpLHMsbj11LmNhbGwoYXJndW1lbnRzLDEpLGE9MCxvPW4ubGVuZ3RoO28+YTthKyspZm9yKGkgaW4gblthXSlzPW5bYV1baV0sblthXS5oYXNPd25Qcm9wZXJ0eShpKSYmdm9pZCAwIT09cyYmKHRbaV09ZS5pc1BsYWluT2JqZWN0KHMpP2UuaXNQbGFpbk9iamVjdCh0W2ldKT9lLndpZGdldC5leHRlbmQoe30sdFtpXSxzKTplLndpZGdldC5leHRlbmQoe30scyk6cyk7cmV0dXJuIHR9LGUud2lkZ2V0LmJyaWRnZT1mdW5jdGlvbih0LGkpe3ZhciBzPWkucHJvdG90eXBlLndpZGdldEZ1bGxOYW1lfHx0O2UuZm5bdF09ZnVuY3Rpb24obil7dmFyIGE9InN0cmluZyI9PXR5cGVvZiBuLG89dS5jYWxsKGFyZ3VtZW50cywxKSxyPXRoaXM7cmV0dXJuIGE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGksYT1lLmRhdGEodGhpcyxzKTtyZXR1cm4iaW5zdGFuY2UiPT09bj8ocj1hLCExKTphP2UuaXNGdW5jdGlvbihhW25dKSYmIl8iIT09bi5jaGFyQXQoMCk/KGk9YVtuXS5hcHBseShhLG8pLGkhPT1hJiZ2b2lkIDAhPT1pPyhyPWkmJmkuanF1ZXJ5P3IucHVzaFN0YWNrKGkuZ2V0KCkpOmksITEpOnZvaWQgMCk6ZS5lcnJvcigibm8gc3VjaCBtZXRob2QgJyIrbisiJyBmb3IgIit0KyIgd2lkZ2V0IGluc3RhbmNlIik6ZS5lcnJvcigiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiAiK3QrIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIisiYXR0ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICciK24rIiciKX0pOihvLmxlbmd0aCYmKG49ZS53aWRnZXQuZXh0ZW5kLmFwcGx5KG51bGwsW25dLmNvbmNhdChvKSkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUuZGF0YSh0aGlzLHMpO3Q/KHQub3B0aW9uKG58fHt9KSx0Ll9pbml0JiZ0Ll9pbml0KCkpOmUuZGF0YSh0aGlzLHMsbmV3IGkobix0aGlzKSl9KSkscn19LGUuV2lkZ2V0PWZ1bmN0aW9uKCl7fSxlLldpZGdldC5fY2hpbGRDb25zdHJ1Y3RvcnM9W10sZS5XaWRnZXQucHJvdG90eXBlPXt3aWRnZXROYW1lOiJ3aWRnZXQiLHdpZGdldEV2ZW50UHJlZml4OiIiLGRlZmF1bHRFbGVtZW50OiI8ZGl2PiIsb3B0aW9uczp7ZGlzYWJsZWQ6ITEsY3JlYXRlOm51bGx9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24odCxpKXtpPWUoaXx8dGhpcy5kZWZhdWx0RWxlbWVudHx8dGhpcylbMF0sdGhpcy5lbGVtZW50PWUoaSksdGhpcy51dWlkPWwrKyx0aGlzLmV2ZW50TmFtZXNwYWNlPSIuIit0aGlzLndpZGdldE5hbWUrdGhpcy51dWlkLHRoaXMuYmluZGluZ3M9ZSgpLHRoaXMuaG92ZXJhYmxlPWUoKSx0aGlzLmZvY3VzYWJsZT1lKCksaSE9PXRoaXMmJihlLmRhdGEoaSx0aGlzLndpZGdldEZ1bGxOYW1lLHRoaXMpLHRoaXMuX29uKCEwLHRoaXMuZWxlbWVudCx7cmVtb3ZlOmZ1bmN0aW9uKGUpe2UudGFyZ2V0PT09aSYmdGhpcy5kZXN0cm95KCl9fSksdGhpcy5kb2N1bWVudD1lKGkuc3R5bGU/aS5vd25lckRvY3VtZW50OmkuZG9jdW1lbnR8fGkpLHRoaXMud2luZG93PWUodGhpcy5kb2N1bWVudFswXS5kZWZhdWx0Vmlld3x8dGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cpKSx0aGlzLm9wdGlvbnM9ZS53aWRnZXQuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyx0aGlzLl9nZXRDcmVhdGVPcHRpb25zKCksdCksdGhpcy5fY3JlYXRlKCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIixudWxsLHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpKSx0aGlzLl9pbml0KCl9LF9nZXRDcmVhdGVPcHRpb25zOmUubm9vcCxfZ2V0Q3JlYXRlRXZlbnREYXRhOmUubm9vcCxfY3JlYXRlOmUubm9vcCxfaW5pdDplLm5vb3AsZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3koKSx0aGlzLmVsZW1lbnQudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZURhdGEodGhpcy53aWRnZXRGdWxsTmFtZSkucmVtb3ZlRGF0YShlLmNhbWVsQ2FzZSh0aGlzLndpZGdldEZ1bGxOYW1lKSksdGhpcy53aWRnZXQoKS51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLnJlbW92ZUNsYXNzKHRoaXMud2lkZ2V0RnVsbE5hbWUrIi1kaXNhYmxlZCAiKyJ1aS1zdGF0ZS1kaXNhYmxlZCIpLHRoaXMuYmluZGluZ3MudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLHRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSxfZGVzdHJveTplLm5vb3Asd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudH0sb3B0aW9uOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89dDtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS53aWRnZXQuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlmKG89e30scz10LnNwbGl0KCIuIiksdD1zLnNoaWZ0KCkscy5sZW5ndGgpe2ZvcihuPW9bdF09ZS53aWRnZXQuZXh0ZW5kKHt9LHRoaXMub3B0aW9uc1t0XSksYT0wO3MubGVuZ3RoLTE+YTthKyspbltzW2FdXT1uW3NbYV1dfHx7fSxuPW5bc1thXV07aWYodD1zLnBvcCgpLDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1uW3RdP251bGw6blt0XTtuW3RdPWl9ZWxzZXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dGhpcy5vcHRpb25zW3RdP251bGw6dGhpcy5vcHRpb25zW3RdO29bdF09aX1yZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyhvKSx0aGlzfSxfc2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXRoaXMuX3NldE9wdGlvbih0LGVbdF0pO3JldHVybiB0aGlzfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub3B0aW9uc1tlXT10LCJkaXNhYmxlZCI9PT1lJiYodGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcyh0aGlzLndpZGdldEZ1bGxOYW1lKyItZGlzYWJsZWQiLCEhdCksdCYmKHRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpKSksdGhpc30sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoe2Rpc2FibGVkOiExfSl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ITB9KX0sX29uOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhPXRoaXM7ImJvb2xlYW4iIT10eXBlb2YgdCYmKHM9aSxpPXQsdD0hMSkscz8oaT1uPWUoaSksdGhpcy5iaW5kaW5ncz10aGlzLmJpbmRpbmdzLmFkZChpKSk6KHM9aSxpPXRoaXMuZWxlbWVudCxuPXRoaXMud2lkZ2V0KCkpLGUuZWFjaChzLGZ1bmN0aW9uKHMsbyl7ZnVuY3Rpb24gcigpe3JldHVybiB0fHxhLm9wdGlvbnMuZGlzYWJsZWQhPT0hMCYmIWUodGhpcykuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIik/KCJzdHJpbmciPT10eXBlb2Ygbz9hW29dOm8pLmFwcGx5KGEsYXJndW1lbnRzKTp2b2lkIDB9InN0cmluZyIhPXR5cGVvZiBvJiYoci5ndWlkPW8uZ3VpZD1vLmd1aWR8fHIuZ3VpZHx8ZS5ndWlkKyspO3ZhciBoPXMubWF0Y2goL14oW1x3Oi1dKilccyooLiopJC8pLGw9aFsxXSthLmV2ZW50TmFtZXNwYWNlLHU9aFsyXTt1P24uZGVsZWdhdGUodSxsLHIpOmkuYmluZChsLHIpfSl9LF9vZmY6ZnVuY3Rpb24odCxpKXtpPShpfHwiIikuc3BsaXQoIiAiKS5qb2luKHRoaXMuZXZlbnROYW1lc3BhY2UrIiAiKSt0aGlzLmV2ZW50TmFtZXNwYWNlLHQudW5iaW5kKGkpLnVuZGVsZWdhdGUoaSksdGhpcy5iaW5kaW5ncz1lKHRoaXMuYmluZGluZ3Mubm90KHQpLmdldCgpKSx0aGlzLmZvY3VzYWJsZT1lKHRoaXMuZm9jdXNhYmxlLm5vdCh0KS5nZXQoKSksdGhpcy5ob3ZlcmFibGU9ZSh0aGlzLmhvdmVyYWJsZS5ub3QodCkuZ2V0KCkpfSxfZGVsYXk6ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKCl7cmV0dXJuKCJzdHJpbmciPT10eXBlb2YgZT9zW2VdOmUpLmFwcGx5KHMsYXJndW1lbnRzKX12YXIgcz10aGlzO3JldHVybiBzZXRUaW1lb3V0KGksdHx8MCl9LF9ob3ZlcmFibGU6ZnVuY3Rpb24odCl7dGhpcy5ob3ZlcmFibGU9dGhpcy5ob3ZlcmFibGUuYWRkKHQpLHRoaXMuX29uKHQse21vdXNlZW50ZXI6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX19KX0sX2ZvY3VzYWJsZTpmdW5jdGlvbih0KXt0aGlzLmZvY3VzYWJsZT10aGlzLmZvY3VzYWJsZS5hZGQodCksdGhpcy5fb24odCx7Zm9jdXNpbjpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9LGZvY3Vzb3V0OmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX19KX0sX3RyaWdnZXI6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbz10aGlzLm9wdGlvbnNbdF07aWYocz1zfHx7fSxpPWUuRXZlbnQoaSksaS50eXBlPSh0PT09dGhpcy53aWRnZXRFdmVudFByZWZpeD90OnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrdCkudG9Mb3dlckNhc2UoKSxpLnRhcmdldD10aGlzLmVsZW1lbnRbMF0sYT1pLm9yaWdpbmFsRXZlbnQpZm9yKG4gaW4gYSluIGluIGl8fChpW25dPWFbbl0pO3JldHVybiB0aGlzLmVsZW1lbnQudHJpZ2dlcihpLHMpLCEoZS5pc0Z1bmN0aW9uKG8pJiZvLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbaV0uY29uY2F0KHMpKT09PSExfHxpLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19LGUuZWFjaCh7c2hvdzoiZmFkZUluIixoaWRlOiJmYWRlT3V0In0sZnVuY3Rpb24odCxpKXtlLldpZGdldC5wcm90b3R5cGVbIl8iK3RdPWZ1bmN0aW9uKHMsbixhKXsic3RyaW5nIj09dHlwZW9mIG4mJihuPXtlZmZlY3Q6bn0pO3ZhciBvLHI9bj9uPT09ITB8fCJudW1iZXIiPT10eXBlb2Ygbj9pOm4uZWZmZWN0fHxpOnQ7bj1ufHx7fSwibnVtYmVyIj09dHlwZW9mIG4mJihuPXtkdXJhdGlvbjpufSksbz0hZS5pc0VtcHR5T2JqZWN0KG4pLG4uY29tcGxldGU9YSxuLmRlbGF5JiZzLmRlbGF5KG4uZGVsYXkpLG8mJmUuZWZmZWN0cyYmZS5lZmZlY3RzLmVmZmVjdFtyXT9zW3RdKG4pOnIhPT10JiZzW3JdP3Nbcl0obi5kdXJhdGlvbixuLmVhc2luZyxhKTpzLnF1ZXVlKGZ1bmN0aW9uKGkpe2UodGhpcylbdF0oKSxhJiZhLmNhbGwoc1swXSksaSgpfSl9fSksZS53aWRnZXQ7dmFyIGQ9ITE7ZShkb2N1bWVudCkubW91c2V1cChmdW5jdGlvbigpe2Q9ITF9KSxlLndpZGdldCgidWkubW91c2UiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2NhbmNlbDoiaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNlbGVjdCxvcHRpb24iLGRpc3RhbmNlOjEsZGVsYXk6MH0sX21vdXNlSW5pdDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5lbGVtZW50LmJpbmQoIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihlKXtyZXR1cm4gdC5fbW91c2VEb3duKGUpfSkuYmluZCgiY2xpY2suIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oaSl7cmV0dXJuITA9PT1lLmRhdGEoaS50YXJnZXQsdC53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKT8oZS5yZW1vdmVEYXRhKGkudGFyZ2V0LHQud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiksaS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwhMSk6dm9pZCAwfSksdGhpcy5zdGFydGVkPSExfSxfbW91c2VEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSYmdGhpcy5kb2N1bWVudC51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSl9LF9tb3VzZURvd246ZnVuY3Rpb24odCl7aWYoIWQpe3RoaXMuX21vdXNlTW92ZWQ9ITEsdGhpcy5fbW91c2VTdGFydGVkJiZ0aGlzLl9tb3VzZVVwKHQpLHRoaXMuX21vdXNlRG93bkV2ZW50PXQ7dmFyIGk9dGhpcyxzPTE9PT10LndoaWNoLG49InN0cmluZyI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuY2FuY2VsJiZ0LnRhcmdldC5ub2RlTmFtZT9lKHQudGFyZ2V0KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aDohMTtyZXR1cm4gcyYmIW4mJnRoaXMuX21vdXNlQ2FwdHVyZSh0KT8odGhpcy5tb3VzZURlbGF5TWV0PSF0aGlzLm9wdGlvbnMuZGVsYXksdGhpcy5tb3VzZURlbGF5TWV0fHwodGhpcy5fbW91c2VEZWxheVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLm1vdXNlRGVsYXlNZXQ9ITB9LHRoaXMub3B0aW9ucy5kZWxheSkpLHRoaXMuX21vdXNlRGlzdGFuY2VNZXQodCkmJnRoaXMuX21vdXNlRGVsYXlNZXQodCkmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0KSE9PSExLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpPyh0LnByZXZlbnREZWZhdWx0KCksITApOighMD09PWUuZGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpJiZlLnJlbW92ZURhdGEodC50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaS5fbW91c2VNb3ZlKGUpfSx0aGlzLl9tb3VzZVVwRGVsZWdhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuX21vdXNlVXAoZSl9LHRoaXMuZG9jdW1lbnQuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdC5wcmV2ZW50RGVmYXVsdCgpLGQ9ITAsITApKTohMH19LF9tb3VzZU1vdmU6ZnVuY3Rpb24odCl7aWYodGhpcy5fbW91c2VNb3ZlZCl7aWYoZS51aS5pZSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk+ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSYmIXQuYnV0dG9uKXJldHVybiB0aGlzLl9tb3VzZVVwKHQpO2lmKCF0LndoaWNoKXJldHVybiB0aGlzLl9tb3VzZVVwKHQpfXJldHVybih0LndoaWNofHx0LmJ1dHRvbikmJih0aGlzLl9tb3VzZU1vdmVkPSEwKSx0aGlzLl9tb3VzZVN0YXJ0ZWQ/KHRoaXMuX21vdXNlRHJhZyh0KSx0LnByZXZlbnREZWZhdWx0KCkpOih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KHQpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KHQpJiYodGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsdCkhPT0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQ/dGhpcy5fbW91c2VEcmFnKHQpOnRoaXMuX21vdXNlVXAodCkpLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpfSxfbW91c2VVcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kb2N1bWVudC51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdGhpcy5fbW91c2VTdGFydGVkJiYodGhpcy5fbW91c2VTdGFydGVkPSExLHQudGFyZ2V0PT09dGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0JiZlLmRhdGEodC50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiLCEwKSx0aGlzLl9tb3VzZVN0b3AodCkpLGQ9ITEsITF9LF9tb3VzZURpc3RhbmNlTWV0OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heChNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWC1lLnBhZ2VYKSxNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWS1lLnBhZ2VZKSk+PXRoaXMub3B0aW9ucy5kaXN0YW5jZX0sX21vdXNlRGVsYXlNZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb3VzZURlbGF5TWV0fSxfbW91c2VTdGFydDpmdW5jdGlvbigpe30sX21vdXNlRHJhZzpmdW5jdGlvbigpe30sX21vdXNlU3RvcDpmdW5jdGlvbigpe30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbigpe3JldHVybiEwfX0pLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHQsaSl7cmV0dXJuW3BhcnNlRmxvYXQoZVswXSkqKHAudGVzdChlWzBdKT90LzEwMDoxKSxwYXJzZUZsb2F0KGVbMV0pKihwLnRlc3QoZVsxXSk/aS8xMDA6MSldfWZ1bmN0aW9uIGkodCxpKXtyZXR1cm4gcGFyc2VJbnQoZS5jc3ModCxpKSwxMCl8fDB9ZnVuY3Rpb24gcyh0KXt2YXIgaT10WzBdO3JldHVybiA5PT09aS5ub2RlVHlwZT97d2lkdGg6dC53aWR0aCgpLGhlaWdodDp0LmhlaWdodCgpLG9mZnNldDp7dG9wOjAsbGVmdDowfX06ZS5pc1dpbmRvdyhpKT97d2lkdGg6dC53aWR0aCgpLGhlaWdodDp0LmhlaWdodCgpLG9mZnNldDp7dG9wOnQuc2Nyb2xsVG9wKCksbGVmdDp0LnNjcm9sbExlZnQoKX19OmkucHJldmVudERlZmF1bHQ/e3dpZHRoOjAsaGVpZ2h0OjAsb2Zmc2V0Ont0b3A6aS5wYWdlWSxsZWZ0OmkucGFnZVh9fTp7d2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKSxvZmZzZXQ6dC5vZmZzZXQoKX19ZS51aT1lLnVpfHx7fTt2YXIgbixhLG89TWF0aC5tYXgscj1NYXRoLmFicyxoPU1hdGgucm91bmQsbD0vbGVmdHxjZW50ZXJ8cmlnaHQvLHU9L3RvcHxjZW50ZXJ8Ym90dG9tLyxkPS9bXCtcLV1cZCsoXC5bXGRdKyk/JT8vLGM9L15cdysvLHA9LyUkLyxmPWUuZm4ucG9zaXRpb247ZS5wb3NpdGlvbj17c2Nyb2xsYmFyV2lkdGg6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1uKXJldHVybiBuO3ZhciB0LGkscz1lKCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6aGlkZGVuOyc+PGRpdiBzdHlsZT0naGVpZ2h0OjEwMHB4O3dpZHRoOmF1dG87Jz48L2Rpdj48L2Rpdj4iKSxhPXMuY2hpbGRyZW4oKVswXTtyZXR1cm4gZSgiYm9keSIpLmFwcGVuZChzKSx0PWEub2Zmc2V0V2lkdGgscy5jc3MoIm92ZXJmbG93Iiwic2Nyb2xsIiksaT1hLm9mZnNldFdpZHRoLHQ9PT1pJiYoaT1zWzBdLmNsaWVudFdpZHRoKSxzLnJlbW92ZSgpLG49dC1pfSxnZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBpPXQuaXNXaW5kb3d8fHQuaXNEb2N1bWVudD8iIjp0LmVsZW1lbnQuY3NzKCJvdmVyZmxvdy14Iikscz10LmlzV2luZG93fHx0LmlzRG9jdW1lbnQ/IiI6dC5lbGVtZW50LmNzcygib3ZlcmZsb3cteSIpLG49InNjcm9sbCI9PT1pfHwiYXV0byI9PT1pJiZ0LndpZHRoPHQuZWxlbWVudFswXS5zY3JvbGxXaWR0aCxhPSJzY3JvbGwiPT09c3x8ImF1dG8iPT09cyYmdC5oZWlnaHQ8dC5lbGVtZW50WzBdLnNjcm9sbEhlaWdodDtyZXR1cm57d2lkdGg6YT9lLnBvc2l0aW9uLnNjcm9sbGJhcldpZHRoKCk6MCxoZWlnaHQ6bj9lLnBvc2l0aW9uLnNjcm9sbGJhcldpZHRoKCk6MH19LGdldFdpdGhpbkluZm86ZnVuY3Rpb24odCl7dmFyIGk9ZSh0fHx3aW5kb3cpLHM9ZS5pc1dpbmRvdyhpWzBdKSxuPSEhaVswXSYmOT09PWlbMF0ubm9kZVR5cGU7cmV0dXJue2VsZW1lbnQ6aSxpc1dpbmRvdzpzLGlzRG9jdW1lbnQ6bixvZmZzZXQ6aS5vZmZzZXQoKXx8e2xlZnQ6MCx0b3A6MH0sc2Nyb2xsTGVmdDppLnNjcm9sbExlZnQoKSxzY3JvbGxUb3A6aS5zY3JvbGxUb3AoKSx3aWR0aDpzfHxuP2kud2lkdGgoKTppLm91dGVyV2lkdGgoKSxoZWlnaHQ6c3x8bj9pLmhlaWdodCgpOmkub3V0ZXJIZWlnaHQoKX19fSxlLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKG4pe2lmKCFufHwhbi5vZilyZXR1cm4gZi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bj1lLmV4dGVuZCh7fSxuKTt2YXIgcCxtLGcsdix5LGIsXz1lKG4ub2YpLHg9ZS5wb3NpdGlvbi5nZXRXaXRoaW5JbmZvKG4ud2l0aGluKSx3PWUucG9zaXRpb24uZ2V0U2Nyb2xsSW5mbyh4KSxrPShuLmNvbGxpc2lvbnx8ImZsaXAiKS5zcGxpdCgiICIpLFQ9e307cmV0dXJuIGI9cyhfKSxfWzBdLnByZXZlbnREZWZhdWx0JiYobi5hdD0ibGVmdCB0b3AiKSxtPWIud2lkdGgsZz1iLmhlaWdodCx2PWIub2Zmc2V0LHk9ZS5leHRlbmQoe30sdiksZS5lYWNoKFsibXkiLCJhdCJdLGZ1bmN0aW9uKCl7dmFyIGUsdCxpPShuW3RoaXNdfHwiIikuc3BsaXQoIiAiKTsxPT09aS5sZW5ndGgmJihpPWwudGVzdChpWzBdKT9pLmNvbmNhdChbImNlbnRlciJdKTp1LnRlc3QoaVswXSk/WyJjZW50ZXIiXS5jb25jYXQoaSk6WyJjZW50ZXIiLCJjZW50ZXIiXSksaVswXT1sLnRlc3QoaVswXSk/aVswXToiY2VudGVyIixpWzFdPXUudGVzdChpWzFdKT9pWzFdOiJjZW50ZXIiLGU9ZC5leGVjKGlbMF0pLHQ9ZC5leGVjKGlbMV0pLFRbdGhpc109W2U/ZVswXTowLHQ/dFswXTowXSxuW3RoaXNdPVtjLmV4ZWMoaVswXSlbMF0sYy5leGVjKGlbMV0pWzBdXX0pLDE9PT1rLmxlbmd0aCYmKGtbMV09a1swXSksInJpZ2h0Ij09PW4uYXRbMF0/eS5sZWZ0Kz1tOiJjZW50ZXIiPT09bi5hdFswXSYmKHkubGVmdCs9bS8yKSwiYm90dG9tIj09PW4uYXRbMV0/eS50b3ArPWc6ImNlbnRlciI9PT1uLmF0WzFdJiYoeS50b3ArPWcvMikscD10KFQuYXQsbSxnKSx5LmxlZnQrPXBbMF0seS50b3ArPXBbMV0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHMsbCx1PWUodGhpcyksZD11Lm91dGVyV2lkdGgoKSxjPXUub3V0ZXJIZWlnaHQoKSxmPWkodGhpcywibWFyZ2luTGVmdCIpLGI9aSh0aGlzLCJtYXJnaW5Ub3AiKSxEPWQrZitpKHRoaXMsIm1hcmdpblJpZ2h0Iikrdy53aWR0aCxTPWMrYitpKHRoaXMsIm1hcmdpbkJvdHRvbSIpK3cuaGVpZ2h0LE09ZS5leHRlbmQoe30seSksQz10KFQubXksdS5vdXRlcldpZHRoKCksdS5vdXRlckhlaWdodCgpKTsicmlnaHQiPT09bi5teVswXT9NLmxlZnQtPWQ6ImNlbnRlciI9PT1uLm15WzBdJiYoTS5sZWZ0LT1kLzIpLCJib3R0b20iPT09bi5teVsxXT9NLnRvcC09YzoiY2VudGVyIj09PW4ubXlbMV0mJihNLnRvcC09Yy8yKSxNLmxlZnQrPUNbMF0sTS50b3ArPUNbMV0sYXx8KE0ubGVmdD1oKE0ubGVmdCksTS50b3A9aChNLnRvcCkpLHM9e21hcmdpbkxlZnQ6ZixtYXJnaW5Ub3A6Yn0sZS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKHQsaSl7ZS51aS5wb3NpdGlvbltrW3RdXSYmZS51aS5wb3NpdGlvbltrW3RdXVtpXShNLHt0YXJnZXRXaWR0aDptLHRhcmdldEhlaWdodDpnLGVsZW1XaWR0aDpkLGVsZW1IZWlnaHQ6Yyxjb2xsaXNpb25Qb3NpdGlvbjpzLGNvbGxpc2lvbldpZHRoOkQsY29sbGlzaW9uSGVpZ2h0OlMsb2Zmc2V0OltwWzBdK0NbMF0scFsxXStDWzFdXSxteTpuLm15LGF0Om4uYXQsd2l0aGluOngsZWxlbTp1fSl9KSxuLnVzaW5nJiYobD1mdW5jdGlvbihlKXt2YXIgdD12LmxlZnQtTS5sZWZ0LGk9dCttLWQscz12LnRvcC1NLnRvcCxhPXMrZy1jLGg9e3RhcmdldDp7ZWxlbWVudDpfLGxlZnQ6di5sZWZ0LHRvcDp2LnRvcCx3aWR0aDptLGhlaWdodDpnfSxlbGVtZW50OntlbGVtZW50OnUsbGVmdDpNLmxlZnQsdG9wOk0udG9wLHdpZHRoOmQsaGVpZ2h0OmN9LGhvcml6b250YWw6MD5pPyJsZWZ0Ijp0PjA/InJpZ2h0IjoiY2VudGVyIix2ZXJ0aWNhbDowPmE/InRvcCI6cz4wPyJib3R0b20iOiJtaWRkbGUifTtkPm0mJm0+cih0K2kpJiYoaC5ob3Jpem9udGFsPSJjZW50ZXIiKSxjPmcmJmc+cihzK2EpJiYoaC52ZXJ0aWNhbD0ibWlkZGxlIiksaC5pbXBvcnRhbnQ9byhyKHQpLHIoaSkpPm8ocihzKSxyKGEpKT8iaG9yaXpvbnRhbCI6InZlcnRpY2FsIixuLnVzaW5nLmNhbGwodGhpcyxlLGgpfSksdS5vZmZzZXQoZS5leHRlbmQoTSx7dXNpbmc6bH0pKX0pfSxlLnVpLnBvc2l0aW9uPXtmaXQ6e2xlZnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzPXQud2l0aGluLG49cy5pc1dpbmRvdz9zLnNjcm9sbExlZnQ6cy5vZmZzZXQubGVmdCxhPXMud2lkdGgscj1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LGg9bi1yLGw9cit0LmNvbGxpc2lvbldpZHRoLWEtbjt0LmNvbGxpc2lvbldpZHRoPmE/aD4wJiYwPj1sPyhpPWUubGVmdCtoK3QuY29sbGlzaW9uV2lkdGgtYS1uLGUubGVmdCs9aC1pKTplLmxlZnQ9bD4wJiYwPj1oP246aD5sP24rYS10LmNvbGxpc2lvbldpZHRoOm46aD4wP2UubGVmdCs9aDpsPjA/ZS5sZWZ0LT1sOmUubGVmdD1vKGUubGVmdC1yLGUubGVmdCl9LHRvcDpmdW5jdGlvbihlLHQpe3ZhciBpLHM9dC53aXRoaW4sbj1zLmlzV2luZG93P3Muc2Nyb2xsVG9wOnMub2Zmc2V0LnRvcCxhPXQud2l0aGluLmhlaWdodCxyPWUudG9wLXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wLGg9bi1yLGw9cit0LmNvbGxpc2lvbkhlaWdodC1hLW47dC5jb2xsaXNpb25IZWlnaHQ+YT9oPjAmJjA+PWw/KGk9ZS50b3AraCt0LmNvbGxpc2lvbkhlaWdodC1hLW4sZS50b3ArPWgtaSk6ZS50b3A9bD4wJiYwPj1oP246aD5sP24rYS10LmNvbGxpc2lvbkhlaWdodDpuOmg+MD9lLnRvcCs9aDpsPjA/ZS50b3AtPWw6ZS50b3A9byhlLnRvcC1yLGUudG9wKX19LGZsaXA6e2xlZnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dC53aXRoaW4sYT1uLm9mZnNldC5sZWZ0K24uc2Nyb2xsTGVmdCxvPW4ud2lkdGgsaD1uLmlzV2luZG93P24uc2Nyb2xsTGVmdDpuLm9mZnNldC5sZWZ0LGw9ZS5sZWZ0LXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCx1PWwtaCxkPWwrdC5jb2xsaXNpb25XaWR0aC1vLWgsYz0ibGVmdCI9PT10Lm15WzBdPy10LmVsZW1XaWR0aDoicmlnaHQiPT09dC5teVswXT90LmVsZW1XaWR0aDowLHA9ImxlZnQiPT09dC5hdFswXT90LnRhcmdldFdpZHRoOiJyaWdodCI9PT10LmF0WzBdPy10LnRhcmdldFdpZHRoOjAsZj0tMip0Lm9mZnNldFswXTswPnU/KGk9ZS5sZWZ0K2MrcCtmK3QuY29sbGlzaW9uV2lkdGgtby1hLCgwPml8fHIodSk+aSkmJihlLmxlZnQrPWMrcCtmKSk6ZD4wJiYocz1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0K2MrcCtmLWgsKHM+MHx8ZD5yKHMpKSYmKGUubGVmdCs9YytwK2YpKX0sdG9wOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuPXQud2l0aGluLGE9bi5vZmZzZXQudG9wK24uc2Nyb2xsVG9wLG89bi5oZWlnaHQsaD1uLmlzV2luZG93P24uc2Nyb2xsVG9wOm4ub2Zmc2V0LnRvcCxsPWUudG9wLXQuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wLHU9bC1oLGQ9bCt0LmNvbGxpc2lvbkhlaWdodC1vLWgsYz0idG9wIj09PXQubXlbMV0scD1jPy10LmVsZW1IZWlnaHQ6ImJvdHRvbSI9PT10Lm15WzFdP3QuZWxlbUhlaWdodDowLGY9InRvcCI9PT10LmF0WzFdP3QudGFyZ2V0SGVpZ2h0OiJib3R0b20iPT09dC5hdFsxXT8tdC50YXJnZXRIZWlnaHQ6MCxtPS0yKnQub2Zmc2V0WzFdOzA+dT8ocz1lLnRvcCtwK2YrbSt0LmNvbGxpc2lvbkhlaWdodC1vLWEsKDA+c3x8cih1KT5zKSYmKGUudG9wKz1wK2YrbSkpOmQ+MCYmKGk9ZS50b3AtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3ArcCtmK20taCwoaT4wfHxkPnIoaSkpJiYoZS50b3ArPXArZittKSl9fSxmbGlwZml0OntsZWZ0OmZ1bmN0aW9uKCl7ZS51aS5wb3NpdGlvbi5mbGlwLmxlZnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudWkucG9zaXRpb24uZml0LmxlZnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0b3A6ZnVuY3Rpb24oKXtlLnVpLnBvc2l0aW9uLmZsaXAudG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnVpLnBvc2l0aW9uLmZpdC50b3AuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKCl7dmFyIHQsaSxzLG4sbyxyPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocj8iZGl2IjoiYm9keSIpLHM9e3Zpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6MCxoZWlnaHQ6MCxib3JkZXI6MCxtYXJnaW46MCxiYWNrZ3JvdW5kOiJub25lIn0sciYmZS5leHRlbmQocyx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiItMTAwMHB4Iix0b3A6Ii0xMDAwcHgifSk7Zm9yKG8gaW4gcyl0LnN0eWxlW29dPXNbb107dC5hcHBlbmRDaGlsZChoKSxpPXJ8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxpLmluc2VydEJlZm9yZSh0LGkuZmlyc3RDaGlsZCksaC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDEwLjc0MzIyMjJweDsiLG49ZShoKS5vZmZzZXQoKS5sZWZ0LGE9bj4xMCYmMTE+bix0LmlubmVySFRNTD0iIixpLnJlbW92ZUNoaWxkKHQpfSgpfSgpLGUudWkucG9zaXRpb24sZS53aWRnZXQoInVpLmRyYWdnYWJsZSIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoiZHJhZyIsb3B0aW9uczp7YWRkQ2xhc3NlczohMCxhcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RUb1NvcnRhYmxlOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaWZyYW1lRml4OiExLG9wYWNpdHk6ITEscmVmcmVzaFBvc2l0aW9uczohMSxyZXZlcnQ6ITEscmV2ZXJ0RHVyYXRpb246NTAwLHNjb3BlOiJkZWZhdWx0IixzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc25hcDohMSxzbmFwTW9kZToiYm90aCIsc25hcFRvbGVyYW5jZToyMCxzdGFjazohMSx6SW5kZXg6ITEsZHJhZzpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7Im9yaWdpbmFsIj09PXRoaXMub3B0aW9ucy5oZWxwZXImJnRoaXMuX3NldFBvc2l0aW9uUmVsYXRpdmUoKSx0aGlzLm9wdGlvbnMuYWRkQ2xhc3NlcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5fbW91c2VJbml0KCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJoYW5kbGUiPT09ZSYmKHRoaXMuX3JlbW92ZUhhbmRsZUNsYXNzTmFtZSgpLHRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5oZWxwZXJ8fHRoaXMuZWxlbWVudCkuaXMoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKT8odGhpcy5kZXN0cm95T25DbGVhcj0hMCx2b2lkIDApOih0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZSB1aS1kcmFnZ2FibGUtZHJhZ2dpbmcgdWktZHJhZ2dhYmxlLWRpc2FibGVkIiksdGhpcy5fcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5fbW91c2VEZXN0cm95KCksdm9pZCAwKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuX2JsdXJBY3RpdmVFbGVtZW50KHQpLHRoaXMuaGVscGVyfHxpLmRpc2FibGVkfHxlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktcmVzaXphYmxlLWhhbmRsZSIpLmxlbmd0aD4wPyExOih0aGlzLmhhbmRsZT10aGlzLl9nZXRIYW5kbGUodCksdGhpcy5oYW5kbGU/KHRoaXMuX2Jsb2NrRnJhbWVzKGkuaWZyYW1lRml4PT09ITA/ImlmcmFtZSI6aS5pZnJhbWVGaXgpLCEwKTohMSl9LF9ibG9ja0ZyYW1lczpmdW5jdGlvbih0KXt0aGlzLmlmcmFtZUJsb2Nrcz10aGlzLmRvY3VtZW50LmZpbmQodCkubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gZSgiPGRpdj4iKS5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKS5hcHBlbmRUbyh0LnBhcmVudCgpKS5vdXRlcldpZHRoKHQub3V0ZXJXaWR0aCgpKS5vdXRlckhlaWdodCh0Lm91dGVySGVpZ2h0KCkpLm9mZnNldCh0Lm9mZnNldCgpKVswXX0pfSxfdW5ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzJiYodGhpcy5pZnJhbWVCbG9ja3MucmVtb3ZlKCksZGVsZXRlIHRoaXMuaWZyYW1lQmxvY2tzKX0sX2JsdXJBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZG9jdW1lbnRbMF07aWYodGhpcy5oYW5kbGVFbGVtZW50LmlzKHQudGFyZ2V0KSl0cnl7aS5hY3RpdmVFbGVtZW50JiYiYm9keSIhPT1pLmFjdGl2ZUVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZShpLmFjdGl2ZUVsZW1lbnQpLmJsdXIoKX1jYXRjaChzKXt9fSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuaGVscGVyPXRoaXMuX2NyZWF0ZUhlbHBlcih0KSx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRyYWdnaW5nIiksdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLGUudWkuZGRtYW5hZ2VyJiYoZS51aS5kZG1hbmFnZXIuY3VycmVudD10aGlzKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoITApLHRoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpLHRoaXMuaGFzRml4ZWRBbmNlc3Rvcj10aGlzLmhlbHBlci5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuImZpeGVkIj09PWUodGhpcykuY3NzKCJwb3NpdGlvbiIpfSkubGVuZ3RoPjAsdGhpcy5wb3NpdGlvbkFicz10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fcmVmcmVzaE9mZnNldHModCksdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXRoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0LCExKSx0aGlzLm9yaWdpbmFsUGFnZVg9dC5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9dC5wYWdlWSxpLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKGkuY3Vyc29yQXQpLHRoaXMuX3NldENvbnRhaW5tZW50KCksdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQpPT09ITE/KHRoaXMuX2NsZWFyKCksITEpOih0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksZS51aS5kZG1hbmFnZXImJiFpLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsdCksdGhpcy5fbm9ybWFsaXplUmlnaHRCb3R0b20oKSx0aGlzLl9tb3VzZURyYWcodCwhMCksZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWdTdGFydCh0aGlzLHQpLCEwKX0sX3JlZnJlc2hPZmZzZXRzOmZ1bmN0aW9uKGUpe3RoaXMub2Zmc2V0PXt0b3A6dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMucG9zaXRpb25BYnMubGVmdC10aGlzLm1hcmdpbnMubGVmdCxzY3JvbGw6ITEscGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9LHRoaXMub2Zmc2V0LmNsaWNrPXtsZWZ0OmUucGFnZVgtdGhpcy5vZmZzZXQubGVmdCx0b3A6ZS5wYWdlWS10aGlzLm9mZnNldC50b3B9fSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQsaSl7aWYodGhpcy5oYXNGaXhlZEFuY2VzdG9yJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKSx0aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24odCwhMCksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSwhaSl7dmFyIHM9dGhpcy5fdWlIYXNoKCk7aWYodGhpcy5fdHJpZ2dlcigiZHJhZyIsdCxzKT09PSExKXJldHVybiB0aGlzLl9tb3VzZVVwKHt9KSwhMTt0aGlzLnBvc2l0aW9uPXMucG9zaXRpb259cmV0dXJuIHRoaXMuaGVscGVyWzBdLnN0eWxlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIsdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCIsZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyx0KSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLHM9ITE7cmV0dXJuIGUudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXImJihzPWUudWkuZGRtYW5hZ2VyLmRyb3AodGhpcyx0KSksdGhpcy5kcm9wcGVkJiYocz10aGlzLmRyb3BwZWQsdGhpcy5kcm9wcGVkPSExKSwiaW52YWxpZCI9PT10aGlzLm9wdGlvbnMucmV2ZXJ0JiYhc3x8InZhbGlkIj09PXRoaXMub3B0aW9ucy5yZXZlcnQmJnN8fHRoaXMub3B0aW9ucy5yZXZlcnQ9PT0hMHx8ZS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpJiZ0aGlzLm9wdGlvbnMucmV2ZXJ0LmNhbGwodGhpcy5lbGVtZW50LHMpP2UodGhpcy5oZWxwZXIpLmFuaW1hdGUodGhpcy5vcmlnaW5hbFBvc2l0aW9uLHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbiwxMCksZnVuY3Rpb24oKXtpLl90cmlnZ2VyKCJzdG9wIix0KSE9PSExJiZpLl9jbGVhcigpfSk6dGhpcy5fdHJpZ2dlcigic3RvcCIsdCkhPT0hMSYmdGhpcy5fY2xlYXIoKSwhMX0sX21vdXNlVXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3VuYmxvY2tGcmFtZXMoKSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZ1N0b3AodGhpcyx0KSx0aGlzLmhhbmRsZUVsZW1lbnQuaXModC50YXJnZXQpJiZ0aGlzLmVsZW1lbnQuZm9jdXMoKSxlLnVpLm1vdXNlLnByb3RvdHlwZS5fbW91c2VVcC5jYWxsKHRoaXMsdCl9LGNhbmNlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlbHBlci5pcygiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpP3RoaXMuX21vdXNlVXAoe30pOnRoaXMuX2NsZWFyKCksdGhpc30sX2dldEhhbmRsZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmhhbmRsZT8hIWUodC50YXJnZXQpLmNsb3Nlc3QodGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLmhhbmRsZSkpLmxlbmd0aDohMH0sX3NldEhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlRWxlbWVudD10aGlzLm9wdGlvbnMuaGFuZGxlP3RoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5oYW5kbGUpOnRoaXMuZWxlbWVudCx0aGlzLmhhbmRsZUVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1oYW5kbGUiKX0sX3JlbW92ZUhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlRWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJhZ2dhYmxlLWhhbmRsZSIpfSxfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPWUuaXNGdW5jdGlvbihpLmhlbHBlciksbj1zP2UoaS5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFt0XSkpOiJjbG9uZSI9PT1pLmhlbHBlcj90aGlzLmVsZW1lbnQuY2xvbmUoKS5yZW1vdmVBdHRyKCJpZCIpOnRoaXMuZWxlbWVudDtyZXR1cm4gbi5wYXJlbnRzKCJib2R5IikubGVuZ3RofHxuLmFwcGVuZFRvKCJwYXJlbnQiPT09aS5hcHBlbmRUbz90aGlzLmVsZW1lbnRbMF0ucGFyZW50Tm9kZTppLmFwcGVuZFRvKSxzJiZuWzBdPT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLl9zZXRQb3NpdGlvblJlbGF0aXZlKCksblswXT09PXRoaXMuZWxlbWVudFswXXx8LyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3Qobi5jc3MoInBvc2l0aW9uIikpfHxuLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLG59LF9zZXRQb3NpdGlvblJlbGF0aXZlOmZ1bmN0aW9uKCl7L14oPzpyfGF8ZikvLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSl8fCh0aGlzLmVsZW1lbnRbMF0uc3R5bGUucG9zaXRpb249InJlbGF0aXZlIil9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiICIpKSxlLmlzQXJyYXkodCkmJih0PXtsZWZ0Oit0WzBdLHRvcDordFsxXXx8MH0pLCJsZWZ0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXQubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIHQmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdC5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXQudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10LmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2lzUm9vdE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuLyhodG1sfGJvZHkpL2kudGVzdChlLnRhZ05hbWUpfHxlPT09dGhpcy5kb2N1bWVudFswXX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpLGk9dGhpcy5kb2N1bWVudFswXTtyZXR1cm4iYWJzb2x1dGUiPT09dGhpcy5jc3NQb3NpdGlvbiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT1pJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHQubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLHQudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksdGhpcy5faXNSb290Tm9kZSh0aGlzLm9mZnNldFBhcmVudFswXSkmJih0PXt0b3A6MCxsZWZ0OjB9KSx7dG9wOnQudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OnQubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYoInJlbGF0aXZlIiE9PXRoaXMuY3NzUG9zaXRpb24pcmV0dXJue3RvcDowLGxlZnQ6MH07dmFyIGU9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCksdD10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKTtyZXR1cm57dG9wOmUudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrKHQ/MDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksbGVmdDplLmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrKHQ/MDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCkpfX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDAscmlnaHQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSwxMCl8fDAsYm90dG9tOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG49dGhpcy5vcHRpb25zLGE9dGhpcy5kb2N1bWVudFswXTtyZXR1cm4gdGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj1udWxsLG4uY29udGFpbm1lbnQ/IndpbmRvdyI9PT1uLmNvbnRhaW5tZW50Pyh0aGlzLmNvbnRhaW5tZW50PVtlKHdpbmRvdykuc2Nyb2xsTGVmdCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsZSh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLGUod2luZG93KS5zY3JvbGxMZWZ0KCkrZSh3aW5kb3cpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxlKHdpbmRvdykuc2Nyb2xsVG9wKCkrKGUod2luZG93KS5oZWlnaHQoKXx8YS5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSx2b2lkIDApOiJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50Pyh0aGlzLmNvbnRhaW5tZW50PVswLDAsZShhKS53aWR0aCgpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKGUoYSkuaGVpZ2h0KCl8fGEuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF0sdm9pZCAwKTpuLmNvbnRhaW5tZW50LmNvbnN0cnVjdG9yPT09QXJyYXk/KHRoaXMuY29udGFpbm1lbnQ9bi5jb250YWlubWVudCx2b2lkIDApOigicGFyZW50Ij09PW4uY29udGFpbm1lbnQmJihuLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpLGk9ZShuLmNvbnRhaW5tZW50KSxzPWlbMF0scyYmKHQ9LyhzY3JvbGx8YXV0bykvLnRlc3QoaS5jc3MoIm92ZXJmbG93IikpLHRoaXMuY29udGFpbm1lbnQ9WyhwYXJzZUludChpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSwocGFyc2VJbnQoaS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLCh0P01hdGgubWF4KHMuc2Nyb2xsV2lkdGgscy5vZmZzZXRXaWR0aCk6cy5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGkuY3NzKCJib3JkZXJSaWdodFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKHQ/TWF0aC5tYXgocy5zY3JvbGxIZWlnaHQscy5vZmZzZXRIZWlnaHQpOnMub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoaS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj1pKSx2b2lkIDApOih0aGlzLmNvbnRhaW5tZW50PW51bGwsdm9pZCAwKX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGUsdCl7dHx8KHQ9dGhpcy5wb3NpdGlvbik7dmFyIGk9ImFic29sdXRlIj09PWU/MTotMSxzPXRoaXMuX2lzUm9vdE5vZGUodGhpcy5zY3JvbGxQYXJlbnRbMF0pO3JldHVybnt0b3A6dC50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKmkrdGhpcy5vZmZzZXQucGFyZW50LnRvcCppLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLnRvcDpzPzA6dGhpcy5vZmZzZXQuc2Nyb2xsLnRvcCkqaSxsZWZ0OnQubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmkrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqaS0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0OnM/MDp0aGlzLm9mZnNldC5zY3JvbGwubGVmdCkqaX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuLGEsbz10aGlzLm9wdGlvbnMscj10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKSxoPWUucGFnZVgsbD1lLnBhZ2VZO3JldHVybiByJiZ0aGlzLm9mZnNldC5zY3JvbGx8fCh0aGlzLm9mZnNldC5zY3JvbGw9e3RvcDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX0pLHQmJih0aGlzLmNvbnRhaW5tZW50JiYodGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj8ocz10aGlzLnJlbGF0aXZlQ29udGFpbmVyLm9mZnNldCgpLGk9W3RoaXMuY29udGFpbm1lbnRbMF0rcy5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0rcy50b3AsdGhpcy5jb250YWlubWVudFsyXStzLmxlZnQsdGhpcy5jb250YWlubWVudFszXStzLnRvcF0pOmk9dGhpcy5jb250YWlubWVudCxlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aVswXSYmKGg9aVswXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxlLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxpWzFdJiYobD1pWzFdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCksZS5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PmlbMl0mJihoPWlbMl0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A+aVszXSYmKGw9aVszXSt0aGlzLm9mZnNldC5jbGljay50b3ApKSxvLmdyaWQmJihuPW8uZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgobC10aGlzLm9yaWdpbmFsUGFnZVkpL28uZ3JpZFsxXSkqby5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWSxsPWk/bi10aGlzLm9mZnNldC5jbGljay50b3A+PWlbMV18fG4tdGhpcy5vZmZzZXQuY2xpY2sudG9wPmlbM10/bjpuLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49aVsxXT9uLW8uZ3JpZFsxXTpuK28uZ3JpZFsxXTpuLGE9by5ncmlkWzBdP3RoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChoLXRoaXMub3JpZ2luYWxQYWdlWCkvby5ncmlkWzBdKSpvLmdyaWRbMF06dGhpcy5vcmlnaW5hbFBhZ2VYLGg9aT9hLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PWlbMF18fGEtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5pWzJdP2E6YS10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj1pWzBdP2Etby5ncmlkWzBdOmErby5ncmlkWzBdOmEpLCJ5Ij09PW8uYXhpcyYmKGg9dGhpcy5vcmlnaW5hbFBhZ2VYKSwieCI9PT1vLmF4aXMmJihsPXRoaXMub3JpZ2luYWxQYWdlWSkpLHt0b3A6bC10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLm9mZnNldC5zY3JvbGwudG9wOnI/MDp0aGlzLm9mZnNldC5zY3JvbGwudG9wKSxsZWZ0OmgtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KygiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLmxlZnQ6cj8wOnRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0KX0KLX0sX2NsZWFyOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXIucmVtb3ZlQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLHRoaXMuaGVscGVyWzBdPT09dGhpcy5lbGVtZW50WzBdfHx0aGlzLmNhbmNlbEhlbHBlclJlbW92YWx8fHRoaXMuaGVscGVyLnJlbW92ZSgpLHRoaXMuaGVscGVyPW51bGwsdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsPSExLHRoaXMuZGVzdHJveU9uQ2xlYXImJnRoaXMuZGVzdHJveSgpfSxfbm9ybWFsaXplUmlnaHRCb3R0b206ZnVuY3Rpb24oKXsieSIhPT10aGlzLm9wdGlvbnMuYXhpcyYmImF1dG8iIT09dGhpcy5oZWxwZXIuY3NzKCJyaWdodCIpJiYodGhpcy5oZWxwZXIud2lkdGgodGhpcy5oZWxwZXIud2lkdGgoKSksdGhpcy5oZWxwZXIuY3NzKCJyaWdodCIsImF1dG8iKSksIngiIT09dGhpcy5vcHRpb25zLmF4aXMmJiJhdXRvIiE9PXRoaXMuaGVscGVyLmNzcygiYm90dG9tIikmJih0aGlzLmhlbHBlci5oZWlnaHQodGhpcy5oZWxwZXIuaGVpZ2h0KCkpLHRoaXMuaGVscGVyLmNzcygiYm90dG9tIiwiYXV0byIpKX0sX3RyaWdnZXI6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBzPXN8fHRoaXMuX3VpSGFzaCgpLGUudWkucGx1Z2luLmNhbGwodGhpcyx0LFtpLHMsdGhpc10sITApLC9eKGRyYWd8c3RhcnR8c3RvcCkvLnRlc3QodCkmJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHMub2Zmc2V0PXRoaXMucG9zaXRpb25BYnMpLGUuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5jYWxsKHRoaXMsdCxpLHMpfSxwbHVnaW5zOnt9LF91aUhhc2g6ZnVuY3Rpb24oKXtyZXR1cm57aGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sb3JpZ2luYWxQb3NpdGlvbjp0aGlzLm9yaWdpbmFsUG9zaXRpb24sb2Zmc2V0OnRoaXMucG9zaXRpb25BYnN9fX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY29ubmVjdFRvU29ydGFibGUiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG49ZS5leHRlbmQoe30saSx7aXRlbTpzLmVsZW1lbnR9KTtzLnNvcnRhYmxlcz1bXSxlKHMub3B0aW9ucy5jb25uZWN0VG9Tb3J0YWJsZSkuZWFjaChmdW5jdGlvbigpe3ZhciBpPWUodGhpcykuc29ydGFibGUoImluc3RhbmNlIik7aSYmIWkub3B0aW9ucy5kaXNhYmxlZCYmKHMuc29ydGFibGVzLnB1c2goaSksaS5yZWZyZXNoUG9zaXRpb25zKCksaS5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsbikpfSl9LHN0b3A6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUuZXh0ZW5kKHt9LGkse2l0ZW06cy5lbGVtZW50fSk7cy5jYW5jZWxIZWxwZXJSZW1vdmFsPSExLGUuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5pc092ZXI/KGUuaXNPdmVyPTAscy5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLGUuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSxlLl9zdG9yZWRDU1M9e3Bvc2l0aW9uOmUucGxhY2Vob2xkZXIuY3NzKCJwb3NpdGlvbiIpLHRvcDplLnBsYWNlaG9sZGVyLmNzcygidG9wIiksbGVmdDplLnBsYWNlaG9sZGVyLmNzcygibGVmdCIpfSxlLl9tb3VzZVN0b3AodCksZS5vcHRpb25zLmhlbHBlcj1lLm9wdGlvbnMuX2hlbHBlcik6KGUuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxlLl90cmlnZ2VyKCJkZWFjdGl2YXRlIix0LG4pKX0pfSxkcmFnOmZ1bmN0aW9uKHQsaSxzKXtlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt2YXIgbj0hMSxhPXRoaXM7YS5wb3NpdGlvbkFicz1zLnBvc2l0aW9uQWJzLGEuaGVscGVyUHJvcG9ydGlvbnM9cy5oZWxwZXJQcm9wb3J0aW9ucyxhLm9mZnNldC5jbGljaz1zLm9mZnNldC5jbGljayxhLl9pbnRlcnNlY3RzV2l0aChhLmNvbnRhaW5lckNhY2hlKSYmKG49ITAsZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25BYnM9cy5wb3NpdGlvbkFicyx0aGlzLmhlbHBlclByb3BvcnRpb25zPXMuaGVscGVyUHJvcG9ydGlvbnMsdGhpcy5vZmZzZXQuY2xpY2s9cy5vZmZzZXQuY2xpY2ssdGhpcyE9PWEmJnRoaXMuX2ludGVyc2VjdHNXaXRoKHRoaXMuY29udGFpbmVyQ2FjaGUpJiZlLmNvbnRhaW5zKGEuZWxlbWVudFswXSx0aGlzLmVsZW1lbnRbMF0pJiYobj0hMSksbn0pKSxuPyhhLmlzT3Zlcnx8KGEuaXNPdmVyPTEscy5fcGFyZW50PWkuaGVscGVyLnBhcmVudCgpLGEuY3VycmVudEl0ZW09aS5oZWxwZXIuYXBwZW5kVG8oYS5lbGVtZW50KS5kYXRhKCJ1aS1zb3J0YWJsZS1pdGVtIiwhMCksYS5vcHRpb25zLl9oZWxwZXI9YS5vcHRpb25zLmhlbHBlcixhLm9wdGlvbnMuaGVscGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGkuaGVscGVyWzBdfSx0LnRhcmdldD1hLmN1cnJlbnRJdGVtWzBdLGEuX21vdXNlQ2FwdHVyZSh0LCEwKSxhLl9tb3VzZVN0YXJ0KHQsITAsITApLGEub2Zmc2V0LmNsaWNrLnRvcD1zLm9mZnNldC5jbGljay50b3AsYS5vZmZzZXQuY2xpY2subGVmdD1zLm9mZnNldC5jbGljay5sZWZ0LGEub2Zmc2V0LnBhcmVudC5sZWZ0LT1zLm9mZnNldC5wYXJlbnQubGVmdC1hLm9mZnNldC5wYXJlbnQubGVmdCxhLm9mZnNldC5wYXJlbnQudG9wLT1zLm9mZnNldC5wYXJlbnQudG9wLWEub2Zmc2V0LnBhcmVudC50b3Ascy5fdHJpZ2dlcigidG9Tb3J0YWJsZSIsdCkscy5kcm9wcGVkPWEuZWxlbWVudCxlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKX0pLHMuY3VycmVudEl0ZW09cy5lbGVtZW50LGEuZnJvbU91dHNpZGU9cyksYS5jdXJyZW50SXRlbSYmKGEuX21vdXNlRHJhZyh0KSxpLnBvc2l0aW9uPWEucG9zaXRpb24pKTphLmlzT3ZlciYmKGEuaXNPdmVyPTAsYS5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLGEub3B0aW9ucy5fcmV2ZXJ0PWEub3B0aW9ucy5yZXZlcnQsYS5vcHRpb25zLnJldmVydD0hMSxhLl90cmlnZ2VyKCJvdXQiLHQsYS5fdWlIYXNoKGEpKSxhLl9tb3VzZVN0b3AodCwhMCksYS5vcHRpb25zLnJldmVydD1hLm9wdGlvbnMuX3JldmVydCxhLm9wdGlvbnMuaGVscGVyPWEub3B0aW9ucy5faGVscGVyLGEucGxhY2Vob2xkZXImJmEucGxhY2Vob2xkZXIucmVtb3ZlKCksaS5oZWxwZXIuYXBwZW5kVG8ocy5fcGFyZW50KSxzLl9yZWZyZXNoT2Zmc2V0cyh0KSxpLnBvc2l0aW9uPXMuX2dlbmVyYXRlUG9zaXRpb24odCwhMCkscy5fdHJpZ2dlcigiZnJvbVNvcnRhYmxlIix0KSxzLmRyb3BwZWQ9ITEsZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoUG9zaXRpb25zKCl9KSl9KX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImN1cnNvciIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKCJib2R5IiksYT1zLm9wdGlvbnM7bi5jc3MoImN1cnNvciIpJiYoYS5fY3Vyc29yPW4uY3NzKCJjdXJzb3IiKSksbi5jc3MoImN1cnNvciIsYS5jdXJzb3IpfSxzdG9wOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1zLm9wdGlvbnM7bi5fY3Vyc29yJiZlKCJib2R5IikuY3NzKCJjdXJzb3IiLG4uX2N1cnNvcil9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJvcGFjaXR5Iix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUoaS5oZWxwZXIpLGE9cy5vcHRpb25zO24uY3NzKCJvcGFjaXR5IikmJihhLl9vcGFjaXR5PW4uY3NzKCJvcGFjaXR5IikpLG4uY3NzKCJvcGFjaXR5IixhLm9wYWNpdHkpfSxzdG9wOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1zLm9wdGlvbnM7bi5fb3BhY2l0eSYmZShpLmhlbHBlcikuY3NzKCJvcGFjaXR5IixuLl9vcGFjaXR5KX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNjcm9sbCIse3N0YXJ0OmZ1bmN0aW9uKGUsdCxpKXtpLnNjcm9sbFBhcmVudE5vdEhpZGRlbnx8KGkuc2Nyb2xsUGFyZW50Tm90SGlkZGVuPWkuaGVscGVyLnNjcm9sbFBhcmVudCghMSkpLGkuc2Nyb2xsUGFyZW50Tm90SGlkZGVuWzBdIT09aS5kb2N1bWVudFswXSYmIkhUTUwiIT09aS5zY3JvbGxQYXJlbnROb3RIaWRkZW5bMF0udGFnTmFtZSYmKGkub3ZlcmZsb3dPZmZzZXQ9aS5zY3JvbGxQYXJlbnROb3RIaWRkZW4ub2Zmc2V0KCkpfSxkcmFnOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1zLm9wdGlvbnMsYT0hMSxvPXMuc2Nyb2xsUGFyZW50Tm90SGlkZGVuWzBdLHI9cy5kb2N1bWVudFswXTtvIT09ciYmIkhUTUwiIT09by50YWdOYW1lPyhuLmF4aXMmJiJ4Ij09PW4uYXhpc3x8KHMub3ZlcmZsb3dPZmZzZXQudG9wK28ub2Zmc2V0SGVpZ2h0LXQucGFnZVk8bi5zY3JvbGxTZW5zaXRpdml0eT9vLnNjcm9sbFRvcD1hPW8uc2Nyb2xsVG9wK24uc2Nyb2xsU3BlZWQ6dC5wYWdlWS1zLm92ZXJmbG93T2Zmc2V0LnRvcDxuLnNjcm9sbFNlbnNpdGl2aXR5JiYoby5zY3JvbGxUb3A9YT1vLnNjcm9sbFRvcC1uLnNjcm9sbFNwZWVkKSksbi5heGlzJiYieSI9PT1uLmF4aXN8fChzLm92ZXJmbG93T2Zmc2V0LmxlZnQrby5vZmZzZXRXaWR0aC10LnBhZ2VYPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/by5zY3JvbGxMZWZ0PWE9by5zY3JvbGxMZWZ0K24uc2Nyb2xsU3BlZWQ6dC5wYWdlWC1zLm92ZXJmbG93T2Zmc2V0LmxlZnQ8bi5zY3JvbGxTZW5zaXRpdml0eSYmKG8uc2Nyb2xsTGVmdD1hPW8uc2Nyb2xsTGVmdC1uLnNjcm9sbFNwZWVkKSkpOihuLmF4aXMmJiJ4Ij09PW4uYXhpc3x8KHQucGFnZVktZShyKS5zY3JvbGxUb3AoKTxuLnNjcm9sbFNlbnNpdGl2aXR5P2E9ZShyKS5zY3JvbGxUb3AoZShyKS5zY3JvbGxUb3AoKS1uLnNjcm9sbFNwZWVkKTplKHdpbmRvdykuaGVpZ2h0KCktKHQucGFnZVktZShyKS5zY3JvbGxUb3AoKSk8bi5zY3JvbGxTZW5zaXRpdml0eSYmKGE9ZShyKS5zY3JvbGxUb3AoZShyKS5zY3JvbGxUb3AoKStuLnNjcm9sbFNwZWVkKSkpLG4uYXhpcyYmInkiPT09bi5heGlzfHwodC5wYWdlWC1lKHIpLnNjcm9sbExlZnQoKTxuLnNjcm9sbFNlbnNpdGl2aXR5P2E9ZShyKS5zY3JvbGxMZWZ0KGUocikuc2Nyb2xsTGVmdCgpLW4uc2Nyb2xsU3BlZWQpOmUod2luZG93KS53aWR0aCgpLSh0LnBhZ2VYLWUocikuc2Nyb2xsTGVmdCgpKTxuLnNjcm9sbFNlbnNpdGl2aXR5JiYoYT1lKHIpLnNjcm9sbExlZnQoZShyKS5zY3JvbGxMZWZ0KCkrbi5zY3JvbGxTcGVlZCkpKSksYSE9PSExJiZlLnVpLmRkbWFuYWdlciYmIW4uZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMocyx0KX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zO3Muc25hcEVsZW1lbnRzPVtdLGUobi5zbmFwLmNvbnN0cnVjdG9yIT09U3RyaW5nP24uc25hcC5pdGVtc3x8IjpkYXRhKHVpLWRyYWdnYWJsZSkiOm4uc25hcCkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyksaT10Lm9mZnNldCgpO3RoaXMhPT1zLmVsZW1lbnRbMF0mJnMuc25hcEVsZW1lbnRzLnB1c2goe2l0ZW06dGhpcyx3aWR0aDp0Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dC5vdXRlckhlaWdodCgpLHRvcDppLnRvcCxsZWZ0OmkubGVmdH0pfSl9LGRyYWc6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbyxyLGgsbCx1LGQsYyxwLGY9cy5vcHRpb25zLG09Zi5zbmFwVG9sZXJhbmNlLGc9aS5vZmZzZXQubGVmdCx2PWcrcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCx5PWkub2Zmc2V0LnRvcCxiPXkrcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7Zm9yKGM9cy5zbmFwRWxlbWVudHMubGVuZ3RoLTE7Yz49MDtjLS0paD1zLnNuYXBFbGVtZW50c1tjXS5sZWZ0LXMubWFyZ2lucy5sZWZ0LGw9aCtzLnNuYXBFbGVtZW50c1tjXS53aWR0aCx1PXMuc25hcEVsZW1lbnRzW2NdLnRvcC1zLm1hcmdpbnMudG9wLGQ9dStzLnNuYXBFbGVtZW50c1tjXS5oZWlnaHQsaC1tPnZ8fGc+bCttfHx1LW0+Ynx8eT5kK218fCFlLmNvbnRhaW5zKHMuc25hcEVsZW1lbnRzW2NdLml0ZW0ub3duZXJEb2N1bWVudCxzLnNuYXBFbGVtZW50c1tjXS5pdGVtKT8ocy5zbmFwRWxlbWVudHNbY10uc25hcHBpbmcmJnMub3B0aW9ucy5zbmFwLnJlbGVhc2UmJnMub3B0aW9ucy5zbmFwLnJlbGVhc2UuY2FsbChzLmVsZW1lbnQsdCxlLmV4dGVuZChzLl91aUhhc2goKSx7c25hcEl0ZW06cy5zbmFwRWxlbWVudHNbY10uaXRlbX0pKSxzLnNuYXBFbGVtZW50c1tjXS5zbmFwcGluZz0hMSk6KCJpbm5lciIhPT1mLnNuYXBNb2RlJiYobj1tPj1NYXRoLmFicyh1LWIpLGE9bT49TWF0aC5hYnMoZC15KSxvPW0+PU1hdGguYWJzKGgtdikscj1tPj1NYXRoLmFicyhsLWcpLG4mJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6dS1zLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3ApLGEmJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6ZCxsZWZ0OjB9KS50b3ApLG8mJihpLnBvc2l0aW9uLmxlZnQ9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpoLXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0KSxyJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bH0pLmxlZnQpKSxwPW58fGF8fG98fHIsIm91dGVyIiE9PWYuc25hcE1vZGUmJihuPW0+PU1hdGguYWJzKHUteSksYT1tPj1NYXRoLmFicyhkLWIpLG89bT49TWF0aC5hYnMoaC1nKSxyPW0+PU1hdGguYWJzKGwtdiksbiYmKGkucG9zaXRpb24udG9wPXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDp1LGxlZnQ6MH0pLnRvcCksYSYmKGkucG9zaXRpb24udG9wPXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpkLXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcCksbyYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omh9KS5sZWZ0KSxyJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bC1zLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdCkpLCFzLnNuYXBFbGVtZW50c1tjXS5zbmFwcGluZyYmKG58fGF8fG98fHJ8fHApJiZzLm9wdGlvbnMuc25hcC5zbmFwJiZzLm9wdGlvbnMuc25hcC5zbmFwLmNhbGwocy5lbGVtZW50LHQsZS5leHRlbmQocy5fdWlIYXNoKCkse3NuYXBJdGVtOnMuc25hcEVsZW1lbnRzW2NdLml0ZW19KSkscy5zbmFwRWxlbWVudHNbY10uc25hcHBpbmc9bnx8YXx8b3x8cnx8cCl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzdGFjayIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhPXMub3B0aW9ucyxvPWUubWFrZUFycmF5KGUoYS5zdGFjaykpLnNvcnQoZnVuY3Rpb24odCxpKXtyZXR1cm4ocGFyc2VJbnQoZSh0KS5jc3MoInpJbmRleCIpLDEwKXx8MCktKHBhcnNlSW50KGUoaSkuY3NzKCJ6SW5kZXgiKSwxMCl8fDApfSk7by5sZW5ndGgmJihuPXBhcnNlSW50KGUob1swXSkuY3NzKCJ6SW5kZXgiKSwxMCl8fDAsZShvKS5lYWNoKGZ1bmN0aW9uKHQpe2UodGhpcykuY3NzKCJ6SW5kZXgiLG4rdCl9KSx0aGlzLmNzcygiekluZGV4IixuK28ubGVuZ3RoKSl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJ6SW5kZXgiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG49ZShpLmhlbHBlciksYT1zLm9wdGlvbnM7bi5jc3MoInpJbmRleCIpJiYoYS5fekluZGV4PW4uY3NzKCJ6SW5kZXgiKSksbi5jc3MoInpJbmRleCIsYS56SW5kZXgpfSxzdG9wOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1zLm9wdGlvbnM7bi5fekluZGV4JiZlKGkuaGVscGVyKS5jc3MoInpJbmRleCIsbi5fekluZGV4KX19KSxlLnVpLmRyYWdnYWJsZSxlLndpZGdldCgidWkuZHJvcHBhYmxlIix7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoiZHJvcCIsb3B0aW9uczp7YWNjZXB0OiIqIixhY3RpdmVDbGFzczohMSxhZGRDbGFzc2VzOiEwLGdyZWVkeTohMSxob3ZlckNsYXNzOiExLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsYWN0aXZhdGU6bnVsbCxkZWFjdGl2YXRlOm51bGwsZHJvcDpudWxsLG91dDpudWxsLG92ZXI6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0LGk9dGhpcy5vcHRpb25zLHM9aS5hY2NlcHQ7dGhpcy5pc292ZXI9ITEsdGhpcy5pc291dD0hMCx0aGlzLmFjY2VwdD1lLmlzRnVuY3Rpb24ocyk/czpmdW5jdGlvbihlKXtyZXR1cm4gZS5pcyhzKX0sdGhpcy5wcm9wb3J0aW9ucz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50c1swXSx2b2lkIDApOnQ/dDp0PXt3aWR0aDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OnRoaXMuZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9fSx0aGlzLl9hZGRUb01hbmFnZXIoaS5zY29wZSksaS5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyb3BwYWJsZSIpfSxfYWRkVG9NYW5hZ2VyOmZ1bmN0aW9uKHQpe2UudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdF09ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XXx8W10sZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XS5wdXNoKHRoaXMpfSxfc3BsaWNlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO2UubGVuZ3RoPnQ7dCsrKWVbdF09PT10aGlzJiZlLnNwbGljZSh0LDEpfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTt0aGlzLl9zcGxpY2UodCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIil9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxpKXtpZigiYWNjZXB0Ij09PXQpdGhpcy5hY2NlcHQ9ZS5pc0Z1bmN0aW9uKGkpP2k6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXMoaSl9O2Vsc2UgaWYoInNjb3BlIj09PXQpe3ZhciBzPWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTt0aGlzLl9zcGxpY2UocyksdGhpcy5fYWRkVG9NYW5hZ2VyKGkpfXRoaXMuX3N1cGVyKHQsaSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgaT1lLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksaSYmdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsdGhpcy51aShpKSl9LF9kZWFjdGl2YXRlOmZ1bmN0aW9uKHQpe3ZhciBpPWUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxpJiZ0aGlzLl90cmlnZ2VyKCJkZWFjdGl2YXRlIix0LHRoaXMudWkoaSkpfSxfb3ZlcjpmdW5jdGlvbih0KXt2YXIgaT1lLnVpLmRkbWFuYWdlci5jdXJyZW50O2kmJihpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpWzBdIT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpJiYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLnVpKGkpKSl9LF9vdXQ6ZnVuY3Rpb24odCl7dmFyIGk9ZS51aS5kZG1hbmFnZXIuY3VycmVudDtpJiYoaS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0saS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm91dCIsdCx0aGlzLnVpKGkpKSl9LF9kcm9wOmZ1bmN0aW9uKHQsaSl7dmFyIHM9aXx8ZS51aS5kZG1hbmFnZXIuY3VycmVudCxuPSExO3JldHVybiBzJiYocy5jdXJyZW50SXRlbXx8cy5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXT8odGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKS5kcm9wcGFibGUoImluc3RhbmNlIik7cmV0dXJuIGkub3B0aW9ucy5ncmVlZHkmJiFpLm9wdGlvbnMuZGlzYWJsZWQmJmkub3B0aW9ucy5zY29wZT09PXMub3B0aW9ucy5zY29wZSYmaS5hY2NlcHQuY2FsbChpLmVsZW1lbnRbMF0scy5jdXJyZW50SXRlbXx8cy5lbGVtZW50KSYmZS51aS5pbnRlcnNlY3QocyxlLmV4dGVuZChpLHtvZmZzZXQ6aS5lbGVtZW50Lm9mZnNldCgpfSksaS5vcHRpb25zLnRvbGVyYW5jZSx0KT8obj0hMCwhMSk6dm9pZCAwfSksbj8hMTp0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxzLmN1cnJlbnRJdGVtfHxzLmVsZW1lbnQpPyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoImRyb3AiLHQsdGhpcy51aShzKSksdGhpcy5lbGVtZW50KTohMSk6ITF9LHVpOmZ1bmN0aW9uKGUpe3JldHVybntkcmFnZ2FibGU6ZS5jdXJyZW50SXRlbXx8ZS5lbGVtZW50LGhlbHBlcjplLmhlbHBlcixwb3NpdGlvbjplLnBvc2l0aW9uLG9mZnNldDplLnBvc2l0aW9uQWJzfX19KSxlLnVpLmludGVyc2VjdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LGkpe3JldHVybiBlPj10JiZ0K2k+ZX1yZXR1cm4gZnVuY3Rpb24odCxpLHMsbil7aWYoIWkub2Zmc2V0KXJldHVybiExO3ZhciBhPSh0LnBvc2l0aW9uQWJzfHx0LnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0K3QubWFyZ2lucy5sZWZ0LG89KHQucG9zaXRpb25BYnN8fHQucG9zaXRpb24uYWJzb2x1dGUpLnRvcCt0Lm1hcmdpbnMudG9wLHI9YSt0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLGg9byt0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsPWkub2Zmc2V0LmxlZnQsdT1pLm9mZnNldC50b3AsZD1sK2kucHJvcG9ydGlvbnMoKS53aWR0aCxjPXUraS5wcm9wb3J0aW9ucygpLmhlaWdodDtzd2l0Y2gocyl7Y2FzZSJmaXQiOnJldHVybiBhPj1sJiZkPj1yJiZvPj11JiZjPj1oO2Nhc2UiaW50ZXJzZWN0IjpyZXR1cm4gYSt0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI+bCYmZD5yLXQuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmbyt0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPnUmJmM+aC10LmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yO2Nhc2UicG9pbnRlciI6cmV0dXJuIGUobi5wYWdlWSx1LGkucHJvcG9ydGlvbnMoKS5oZWlnaHQpJiZlKG4ucGFnZVgsbCxpLnByb3BvcnRpb25zKCkud2lkdGgpO2Nhc2UidG91Y2giOnJldHVybihvPj11JiZjPj1vfHxoPj11JiZjPj1ofHx1Pm8mJmg+YykmJihhPj1sJiZkPj1hfHxyPj1sJiZkPj1yfHxsPmEmJnI+ZCk7ZGVmYXVsdDpyZXR1cm4hMX19fSgpLGUudWkuZGRtYW5hZ2VyPXtjdXJyZW50Om51bGwsZHJvcHBhYmxlczp7ImRlZmF1bHQiOltdfSxwcmVwYXJlT2Zmc2V0czpmdW5jdGlvbih0LGkpe3ZhciBzLG4sYT1lLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV18fFtdLG89aT9pLnR5cGU6bnVsbCxyPSh0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpLmZpbmQoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5hZGRCYWNrKCk7ZTpmb3Iocz0wO2EubGVuZ3RoPnM7cysrKWlmKCEoYVtzXS5vcHRpb25zLmRpc2FibGVkfHx0JiYhYVtzXS5hY2NlcHQuY2FsbChhW3NdLmVsZW1lbnRbMF0sdC5jdXJyZW50SXRlbXx8dC5lbGVtZW50KSkpe2ZvcihuPTA7ci5sZW5ndGg+bjtuKyspaWYocltuXT09PWFbc10uZWxlbWVudFswXSl7YVtzXS5wcm9wb3J0aW9ucygpLmhlaWdodD0wO2NvbnRpbnVlIGV9YVtzXS52aXNpYmxlPSJub25lIiE9PWFbc10uZWxlbWVudC5jc3MoImRpc3BsYXkiKSxhW3NdLnZpc2libGUmJigibW91c2Vkb3duIj09PW8mJmFbc10uX2FjdGl2YXRlLmNhbGwoYVtzXSxpKSxhW3NdLm9mZnNldD1hW3NdLmVsZW1lbnQub2Zmc2V0KCksYVtzXS5wcm9wb3J0aW9ucyh7d2lkdGg6YVtzXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDphW3NdLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSkpfX0sZHJvcDpmdW5jdGlvbih0LGkpe3ZhciBzPSExO3JldHVybiBlLmVhY2goKGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10pLnNsaWNlKCksZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMmJighdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJmUudWkuaW50ZXJzZWN0KHQsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlLGkpJiYocz10aGlzLl9kcm9wLmNhbGwodGhpcyxpKXx8cyksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSx0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpJiYodGhpcy5pc291dD0hMCx0aGlzLmlzb3Zlcj0hMSx0aGlzLl9kZWFjdGl2YXRlLmNhbGwodGhpcyxpKSkpfSksc30sZHJhZ1N0YXJ0OmZ1bmN0aW9uKHQsaSl7dC5lbGVtZW50LnBhcmVudHNVbnRpbCgiYm9keSIpLmJpbmQoInNjcm9sbC5kcm9wcGFibGUiLGZ1bmN0aW9uKCl7dC5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHQsaSl9KX0sZHJhZzpmdW5jdGlvbih0LGkpe3Qub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0LGkpLGUuZWFjaChlLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmIXRoaXMuZ3JlZWR5Q2hpbGQmJnRoaXMudmlzaWJsZSl7dmFyIHMsbixhLG89ZS51aS5pbnRlcnNlY3QodCx0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UsaSkscj0hbyYmdGhpcy5pc292ZXI/Imlzb3V0IjpvJiYhdGhpcy5pc292ZXI/Imlzb3ZlciI6bnVsbDtyJiYodGhpcy5vcHRpb25zLmdyZWVkeSYmKG49dGhpcy5vcHRpb25zLnNjb3BlLGE9dGhpcy5lbGVtZW50LnBhcmVudHMoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKS5kcm9wcGFibGUoImluc3RhbmNlIikub3B0aW9ucy5zY29wZT09PW59KSxhLmxlbmd0aCYmKHM9ZShhWzBdKS5kcm9wcGFibGUoImluc3RhbmNlIikscy5ncmVlZHlDaGlsZD0iaXNvdmVyIj09PXIpKSxzJiYiaXNvdmVyIj09PXImJihzLmlzb3Zlcj0hMSxzLmlzb3V0PSEwLHMuX291dC5jYWxsKHMsaSkpLHRoaXNbcl09ITAsdGhpc1siaXNvdXQiPT09cj8iaXNvdmVyIjoiaXNvdXQiXT0hMSx0aGlzWyJpc292ZXIiPT09cj8iX292ZXIiOiJfb3V0Il0uY2FsbCh0aGlzLGkpLHMmJiJpc291dCI9PT1yJiYocy5pc291dD0hMSxzLmlzb3Zlcj0hMCxzLl9vdmVyLmNhbGwocyxpKSkpfX0pfSxkcmFnU3RvcDpmdW5jdGlvbih0LGkpe3QuZWxlbWVudC5wYXJlbnRzVW50aWwoImJvZHkiKS51bmJpbmQoInNjcm9sbC5kcm9wcGFibGUiKSx0Lm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8ZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModCxpKX19LGUudWkuZHJvcHBhYmxlLGUud2lkZ2V0KCJ1aS5yZXNpemFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuMTEuNCIsd2lkZ2V0RXZlbnRQcmVmaXg6InJlc2l6ZSIsb3B0aW9uczp7YWxzb1Jlc2l6ZTohMSxhbmltYXRlOiExLGFuaW1hdGVEdXJhdGlvbjoic2xvdyIsYW5pbWF0ZUVhc2luZzoic3dpbmciLGFzcGVjdFJhdGlvOiExLGF1dG9IaWRlOiExLGNvbnRhaW5tZW50OiExLGdob3N0OiExLGdyaWQ6ITEsaGFuZGxlczoiZSxzLHNlIixoZWxwZXI6ITEsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTAsbWluV2lkdGg6MTAsekluZGV4OjkwLHJlc2l6ZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxfbnVtOmZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLDEwKXx8MH0sX2lzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiFpc05hTihwYXJzZUludChlLDEwKSl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24odCxpKXtpZigiaGlkZGVuIj09PWUodCkuY3NzKCJvdmVyZmxvdyIpKXJldHVybiExO3ZhciBzPWkmJiJsZWZ0Ij09PWk/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiLG49ITE7cmV0dXJuIHRbc10+MD8hMDoodFtzXT0xLG49dFtzXT4wLHRbc109MCxuKX0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0LGkscyxuLGEsbz10aGlzLHI9dGhpcy5vcHRpb25zO2lmKHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktcmVzaXphYmxlIiksZS5leHRlbmQodGhpcyx7X2FzcGVjdFJhdGlvOiEhci5hc3BlY3RSYXRpbyxhc3BlY3RSYXRpbzpyLmFzcGVjdFJhdGlvLG9yaWdpbmFsRWxlbWVudDp0aGlzLmVsZW1lbnQsX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHM6W10sX2hlbHBlcjpyLmhlbHBlcnx8ci5naG9zdHx8ci5hbmltYXRlP3IuaGVscGVyfHwidWktcmVzaXphYmxlLWhlbHBlciI6bnVsbH0pLHRoaXMuZWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvXihjYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcpJC9pKSYmKHRoaXMuZWxlbWVudC53cmFwKGUoIjxkaXYgY2xhc3M9J3VpLXdyYXBwZXInIHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyc+PC9kaXY+IikuY3NzKHtwb3NpdGlvbjp0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLHRvcDp0aGlzLmVsZW1lbnQuY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuZWxlbWVudC5jc3MoImxlZnQiKX0pKSx0aGlzLmVsZW1lbnQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmRhdGEoInVpLXJlc2l6YWJsZSIsdGhpcy5lbGVtZW50LnJlc2l6YWJsZSgiaW5zdGFuY2UiKSksdGhpcy5lbGVtZW50SXNXcmFwcGVyPSEwLHRoaXMuZWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksbWFyZ2luVG9wOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luVG9wIiksbWFyZ2luUmlnaHQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLG1hcmdpbkJvdHRvbTp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpfSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OjAsbWFyZ2luVG9wOjAsbWFyZ2luUmlnaHQ6MCxtYXJnaW5Cb3R0b206MH0pLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZT10aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiwibm9uZSIpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMucHVzaCh0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOiJzdGF0aWMiLHpvb206MSxkaXNwbGF5OiJibG9jayJ9KSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHttYXJnaW46dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW4iKX0pLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLHRoaXMuaGFuZGxlcz1yLmhhbmRsZXN8fChlKCIudWktcmVzaXphYmxlLWhhbmRsZSIsdGhpcy5lbGVtZW50KS5sZW5ndGg/e246Ii51aS1yZXNpemFibGUtbiIsZToiLnVpLXJlc2l6YWJsZS1lIixzOiIudWktcmVzaXphYmxlLXMiLHc6Ii51aS1yZXNpemFibGUtdyIsc2U6Ii51aS1yZXNpemFibGUtc2UiLHN3OiIudWktcmVzaXphYmxlLXN3IixuZToiLnVpLXJlc2l6YWJsZS1uZSIsbnc6Ii51aS1yZXNpemFibGUtbncifToiZSxzLHNlIiksdGhpcy5faGFuZGxlcz1lKCksdGhpcy5oYW5kbGVzLmNvbnN0cnVjdG9yPT09U3RyaW5nKWZvcigiYWxsIj09PXRoaXMuaGFuZGxlcyYmKHRoaXMuaGFuZGxlcz0ibixlLHMsdyxzZSxzdyxuZSxudyIpLHQ9dGhpcy5oYW5kbGVzLnNwbGl0KCIsIiksdGhpcy5oYW5kbGVzPXt9LGk9MDt0Lmxlbmd0aD5pO2krKylzPWUudHJpbSh0W2ldKSxhPSJ1aS1yZXNpemFibGUtIitzLG49ZSgiPGRpdiBjbGFzcz0ndWktcmVzaXphYmxlLWhhbmRsZSAiK2ErIic+PC9kaXY+Iiksbi5jc3Moe3pJbmRleDpyLnpJbmRleH0pLCJzZSI9PT1zJiZuLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIiksdGhpcy5oYW5kbGVzW3NdPSIudWktcmVzaXphYmxlLSIrcyx0aGlzLmVsZW1lbnQuYXBwZW5kKG4pO3RoaXMuX3JlbmRlckF4aXM9ZnVuY3Rpb24odCl7dmFyIGkscyxuLGE7dD10fHx0aGlzLmVsZW1lbnQ7Zm9yKGkgaW4gdGhpcy5oYW5kbGVzKXRoaXMuaGFuZGxlc1tpXS5jb25zdHJ1Y3Rvcj09PVN0cmluZz90aGlzLmhhbmRsZXNbaV09dGhpcy5lbGVtZW50LmNoaWxkcmVuKHRoaXMuaGFuZGxlc1tpXSkuZmlyc3QoKS5zaG93KCk6KHRoaXMuaGFuZGxlc1tpXS5qcXVlcnl8fHRoaXMuaGFuZGxlc1tpXS5ub2RlVHlwZSkmJih0aGlzLmhhbmRsZXNbaV09ZSh0aGlzLmhhbmRsZXNbaV0pLHRoaXMuX29uKHRoaXMuaGFuZGxlc1tpXSx7bW91c2Vkb3duOm8uX21vdXNlRG93bn0pKSx0aGlzLmVsZW1lbnRJc1dyYXBwZXImJnRoaXMub3JpZ2luYWxFbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9eKHRleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b24pJC9pKSYmKHM9ZSh0aGlzLmhhbmRsZXNbaV0sdGhpcy5lbGVtZW50KSxhPS9zd3xuZXxud3xzZXxufHMvLnRlc3QoaSk/cy5vdXRlckhlaWdodCgpOnMub3V0ZXJXaWR0aCgpLG49WyJwYWRkaW5nIiwvbmV8bnd8bi8udGVzdChpKT8iVG9wIjovc2V8c3d8cy8udGVzdChpKT8iQm90dG9tIjovXmUkLy50ZXN0KGkpPyJSaWdodCI6IkxlZnQiXS5qb2luKCIiKSx0LmNzcyhuLGEpLHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLHRoaXMuX2hhbmRsZXM9dGhpcy5faGFuZGxlcy5hZGQodGhpcy5oYW5kbGVzW2ldKX0sdGhpcy5fcmVuZGVyQXhpcyh0aGlzLmVsZW1lbnQpLHRoaXMuX2hhbmRsZXM9dGhpcy5faGFuZGxlcy5hZGQodGhpcy5lbGVtZW50LmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikpLHRoaXMuX2hhbmRsZXMuZGlzYWJsZVNlbGVjdGlvbigpLHRoaXMuX2hhbmRsZXMubW91c2VvdmVyKGZ1bmN0aW9uKCl7by5yZXNpemluZ3x8KHRoaXMuY2xhc3NOYW1lJiYobj10aGlzLmNsYXNzTmFtZS5tYXRjaCgvdWktcmVzaXphYmxlLShzZXxzd3xuZXxud3xufGV8c3x3KS9pKSksby5heGlzPW4mJm5bMV0/blsxXToic2UiKX0pLHIuYXV0b0hpZGUmJih0aGlzLl9oYW5kbGVzLmhpZGUoKSxlKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLm1vdXNlZW50ZXIoZnVuY3Rpb24oKXtyLmRpc2FibGVkfHwoZSh0aGlzKS5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIiksby5faGFuZGxlcy5zaG93KCkpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe3IuZGlzYWJsZWR8fG8ucmVzaXppbmd8fChlKHRoaXMpLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSxvLl9oYW5kbGVzLmhpZGUoKSl9KSksdGhpcy5fbW91c2VJbml0KCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fbW91c2VEZXN0cm95KCk7dmFyIHQsaT1mdW5jdGlvbih0KXtlKHQpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUgdWktcmVzaXphYmxlLWRpc2FibGVkIHVpLXJlc2l6YWJsZS1yZXNpemluZyIpLnJlbW92ZURhdGEoInJlc2l6YWJsZSIpLnJlbW92ZURhdGEoInVpLXJlc2l6YWJsZSIpLnVuYmluZCgiLnJlc2l6YWJsZSIpLmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikucmVtb3ZlKCl9O3JldHVybiB0aGlzLmVsZW1lbnRJc1dyYXBwZXImJihpKHRoaXMuZWxlbWVudCksdD10aGlzLmVsZW1lbnQsdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjp0LmNzcygicG9zaXRpb24iKSx3aWR0aDp0Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dC5vdXRlckhlaWdodCgpLHRvcDp0LmNzcygidG9wIiksbGVmdDp0LmNzcygibGVmdCIpfSkuaW5zZXJ0QWZ0ZXIodCksdC5yZW1vdmUoKSksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSksaSh0aGlzLm9yaWdpbmFsRWxlbWVudCksdGhpc30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0KXt2YXIgaSxzLG49ITE7Zm9yKGkgaW4gdGhpcy5oYW5kbGVzKXM9ZSh0aGlzLmhhbmRsZXNbaV0pWzBdLChzPT09dC50YXJnZXR8fGUuY29udGFpbnMocyx0LnRhcmdldCkpJiYobj0hMCk7cmV0dXJuIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmbn0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGE9dGhpcy5vcHRpb25zLG89dGhpcy5lbGVtZW50O3JldHVybiB0aGlzLnJlc2l6aW5nPSEwLHRoaXMuX3JlbmRlclByb3h5KCksaT10aGlzLl9udW0odGhpcy5oZWxwZXIuY3NzKCJsZWZ0IikpLHM9dGhpcy5fbnVtKHRoaXMuaGVscGVyLmNzcygidG9wIikpLGEuY29udGFpbm1lbnQmJihpKz1lKGEuY29udGFpbm1lbnQpLnNjcm9sbExlZnQoKXx8MCxzKz1lKGEuY29udGFpbm1lbnQpLnNjcm9sbFRvcCgpfHwwKSx0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLnBvc2l0aW9uPXtsZWZ0OmksdG9wOnN9LHRoaXMuc2l6ZT10aGlzLl9oZWxwZXI/e3dpZHRoOnRoaXMuaGVscGVyLndpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLmhlaWdodCgpfTp7d2lkdGg6by53aWR0aCgpLGhlaWdodDpvLmhlaWdodCgpfSx0aGlzLm9yaWdpbmFsU2l6ZT10aGlzLl9oZWxwZXI/e3dpZHRoOm8ub3V0ZXJXaWR0aCgpLGhlaWdodDpvLm91dGVySGVpZ2h0KCl9Ont3aWR0aDpvLndpZHRoKCksaGVpZ2h0Om8uaGVpZ2h0KCl9LHRoaXMuc2l6ZURpZmY9e3dpZHRoOm8ub3V0ZXJXaWR0aCgpLW8ud2lkdGgoKSxoZWlnaHQ6by5vdXRlckhlaWdodCgpLW8uaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxQb3NpdGlvbj17bGVmdDppLHRvcDpzfSx0aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbj17bGVmdDp0LnBhZ2VYLHRvcDp0LnBhZ2VZfSx0aGlzLmFzcGVjdFJhdGlvPSJudW1iZXIiPT10eXBlb2YgYS5hc3BlY3RSYXRpbz9hLmFzcGVjdFJhdGlvOnRoaXMub3JpZ2luYWxTaXplLndpZHRoL3RoaXMub3JpZ2luYWxTaXplLmhlaWdodHx8MSxuPWUoIi51aS1yZXNpemFibGUtIit0aGlzLmF4aXMpLmNzcygiY3Vyc29yIiksZSgiYm9keSIpLmNzcygiY3Vyc29yIiwiYXV0byI9PT1uP3RoaXMuYXhpcysiLXJlc2l6ZSI6biksby5hZGRDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdGFydCIsdCksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24odCl7dmFyIGkscyxuPXRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uLGE9dGhpcy5heGlzLG89dC5wYWdlWC1uLmxlZnR8fDAscj10LnBhZ2VZLW4udG9wfHwwLGg9dGhpcy5fY2hhbmdlW2FdO3JldHVybiB0aGlzLl91cGRhdGVQcmV2UHJvcGVydGllcygpLGg/KGk9aC5hcHBseSh0aGlzLFt0LG8scl0pLHRoaXMuX3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzKHQuc2hpZnRLZXkpLCh0aGlzLl9hc3BlY3RSYXRpb3x8dC5zaGlmdEtleSkmJihpPXRoaXMuX3VwZGF0ZVJhdGlvKGksdCkpLGk9dGhpcy5fcmVzcGVjdFNpemUoaSx0KSx0aGlzLl91cGRhdGVDYWNoZShpKSx0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsdCkscz10aGlzLl9hcHBseUNoYW5nZXMoKSwhdGhpcy5faGVscGVyJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aCYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSxlLmlzRW1wdHlPYmplY3Qocyl8fCh0aGlzLl91cGRhdGVQcmV2UHJvcGVydGllcygpLHRoaXMuX3RyaWdnZXIoInJlc2l6ZSIsdCx0aGlzLnVpKCkpLHRoaXMuX2FwcGx5Q2hhbmdlcygpKSwhMSk6ITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCl7dGhpcy5yZXNpemluZz0hMTt2YXIgaSxzLG4sYSxvLHIsaCxsPXRoaXMub3B0aW9ucyx1PXRoaXM7cmV0dXJuIHRoaXMuX2hlbHBlciYmKGk9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cyxzPWkubGVuZ3RoJiYvdGV4dGFyZWEvaS50ZXN0KGlbMF0ubm9kZU5hbWUpLG49cyYmdGhpcy5faGFzU2Nyb2xsKGlbMF0sImxlZnQiKT8wOnUuc2l6ZURpZmYuaGVpZ2h0LGE9cz8wOnUuc2l6ZURpZmYud2lkdGgsbz17d2lkdGg6dS5oZWxwZXIud2lkdGgoKS1hLGhlaWdodDp1LmhlbHBlci5oZWlnaHQoKS1ufSxyPXBhcnNlSW50KHUuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKHUucG9zaXRpb24ubGVmdC11Lm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsaD1wYXJzZUludCh1LmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKHUucG9zaXRpb24udG9wLXUub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsLGwuYW5pbWF0ZXx8dGhpcy5lbGVtZW50LmNzcyhlLmV4dGVuZChvLHt0b3A6aCxsZWZ0OnJ9KSksdS5oZWxwZXIuaGVpZ2h0KHUuc2l6ZS5oZWlnaHQpLHUuaGVscGVyLndpZHRoKHUuc2l6ZS53aWR0aCksdGhpcy5faGVscGVyJiYhbC5hbmltYXRlJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpKSxlKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIiksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0b3AiLHQpLHRoaXMuX2hlbHBlciYmdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9LF91cGRhdGVQcmV2UHJvcGVydGllczpmdW5jdGlvbigpe3RoaXMucHJldlBvc2l0aW9uPXt0b3A6dGhpcy5wb3NpdGlvbi50b3AsbGVmdDp0aGlzLnBvc2l0aW9uLmxlZnR9LHRoaXMucHJldlNpemU9e3dpZHRoOnRoaXMuc2l6ZS53aWR0aCxoZWlnaHQ6dGhpcy5zaXplLmhlaWdodH19LF9hcHBseUNoYW5nZXM6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gdGhpcy5wb3NpdGlvbi50b3AhPT10aGlzLnByZXZQb3NpdGlvbi50b3AmJihlLnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgiKSx0aGlzLnBvc2l0aW9uLmxlZnQhPT10aGlzLnByZXZQb3NpdGlvbi5sZWZ0JiYoZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiKSx0aGlzLnNpemUud2lkdGghPT10aGlzLnByZXZTaXplLndpZHRoJiYoZS53aWR0aD10aGlzLnNpemUud2lkdGgrInB4IiksdGhpcy5zaXplLmhlaWdodCE9PXRoaXMucHJldlNpemUuaGVpZ2h0JiYoZS5oZWlnaHQ9dGhpcy5zaXplLmhlaWdodCsicHgiKSx0aGlzLmhlbHBlci5jc3MoZSksZX0sX3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzOmZ1bmN0aW9uKGUpe3ZhciB0LGkscyxuLGEsbz10aGlzLm9wdGlvbnM7YT17bWluV2lkdGg6dGhpcy5faXNOdW1iZXIoby5taW5XaWR0aCk/by5taW5XaWR0aDowLG1heFdpZHRoOnRoaXMuX2lzTnVtYmVyKG8ubWF4V2lkdGgpP28ubWF4V2lkdGg6MS8wLG1pbkhlaWdodDp0aGlzLl9pc051bWJlcihvLm1pbkhlaWdodCk/by5taW5IZWlnaHQ6MCxtYXhIZWlnaHQ6dGhpcy5faXNOdW1iZXIoby5tYXhIZWlnaHQpP28ubWF4SGVpZ2h0OjEvMH0sKHRoaXMuX2FzcGVjdFJhdGlvfHxlKSYmKHQ9YS5taW5IZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxzPWEubWluV2lkdGgvdGhpcy5hc3BlY3RSYXRpbyxpPWEubWF4SGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sbj1hLm1heFdpZHRoL3RoaXMuYXNwZWN0UmF0aW8sdD5hLm1pbldpZHRoJiYoYS5taW5XaWR0aD10KSxzPmEubWluSGVpZ2h0JiYoYS5taW5IZWlnaHQ9cyksYS5tYXhXaWR0aD5pJiYoYS5tYXhXaWR0aD1pKSxhLm1heEhlaWdodD5uJiYoYS5tYXhIZWlnaHQ9bikpLHRoaXMuX3ZCb3VuZGFyaWVzPWF9LF91cGRhdGVDYWNoZTpmdW5jdGlvbihlKXt0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLl9pc051bWJlcihlLmxlZnQpJiYodGhpcy5wb3NpdGlvbi5sZWZ0PWUubGVmdCksdGhpcy5faXNOdW1iZXIoZS50b3ApJiYodGhpcy5wb3NpdGlvbi50b3A9ZS50b3ApLHRoaXMuX2lzTnVtYmVyKGUuaGVpZ2h0KSYmKHRoaXMuc2l6ZS5oZWlnaHQ9ZS5oZWlnaHQpLHRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiYodGhpcy5zaXplLndpZHRoPWUud2lkdGgpfSxfdXBkYXRlUmF0aW86ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb3NpdGlvbixpPXRoaXMuc2l6ZSxzPXRoaXMuYXhpcztyZXR1cm4gdGhpcy5faXNOdW1iZXIoZS5oZWlnaHQpP2Uud2lkdGg9ZS5oZWlnaHQqdGhpcy5hc3BlY3RSYXRpbzp0aGlzLl9pc051bWJlcihlLndpZHRoKSYmKGUuaGVpZ2h0PWUud2lkdGgvdGhpcy5hc3BlY3RSYXRpbyksInN3Ij09PXMmJihlLmxlZnQ9dC5sZWZ0KyhpLndpZHRoLWUud2lkdGgpLGUudG9wPW51bGwpLCJudyI9PT1zJiYoZS50b3A9dC50b3ArKGkuaGVpZ2h0LWUuaGVpZ2h0KSxlLmxlZnQ9dC5sZWZ0KyhpLndpZHRoLWUud2lkdGgpKSxlfSxfcmVzcGVjdFNpemU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fdkJvdW5kYXJpZXMsaT10aGlzLmF4aXMscz10aGlzLl9pc051bWJlcihlLndpZHRoKSYmdC5tYXhXaWR0aCYmdC5tYXhXaWR0aDxlLndpZHRoLG49dGhpcy5faXNOdW1iZXIoZS5oZWlnaHQpJiZ0Lm1heEhlaWdodCYmdC5tYXhIZWlnaHQ8ZS5oZWlnaHQsYT10aGlzLl9pc051bWJlcihlLndpZHRoKSYmdC5taW5XaWR0aCYmdC5taW5XaWR0aD5lLndpZHRoLG89dGhpcy5faXNOdW1iZXIoZS5oZWlnaHQpJiZ0Lm1pbkhlaWdodCYmdC5taW5IZWlnaHQ+ZS5oZWlnaHQscj10aGlzLm9yaWdpbmFsUG9zaXRpb24ubGVmdCt0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aCxoPXRoaXMucG9zaXRpb24udG9wK3RoaXMuc2l6ZS5oZWlnaHQsbD0vc3d8bnd8dy8udGVzdChpKSx1PS9ud3xuZXxuLy50ZXN0KGkpO3JldHVybiBhJiYoZS53aWR0aD10Lm1pbldpZHRoKSxvJiYoZS5oZWlnaHQ9dC5taW5IZWlnaHQpLHMmJihlLndpZHRoPXQubWF4V2lkdGgpLG4mJihlLmhlaWdodD10Lm1heEhlaWdodCksYSYmbCYmKGUubGVmdD1yLXQubWluV2lkdGgpLHMmJmwmJihlLmxlZnQ9ci10Lm1heFdpZHRoKSxvJiZ1JiYoZS50b3A9aC10Lm1pbkhlaWdodCksbiYmdSYmKGUudG9wPWgtdC5tYXhIZWlnaHQpLGUud2lkdGh8fGUuaGVpZ2h0fHxlLmxlZnR8fCFlLnRvcD9lLndpZHRofHxlLmhlaWdodHx8ZS50b3B8fCFlLmxlZnR8fChlLmxlZnQ9bnVsbCk6ZS50b3A9bnVsbCxlfSxfZ2V0UGFkZGluZ1BsdXNCb3JkZXJEaW1lbnNpb25zOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLGk9W10scz1bZS5jc3MoImJvcmRlclRvcFdpZHRoIiksZS5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSxlLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSxlLmNzcygiYm9yZGVyTGVmdFdpZHRoIildLG49W2UuY3NzKCJwYWRkaW5nVG9wIiksZS5jc3MoInBhZGRpbmdSaWdodCIpLGUuY3NzKCJwYWRkaW5nQm90dG9tIiksZS5jc3MoInBhZGRpbmdMZWZ0IildOzQ+dDt0KyspaVt0XT1wYXJzZUludChzW3RdLDEwKXx8MCxpW3RdKz1wYXJzZUludChuW3RdLDEwKXx8MDtyZXR1cm57aGVpZ2h0OmlbMF0raVsyXSx3aWR0aDppWzFdK2lbM119fSxfcHJvcG9ydGlvbmFsbHlSZXNpemU6ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aClmb3IodmFyIGUsdD0wLGk9dGhpcy5oZWxwZXJ8fHRoaXMuZWxlbWVudDt0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aD50O3QrKyllPXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHNbdF0sdGhpcy5vdXRlckRpbWVuc2lvbnN8fCh0aGlzLm91dGVyRGltZW5zaW9ucz10aGlzLl9nZXRQYWRkaW5nUGx1c0JvcmRlckRpbWVuc2lvbnMoZSkpLGUuY3NzKHtoZWlnaHQ6aS5oZWlnaHQoKS10aGlzLm91dGVyRGltZW5zaW9ucy5oZWlnaHR8fDAsd2lkdGg6aS53aWR0aCgpLXRoaXMub3V0ZXJEaW1lbnNpb25zLndpZHRofHwwfSl9LF9yZW5kZXJQcm94eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudCxpPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnRPZmZzZXQ9dC5vZmZzZXQoKSx0aGlzLl9oZWxwZXI/KHRoaXMuaGVscGVyPXRoaXMuaGVscGVyfHxlKCI8ZGl2IHN0eWxlPSdvdmVyZmxvdzpoaWRkZW47Jz48L2Rpdj4iKSx0aGlzLmhlbHBlci5hZGRDbGFzcyh0aGlzLl9oZWxwZXIpLmNzcyh7d2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKS0xLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKS0xLHBvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDp0aGlzLmVsZW1lbnRPZmZzZXQubGVmdCsicHgiLHRvcDp0aGlzLmVsZW1lbnRPZmZzZXQudG9wKyJweCIsekluZGV4OisraS56SW5kZXh9KSx0aGlzLmhlbHBlci5hcHBlbmRUbygiYm9keSIpLmRpc2FibGVTZWxlY3Rpb24oKSk6dGhpcy5oZWxwZXI9dGhpcy5lbGVtZW50fSxfY2hhbmdlOntlOmZ1bmN0aW9uKGUsdCl7cmV0dXJue3dpZHRoOnRoaXMub3JpZ2luYWxTaXplLndpZHRoK3R9fSx3OmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5vcmlnaW5hbFNpemUscz10aGlzLm9yaWdpbmFsUG9zaXRpb247cmV0dXJue2xlZnQ6cy5sZWZ0K3Qsd2lkdGg6aS53aWR0aC10fX0sbjpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcy5vcmlnaW5hbFNpemUsbj10aGlzLm9yaWdpbmFsUG9zaXRpb247cmV0dXJue3RvcDpuLnRvcCtpLGhlaWdodDpzLmhlaWdodC1pfX0sczpmdW5jdGlvbihlLHQsaSl7cmV0dXJue2hlaWdodDp0aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHQraX19LHNlOmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW3QsaSxzXSkpfSxzdzpmdW5jdGlvbih0LGkscyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFt0LGksc10pKX0sbmU6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbdCxpLHNdKSl9LG53OmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW3QsaSxzXSkpfX0sX3Byb3BhZ2F0ZTpmdW5jdGlvbih0LGkpe2UudWkucGx1Z2luLmNhbGwodGhpcyx0LFtpLHRoaXMudWkoKV0pLCJyZXNpemUiIT09dCYmdGhpcy5fdHJpZ2dlcih0LGksdGhpcy51aSgpKX0scGx1Z2luczp7fSx1aTpmdW5jdGlvbigpe3JldHVybntvcmlnaW5hbEVsZW1lbnQ6dGhpcy5vcmlnaW5hbEVsZW1lbnQsZWxlbWVudDp0aGlzLmVsZW1lbnQsaGVscGVyOnRoaXMuaGVscGVyLHBvc2l0aW9uOnRoaXMucG9zaXRpb24sc2l6ZTp0aGlzLnNpemUsb3JpZ2luYWxTaXplOnRoaXMub3JpZ2luYWxTaXplLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9ufX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFuaW1hdGUiLHtzdG9wOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLHM9aS5vcHRpb25zLG49aS5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cyxhPW4ubGVuZ3RoJiYvdGV4dGFyZWEvaS50ZXN0KG5bMF0ubm9kZU5hbWUpLG89YSYmaS5faGFzU2Nyb2xsKG5bMF0sImxlZnQiKT8wOmkuc2l6ZURpZmYuaGVpZ2h0LHI9YT8wOmkuc2l6ZURpZmYud2lkdGgsaD17d2lkdGg6aS5zaXplLndpZHRoLXIsaGVpZ2h0Omkuc2l6ZS5oZWlnaHQtb30sbD1wYXJzZUludChpLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApKyhpLnBvc2l0aW9uLmxlZnQtaS5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLHU9cGFyc2VJbnQoaS5lbGVtZW50LmNzcygidG9wIiksMTApKyhpLnBvc2l0aW9uLnRvcC1pLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDtpLmVsZW1lbnQuYW5pbWF0ZShlLmV4dGVuZChoLHUmJmw/e3RvcDp1LGxlZnQ6bH06e30pLHtkdXJhdGlvbjpzLmFuaW1hdGVEdXJhdGlvbixlYXNpbmc6cy5hbmltYXRlRWFzaW5nLHN0ZXA6ZnVuY3Rpb24oKXt2YXIgcz17d2lkdGg6cGFyc2VJbnQoaS5lbGVtZW50LmNzcygid2lkdGgiKSwxMCksaGVpZ2h0OnBhcnNlSW50KGkuZWxlbWVudC5jc3MoImhlaWdodCIpLDEwKSx0b3A6cGFyc2VJbnQoaS5lbGVtZW50LmNzcygidG9wIiksMTApLGxlZnQ6cGFyc2VJbnQoaS5lbGVtZW50LmNzcygibGVmdCIpLDEwKX07biYmbi5sZW5ndGgmJmUoblswXSkuY3NzKHt3aWR0aDpzLndpZHRoLGhlaWdodDpzLmhlaWdodH0pLGkuX3VwZGF0ZUNhY2hlKHMpLGkuX3Byb3BhZ2F0ZSgicmVzaXplIix0KX19KX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImNvbnRhaW5tZW50Iix7c3RhcnQ6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbixhLG8scixoPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLGw9aC5vcHRpb25zLHU9aC5lbGVtZW50LGQ9bC5jb250YWlubWVudCxjPWQgaW5zdGFuY2VvZiBlP2QuZ2V0KDApOi9wYXJlbnQvLnRlc3QoZCk/dS5wYXJlbnQoKS5nZXQoMCk6ZDtjJiYoaC5jb250YWluZXJFbGVtZW50PWUoYyksL2RvY3VtZW50Ly50ZXN0KGQpfHxkPT09ZG9jdW1lbnQ/KGguY29udGFpbmVyT2Zmc2V0PXtsZWZ0OjAsdG9wOjB9LGguY29udGFpbmVyUG9zaXRpb249e2xlZnQ6MCx0b3A6MH0saC5wYXJlbnREYXRhPXtlbGVtZW50OmUoZG9jdW1lbnQpLGxlZnQ6MCx0b3A6MCx3aWR0aDplKGRvY3VtZW50KS53aWR0aCgpLGhlaWdodDplKGRvY3VtZW50KS5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodH0pOih0PWUoYyksaT1bXSxlKFsiVG9wIiwiUmlnaHQiLCJMZWZ0IiwiQm90dG9tIl0pLmVhY2goZnVuY3Rpb24oZSxzKXtpW2VdPWguX251bSh0LmNzcygicGFkZGluZyIrcykpfSksaC5jb250YWluZXJPZmZzZXQ9dC5vZmZzZXQoKSxoLmNvbnRhaW5lclBvc2l0aW9uPXQucG9zaXRpb24oKSxoLmNvbnRhaW5lclNpemU9e2hlaWdodDp0LmlubmVySGVpZ2h0KCktaVszXSx3aWR0aDp0LmlubmVyV2lkdGgoKS1pWzFdfSxzPWguY29udGFpbmVyT2Zmc2V0LG49aC5jb250YWluZXJTaXplLmhlaWdodCxhPWguY29udGFpbmVyU2l6ZS53aWR0aCxvPWguX2hhc1Njcm9sbChjLCJsZWZ0Iik/Yy5zY3JvbGxXaWR0aDphLHI9aC5faGFzU2Nyb2xsKGMpP2Muc2Nyb2xsSGVpZ2h0Om4saC5wYXJlbnREYXRhPXtlbGVtZW50OmMsbGVmdDpzLmxlZnQsdG9wOnMudG9wLHdpZHRoOm8saGVpZ2h0OnJ9KSl9LHJlc2l6ZTpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLHI9by5vcHRpb25zLGg9by5jb250YWluZXJPZmZzZXQsbD1vLnBvc2l0aW9uLHU9by5fYXNwZWN0UmF0aW98fHQuc2hpZnRLZXksZD17dG9wOjAsbGVmdDowfSxjPW8uY29udGFpbmVyRWxlbWVudCxwPSEwO2NbMF0hPT1kb2N1bWVudCYmL3N0YXRpYy8udGVzdChjLmNzcygicG9zaXRpb24iKSkmJihkPWgpLGwubGVmdDwoby5faGVscGVyP2gubGVmdDowKSYmKG8uc2l6ZS53aWR0aD1vLnNpemUud2lkdGgrKG8uX2hlbHBlcj9vLnBvc2l0aW9uLmxlZnQtaC5sZWZ0Om8ucG9zaXRpb24ubGVmdC1kLmxlZnQpLHUmJihvLnNpemUuaGVpZ2h0PW8uc2l6ZS53aWR0aC9vLmFzcGVjdFJhdGlvLHA9ITEpLG8ucG9zaXRpb24ubGVmdD1yLmhlbHBlcj9oLmxlZnQ6MCksbC50b3A8KG8uX2hlbHBlcj9oLnRvcDowKSYmKG8uc2l6ZS5oZWlnaHQ9by5zaXplLmhlaWdodCsoby5faGVscGVyP28ucG9zaXRpb24udG9wLWgudG9wOm8ucG9zaXRpb24udG9wKSx1JiYoby5zaXplLndpZHRoPW8uc2l6ZS5oZWlnaHQqby5hc3BlY3RSYXRpbyxwPSExKSxvLnBvc2l0aW9uLnRvcD1vLl9oZWxwZXI/aC50b3A6MCksbj1vLmNvbnRhaW5lckVsZW1lbnQuZ2V0KDApPT09by5lbGVtZW50LnBhcmVudCgpLmdldCgwKSxhPS9yZWxhdGl2ZXxhYnNvbHV0ZS8udGVzdChvLmNvbnRhaW5lckVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKSxuJiZhPyhvLm9mZnNldC5sZWZ0PW8ucGFyZW50RGF0YS5sZWZ0K28ucG9zaXRpb24ubGVmdCxvLm9mZnNldC50b3A9by5wYXJlbnREYXRhLnRvcCtvLnBvc2l0aW9uLnRvcCk6KG8ub2Zmc2V0LmxlZnQ9by5lbGVtZW50Lm9mZnNldCgpLmxlZnQsby5vZmZzZXQudG9wPW8uZWxlbWVudC5vZmZzZXQoKS50b3ApLGk9TWF0aC5hYnMoby5zaXplRGlmZi53aWR0aCsoby5faGVscGVyP28ub2Zmc2V0LmxlZnQtZC5sZWZ0Om8ub2Zmc2V0LmxlZnQtaC5sZWZ0KSkscz1NYXRoLmFicyhvLnNpemVEaWZmLmhlaWdodCsoby5faGVscGVyP28ub2Zmc2V0LnRvcC1kLnRvcDpvLm9mZnNldC50b3AtaC50b3ApKSxpK28uc2l6ZS53aWR0aD49by5wYXJlbnREYXRhLndpZHRoJiYoby5zaXplLndpZHRoPW8ucGFyZW50RGF0YS53aWR0aC1pLHUmJihvLnNpemUuaGVpZ2h0PW8uc2l6ZS53aWR0aC9vLmFzcGVjdFJhdGlvLHA9ITEpKSxzK28uc2l6ZS5oZWlnaHQ+PW8ucGFyZW50RGF0YS5oZWlnaHQmJihvLnNpemUuaGVpZ2h0PW8ucGFyZW50RGF0YS5oZWlnaHQtcyx1JiYoby5zaXplLndpZHRoPW8uc2l6ZS5oZWlnaHQqby5hc3BlY3RSYXRpbyxwPSExKSkscHx8KG8ucG9zaXRpb24ubGVmdD1vLnByZXZQb3NpdGlvbi5sZWZ0LG8ucG9zaXRpb24udG9wPW8ucHJldlBvc2l0aW9uLnRvcCxvLnNpemUud2lkdGg9by5wcmV2U2l6ZS53aWR0aCxvLnNpemUuaGVpZ2h0PW8ucHJldlNpemUuaGVpZ2h0KX0sc3RvcDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLGk9dC5vcHRpb25zLHM9dC5jb250YWluZXJPZmZzZXQsbj10LmNvbnRhaW5lclBvc2l0aW9uLGE9dC5jb250YWluZXJFbGVtZW50LG89ZSh0LmhlbHBlcikscj1vLm9mZnNldCgpLGg9by5vdXRlcldpZHRoKCktdC5zaXplRGlmZi53aWR0aCxsPW8ub3V0ZXJIZWlnaHQoKS10LnNpemVEaWZmLmhlaWdodDt0Ll9oZWxwZXImJiFpLmFuaW1hdGUmJi9yZWxhdGl2ZS8udGVzdChhLmNzcygicG9zaXRpb24iKSkmJmUodGhpcykuY3NzKHtsZWZ0OnIubGVmdC1uLmxlZnQtcy5sZWZ0LHdpZHRoOmgsaGVpZ2h0Omx9KSx0Ll9oZWxwZXImJiFpLmFuaW1hdGUmJi9zdGF0aWMvLnRlc3QoYS5jc3MoInBvc2l0aW9uIikpJiZlKHRoaXMpLmNzcyh7bGVmdDpyLmxlZnQtbi5sZWZ0LXMubGVmdCx3aWR0aDpoLGhlaWdodDpsfSl9fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJhbHNvUmVzaXplIix7c3RhcnQ6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxpPXQub3B0aW9ucztlKGkuYWxzb1Jlc2l6ZSkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5kYXRhKCJ1aS1yZXNpemFibGUtYWxzb3Jlc2l6ZSIse3dpZHRoOnBhcnNlSW50KHQud2lkdGgoKSwxMCksaGVpZ2h0OnBhcnNlSW50KHQuaGVpZ2h0KCksMTApLGxlZnQ6cGFyc2VJbnQodC5jc3MoImxlZnQiKSwxMCksdG9wOnBhcnNlSW50KHQuY3NzKCJ0b3AiKSwxMCl9KX0pfSxyZXNpemU6ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxuPXMub3B0aW9ucyxhPXMub3JpZ2luYWxTaXplLG89cy5vcmlnaW5hbFBvc2l0aW9uLHI9e2hlaWdodDpzLnNpemUuaGVpZ2h0LWEuaGVpZ2h0fHwwLHdpZHRoOnMuc2l6ZS53aWR0aC1hLndpZHRofHwwLHRvcDpzLnBvc2l0aW9uLnRvcC1vLnRvcHx8MCxsZWZ0OnMucG9zaXRpb24ubGVmdC1vLmxlZnR8fDB9O2Uobi5hbHNvUmVzaXplKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxzPWUodGhpcykuZGF0YSgidWktcmVzaXphYmxlLWFsc29yZXNpemUiKSxuPXt9LGE9dC5wYXJlbnRzKGkub3JpZ2luYWxFbGVtZW50WzBdKS5sZW5ndGg/WyJ3aWR0aCIsImhlaWdodCJdOlsid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJsZWZ0Il07ZS5lYWNoKGEsZnVuY3Rpb24oZSx0KXt2YXIgaT0oc1t0XXx8MCkrKHJbdF18fDApO2kmJmk+PTAmJihuW3RdPWl8fG51bGwpfSksdC5jc3Mobil9KX0sc3RvcDpmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlRGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdob3N0Iix7c3RhcnQ6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxpPXQub3B0aW9ucyxzPXQuc2l6ZTt0Lmdob3N0PXQub3JpZ2luYWxFbGVtZW50LmNsb25lKCksdC5naG9zdC5jc3Moe29wYWNpdHk6LjI1LGRpc3BsYXk6ImJsb2NrIixwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDpzLmhlaWdodCx3aWR0aDpzLndpZHRoLG1hcmdpbjowLGxlZnQ6MCx0b3A6MH0pLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtZ2hvc3QiKS5hZGRDbGFzcygic3RyaW5nIj09dHlwZW9mIGkuZ2hvc3Q/aS5naG9zdDoiIiksdC5naG9zdC5hcHBlbmRUbyh0LmhlbHBlcil9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpO3QuZ2hvc3QmJnQuZ2hvc3QuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDp0LnNpemUuaGVpZ2h0LHdpZHRoOnQuc2l6ZS53aWR0aH0pfSxzdG9wOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIik7dC5naG9zdCYmdC5oZWxwZXImJnQuaGVscGVyLmdldCgwKS5yZW1vdmVDaGlsZCh0Lmdob3N0LmdldCgwKSl9fSksZS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJncmlkIix7cmVzaXplOmZ1bmN0aW9uKCl7dmFyIHQsaT1lKHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxzPWkub3B0aW9ucyxuPWkuc2l6ZSxhPWkub3JpZ2luYWxTaXplLG89aS5vcmlnaW5hbFBvc2l0aW9uLHI9aS5heGlzLGg9Im51bWJlciI9PXR5cGVvZiBzLmdyaWQ/W3MuZ3JpZCxzLmdyaWRdOnMuZ3JpZCxsPWhbMF18fDEsdT1oWzFdfHwxLGQ9TWF0aC5yb3VuZCgobi53aWR0aC1hLndpZHRoKS9sKSpsLGM9TWF0aC5yb3VuZCgobi5oZWlnaHQtYS5oZWlnaHQpL3UpKnUscD1hLndpZHRoK2QsZj1hLmhlaWdodCtjLG09cy5tYXhXaWR0aCYmcD5zLm1heFdpZHRoLGc9cy5tYXhIZWlnaHQmJmY+cy5tYXhIZWlnaHQsdj1zLm1pbldpZHRoJiZzLm1pbldpZHRoPnAseT1zLm1pbkhlaWdodCYmcy5taW5IZWlnaHQ+ZjtzLmdyaWQ9aCx2JiYocCs9bCkseSYmKGYrPXUpLG0mJihwLT1sKSxnJiYoZi09dSksL14oc2V8c3xlKSQvLnRlc3Qocik/KGkuc2l6ZS53aWR0aD1wLGkuc2l6ZS5oZWlnaHQ9Zik6L14obmUpJC8udGVzdChyKT8oaS5zaXplLndpZHRoPXAsaS5zaXplLmhlaWdodD1mLGkucG9zaXRpb24udG9wPW8udG9wLWMpOi9eKHN3KSQvLnRlc3Qocik/KGkuc2l6ZS53aWR0aD1wLGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLmxlZnQ9by5sZWZ0LWQpOigoMD49Zi11fHwwPj1wLWwpJiYodD1pLl9nZXRQYWRkaW5nUGx1c0JvcmRlckRpbWVuc2lvbnModGhpcykpLGYtdT4wPyhpLnNpemUuaGVpZ2h0PWYsaS5wb3NpdGlvbi50b3A9by50b3AtYyk6KGY9dS10LmhlaWdodCxpLnNpemUuaGVpZ2h0PWYsaS5wb3NpdGlvbi50b3A9by50b3ArYS5oZWlnaHQtZikscC1sPjA/KGkuc2l6ZS53aWR0aD1wLGkucG9zaXRpb24ubGVmdD1vLmxlZnQtZCk6KHA9bC10LndpZHRoLGkuc2l6ZS53aWR0aD1wLGkucG9zaXRpb24ubGVmdD1vLmxlZnQrYS53aWR0aC1wKSl9fSksZS51aS5yZXNpemFibGUsZS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuMTEuNCIsb3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9SZWZyZXNoOiEwLGRpc3RhbmNlOjAsZmlsdGVyOiIqIix0b2xlcmFuY2U6InRvdWNoIixzZWxlY3RlZDpudWxsLHNlbGVjdGluZzpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsLHVuc2VsZWN0ZWQ6bnVsbCx1bnNlbGVjdGluZzpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzOwotdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIiksdGhpcy5kcmFnZ2VkPSExLHRoaXMucmVmcmVzaD1mdW5jdGlvbigpe3Q9ZShpLm9wdGlvbnMuZmlsdGVyLGkuZWxlbWVudFswXSksdC5hZGRDbGFzcygidWktc2VsZWN0ZWUiKSx0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5vZmZzZXQoKTtlLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIix7ZWxlbWVudDp0aGlzLCRlbGVtZW50OnQsbGVmdDppLmxlZnQsdG9wOmkudG9wLHJpZ2h0OmkubGVmdCt0Lm91dGVyV2lkdGgoKSxib3R0b206aS50b3ArdC5vdXRlckhlaWdodCgpLHN0YXJ0c2VsZWN0ZWQ6ITEsc2VsZWN0ZWQ6dC5oYXNDbGFzcygidWktc2VsZWN0ZWQiKSxzZWxlY3Rpbmc6dC5oYXNDbGFzcygidWktc2VsZWN0aW5nIiksdW5zZWxlY3Rpbmc6dC5oYXNDbGFzcygidWktdW5zZWxlY3RpbmciKX0pfSl9LHRoaXMucmVmcmVzaCgpLHRoaXMuc2VsZWN0ZWVzPXQuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksdGhpcy5fbW91c2VJbml0KCksdGhpcy5oZWxwZXI9ZSgiPGRpdiBjbGFzcz0ndWktc2VsZWN0YWJsZS1oZWxwZXInPjwvZGl2PiIpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWVzLnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZSIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUtaXRlbSIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0YWJsZSB1aS1zZWxlY3RhYmxlLWRpc2FibGVkIiksdGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz10aGlzLm9wdGlvbnM7dGhpcy5vcG9zPVt0LnBhZ2VYLHQucGFnZVldLHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8KHRoaXMuc2VsZWN0ZWVzPWUocy5maWx0ZXIsdGhpcy5lbGVtZW50WzBdKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsdCksZShzLmFwcGVuZFRvKS5hcHBlbmQodGhpcy5oZWxwZXIpLHRoaXMuaGVscGVyLmNzcyh7bGVmdDp0LnBhZ2VYLHRvcDp0LnBhZ2VZLHdpZHRoOjAsaGVpZ2h0OjB9KSxzLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgcz1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7cy5zdGFydHNlbGVjdGVkPSEwLHQubWV0YUtleXx8dC5jdHJsS2V5fHwocy4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxzLnNlbGVjdGVkPSExLHMuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIikscy51bnNlbGVjdGluZz0hMCxpLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6cy5lbGVtZW50fSkpfSksZSh0LnRhcmdldCkucGFyZW50cygpLmFkZEJhY2soKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHMsbj1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7cmV0dXJuIG4/KHM9IXQubWV0YUtleSYmIXQuY3RybEtleXx8IW4uJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksbi4kZWxlbWVudC5yZW1vdmVDbGFzcyhzPyJ1aS11bnNlbGVjdGluZyI6InVpLXNlbGVjdGVkIikuYWRkQ2xhc3Mocz8idWktc2VsZWN0aW5nIjoidWktdW5zZWxlY3RpbmciKSxuLnVuc2VsZWN0aW5nPSFzLG4uc2VsZWN0aW5nPXMsbi5zZWxlY3RlZD1zLHM/aS5fdHJpZ2dlcigic2VsZWN0aW5nIix0LHtzZWxlY3Rpbmc6bi5lbGVtZW50fSk6aS5fdHJpZ2dlcigidW5zZWxlY3RpbmciLHQse3Vuc2VsZWN0aW5nOm4uZWxlbWVudH0pLCExKTp2b2lkIDB9KSl9LF9tb3VzZURyYWc6ZnVuY3Rpb24odCl7aWYodGhpcy5kcmFnZ2VkPSEwLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpe3ZhciBpLHM9dGhpcyxuPXRoaXMub3B0aW9ucyxhPXRoaXMub3Bvc1swXSxvPXRoaXMub3Bvc1sxXSxyPXQucGFnZVgsaD10LnBhZ2VZO3JldHVybiBhPnImJihpPXIscj1hLGE9aSksbz5oJiYoaT1oLGg9byxvPWkpLHRoaXMuaGVscGVyLmNzcyh7bGVmdDphLHRvcDpvLHdpZHRoOnItYSxoZWlnaHQ6aC1vfSksdGhpcy5zZWxlY3RlZXMuZWFjaChmdW5jdGlvbigpe3ZhciBpPWUuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKSxsPSExO2kmJmkuZWxlbWVudCE9PXMuZWxlbWVudFswXSYmKCJ0b3VjaCI9PT1uLnRvbGVyYW5jZT9sPSEoaS5sZWZ0PnJ8fGE+aS5yaWdodHx8aS50b3A+aHx8bz5pLmJvdHRvbSk6ImZpdCI9PT1uLnRvbGVyYW5jZSYmKGw9aS5sZWZ0PmEmJnI+aS5yaWdodCYmaS50b3A+byYmaD5pLmJvdHRvbSksbD8oaS5zZWxlY3RlZCYmKGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIiksaS5zZWxlY3RlZD0hMSksaS51bnNlbGVjdGluZyYmKGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksaS51bnNlbGVjdGluZz0hMSksaS5zZWxlY3Rpbmd8fChpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMCxzLl90cmlnZ2VyKCJzZWxlY3RpbmciLHQse3NlbGVjdGluZzppLmVsZW1lbnR9KSkpOihpLnNlbGVjdGluZyYmKCh0Lm1ldGFLZXl8fHQuY3RybEtleSkmJmkuc3RhcnRzZWxlY3RlZD8oaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIiksaS5zZWxlY3Rpbmc9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0ZWQiKSxpLnNlbGVjdGVkPSEwKTooaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIiksaS5zZWxlY3Rpbmc9ITEsaS5zdGFydHNlbGVjdGVkJiYoaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwKSxzLl90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsdCx7dW5zZWxlY3Rpbmc6aS5lbGVtZW50fSkpKSxpLnNlbGVjdGVkJiYodC5tZXRhS2V5fHx0LmN0cmxLZXl8fGkuc3RhcnRzZWxlY3RlZHx8KGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIiksaS5zZWxlY3RlZD0hMSxpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITAscy5fdHJpZ2dlcigidW5zZWxlY3RpbmciLHQse3Vuc2VsZWN0aW5nOmkuZWxlbWVudH0pKSkpKX0pLCExfX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt2YXIgaT10aGlzO3JldHVybiB0aGlzLmRyYWdnZWQ9ITEsZSgiLnVpLXVuc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgcz1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7cy4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKSxzLnVuc2VsZWN0aW5nPSExLHMuc3RhcnRzZWxlY3RlZD0hMSxpLl90cmlnZ2VyKCJ1bnNlbGVjdGVkIix0LHt1bnNlbGVjdGVkOnMuZWxlbWVudH0pfSksZSgiLnVpLXNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3MuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpLHMuc2VsZWN0aW5nPSExLHMuc2VsZWN0ZWQ9ITAscy5zdGFydHNlbGVjdGVkPSEwLGkuX3RyaWdnZXIoInNlbGVjdGVkIix0LHtzZWxlY3RlZDpzLmVsZW1lbnR9KX0pLHRoaXMuX3RyaWdnZXIoInN0b3AiLHQpLHRoaXMuaGVscGVyLnJlbW92ZSgpLCExfX0pLGUud2lkZ2V0KCJ1aS5zb3J0YWJsZSIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoic29ydCIscmVhZHk6ITEsb3B0aW9uczp7YXBwZW5kVG86InBhcmVudCIsYXhpczohMSxjb25uZWN0V2l0aDohMSxjb250YWlubWVudDohMSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OiExLGRyb3BPbkVtcHR5OiEwLGZvcmNlUGxhY2Vob2xkZXJTaXplOiExLGZvcmNlSGVscGVyU2l6ZTohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpdGVtczoiPiAqIixvcGFjaXR5OiExLHBsYWNlaG9sZGVyOiExLHJldmVydDohMSxzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc2NvcGU6ImRlZmF1bHQiLHRvbGVyYW5jZToiaW50ZXJzZWN0Iix6SW5kZXg6MWUzLGFjdGl2YXRlOm51bGwsYmVmb3JlU3RvcDpudWxsLGNoYW5nZTpudWxsLGRlYWN0aXZhdGU6bnVsbCxvdXQ6bnVsbCxvdmVyOm51bGwscmVjZWl2ZTpudWxsLHJlbW92ZTpudWxsLHNvcnQ6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbCx1cGRhdGU6bnVsbH0sX2lzT3ZlckF4aXM6ZnVuY3Rpb24oZSx0LGkpe3JldHVybiBlPj10JiZ0K2k+ZX0sX2lzRmxvYXRpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuL2xlZnR8cmlnaHQvLnRlc3QoZS5jc3MoImZsb2F0IikpfHwvaW5saW5lfHRhYmxlLWNlbGwvLnRlc3QoZS5jc3MoImRpc3BsYXkiKSl9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmNvbnRhaW5lckNhY2hlPXt9LHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc29ydGFibGUiKSx0aGlzLnJlZnJlc2goKSx0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5yZWFkeT0hMH0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMuX3N1cGVyKGUsdCksImhhbmRsZSI9PT1lJiZ0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKX0sX3NldEhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5maW5kKCIudWktc29ydGFibGUtaGFuZGxlIikucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhhbmRsZSIpLGUuZWFjaCh0aGlzLml0ZW1zLGZ1bmN0aW9uKCl7KHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oYW5kbGU/dGhpcy5pdGVtLmZpbmQodGhpcy5pbnN0YW5jZS5vcHRpb25zLmhhbmRsZSk6dGhpcy5pdGVtKS5hZGRDbGFzcygidWktc29ydGFibGUtaGFuZGxlIil9KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlIHVpLXNvcnRhYmxlLWRpc2FibGVkIikuZmluZCgiLnVpLXNvcnRhYmxlLWhhbmRsZSIpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oYW5kbGUiKSx0aGlzLl9tb3VzZURlc3Ryb3koKTtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGgtMTtlPj0wO2UtLSl0aGlzLml0ZW1zW2VdLml0ZW0ucmVtb3ZlRGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIik7cmV0dXJuIHRoaXN9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24odCxpKXt2YXIgcz1udWxsLG49ITEsYT10aGlzO3JldHVybiB0aGlzLnJldmVydGluZz8hMTp0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCJzdGF0aWMiPT09dGhpcy5vcHRpb25zLnR5cGU/ITE6KHRoaXMuX3JlZnJlc2hJdGVtcyh0KSxlKHQudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3JldHVybiBlLmRhdGEodGhpcyxhLndpZGdldE5hbWUrIi1pdGVtIik9PT1hPyhzPWUodGhpcyksITEpOnZvaWQgMH0pLGUuZGF0YSh0LnRhcmdldCxhLndpZGdldE5hbWUrIi1pdGVtIik9PT1hJiYocz1lKHQudGFyZ2V0KSkscz8hdGhpcy5vcHRpb25zLmhhbmRsZXx8aXx8KGUodGhpcy5vcHRpb25zLmhhbmRsZSxzKS5maW5kKCIqIikuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT09dC50YXJnZXQmJihuPSEwKX0pLG4pPyh0aGlzLmN1cnJlbnRJdGVtPXMsdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMCk6ITE6ITEpfSxfbW91c2VTdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG4sYSxvPXRoaXMub3B0aW9ucztpZih0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcyx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIodCksdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpLHRoaXMub2Zmc2V0PXRoaXMuY3VycmVudEl0ZW0ub2Zmc2V0KCksdGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9LGUuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDp0LnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOnQucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pLHRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQpLHRoaXMub3JpZ2luYWxQYWdlWD10LnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT10LnBhZ2VZLG8uY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoby5jdXJzb3JBdCksdGhpcy5kb21Qb3NpdGlvbj17cHJldjp0aGlzLmN1cnJlbnRJdGVtLnByZXYoKVswXSxwYXJlbnQ6dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXX0sdGhpcy5oZWxwZXJbMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKSx0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpLG8uY29udGFpbm1lbnQmJnRoaXMuX3NldENvbnRhaW5tZW50KCksby5jdXJzb3ImJiJhdXRvIiE9PW8uY3Vyc29yJiYoYT10aGlzLmRvY3VtZW50LmZpbmQoImJvZHkiKSx0aGlzLnN0b3JlZEN1cnNvcj1hLmNzcygiY3Vyc29yIiksYS5jc3MoImN1cnNvciIsby5jdXJzb3IpLHRoaXMuc3RvcmVkU3R5bGVzaGVldD1lKCI8c3R5bGU+KnsgY3Vyc29yOiAiK28uY3Vyc29yKyIgIWltcG9ydGFudDsgfTwvc3R5bGU+IikuYXBwZW5kVG8oYSkpLG8ub3BhY2l0eSYmKHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpJiYodGhpcy5fc3RvcmVkT3BhY2l0eT10aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSksdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IixvLm9wYWNpdHkpKSxvLnpJbmRleCYmKHRoaXMuaGVscGVyLmNzcygiekluZGV4IikmJih0aGlzLl9zdG9yZWRaSW5kZXg9dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSksdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLG8uekluZGV4KSksdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiYiSFRNTCIhPT10aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lJiYodGhpcy5vdmVyZmxvd09mZnNldD10aGlzLnNjcm9sbFBhcmVudC5vZmZzZXQoKSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQsdGhpcy5fdWlIYXNoKCkpLHRoaXMuX3ByZXNlcnZlSGVscGVyUHJvcG9ydGlvbnN8fHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSwhcylmb3Iobj10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7bj49MDtuLS0pdGhpcy5jb250YWluZXJzW25dLl90cmlnZ2VyKCJhY3RpdmF0ZSIsdCx0aGlzLl91aUhhc2godGhpcykpO3JldHVybiBlLnVpLmRkbWFuYWdlciYmKGUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksZS51aS5kZG1hbmFnZXImJiFvLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsdCksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VEcmFnKHQpLCEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG89dGhpcy5vcHRpb25zLHI9ITE7Zm9yKHRoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0KSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyksdGhpcy5vcHRpb25zLnNjcm9sbCYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmIkhUTUwiIT09dGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZT8odGhpcy5vdmVyZmxvd09mZnNldC50b3ArdGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0LXQucGFnZVk8by5zY3JvbGxTZW5zaXRpdml0eT90aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3Arby5zY3JvbGxTcGVlZDp0LnBhZ2VZLXRoaXMub3ZlcmZsb3dPZmZzZXQudG9wPG8uc2Nyb2xsU2Vuc2l0aXZpdHkmJih0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3Atby5zY3JvbGxTcGVlZCksdGhpcy5vdmVyZmxvd09mZnNldC5sZWZ0K3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoLXQucGFnZVg8by5zY3JvbGxTZW5zaXRpdml0eT90aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdCtvLnNjcm9sbFNwZWVkOnQucGFnZVgtdGhpcy5vdmVyZmxvd09mZnNldC5sZWZ0PG8uc2Nyb2xsU2Vuc2l0aXZpdHkmJih0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdC1vLnNjcm9sbFNwZWVkKSk6KHQucGFnZVktdGhpcy5kb2N1bWVudC5zY3JvbGxUb3AoKTxvLnNjcm9sbFNlbnNpdGl2aXR5P3I9dGhpcy5kb2N1bWVudC5zY3JvbGxUb3AodGhpcy5kb2N1bWVudC5zY3JvbGxUb3AoKS1vLnNjcm9sbFNwZWVkKTp0aGlzLndpbmRvdy5oZWlnaHQoKS0odC5wYWdlWS10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpKTxvLnNjcm9sbFNlbnNpdGl2aXR5JiYocj10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCh0aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpK28uc2Nyb2xsU3BlZWQpKSx0LnBhZ2VYLXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpPG8uc2Nyb2xsU2Vuc2l0aXZpdHk/cj10aGlzLmRvY3VtZW50LnNjcm9sbExlZnQodGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCktby5zY3JvbGxTcGVlZCk6dGhpcy53aW5kb3cud2lkdGgoKS0odC5wYWdlWC10aGlzLmRvY3VtZW50LnNjcm9sbExlZnQoKSk8by5zY3JvbGxTZW5zaXRpdml0eSYmKHI9dGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KHRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpK28uc2Nyb2xsU3BlZWQpKSksciE9PSExJiZlLnVpLmRkbWFuYWdlciYmIW8uZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyx0KSksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSx0aGlzLm9wdGlvbnMuYXhpcyYmInkiPT09dGhpcy5vcHRpb25zLmF4aXN8fCh0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiKSx0aGlzLm9wdGlvbnMuYXhpcyYmIngiPT09dGhpcy5vcHRpb25zLmF4aXN8fCh0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IiksaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+PTA7aS0tKWlmKHM9dGhpcy5pdGVtc1tpXSxuPXMuaXRlbVswXSxhPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihzKSxhJiZzLmluc3RhbmNlPT09dGhpcy5jdXJyZW50Q29udGFpbmVyJiZuIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5wbGFjZWhvbGRlclsxPT09YT8ibmV4dCI6InByZXYiXSgpWzBdIT09biYmIWUuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSxuKSYmKCJzZW1pLWR5bmFtaWMiPT09dGhpcy5vcHRpb25zLnR5cGU/IWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLG4pOiEwKSl7aWYodGhpcy5kaXJlY3Rpb249MT09PWE/ImRvd24iOiJ1cCIsInBvaW50ZXIiIT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZSYmIXRoaXMuX2ludGVyc2VjdHNXaXRoU2lkZXMocykpYnJlYWs7dGhpcy5fcmVhcnJhbmdlKHQscyksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIix0LHRoaXMuX3VpSGFzaCgpKTticmVha31yZXR1cm4gdGhpcy5fY29udGFjdENvbnRhaW5lcnModCksZS51aS5kZG1hbmFnZXImJmUudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyx0KSx0aGlzLl90cmlnZ2VyKCJzb3J0Iix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLmxhc3RQb3NpdGlvbkFicz10aGlzLnBvc2l0aW9uQWJzLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKHQsaSl7aWYodCl7aWYoZS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLHQpLHRoaXMub3B0aW9ucy5yZXZlcnQpe3ZhciBzPXRoaXMsbj10aGlzLnBsYWNlaG9sZGVyLm9mZnNldCgpLGE9dGhpcy5vcHRpb25zLmF4aXMsbz17fTthJiYieCIhPT1hfHwoby5sZWZ0PW4ubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdC10aGlzLm1hcmdpbnMubGVmdCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxMZWZ0KSksYSYmInkiIT09YXx8KG8udG9wPW4udG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5tYXJnaW5zLnRvcCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxUb3ApKSx0aGlzLnJldmVydGluZz0hMCxlKHRoaXMuaGVscGVyKS5hbmltYXRlKG8scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydCwxMCl8fDUwMCxmdW5jdGlvbigpe3MuX2NsZWFyKHQpfSl9ZWxzZSB0aGlzLl9jbGVhcih0LGkpO3JldHVybiExfX0sY2FuY2VsOmZ1bmN0aW9uKCl7aWYodGhpcy5kcmFnZ2luZyl7dGhpcy5fbW91c2VVcCh7dGFyZ2V0Om51bGx9KSwib3JpZ2luYWwiPT09dGhpcy5vcHRpb25zLmhlbHBlcj90aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTp0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodmFyIHQ9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO3Q+PTA7dC0tKXRoaXMuY29udGFpbmVyc1t0XS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsbnVsbCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1t0XS5jb250YWluZXJDYWNoZS5vdmVyJiYodGhpcy5jb250YWluZXJzW3RdLl90cmlnZ2VyKCJvdXQiLG51bGwsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbdF0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKX1yZXR1cm4gdGhpcy5wbGFjZWhvbGRlciYmKHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLCJvcmlnaW5hbCIhPT10aGlzLm9wdGlvbnMuaGVscGVyJiZ0aGlzLmhlbHBlciYmdGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5oZWxwZXIucmVtb3ZlKCksZS5leHRlbmQodGhpcyx7aGVscGVyOm51bGwsZHJhZ2dpbmc6ITEscmV2ZXJ0aW5nOiExLF9ub0ZpbmFsU29ydDpudWxsfSksdGhpcy5kb21Qb3NpdGlvbi5wcmV2P2UodGhpcy5kb21Qb3NpdGlvbi5wcmV2KS5hZnRlcih0aGlzLmN1cnJlbnRJdGVtKTplKHRoaXMuZG9tUG9zaXRpb24ucGFyZW50KS5wcmVwZW5kKHRoaXMuY3VycmVudEl0ZW0pKSx0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeSh0JiZ0LmNvbm5lY3RlZCkscz1bXTtyZXR1cm4gdD10fHx7fSxlKGkpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT0oZSh0Lml0ZW18fHRoaXMpLmF0dHIodC5hdHRyaWJ1dGV8fCJpZCIpfHwiIikubWF0Y2godC5leHByZXNzaW9ufHwvKC4rKVtcLT1fXSguKykvKTtpJiZzLnB1c2goKHQua2V5fHxpWzFdKyJbXSIpKyI9IisodC5rZXkmJnQuZXhwcmVzc2lvbj9pWzFdOmlbMl0pKX0pLCFzLmxlbmd0aCYmdC5rZXkmJnMucHVzaCh0LmtleSsiPSIpLHMuam9pbigiJiIpfSx0b0FycmF5OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkodCYmdC5jb25uZWN0ZWQpLHM9W107cmV0dXJuIHQ9dHx8e30saS5lYWNoKGZ1bmN0aW9uKCl7cy5wdXNoKGUodC5pdGVtfHx0aGlzKS5hdHRyKHQuYXR0cmlidXRlfHwiaWQiKXx8IiIpfSksc30sX2ludGVyc2VjdHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucG9zaXRpb25BYnMubGVmdCxpPXQrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxzPXRoaXMucG9zaXRpb25BYnMudG9wLG49cyt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxhPWUubGVmdCxvPWErZS53aWR0aCxyPWUudG9wLGg9citlLmhlaWdodCxsPXRoaXMub2Zmc2V0LmNsaWNrLnRvcCx1PXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsZD0ieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8cytsPnImJmg+cytsLGM9InkiPT09dGhpcy5vcHRpb25zLmF4aXN8fHQrdT5hJiZvPnQrdSxwPWQmJmM7cmV0dXJuInBvaW50ZXIiPT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZXx8dGhpcy5vcHRpb25zLmZvcmNlUG9pbnRlckZvckNvbnRhaW5lcnN8fCJwb2ludGVyIiE9PXRoaXMub3B0aW9ucy50b2xlcmFuY2UmJnRoaXMuaGVscGVyUHJvcG9ydGlvbnNbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT5lW3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0/cDp0K3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMj5hJiZvPmktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZzK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI+ciYmaD5uLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzJ9LF9pbnRlcnNlY3RzV2l0aFBvaW50ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9IngiPT09dGhpcy5vcHRpb25zLmF4aXN8fHRoaXMuX2lzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3ArdGhpcy5vZmZzZXQuY2xpY2sudG9wLGUudG9wLGUuaGVpZ2h0KSxpPSJ5Ij09PXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLl9pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LGUubGVmdCxlLndpZHRoKSxzPXQmJmksbj10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxhPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIHM/dGhpcy5mbG9hdGluZz9hJiYicmlnaHQiPT09YXx8ImRvd24iPT09bj8yOjE6biYmKCJkb3duIj09PW4/MjoxKTohMX0sX2ludGVyc2VjdHNXaXRoU2lkZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsZS50b3ArZS5oZWlnaHQvMixlLmhlaWdodCksaT10aGlzLl9pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LGUubGVmdCtlLndpZHRoLzIsZS53aWR0aCkscz10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxuPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIHRoaXMuZmxvYXRpbmcmJm4/InJpZ2h0Ij09PW4mJml8fCJsZWZ0Ij09PW4mJiFpOnMmJigiZG93biI9PT1zJiZ0fHwidXAiPT09cyYmIXQpfSxfZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wO3JldHVybiAwIT09ZSYmKGU+MD8iZG93biI6InVwIil9LF9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMucG9zaXRpb25BYnMubGVmdC10aGlzLmxhc3RQb3NpdGlvbkFicy5sZWZ0O3JldHVybiAwIT09ZSYmKGU+MD8icmlnaHQiOiJsZWZ0Iil9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlZnJlc2hJdGVtcyhlKSx0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKSx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzfSxfY29ubmVjdFdpdGg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnM7cmV0dXJuIGUuY29ubmVjdFdpdGguY29uc3RydWN0b3I9PT1TdHJpbmc/W2UuY29ubmVjdFdpdGhdOmUuY29ubmVjdFdpdGh9LF9nZXRJdGVtc0FzalF1ZXJ5OmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkoKXtyLnB1c2godGhpcyl9dmFyIHMsbixhLG8scj1bXSxoPVtdLGw9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihsJiZ0KWZvcihzPWwubGVuZ3RoLTE7cz49MDtzLS0pZm9yKGE9ZShsW3NdLHRoaXMuZG9jdW1lbnRbMF0pLG49YS5sZW5ndGgtMTtuPj0wO24tLSlvPWUuZGF0YShhW25dLHRoaXMud2lkZ2V0RnVsbE5hbWUpLG8mJm8hPT10aGlzJiYhby5vcHRpb25zLmRpc2FibGVkJiZoLnB1c2goW2UuaXNGdW5jdGlvbihvLm9wdGlvbnMuaXRlbXMpP28ub3B0aW9ucy5pdGVtcy5jYWxsKG8uZWxlbWVudCk6ZShvLm9wdGlvbnMuaXRlbXMsby5lbGVtZW50KS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKS5ub3QoIi51aS1zb3J0YWJsZS1wbGFjZWhvbGRlciIpLG9dKTtmb3IoaC5wdXNoKFtlLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnQsbnVsbCx7b3B0aW9uczp0aGlzLm9wdGlvbnMsaXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6ZSh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKS5ub3QoIi51aS1zb3J0YWJsZS1wbGFjZWhvbGRlciIpLHRoaXNdKSxzPWgubGVuZ3RoLTE7cz49MDtzLS0paFtzXVswXS5lYWNoKGkpO3JldHVybiBlKHIpfSxfcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKCIrdGhpcy53aWRnZXROYW1lKyItaXRlbSkiKTt0aGlzLml0ZW1zPWUuZ3JlcCh0aGlzLml0ZW1zLGZ1bmN0aW9uKGUpe2Zvcih2YXIgaT0wO3QubGVuZ3RoPmk7aSsrKWlmKHRbaV09PT1lLml0ZW1bMF0pcmV0dXJuITE7cmV0dXJuITB9KX0sX3JlZnJlc2hJdGVtczpmdW5jdGlvbih0KXt0aGlzLml0ZW1zPVtdLHRoaXMuY29udGFpbmVycz1bdGhpc107dmFyIGkscyxuLGEsbyxyLGgsbCx1PXRoaXMuaXRlbXMsZD1bW2UuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSx0LHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTplKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLHRoaXNdXSxjPXRoaXMuX2Nvbm5lY3RXaXRoKCk7aWYoYyYmdGhpcy5yZWFkeSlmb3IoaT1jLmxlbmd0aC0xO2k+PTA7aS0tKWZvcihuPWUoY1tpXSx0aGlzLmRvY3VtZW50WzBdKSxzPW4ubGVuZ3RoLTE7cz49MDtzLS0pYT1lLmRhdGEobltzXSx0aGlzLndpZGdldEZ1bGxOYW1lKSxhJiZhIT09dGhpcyYmIWEub3B0aW9ucy5kaXNhYmxlZCYmKGQucHVzaChbZS5pc0Z1bmN0aW9uKGEub3B0aW9ucy5pdGVtcyk/YS5vcHRpb25zLml0ZW1zLmNhbGwoYS5lbGVtZW50WzBdLHQse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmUoYS5vcHRpb25zLml0ZW1zLGEuZWxlbWVudCksYV0pLHRoaXMuY29udGFpbmVycy5wdXNoKGEpKTtmb3IoaT1kLmxlbmd0aC0xO2k+PTA7aS0tKWZvcihvPWRbaV1bMV0scj1kW2ldWzBdLHM9MCxsPXIubGVuZ3RoO2w+cztzKyspaD1lKHJbc10pLGguZGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIixvKSx1LnB1c2goe2l0ZW06aCxpbnN0YW5jZTpvLHdpZHRoOjAsaGVpZ2h0OjAsbGVmdDowLHRvcDowfSl9LHJlZnJlc2hQb3NpdGlvbnM6ZnVuY3Rpb24odCl7dGhpcy5mbG9hdGluZz10aGlzLml0ZW1zLmxlbmd0aD8ieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNGbG9hdGluZyh0aGlzLml0ZW1zWzBdLml0ZW0pOiExLHRoaXMub2Zmc2V0UGFyZW50JiZ0aGlzLmhlbHBlciYmKHRoaXMub2Zmc2V0LnBhcmVudD10aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSk7dmFyIGkscyxuLGE7Zm9yKGk9dGhpcy5pdGVtcy5sZW5ndGgtMTtpPj0wO2ktLSlzPXRoaXMuaXRlbXNbaV0scy5pbnN0YW5jZSE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZzLml0ZW1bMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdfHwobj10aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudD9lKHRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50LHMuaXRlbSk6cy5pdGVtLHR8fChzLndpZHRoPW4ub3V0ZXJXaWR0aCgpLHMuaGVpZ2h0PW4ub3V0ZXJIZWlnaHQoKSksYT1uLm9mZnNldCgpLHMubGVmdD1hLmxlZnQscy50b3A9YS50b3ApO2lmKHRoaXMub3B0aW9ucy5jdXN0b20mJnRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMpdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycy5jYWxsKHRoaXMpO2Vsc2UgZm9yKGk9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2k+PTA7aS0tKWE9dGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLmxlZnQ9YS5sZWZ0LHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS50b3A9YS50b3AsdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLndpZHRoPXRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVyV2lkdGgoKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVySGVpZ2h0KCk7cmV0dXJuIHRoaXN9LF9jcmVhdGVQbGFjZWhvbGRlcjpmdW5jdGlvbih0KXt0PXR8fHRoaXM7dmFyIGkscz10Lm9wdGlvbnM7cy5wbGFjZWhvbGRlciYmcy5wbGFjZWhvbGRlci5jb25zdHJ1Y3RvciE9PVN0cmluZ3x8KGk9cy5wbGFjZWhvbGRlcixzLnBsYWNlaG9sZGVyPXtlbGVtZW50OmZ1bmN0aW9uKCl7dmFyIHM9dC5jdXJyZW50SXRlbVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49ZSgiPCIrcysiPiIsdC5kb2N1bWVudFswXSkuYWRkQ2xhc3MoaXx8dC5jdXJyZW50SXRlbVswXS5jbGFzc05hbWUrIiB1aS1zb3J0YWJsZS1wbGFjZWhvbGRlciIpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTtyZXR1cm4idGJvZHkiPT09cz90Ll9jcmVhdGVUclBsYWNlaG9sZGVyKHQuY3VycmVudEl0ZW0uZmluZCgidHIiKS5lcSgwKSxlKCI8dHI+Iix0LmRvY3VtZW50WzBdKS5hcHBlbmRUbyhuKSk6InRyIj09PXM/dC5fY3JlYXRlVHJQbGFjZWhvbGRlcih0LmN1cnJlbnRJdGVtLG4pOiJpbWciPT09cyYmbi5hdHRyKCJzcmMiLHQuY3VycmVudEl0ZW0uYXR0cigic3JjIikpLGl8fG4uY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksbn0sdXBkYXRlOmZ1bmN0aW9uKGUsbil7KCFpfHxzLmZvcmNlUGxhY2Vob2xkZXJTaXplKSYmKG4uaGVpZ2h0KCl8fG4uaGVpZ2h0KHQuY3VycmVudEl0ZW0uaW5uZXJIZWlnaHQoKS1wYXJzZUludCh0LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ1RvcCIpfHwwLDEwKS1wYXJzZUludCh0LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0JvdHRvbSIpfHwwLDEwKSksbi53aWR0aCgpfHxuLndpZHRoKHQuY3VycmVudEl0ZW0uaW5uZXJXaWR0aCgpLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nTGVmdCIpfHwwLDEwKS1wYXJzZUludCh0LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ1JpZ2h0Iil8fDAsMTApKSl9fSksdC5wbGFjZWhvbGRlcj1lKHMucGxhY2Vob2xkZXIuZWxlbWVudC5jYWxsKHQuZWxlbWVudCx0LmN1cnJlbnRJdGVtKSksdC5jdXJyZW50SXRlbS5hZnRlcih0LnBsYWNlaG9sZGVyKSxzLnBsYWNlaG9sZGVyLnVwZGF0ZSh0LHQucGxhY2Vob2xkZXIpfSxfY3JlYXRlVHJQbGFjZWhvbGRlcjpmdW5jdGlvbih0LGkpe3ZhciBzPXRoaXM7dC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXtlKCI8dGQ+JiMxNjA7PC90ZD4iLHMuZG9jdW1lbnRbMF0pLmF0dHIoImNvbHNwYW4iLGUodGhpcykuYXR0cigiY29sc3BhbiIpfHwxKS5hcHBlbmRUbyhpKX0pfSxfY29udGFjdENvbnRhaW5lcnM6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbyxyLGgsbCx1LGQsYz1udWxsLHA9bnVsbDtmb3IoaT10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7aT49MDtpLS0paWYoIWUuY29udGFpbnModGhpcy5jdXJyZW50SXRlbVswXSx0aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudFswXSkpaWYodGhpcy5faW50ZXJzZWN0c1dpdGgodGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlKSl7aWYoYyYmZS5jb250YWlucyh0aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudFswXSxjLmVsZW1lbnRbMF0pKWNvbnRpbnVlO2M9dGhpcy5jb250YWluZXJzW2ldLHA9aX1lbHNlIHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVyJiYodGhpcy5jb250YWluZXJzW2ldLl90cmlnZ2VyKCJvdXQiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKTtpZihjKWlmKDE9PT10aGlzLmNvbnRhaW5lcnMubGVuZ3RoKXRoaXMuY29udGFpbmVyc1twXS5jb250YWluZXJDYWNoZS5vdmVyfHwodGhpcy5jb250YWluZXJzW3BdLl90cmlnZ2VyKCJvdmVyIix0LHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3BdLmNvbnRhaW5lckNhY2hlLm92ZXI9MSk7ZWxzZXtmb3Iobj0xZTQsYT1udWxsLHU9Yy5mbG9hdGluZ3x8dGhpcy5faXNGbG9hdGluZyh0aGlzLmN1cnJlbnRJdGVtKSxvPXU/ImxlZnQiOiJ0b3AiLHI9dT8id2lkdGgiOiJoZWlnaHQiLGQ9dT8iY2xpZW50WCI6ImNsaWVudFkiLHM9dGhpcy5pdGVtcy5sZW5ndGgtMTtzPj0wO3MtLSllLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1twXS5lbGVtZW50WzBdLHRoaXMuaXRlbXNbc10uaXRlbVswXSkmJnRoaXMuaXRlbXNbc10uaXRlbVswXSE9PXRoaXMuY3VycmVudEl0ZW1bMF0mJihoPXRoaXMuaXRlbXNbc10uaXRlbS5vZmZzZXQoKVtvXSxsPSExLHRbZF0taD50aGlzLml0ZW1zW3NdW3JdLzImJihsPSEwKSxuPk1hdGguYWJzKHRbZF0taCkmJihuPU1hdGguYWJzKHRbZF0taCksYT10aGlzLml0ZW1zW3NdLHRoaXMuZGlyZWN0aW9uPWw/InVwIjoiZG93biIpKTtpZighYSYmIXRoaXMub3B0aW9ucy5kcm9wT25FbXB0eSlyZXR1cm47aWYodGhpcy5jdXJyZW50Q29udGFpbmVyPT09dGhpcy5jb250YWluZXJzW3BdKXJldHVybiB0aGlzLmN1cnJlbnRDb250YWluZXIuY29udGFpbmVyQ2FjaGUub3Zlcnx8KHRoaXMuY29udGFpbmVyc1twXS5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5jdXJyZW50Q29udGFpbmVyLmNvbnRhaW5lckNhY2hlLm92ZXI9MSksdm9pZCAwO2E/dGhpcy5fcmVhcnJhbmdlKHQsYSxudWxsLCEwKTp0aGlzLl9yZWFycmFuZ2UodCxudWxsLHRoaXMuY29udGFpbmVyc1twXS5lbGVtZW50LCEwKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKCkpLHRoaXMuY29udGFpbmVyc1twXS5fdHJpZ2dlcigiY2hhbmdlIix0LHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMuY29udGFpbmVyc1twXSx0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lcix0aGlzLnBsYWNlaG9sZGVyKSx0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoIm92ZXIiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbcF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xfX0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMscz1lLmlzRnVuY3Rpb24oaS5oZWxwZXIpP2UoaS5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFt0LHRoaXMuY3VycmVudEl0ZW1dKSk6ImNsb25lIj09PWkuaGVscGVyP3RoaXMuY3VycmVudEl0ZW0uY2xvbmUoKTp0aGlzLmN1cnJlbnRJdGVtO3JldHVybiBzLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGUoInBhcmVudCIhPT1pLmFwcGVuZFRvP2kuYXBwZW5kVG86dGhpcy5jdXJyZW50SXRlbVswXS5wYXJlbnROb2RlKVswXS5hcHBlbmRDaGlsZChzWzBdKSxzWzBdPT09dGhpcy5jdXJyZW50SXRlbVswXSYmKHRoaXMuX3N0b3JlZENTUz17d2lkdGg6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCxoZWlnaHQ6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQscG9zaXRpb246dGhpcy5jdXJyZW50SXRlbS5jc3MoInBvc2l0aW9uIiksdG9wOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0Iil9KSwoIXNbMF0uc3R5bGUud2lkdGh8fGkuZm9yY2VIZWxwZXJTaXplKSYmcy53aWR0aCh0aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpLCghc1swXS5zdHlsZS5oZWlnaHR8fGkuZm9yY2VIZWxwZXJTaXplKSYmcy5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSksc30sX2FkanVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIgIikpLGUuaXNBcnJheSh0KSYmKHQ9e2xlZnQ6K3RbMF0sdG9wOit0WzFdfHwwfSksImxlZnQiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dC5sZWZ0K3RoaXMubWFyZ2lucy5sZWZ0KSwicmlnaHQiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10LnJpZ2h0K3RoaXMubWFyZ2lucy5sZWZ0KSwidG9wImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dC50b3ArdGhpcy5tYXJnaW5zLnRvcCksImJvdHRvbSJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXQuYm90dG9tK3RoaXMubWFyZ2lucy50b3ApfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7dmFyIHQ9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7cmV0dXJuImFic29sdXRlIj09PXRoaXMuY3NzUG9zaXRpb24mJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmZS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJih0LmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSx0LnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpLCh0aGlzLm9mZnNldFBhcmVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYm9keXx8dGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZSYmImh0bWwiPT09dGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnVpLmllKSYmKHQ9e3RvcDowLGxlZnQ6MH0pLHt0b3A6dC50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6dC5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZigicmVsYXRpdmUiPT09dGhpcy5jc3NQb3NpdGlvbil7dmFyIGU9dGhpcy5jdXJyZW50SXRlbS5wb3NpdGlvbigpO3JldHVybnt0b3A6ZS50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OmUubGVmdC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCl9fXJldHVybnt0b3A6MCxsZWZ0OjB9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luVG9wIiksMTApfHwwfX0sX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlclByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCl9fSxfc2V0Q29udGFpbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbj10aGlzLm9wdGlvbnM7InBhcmVudCI9PT1uLmNvbnRhaW5tZW50JiYobi5jb250YWlubWVudD10aGlzLmhlbHBlclswXS5wYXJlbnROb2RlKSwoImRvY3VtZW50Ij09PW4uY29udGFpbm1lbnR8fCJ3aW5kb3ciPT09bi5jb250YWlubWVudCkmJih0aGlzLmNvbnRhaW5tZW50PVswLXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsMC10aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcCwiZG9jdW1lbnQiPT09bi5jb250YWlubWVudD90aGlzLmRvY3VtZW50LndpZHRoKCk6dGhpcy53aW5kb3cud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LCgiZG9jdW1lbnQiPT09bi5jb250YWlubWVudD90aGlzLmRvY3VtZW50LndpZHRoKCk6dGhpcy53aW5kb3cuaGVpZ2h0KCl8fHRoaXMuZG9jdW1lbnRbMF0uYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF0pLC9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8udGVzdChuLmNvbnRhaW5tZW50KXx8KHQ9ZShuLmNvbnRhaW5tZW50KVswXSxpPWUobi5jb250YWlubWVudCkub2Zmc2V0KCkscz0iaGlkZGVuIiE9PWUodCkuY3NzKCJvdmVyZmxvdyIpLHRoaXMuY29udGFpbm1lbnQ9W2kubGVmdCsocGFyc2VJbnQoZSh0KS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGUodCkuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCktdGhpcy5tYXJnaW5zLmxlZnQsaS50b3ArKHBhcnNlSW50KGUodCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGUodCkuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKS10aGlzLm1hcmdpbnMudG9wLGkubGVmdCsocz9NYXRoLm1heCh0LnNjcm9sbFdpZHRoLHQub2Zmc2V0V2lkdGgpOnQub2Zmc2V0V2lkdGgpLShwYXJzZUludChlKHQpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoZSh0KS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxpLnRvcCsocz9NYXRoLm1heCh0LnNjcm9sbEhlaWdodCx0Lm9mZnNldEhlaWdodCk6dC5vZmZzZXRIZWlnaHQpLShwYXJzZUludChlKHQpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChlKHQpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF0pfSxfY29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24odCxpKXtpfHwoaT10aGlzLnBvc2l0aW9uKTt2YXIgcz0iYWJzb2x1dGUiPT09dD8xOi0xLG49ImFic29sdXRlIiE9PXRoaXMuY3NzUG9zaXRpb258fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmZS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSk/dGhpcy5zY3JvbGxQYXJlbnQ6dGhpcy5vZmZzZXRQYXJlbnQsYT0vKGh0bWx8Ym9keSkvaS50ZXN0KG5bMF0udGFnTmFtZSk7cmV0dXJue3RvcDppLnRvcCt0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3Aqcyt0aGlzLm9mZnNldC5wYXJlbnQudG9wKnMtKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTphPzA6bi5zY3JvbGxUb3AoKSkqcyxsZWZ0OmkubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KnMrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqcy0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTphPzA6bi5zY3JvbGxMZWZ0KCkpKnN9fSxfZ2VuZXJhdGVQb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgaSxzLG49dGhpcy5vcHRpb25zLGE9dC5wYWdlWCxvPXQucGFnZVkscj0iYWJzb2x1dGUiIT09dGhpcy5jc3NQb3NpdGlvbnx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKT90aGlzLnNjcm9sbFBhcmVudDp0aGlzLm9mZnNldFBhcmVudCxoPS8oaHRtbHxib2R5KS9pLnRlc3QoclswXS50YWdOYW1lKTtyZXR1cm4icmVsYXRpdmUiIT09dGhpcy5jc3NQb3NpdGlvbnx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMub2Zmc2V0UGFyZW50WzBdfHwodGhpcy5vZmZzZXQucmVsYXRpdmU9dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSksdGhpcy5vcmlnaW5hbFBvc2l0aW9uJiYodGhpcy5jb250YWlubWVudCYmKHQucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdJiYoYT10aGlzLmNvbnRhaW5tZW50WzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLHQucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0mJihvPXRoaXMuY29udGFpbm1lbnRbMV0rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSx0LnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSYmKGE9dGhpcy5jb250YWlubWVudFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSx0LnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdJiYobz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCkpLG4uZ3JpZCYmKGk9dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKG8tdGhpcy5vcmlnaW5hbFBhZ2VZKS9uLmdyaWRbMV0pKm4uZ3JpZFsxXSxvPXRoaXMuY29udGFpbm1lbnQ/aS10aGlzLm9mZnNldC5jbGljay50b3A+PXRoaXMuY29udGFpbm1lbnRbMV0mJmktdGhpcy5vZmZzZXQuY2xpY2sudG9wPD10aGlzLmNvbnRhaW5tZW50WzNdP2k6aS10aGlzLm9mZnNldC5jbGljay50b3A+PXRoaXMuY29udGFpbm1lbnRbMV0/aS1uLmdyaWRbMV06aStuLmdyaWRbMV06aSxzPXRoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChhLXRoaXMub3JpZ2luYWxQYWdlWCkvbi5ncmlkWzBdKSpuLmdyaWRbMF0sYT10aGlzLmNvbnRhaW5tZW50P3MtdGhpcy5vZmZzZXQuY2xpY2subGVmdD49dGhpcy5jb250YWlubWVudFswXSYmcy10aGlzLm9mZnNldC5jbGljay5sZWZ0PD10aGlzLmNvbnRhaW5tZW50WzJdP3M6cy10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj10aGlzLmNvbnRhaW5tZW50WzBdP3Mtbi5ncmlkWzBdOnMrbi5ncmlkWzBdOnMpKSx7dG9wOm8tdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKygiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6aD8wOnIuc2Nyb2xsVG9wKCkpLGxlZnQ6YS10aGlzLm9mZnNldC5jbGljay5sZWZ0LXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6aD8wOnIuc2Nyb2xsTGVmdCgpKX19LF9yZWFycmFuZ2U6ZnVuY3Rpb24oZSx0LGkscyl7aT9pWzBdLmFwcGVuZENoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOnQuaXRlbVswXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLCJkb3duIj09PXRoaXMuZGlyZWN0aW9uP3QuaXRlbVswXTp0Lml0ZW1bMF0ubmV4dFNpYmxpbmcpLHRoaXMuY291bnRlcj10aGlzLmNvdW50ZXI/Kyt0aGlzLmNvdW50ZXI6MTt2YXIgbj10aGlzLmNvdW50ZXI7dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtuPT09dGhpcy5jb3VudGVyJiZ0aGlzLnJlZnJlc2hQb3NpdGlvbnMoIXMpfSl9LF9jbGVhcjpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0LGkpe3JldHVybiBmdW5jdGlvbihzKXtpLl90cmlnZ2VyKGUscyx0Ll91aUhhc2godCkpfX10aGlzLnJldmVydGluZz0hMTt2YXIgcyxuPVtdO2lmKCF0aGlzLl9ub0ZpbmFsU29ydCYmdGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKS5sZW5ndGgmJnRoaXMucGxhY2Vob2xkZXIuYmVmb3JlKHRoaXMuY3VycmVudEl0ZW0pLHRoaXMuX25vRmluYWxTb3J0PW51bGwsdGhpcy5oZWxwZXJbMF09PT10aGlzLmN1cnJlbnRJdGVtWzBdKXtmb3IocyBpbiB0aGlzLl9zdG9yZWRDU1MpKCJhdXRvIj09PXRoaXMuX3N0b3JlZENTU1tzXXx8InN0YXRpYyI9PT10aGlzLl9zdG9yZWRDU1Nbc10pJiYodGhpcy5fc3RvcmVkQ1NTW3NdPSIiKTt0aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKX1lbHNlIHRoaXMuY3VycmVudEl0ZW0uc2hvdygpO2Zvcih0aGlzLmZyb21PdXRzaWRlJiYhdCYmbi5wdXNoKGZ1bmN0aW9uKGUpe3RoaXMuX3RyaWdnZXIoInJlY2VpdmUiLGUsdGhpcy5fdWlIYXNoKHRoaXMuZnJvbU91dHNpZGUpKX0pLCF0aGlzLmZyb21PdXRzaWRlJiZ0aGlzLmRvbVBvc2l0aW9uLnByZXY9PT10aGlzLmN1cnJlbnRJdGVtLnByZXYoKS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKVswXSYmdGhpcy5kb21Qb3NpdGlvbi5wYXJlbnQ9PT10aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdfHx0fHxuLnB1c2goZnVuY3Rpb24oZSl7dGhpcy5fdHJpZ2dlcigidXBkYXRlIixlLHRoaXMuX3VpSGFzaCgpKX0pLHRoaXMhPT10aGlzLmN1cnJlbnRDb250YWluZXImJih0fHwobi5wdXNoKGZ1bmN0aW9uKGUpe3RoaXMuX3RyaWdnZXIoInJlbW92ZSIsZSx0aGlzLl91aUhhc2goKSl9KSxuLnB1c2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuX3RyaWdnZXIoInJlY2VpdmUiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmN1cnJlbnRDb250YWluZXIpKSxuLnB1c2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuX3RyaWdnZXIoInVwZGF0ZSIsdCx0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpKSkscz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7cz49MDtzLS0pdHx8bi5wdXNoKGkoImRlYWN0aXZhdGUiLHRoaXMsdGhpcy5jb250YWluZXJzW3NdKSksdGhpcy5jb250YWluZXJzW3NdLmNvbnRhaW5lckNhY2hlLm92ZXImJihuLnB1c2goaSgib3V0Iix0aGlzLHRoaXMuY29udGFpbmVyc1tzXSkpLHRoaXMuY29udGFpbmVyc1tzXS5jb250YWluZXJDYWNoZS5vdmVyPTApO2lmKHRoaXMuc3RvcmVkQ3Vyc29yJiYodGhpcy5kb2N1bWVudC5maW5kKCJib2R5IikuY3NzKCJjdXJzb3IiLHRoaXMuc3RvcmVkQ3Vyc29yKSx0aGlzLnN0b3JlZFN0eWxlc2hlZXQucmVtb3ZlKCkpLHRoaXMuX3N0b3JlZE9wYWNpdHkmJnRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsdGhpcy5fc3RvcmVkT3BhY2l0eSksdGhpcy5fc3RvcmVkWkluZGV4JiZ0aGlzLmhlbHBlci5jc3MoInpJbmRleCIsImF1dG8iPT09dGhpcy5fc3RvcmVkWkluZGV4PyIiOnRoaXMuX3N0b3JlZFpJbmRleCksdGhpcy5kcmFnZ2luZz0hMSx0fHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIixlLHRoaXMuX3VpSGFzaCgpKSx0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsfHwodGhpcy5oZWxwZXJbMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsKSwhdCl7Zm9yKHM9MDtuLmxlbmd0aD5zO3MrKyluW3NdLmNhbGwodGhpcyxlKTt0aGlzLl90cmlnZ2VyKCJzdG9wIixlLHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsfSxfdHJpZ2dlcjpmdW5jdGlvbigpe2UuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk9PT0hMSYmdGhpcy5jYW5jZWwoKX0sX3VpSGFzaDpmdW5jdGlvbih0KXt2YXIgaT10fHx0aGlzO3JldHVybntoZWxwZXI6aS5oZWxwZXIscGxhY2Vob2xkZXI6aS5wbGFjZWhvbGRlcnx8ZShbXSkscG9zaXRpb246aS5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOmkub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6aS5wb3NpdGlvbkFicyxpdGVtOmkuY3VycmVudEl0ZW0sc2VuZGVyOnQ/dC5lbGVtZW50Om51bGx9fX0pLGUud2lkZ2V0KCJ1aS5hY2NvcmRpb24iLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2FjdGl2ZTowLGFuaW1hdGU6e30sY29sbGFwc2libGU6ITEsZXZlbnQ6ImNsaWNrIixoZWFkZXI6Ij4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIixoZWlnaHRTdHlsZToiYXV0byIsaWNvbnM6e2FjdGl2ZUhlYWRlcjoidWktaWNvbi10cmlhbmdsZS0xLXMiLGhlYWRlcjoidWktaWNvbi10cmlhbmdsZS0xLWUifSxhY3RpdmF0ZTpudWxsLGJlZm9yZUFjdGl2YXRlOm51bGx9LGhpZGVQcm9wczp7Ym9yZGVyVG9wV2lkdGg6ImhpZGUiLGJvcmRlckJvdHRvbVdpZHRoOiJoaWRlIixwYWRkaW5nVG9wOiJoaWRlIixwYWRkaW5nQm90dG9tOiJoaWRlIixoZWlnaHQ6ImhpZGUifSxzaG93UHJvcHM6e2JvcmRlclRvcFdpZHRoOiJzaG93Iixib3JkZXJCb3R0b21XaWR0aDoic2hvdyIscGFkZGluZ1RvcDoic2hvdyIscGFkZGluZ0JvdHRvbToic2hvdyIsaGVpZ2h0OiJzaG93In0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uczt0aGlzLnByZXZTaG93PXRoaXMucHJldkhpZGU9ZSgpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXQiKS5hdHRyKCJyb2xlIiwidGFibGlzdCIpLHQuY29sbGFwc2libGV8fHQuYWN0aXZlIT09ITEmJm51bGwhPXQuYWN0aXZlfHwodC5hY3RpdmU9MCksdGhpcy5fcHJvY2Vzc1BhbmVscygpLDA+dC5hY3RpdmUmJih0LmFjdGl2ZSs9dGhpcy5oZWFkZXJzLmxlbmd0aCksdGhpcy5fcmVmcmVzaCgpfSxfZ2V0Q3JlYXRlRXZlbnREYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2hlYWRlcjp0aGlzLmFjdGl2ZSxwYW5lbDp0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5hY3RpdmUubmV4dCgpOmUoKX19LF9jcmVhdGVJY29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5pY29uczt0JiYoZSgiPHNwYW4+IikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiB1aS1pY29uICIrdC5oZWFkZXIpLnByZXBlbmRUbyh0aGlzLmhlYWRlcnMpLHRoaXMuYWN0aXZlLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlQ2xhc3ModC5oZWFkZXIpLmFkZENsYXNzKHQuYWN0aXZlSGVhZGVyKSx0aGlzLmhlYWRlcnMuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpKX0sX2Rlc3Ryb3lJY29uczpmdW5jdGlvbigpe3RoaXMuaGVhZGVycy5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWljb25zIikuY2hpbGRyZW4oIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iKS5yZW1vdmUoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikucmVtb3ZlQXR0cigicm9sZSIpLHRoaXMuaGVhZGVycy5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIHVpLWNvcm5lci10b3AiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1leHBhbmRlZCIpLnJlbW92ZUF0dHIoImFyaWEtc2VsZWN0ZWQiKS5yZW1vdmVBdHRyKCJhcmlhLWNvbnRyb2xzIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVVbmlxdWVJZCgpLHRoaXMuX2Rlc3Ryb3lJY29ucygpLGU9dGhpcy5oZWFkZXJzLm5leHQoKS5yZW1vdmVDbGFzcygidWktaGVscGVyLXJlc2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20gdWktYWNjb3JkaW9uLWNvbnRlbnQgdWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIikuY3NzKCJkaXNwbGF5IiwiIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtaGlkZGVuIikucmVtb3ZlQXR0cigiYXJpYS1sYWJlbGxlZGJ5IikucmVtb3ZlVW5pcXVlSWQoKSwiY29udGVudCIhPT10aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGUmJmUuY3NzKCJoZWlnaHQiLCIiKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiJhY3RpdmUiPT09ZT8odGhpcy5fYWN0aXZhdGUodCksdm9pZCAwKTooImV2ZW50Ij09PWUmJih0aGlzLm9wdGlvbnMuZXZlbnQmJnRoaXMuX29mZih0aGlzLmhlYWRlcnMsdGhpcy5vcHRpb25zLmV2ZW50KSx0aGlzLl9zZXR1cEV2ZW50cyh0KSksdGhpcy5fc3VwZXIoZSx0KSwiY29sbGFwc2libGUiIT09ZXx8dHx8dGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExfHx0aGlzLl9hY3RpdmF0ZSgwKSwiaWNvbnMiPT09ZSYmKHRoaXMuX2Rlc3Ryb3lJY29ucygpLHQmJnRoaXMuX2NyZWF0ZUljb25zKCkpLCJkaXNhYmxlZCI9PT1lJiYodGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KS5hdHRyKCJhcmlhLWRpc2FibGVkIix0KSx0aGlzLmhlYWRlcnMuYWRkKHRoaXMuaGVhZGVycy5uZXh0KCkpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KSksdm9pZCAwKX0sX2tleWRvd246ZnVuY3Rpb24odCl7aWYoIXQuYWx0S2V5JiYhdC5jdHJsS2V5KXt2YXIgaT1lLnVpLmtleUNvZGUscz10aGlzLmhlYWRlcnMubGVuZ3RoLG49dGhpcy5oZWFkZXJzLmluZGV4KHQudGFyZ2V0KSxhPSExO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgaS5SSUdIVDpjYXNlIGkuRE9XTjphPXRoaXMuaGVhZGVyc1sobisxKSVzXTticmVhaztjYXNlIGkuTEVGVDpjYXNlIGkuVVA6YT10aGlzLmhlYWRlcnNbKG4tMStzKSVzXTticmVhaztjYXNlIGkuU1BBQ0U6Y2FzZSBpLkVOVEVSOnRoaXMuX2V2ZW50SGFuZGxlcih0KTticmVhaztjYXNlIGkuSE9NRTphPXRoaXMuaGVhZGVyc1swXTticmVhaztjYXNlIGkuRU5EOmE9dGhpcy5oZWFkZXJzW3MtMV19YSYmKGUodC50YXJnZXQpLmF0dHIoInRhYkluZGV4IiwtMSksZShhKS5hdHRyKCJ0YWJJbmRleCIsMCksYS5mb2N1cygpLHQucHJldmVudERlZmF1bHQoKSl9fSxfcGFuZWxLZXlEb3duOmZ1bmN0aW9uKHQpe3Qua2V5Q29kZT09PWUudWkua2V5Q29kZS5VUCYmdC5jdHJsS2V5JiZlKHQuY3VycmVudFRhcmdldCkucHJldigpLmZvY3VzKCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnM7dGhpcy5fcHJvY2Vzc1BhbmVscygpLHQuYWN0aXZlPT09ITEmJnQuY29sbGFwc2libGU9PT0hMHx8IXRoaXMuaGVhZGVycy5sZW5ndGg/KHQuYWN0aXZlPSExLHRoaXMuYWN0aXZlPWUoKSk6dC5hY3RpdmU9PT0hMT90aGlzLl9hY3RpdmF0ZSgwKTp0aGlzLmFjdGl2ZS5sZW5ndGgmJiFlLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmFjdGl2ZVswXSk/dGhpcy5oZWFkZXJzLmxlbmd0aD09PXRoaXMuaGVhZGVycy5maW5kKCIudWktc3RhdGUtZGlzYWJsZWQiKS5sZW5ndGg/KHQuYWN0aXZlPSExLHRoaXMuYWN0aXZlPWUoKSk6dGhpcy5fYWN0aXZhdGUoTWF0aC5tYXgoMCx0LmFjdGl2ZS0xKSk6dC5hY3RpdmU9dGhpcy5oZWFkZXJzLmluZGV4KHRoaXMuYWN0aXZlKSx0aGlzLl9kZXN0cm95SWNvbnMoKSx0aGlzLl9yZWZyZXNoKCl9LF9wcm9jZXNzUGFuZWxzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oZWFkZXJzLHQ9dGhpcy5wYW5lbHM7dGhpcy5oZWFkZXJzPXRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5oZWFkZXIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLHRoaXMucGFuZWxzPXRoaXMuaGVhZGVycy5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50IHVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuZmlsdGVyKCI6bm90KC51aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUpIikuaGlkZSgpLHQmJih0aGlzLl9vZmYoZS5ub3QodGhpcy5oZWFkZXJzKSksdGhpcy5fb2ZmKHQubm90KHRoaXMucGFuZWxzKSkpCi19LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzLm9wdGlvbnMscz1pLmhlaWdodFN0eWxlLG49dGhpcy5lbGVtZW50LnBhcmVudCgpO3RoaXMuYWN0aXZlPXRoaXMuX2ZpbmRBY3RpdmUoaS5hY3RpdmUpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIiksdGhpcy5hY3RpdmUubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKS5zaG93KCksdGhpcy5oZWFkZXJzLmF0dHIoInJvbGUiLCJ0YWIiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxpPXQudW5pcXVlSWQoKS5hdHRyKCJpZCIpLHM9dC5uZXh0KCksbj1zLnVuaXF1ZUlkKCkuYXR0cigiaWQiKTt0LmF0dHIoImFyaWEtY29udHJvbHMiLG4pLHMuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixpKX0pLm5leHQoKS5hdHRyKCJyb2xlIiwidGFicGFuZWwiKSx0aGlzLmhlYWRlcnMubm90KHRoaXMuYWN0aXZlKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6ImZhbHNlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIix0YWJJbmRleDotMX0pLm5leHQoKS5hdHRyKHsiYXJpYS1oaWRkZW4iOiJ0cnVlIn0pLmhpZGUoKSx0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5hY3RpdmUuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIiwiYXJpYS1leHBhbmRlZCI6InRydWUiLHRhYkluZGV4OjB9KS5uZXh0KCkuYXR0cih7ImFyaWEtaGlkZGVuIjoiZmFsc2UifSk6dGhpcy5oZWFkZXJzLmVxKDApLmF0dHIoInRhYkluZGV4IiwwKSx0aGlzLl9jcmVhdGVJY29ucygpLHRoaXMuX3NldHVwRXZlbnRzKGkuZXZlbnQpLCJmaWxsIj09PXM/KHQ9bi5oZWlnaHQoKSx0aGlzLmVsZW1lbnQuc2libGluZ3MoIjp2aXNpYmxlIikuZWFjaChmdW5jdGlvbigpe3ZhciBpPWUodGhpcykscz1pLmNzcygicG9zaXRpb24iKTsiYWJzb2x1dGUiIT09cyYmImZpeGVkIiE9PXMmJih0LT1pLm91dGVySGVpZ2h0KCEwKSl9KSx0aGlzLmhlYWRlcnMuZWFjaChmdW5jdGlvbigpe3QtPWUodGhpcykub3V0ZXJIZWlnaHQoITApfSksdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5oZWlnaHQoTWF0aC5tYXgoMCx0LWUodGhpcykuaW5uZXJIZWlnaHQoKStlKHRoaXMpLmhlaWdodCgpKSl9KS5jc3MoIm92ZXJmbG93IiwiYXV0byIpKToiYXV0byI9PT1zJiYodD0wLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe3Q9TWF0aC5tYXgodCxlKHRoaXMpLmNzcygiaGVpZ2h0IiwiIikuaGVpZ2h0KCkpfSkuaGVpZ2h0KHQpKX0sX2FjdGl2YXRlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2ZpbmRBY3RpdmUodClbMF07aSE9PXRoaXMuYWN0aXZlWzBdJiYoaT1pfHx0aGlzLmFjdGl2ZVswXSx0aGlzLl9ldmVudEhhbmRsZXIoe3RhcmdldDppLGN1cnJlbnRUYXJnZXQ6aSxwcmV2ZW50RGVmYXVsdDplLm5vb3B9KSl9LF9maW5kQWN0aXZlOmZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmhlYWRlcnMuZXEodCk6ZSgpfSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGk9e2tleWRvd246Il9rZXlkb3duIn07dCYmZS5lYWNoKHQuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2lbdF09Il9ldmVudEhhbmRsZXIifSksdGhpcy5fb2ZmKHRoaXMuaGVhZGVycy5hZGQodGhpcy5oZWFkZXJzLm5leHQoKSkpLHRoaXMuX29uKHRoaXMuaGVhZGVycyxpKSx0aGlzLl9vbih0aGlzLmhlYWRlcnMubmV4dCgpLHtrZXlkb3duOiJfcGFuZWxLZXlEb3duIn0pLHRoaXMuX2hvdmVyYWJsZSh0aGlzLmhlYWRlcnMpLHRoaXMuX2ZvY3VzYWJsZSh0aGlzLmhlYWRlcnMpfSxfZXZlbnRIYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPXRoaXMuYWN0aXZlLG49ZSh0LmN1cnJlbnRUYXJnZXQpLGE9blswXT09PXNbMF0sbz1hJiZpLmNvbGxhcHNpYmxlLHI9bz9lKCk6bi5uZXh0KCksaD1zLm5leHQoKSxsPXtvbGRIZWFkZXI6cyxvbGRQYW5lbDpoLG5ld0hlYWRlcjpvP2UoKTpuLG5ld1BhbmVsOnJ9O3QucHJldmVudERlZmF1bHQoKSxhJiYhaS5jb2xsYXBzaWJsZXx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlQWN0aXZhdGUiLHQsbCk9PT0hMXx8KGkuYWN0aXZlPW8/ITE6dGhpcy5oZWFkZXJzLmluZGV4KG4pLHRoaXMuYWN0aXZlPWE/ZSgpOm4sdGhpcy5fdG9nZ2xlKGwpLHMucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLGkuaWNvbnMmJnMuY2hpbGRyZW4oIi51aS1hY2NvcmRpb24taGVhZGVyLWljb24iKS5yZW1vdmVDbGFzcyhpLmljb25zLmFjdGl2ZUhlYWRlcikuYWRkQ2xhc3MoaS5pY29ucy5oZWFkZXIpLGF8fChuLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIiksaS5pY29ucyYmbi5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZUNsYXNzKGkuaWNvbnMuaGVhZGVyKS5hZGRDbGFzcyhpLmljb25zLmFjdGl2ZUhlYWRlciksbi5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpKSl9LF90b2dnbGU6ZnVuY3Rpb24odCl7dmFyIGk9dC5uZXdQYW5lbCxzPXRoaXMucHJldlNob3cubGVuZ3RoP3RoaXMucHJldlNob3c6dC5vbGRQYW5lbDt0aGlzLnByZXZTaG93LmFkZCh0aGlzLnByZXZIaWRlKS5zdG9wKCEwLCEwKSx0aGlzLnByZXZTaG93PWksdGhpcy5wcmV2SGlkZT1zLHRoaXMub3B0aW9ucy5hbmltYXRlP3RoaXMuX2FuaW1hdGUoaSxzLHQpOihzLmhpZGUoKSxpLnNob3coKSx0aGlzLl90b2dnbGVDb21wbGV0ZSh0KSkscy5hdHRyKHsiYXJpYS1oaWRkZW4iOiJ0cnVlIn0pLHMucHJldigpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UifSksaS5sZW5ndGgmJnMubGVuZ3RoP3MucHJldigpLmF0dHIoe3RhYkluZGV4Oi0xLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UifSk6aS5sZW5ndGgmJnRoaXMuaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gMD09PXBhcnNlSW50KGUodGhpcykuYXR0cigidGFiSW5kZXgiKSwxMCl9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGkuYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpLnByZXYoKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pfSxfYW5pbWF0ZTpmdW5jdGlvbihlLHQsaSl7dmFyIHMsbixhLG89dGhpcyxyPTAsaD1lLmNzcygiYm94LXNpemluZyIpLGw9ZS5sZW5ndGgmJighdC5sZW5ndGh8fGUuaW5kZXgoKTx0LmluZGV4KCkpLHU9dGhpcy5vcHRpb25zLmFuaW1hdGV8fHt9LGQ9bCYmdS5kb3dufHx1LGM9ZnVuY3Rpb24oKXtvLl90b2dnbGVDb21wbGV0ZShpKX07cmV0dXJuIm51bWJlciI9PXR5cGVvZiBkJiYoYT1kKSwic3RyaW5nIj09dHlwZW9mIGQmJihuPWQpLG49bnx8ZC5lYXNpbmd8fHUuZWFzaW5nLGE9YXx8ZC5kdXJhdGlvbnx8dS5kdXJhdGlvbix0Lmxlbmd0aD9lLmxlbmd0aD8ocz1lLnNob3coKS5vdXRlckhlaWdodCgpLHQuYW5pbWF0ZSh0aGlzLmhpZGVQcm9wcyx7ZHVyYXRpb246YSxlYXNpbmc6bixzdGVwOmZ1bmN0aW9uKGUsdCl7dC5ub3c9TWF0aC5yb3VuZChlKX19KSxlLmhpZGUoKS5hbmltYXRlKHRoaXMuc2hvd1Byb3BzLHtkdXJhdGlvbjphLGVhc2luZzpuLGNvbXBsZXRlOmMsc3RlcDpmdW5jdGlvbihlLGkpe2kubm93PU1hdGgucm91bmQoZSksImhlaWdodCIhPT1pLnByb3A/ImNvbnRlbnQtYm94Ij09PWgmJihyKz1pLm5vdyk6ImNvbnRlbnQiIT09by5vcHRpb25zLmhlaWdodFN0eWxlJiYoaS5ub3c9TWF0aC5yb3VuZChzLXQub3V0ZXJIZWlnaHQoKS1yKSxyPTApfX0pLHZvaWQgMCk6dC5hbmltYXRlKHRoaXMuaGlkZVByb3BzLGEsbixjKTplLmFuaW1hdGUodGhpcy5zaG93UHJvcHMsYSxuLGMpfSxfdG9nZ2xlQ29tcGxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vbGRQYW5lbDt0LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKS5wcmV2KCkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci10b3AiKS5hZGRDbGFzcygidWktY29ybmVyLWFsbCIpLHQubGVuZ3RoJiYodC5wYXJlbnQoKVswXS5jbGFzc05hbWU9dC5wYXJlbnQoKVswXS5jbGFzc05hbWUpLHRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixudWxsLGUpfX0pLGUud2lkZ2V0KCJ1aS5tZW51Iix7dmVyc2lvbjoiMS4xMS40IixkZWZhdWx0RWxlbWVudDoiPHVsPiIsZGVsYXk6MzAwLG9wdGlvbnM6e2ljb25zOntzdWJtZW51OiJ1aS1pY29uLWNhcmF0LTEtZSJ9LGl0ZW1zOiI+ICoiLG1lbnVzOiJ1bCIscG9zaXRpb246e215OiJsZWZ0LTEgdG9wIixhdDoicmlnaHQgdG9wIn0scm9sZToibWVudSIsYmx1cjpudWxsLGZvY3VzOm51bGwsc2VsZWN0Om51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZU1lbnU9dGhpcy5lbGVtZW50LHRoaXMubW91c2VIYW5kbGVkPSExLHRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmFkZENsYXNzKCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCIpLnRvZ2dsZUNsYXNzKCJ1aS1tZW51LWljb25zIiwhIXRoaXMuZWxlbWVudC5maW5kKCIudWktaWNvbiIpLmxlbmd0aCkuYXR0cih7cm9sZTp0aGlzLm9wdGlvbnMucm9sZSx0YWJJbmRleDowfSksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSx0aGlzLl9vbih7Im1vdXNlZG93biAudWktbWVudS1pdGVtIjpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9LCJjbGljayAudWktbWVudS1pdGVtIjpmdW5jdGlvbih0KXt2YXIgaT1lKHQudGFyZ2V0KTshdGhpcy5tb3VzZUhhbmRsZWQmJmkubm90KCIudWktc3RhdGUtZGlzYWJsZWQiKS5sZW5ndGgmJih0aGlzLnNlbGVjdCh0KSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCl8fCh0aGlzLm1vdXNlSGFuZGxlZD0hMCksaS5oYXMoIi51aS1tZW51IikubGVuZ3RoP3RoaXMuZXhwYW5kKHQpOiF0aGlzLmVsZW1lbnQuaXMoIjpmb2N1cyIpJiZlKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCkuY2xvc2VzdCgiLnVpLW1lbnUiKS5sZW5ndGgmJih0aGlzLmVsZW1lbnQudHJpZ2dlcigiZm9jdXMiLFshMF0pLHRoaXMuYWN0aXZlJiYxPT09dGhpcy5hY3RpdmUucGFyZW50cygiLnVpLW1lbnUiKS5sZW5ndGgmJmNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSkpfSwibW91c2VlbnRlciAudWktbWVudS1pdGVtIjpmdW5jdGlvbih0KXtpZighdGhpcy5wcmV2aW91c0ZpbHRlcil7dmFyIGk9ZSh0LmN1cnJlbnRUYXJnZXQpO2kuc2libGluZ3MoIi51aS1zdGF0ZS1hY3RpdmUiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5mb2N1cyh0LGkpfX0sbW91c2VsZWF2ZToiY29sbGFwc2VBbGwiLCJtb3VzZWxlYXZlIC51aS1tZW51IjoiY29sbGFwc2VBbGwiLGZvY3VzOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5hY3RpdmV8fHRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZXEoMCk7dHx8dGhpcy5mb2N1cyhlLGkpfSxibHVyOmZ1bmN0aW9uKHQpe3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KXx8dGhpcy5jb2xsYXBzZUFsbCh0KX0pfSxrZXlkb3duOiJfa2V5ZG93biJ9KSx0aGlzLnJlZnJlc2goKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHtjbGljazpmdW5jdGlvbihlKXt0aGlzLl9jbG9zZU9uRG9jdW1lbnRDbGljayhlKSYmdGhpcy5jb2xsYXBzZUFsbChlKSx0aGlzLm1vdXNlSGFuZGxlZD0hMX19KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50IikuZmluZCgiLnVpLW1lbnUiKS5hZGRCYWNrKCkucmVtb3ZlQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtaWNvbnMgdWktZnJvbnQiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsbGVkYnkiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlVW5pcXVlSWQoKS5zaG93KCksdGhpcy5lbGVtZW50LmZpbmQoIi51aS1tZW51LWl0ZW0iKS5yZW1vdmVDbGFzcygidWktbWVudS1pdGVtIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVVbmlxdWVJZCgpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtaGFzcG9wdXAiKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuZGF0YSgidWktbWVudS1zdWJtZW51LWNhcmF0IikmJnQucmVtb3ZlKCl9KSx0aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUtZGl2aWRlciIpLnJlbW92ZUNsYXNzKCJ1aS1tZW51LWRpdmlkZXIgdWktd2lkZ2V0LWNvbnRlbnQiKX0sX2tleWRvd246ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz0hMDtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMucHJldmlvdXNQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfRE9XTjp0aGlzLm5leHRQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6dGhpcy5fbW92ZSgiZmlyc3QiLCJmaXJzdCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnRoaXMuX21vdmUoImxhc3QiLCJsYXN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDp0aGlzLnByZXZpb3VzKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046dGhpcy5uZXh0KHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5jb2xsYXBzZSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5SSUdIVDp0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKSYmdGhpcy5leHBhbmQodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5URVI6Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5fYWN0aXZhdGUodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRVNDQVBFOnRoaXMuY29sbGFwc2UodCk7YnJlYWs7ZGVmYXVsdDpvPSExLHM9dGhpcy5wcmV2aW91c0ZpbHRlcnx8IiIsbj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksYT0hMSxjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJUaW1lciksbj09PXM/YT0hMDpuPXMrbixpPXRoaXMuX2ZpbHRlck1lbnVJdGVtcyhuKSxpPWEmJi0xIT09aS5pbmRleCh0aGlzLmFjdGl2ZS5uZXh0KCkpP3RoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKTppLGkubGVuZ3RofHwobj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksaT10aGlzLl9maWx0ZXJNZW51SXRlbXMobikpLGkubGVuZ3RoPyh0aGlzLmZvY3VzKHQsaSksdGhpcy5wcmV2aW91c0ZpbHRlcj1uLHRoaXMuZmlsdGVyVGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcn0sMWUzKSk6ZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXJ9byYmdC5wcmV2ZW50RGVmYXVsdCgpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oZSl7dGhpcy5hY3RpdmUuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpfHwodGhpcy5hY3RpdmUuaXMoIlthcmlhLWhhc3BvcHVwPSd0cnVlJ10iKT90aGlzLmV4cGFuZChlKTp0aGlzLnNlbGVjdChlKSl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcyxuPXRoaXMub3B0aW9ucy5pY29ucy5zdWJtZW51LGE9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLm1lbnVzKTt0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLW1lbnUtaWNvbnMiLCEhdGhpcy5lbGVtZW50LmZpbmQoIi51aS1pY29uIikubGVuZ3RoKSxhLmZpbHRlcigiOm5vdCgudWktbWVudSkiKS5hZGRDbGFzcygidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktZnJvbnQiKS5oaWRlKCkuYXR0cih7cm9sZTp0aGlzLm9wdGlvbnMucm9sZSwiYXJpYS1oaWRkZW4iOiJ0cnVlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5wYXJlbnQoKSxzPWUoIjxzcGFuPiIpLmFkZENsYXNzKCJ1aS1tZW51LWljb24gdWktaWNvbiAiK24pLmRhdGEoInVpLW1lbnUtc3VibWVudS1jYXJhdCIsITApO2kuYXR0cigiYXJpYS1oYXNwb3B1cCIsInRydWUiKS5wcmVwZW5kKHMpLHQuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixpLmF0dHIoImlkIikpfSksdD1hLmFkZCh0aGlzLmVsZW1lbnQpLGk9dC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcyksaS5ub3QoIi51aS1tZW51LWl0ZW0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtzLl9pc0RpdmlkZXIodCkmJnQuYWRkQ2xhc3MoInVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtZGl2aWRlciIpfSksaS5ub3QoIi51aS1tZW51LWl0ZW0sIC51aS1tZW51LWRpdmlkZXIiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikudW5pcXVlSWQoKS5hdHRyKHt0YWJJbmRleDotMSxyb2xlOnRoaXMuX2l0ZW1Sb2xlKCl9KSxpLmZpbHRlcigiLnVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSx0aGlzLmFjdGl2ZSYmIWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLHRoaXMuYWN0aXZlWzBdKSYmdGhpcy5ibHVyKCl9LF9pdGVtUm9sZTpmdW5jdGlvbigpe3JldHVybnttZW51OiJtZW51aXRlbSIsbGlzdGJveDoib3B0aW9uIn1bdGhpcy5vcHRpb25zLnJvbGVdfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7Imljb25zIj09PWUmJnRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLnN1Ym1lbnUpLmFkZENsYXNzKHQuc3VibWVudSksImRpc2FibGVkIj09PWUmJnRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5fc3VwZXIoZSx0KX0sZm9jdXM6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO3RoaXMuYmx1cihlLGUmJiJmb2N1cyI9PT1lLnR5cGUpLHRoaXMuX3Njcm9sbEludG9WaWV3KHQpLHRoaXMuYWN0aXZlPXQuZmlyc3QoKSxzPXRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLm9wdGlvbnMucm9sZSYmdGhpcy5lbGVtZW50LmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIscy5hdHRyKCJpZCIpKSx0aGlzLmFjdGl2ZS5wYXJlbnQoKS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGUmJiJrZXlkb3duIj09PWUudHlwZT90aGlzLl9jbG9zZSgpOnRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9jbG9zZSgpfSx0aGlzLmRlbGF5KSxpPXQuY2hpbGRyZW4oIi51aS1tZW51IiksaS5sZW5ndGgmJmUmJi9ebW91c2UvLnRlc3QoZS50eXBlKSYmdGhpcy5fc3RhcnRPcGVuaW5nKGkpLHRoaXMuYWN0aXZlTWVudT10LnBhcmVudCgpLHRoaXMuX3RyaWdnZXIoImZvY3VzIixlLHtpdGVtOnR9KX0sX3Njcm9sbEludG9WaWV3OmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG8scjt0aGlzLl9oYXNTY3JvbGwoKSYmKGk9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLHM9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sInBhZGRpbmdUb3AiKSl8fDAsbj10Lm9mZnNldCgpLnRvcC10aGlzLmFjdGl2ZU1lbnUub2Zmc2V0KCkudG9wLWktcyxhPXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoKSxvPXRoaXMuYWN0aXZlTWVudS5oZWlnaHQoKSxyPXQub3V0ZXJIZWlnaHQoKSwwPm4/dGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcChhK24pOm4rcj5vJiZ0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKGErbi1vK3IpKX0sYmx1cjpmdW5jdGlvbihlLHQpe3R8fGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLmFjdGl2ZSYmKHRoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLHRoaXMuYWN0aXZlPW51bGwsdGhpcy5fdHJpZ2dlcigiYmx1ciIsZSx7aXRlbTp0aGlzLmFjdGl2ZX0pKX0sX3N0YXJ0T3BlbmluZzpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lciksInRydWUiPT09ZS5hdHRyKCJhcmlhLWhpZGRlbiIpJiYodGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuX2Nsb3NlKCksdGhpcy5fb3BlbihlKX0sdGhpcy5kZWxheSkpfSxfb3BlbjpmdW5jdGlvbih0KXt2YXIgaT1lLmV4dGVuZCh7b2Y6dGhpcy5hY3RpdmV9LHRoaXMub3B0aW9ucy5wb3NpdGlvbik7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpLm5vdCh0LnBhcmVudHMoIi51aS1tZW51IikpLmhpZGUoKS5hdHRyKCJhcmlhLWhpZGRlbiIsInRydWUiKSx0LnNob3coKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJ0cnVlIikucG9zaXRpb24oaSl9LGNvbGxhcHNlQWxsOmZ1bmN0aW9uKHQsaSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt2YXIgcz1pP3RoaXMuZWxlbWVudDplKHQmJnQudGFyZ2V0KS5jbG9zZXN0KHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpKTtzLmxlbmd0aHx8KHM9dGhpcy5lbGVtZW50KSx0aGlzLl9jbG9zZShzKSx0aGlzLmJsdXIodCksdGhpcy5hY3RpdmVNZW51PXN9LHRoaXMuZGVsYXkpfSxfY2xvc2U6ZnVuY3Rpb24oZSl7ZXx8KGU9dGhpcy5hY3RpdmU/dGhpcy5hY3RpdmUucGFyZW50KCk6dGhpcy5lbGVtZW50KSxlLmZpbmQoIi51aS1tZW51IikuaGlkZSgpLmF0dHIoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLmVuZCgpLmZpbmQoIi51aS1zdGF0ZS1hY3RpdmUiKS5ub3QoIi51aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0sX2Nsb3NlT25Eb2N1bWVudENsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiFlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudSIpLmxlbmd0aH0sX2lzRGl2aWRlcjpmdW5jdGlvbihlKXtyZXR1cm4hL1teXC1cdTIwMTRcdTIwMTNcc10vLnRlc3QoZS50ZXh0KCkpfSxjb2xsYXBzZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmFjdGl2ZSYmdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIsdGhpcy5lbGVtZW50KTt0JiZ0Lmxlbmd0aCYmKHRoaXMuX2Nsb3NlKCksdGhpcy5mb2N1cyhlLHQpKX0sZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLW1lbnUgIikuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmZpcnN0KCk7dCYmdC5sZW5ndGgmJih0aGlzLl9vcGVuKHQucGFyZW50KCkpLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5mb2N1cyhlLHQpfSkpfSxuZXh0OmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoIm5leHQiLCJmaXJzdCIsZSl9LHByZXZpb3VzOmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoInByZXYiLCJsYXN0IixlKX0saXNGaXJzdEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5wcmV2QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxpc0xhc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sX21vdmU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzO3RoaXMuYWN0aXZlJiYocz0iZmlyc3QiPT09ZXx8Imxhc3QiPT09ZT90aGlzLmFjdGl2ZVsiZmlyc3QiPT09ZT8icHJldkFsbCI6Im5leHRBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKC0xKTp0aGlzLmFjdGl2ZVtlKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApKSxzJiZzLmxlbmd0aCYmdGhpcy5hY3RpdmV8fChzPXRoaXMuYWN0aXZlTWVudS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcylbdF0oKSksdGhpcy5mb2N1cyhpLHMpfSxuZXh0UGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzTGFzdEl0ZW0oKXx8KHRoaXMuX2hhc1Njcm9sbCgpPyhzPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxuPXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmFjdGl2ZS5uZXh0QWxsKCIudWktbWVudS1pdGVtIikuZWFjaChmdW5jdGlvbigpe3JldHVybiBpPWUodGhpcyksMD5pLm9mZnNldCgpLnRvcC1zLW59KSx0aGlzLmZvY3VzKHQsaSkpOnRoaXMuZm9jdXModCx0aGlzLmFjdGl2ZU1lbnUuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpW3RoaXMuYWN0aXZlPyJsYXN0IjoiZmlyc3QiXSgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LHByZXZpb3VzUGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzRmlyc3RJdGVtKCl8fCh0aGlzLl9oYXNTY3JvbGwoKT8ocz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3Asbj10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gaT1lKHRoaXMpLGkub2Zmc2V0KCkudG9wLXMrbj4wfSksdGhpcy5mb2N1cyh0LGkpKTp0aGlzLmZvY3VzKHQsdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maXJzdCgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk8dGhpcy5lbGVtZW50LnByb3AoInNjcm9sbEhlaWdodCIpfSxzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmU9dGhpcy5hY3RpdmV8fGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0iKTt2YXIgaT17aXRlbTp0aGlzLmFjdGl2ZX07dGhpcy5hY3RpdmUuaGFzKCIudWktbWVudSIpLmxlbmd0aHx8dGhpcy5jb2xsYXBzZUFsbCh0LCEwKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLHQsaSl9LF9maWx0ZXJNZW51SXRlbXM6ZnVuY3Rpb24odCl7dmFyIGk9dC5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCJcXCQmIikscz1SZWdFeHAoIl4iK2ksImkiKTtyZXR1cm4gdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maWx0ZXIoIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gcy50ZXN0KGUudHJpbShlKHRoaXMpLnRleHQoKSkpfSl9fSksZS53aWRnZXQoInVpLmF1dG9jb21wbGV0ZSIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxpbnB1dD4iLG9wdGlvbnM6e2FwcGVuZFRvOm51bGwsYXV0b0ZvY3VzOiExLGRlbGF5OjMwMCxtaW5MZW5ndGg6MSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHNvdXJjZTpudWxsLGNoYW5nZTpudWxsLGNsb3NlOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzcG9uc2U6bnVsbCxzZWFyY2g6bnVsbCxzZWxlY3Q6bnVsbH0scmVxdWVzdEluZGV4OjAscGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbj10aGlzLmVsZW1lbnRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxhPSJ0ZXh0YXJlYSI9PT1uLG89ImlucHV0Ij09PW47dGhpcy5pc011bHRpTGluZT1hPyEwOm8/ITE6dGhpcy5lbGVtZW50LnByb3AoImlzQ29udGVudEVkaXRhYmxlIiksdGhpcy52YWx1ZU1ldGhvZD10aGlzLmVsZW1lbnRbYXx8bz8idmFsIjoidGV4dCJdLHRoaXMuaXNOZXdNZW51PSEwLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYXV0b2NvbXBsZXRlLWlucHV0IikuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIiksdGhpcy5fb24odGhpcy5lbGVtZW50LHtrZXlkb3duOmZ1bmN0aW9uKG4pe2lmKHRoaXMuZWxlbWVudC5wcm9wKCJyZWFkT25seSIpKXJldHVybiB0PSEwLHM9ITAsaT0hMCx2b2lkIDA7dD0hMSxzPSExLGk9ITE7dmFyIGE9ZS51aS5rZXlDb2RlO3N3aXRjaChuLmtleUNvZGUpe2Nhc2UgYS5QQUdFX1VQOnQ9ITAsdGhpcy5fbW92ZSgicHJldmlvdXNQYWdlIixuKTticmVhaztjYXNlIGEuUEFHRV9ET1dOOnQ9ITAsdGhpcy5fbW92ZSgibmV4dFBhZ2UiLG4pO2JyZWFrO2Nhc2UgYS5VUDp0PSEwLHRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIsbik7YnJlYWs7Y2FzZSBhLkRPV046dD0hMCx0aGlzLl9rZXlFdmVudCgibmV4dCIsbik7YnJlYWs7Y2FzZSBhLkVOVEVSOnRoaXMubWVudS5hY3RpdmUmJih0PSEwLG4ucHJldmVudERlZmF1bHQoKSx0aGlzLm1lbnUuc2VsZWN0KG4pKTticmVhaztjYXNlIGEuVEFCOnRoaXMubWVudS5hY3RpdmUmJnRoaXMubWVudS5zZWxlY3Qobik7YnJlYWs7Y2FzZSBhLkVTQ0FQRTp0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSYmKHRoaXMuaXNNdWx0aUxpbmV8fHRoaXMuX3ZhbHVlKHRoaXMudGVybSksdGhpcy5jbG9zZShuKSxuLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2RlZmF1bHQ6aT0hMCx0aGlzLl9zZWFyY2hUaW1lb3V0KG4pfX0sa2V5cHJlc3M6ZnVuY3Rpb24ocyl7aWYodClyZXR1cm4gdD0hMSwoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKSYmcy5wcmV2ZW50RGVmYXVsdCgpLHZvaWQgMDtpZighaSl7dmFyIG49ZS51aS5rZXlDb2RlO3N3aXRjaChzLmtleUNvZGUpe2Nhc2Ugbi5QQUdFX1VQOnRoaXMuX21vdmUoInByZXZpb3VzUGFnZSIscyk7YnJlYWs7Y2FzZSBuLlBBR0VfRE9XTjp0aGlzLl9tb3ZlKCJuZXh0UGFnZSIscyk7YnJlYWs7Y2FzZSBuLlVQOnRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIscyk7YnJlYWs7Y2FzZSBuLkRPV046dGhpcy5fa2V5RXZlbnQoIm5leHQiLHMpfX19LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBzPyhzPSExLGUucHJldmVudERlZmF1bHQoKSx2b2lkIDApOih0aGlzLl9zZWFyY2hUaW1lb3V0KGUpLHZvaWQgMCl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEl0ZW09bnVsbCx0aGlzLnByZXZpb3VzPXRoaXMuX3ZhbHVlKCl9LGJsdXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2FuY2VsQmx1cj8oZGVsZXRlIHRoaXMuY2FuY2VsQmx1cix2b2lkIDApOihjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuY2xvc2UoZSksdGhpcy5fY2hhbmdlKGUpLHZvaWQgMCl9fSksdGhpcy5faW5pdFNvdXJjZSgpLHRoaXMubWVudT1lKCI8dWw+IikuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZSB1aS1mcm9udCIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLm1lbnUoe3JvbGU6bnVsbH0pLmhpZGUoKS5tZW51KCJpbnN0YW5jZSIpLHRoaXMuX29uKHRoaXMubWVudS5lbGVtZW50LHttb3VzZWRvd246ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2FuY2VsQmx1cj0hMCx0aGlzLl9kZWxheShmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmNhbmNlbEJsdXJ9KTt2YXIgaT10aGlzLm1lbnUuZWxlbWVudFswXTtlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikubGVuZ3RofHx0aGlzLl9kZWxheShmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kb2N1bWVudC5vbmUoIm1vdXNlZG93biIsZnVuY3Rpb24ocyl7cy50YXJnZXQ9PT10LmVsZW1lbnRbMF18fHMudGFyZ2V0PT09aXx8ZS5jb250YWlucyhpLHMudGFyZ2V0KXx8dC5jbG9zZSgpfSl9KX0sbWVudWZvY3VzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbjtyZXR1cm4gdGhpcy5pc05ld01lbnUmJih0aGlzLmlzTmV3TWVudT0hMSx0Lm9yaWdpbmFsRXZlbnQmJi9ebW91c2UvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpKT8odGhpcy5tZW51LmJsdXIoKSx0aGlzLmRvY3VtZW50Lm9uZSgibW91c2Vtb3ZlIixmdW5jdGlvbigpe2UodC50YXJnZXQpLnRyaWdnZXIodC5vcmlnaW5hbEV2ZW50KX0pLHZvaWQgMCk6KG49aS5pdGVtLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIiksITEhPT10aGlzLl90cmlnZ2VyKCJmb2N1cyIsdCx7aXRlbTpufSkmJnQub3JpZ2luYWxFdmVudCYmL15rZXkvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpJiZ0aGlzLl92YWx1ZShuLnZhbHVlKSxzPWkuaXRlbS5hdHRyKCJhcmlhLWxhYmVsIil8fG4udmFsdWUscyYmZS50cmltKHMpLmxlbmd0aCYmKHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKCI8ZGl2PiIpLnRleHQocykuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSksdm9pZCAwKX0sbWVudXNlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXQuaXRlbS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIpLHM9dGhpcy5wcmV2aW91czt0aGlzLmVsZW1lbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQmJih0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPXMsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXMsdGhpcy5zZWxlY3RlZEl0ZW09aX0pKSwhMSE9PXRoaXMuX3RyaWdnZXIoInNlbGVjdCIsZSx7aXRlbTppfSkmJnRoaXMuX3ZhbHVlKGkudmFsdWUpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLHRoaXMuY2xvc2UoZSksdGhpcy5zZWxlY3RlZEl0ZW09aX19KSx0aGlzLmxpdmVSZWdpb249ZSgiPHNwYW4+Iix7cm9sZToic3RhdHVzIiwiYXJpYS1saXZlIjoiYXNzZXJ0aXZlIiwiYXJpYS1yZWxldmFudCI6ImFkZGl0aW9ucyJ9KS5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIikuYXBwZW5kVG8odGhpcy5kb2N1bWVudFswXS5ib2R5KSx0aGlzLl9vbih0aGlzLndpbmRvdyx7YmVmb3JldW5sb2FkOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLnNlYXJjaGluZyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKSx0aGlzLm1lbnUuZWxlbWVudC5yZW1vdmUoKSx0aGlzLmxpdmVSZWdpb24ucmVtb3ZlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJzb3VyY2UiPT09ZSYmdGhpcy5faW5pdFNvdXJjZSgpLCJhcHBlbmRUbyI9PT1lJiZ0aGlzLm1lbnUuZWxlbWVudC5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwiZGlzYWJsZWQiPT09ZSYmdCYmdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCl9LF9hcHBlbmRUbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5hcHBlbmRUbztyZXR1cm4gdCYmKHQ9dC5qcXVlcnl8fHQubm9kZVR5cGU/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodCkuZXEoMCkpLHQmJnRbMF18fCh0PXRoaXMuZWxlbWVudC5jbG9zZXN0KCIudWktZnJvbnQiKSksdC5sZW5ndGh8fCh0PXRoaXMuZG9jdW1lbnRbMF0uYm9keSksdH0sX2luaXRTb3VyY2U6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcztlLmlzQXJyYXkodGhpcy5vcHRpb25zLnNvdXJjZSk/KHQ9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbihpLHMpe3MoZS51aS5hdXRvY29tcGxldGUuZmlsdGVyKHQsaS50ZXJtKSl9KToic3RyaW5nIj09dHlwZW9mIHRoaXMub3B0aW9ucy5zb3VyY2U/KGk9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbih0LG4pe3MueGhyJiZzLnhoci5hYm9ydCgpLHMueGhyPWUuYWpheCh7dXJsOmksZGF0YTp0LGRhdGFUeXBlOiJqc29uIixzdWNjZXNzOmZ1bmN0aW9uKGUpe24oZSl9LGVycm9yOmZ1bmN0aW9uKCl7bihbXSl9fSl9KTp0aGlzLnNvdXJjZT10aGlzLm9wdGlvbnMuc291cmNlfSxfc2VhcmNoVGltZW91dDpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuc2VhcmNoaW5nPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50ZXJtPT09dGhpcy5fdmFsdWUoKSxpPXRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpLHM9ZS5hbHRLZXl8fGUuY3RybEtleXx8ZS5tZXRhS2V5fHxlLnNoaWZ0S2V5OyghdHx8dCYmIWkmJiFzKSYmKHRoaXMuc2VsZWN0ZWRJdGVtPW51bGwsdGhpcy5zZWFyY2gobnVsbCxlKSl9LHRoaXMub3B0aW9ucy5kZWxheSl9LHNlYXJjaDpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWU/ZTp0aGlzLl92YWx1ZSgpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLGUubGVuZ3RoPHRoaXMub3B0aW9ucy5taW5MZW5ndGg/dGhpcy5jbG9zZSh0KTp0aGlzLl90cmlnZ2VyKCJzZWFyY2giLHQpIT09ITE/dGhpcy5fc2VhcmNoKGUpOnZvaWQgMH0sX3NlYXJjaDpmdW5jdGlvbihlKXt0aGlzLnBlbmRpbmcrKyx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiksdGhpcy5jYW5jZWxTZWFyY2g9ITEsdGhpcy5zb3VyY2Uoe3Rlcm06ZX0sdGhpcy5fcmVzcG9uc2UoKSl9LF9yZXNwb25zZTpmdW5jdGlvbigpe3ZhciB0PSsrdGhpcy5yZXF1ZXN0SW5kZXg7cmV0dXJuIGUucHJveHkoZnVuY3Rpb24oZSl7dD09PXRoaXMucmVxdWVzdEluZGV4JiZ0aGlzLl9fcmVzcG9uc2UoZSksdGhpcy5wZW5kaW5nLS0sdGhpcy5wZW5kaW5nfHx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIil9LHRoaXMpfSxfX3Jlc3BvbnNlOmZ1bmN0aW9uKGUpe2UmJihlPXRoaXMuX25vcm1hbGl6ZShlKSksdGhpcy5fdHJpZ2dlcigicmVzcG9uc2UiLG51bGwse2NvbnRlbnQ6ZX0pLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmUmJmUubGVuZ3RoJiYhdGhpcy5jYW5jZWxTZWFyY2g/KHRoaXMuX3N1Z2dlc3QoZSksdGhpcy5fdHJpZ2dlcigib3BlbiIpKTp0aGlzLl9jbG9zZSgpfSxjbG9zZTpmdW5jdGlvbihlKXt0aGlzLmNhbmNlbFNlYXJjaD0hMCx0aGlzLl9jbG9zZShlKX0sX2Nsb3NlOmZ1bmN0aW9uKGUpe3RoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpJiYodGhpcy5tZW51LmVsZW1lbnQuaGlkZSgpLHRoaXMubWVudS5ibHVyKCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLGUpKX0sX2NoYW5nZTpmdW5jdGlvbihlKXt0aGlzLnByZXZpb3VzIT09dGhpcy5fdmFsdWUoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlLHtpdGVtOnRoaXMuc2VsZWN0ZWRJdGVtfSl9LF9ub3JtYWxpemU6ZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoJiZ0WzBdLmxhYmVsJiZ0WzBdLnZhbHVlP3Q6ZS5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/e2xhYmVsOnQsdmFsdWU6dH06ZS5leHRlbmQoe30sdCx7bGFiZWw6dC5sYWJlbHx8dC52YWx1ZSx2YWx1ZTp0LnZhbHVlfHx0LmxhYmVsfSl9KX0sX3N1Z2dlc3Q6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5tZW51LmVsZW1lbnQuZW1wdHkoKTt0aGlzLl9yZW5kZXJNZW51KGksdCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5tZW51LnJlZnJlc2goKSxpLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksaS5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dCgpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWVudS5lbGVtZW50O2Uub3V0ZXJXaWR0aChNYXRoLm1heChlLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcztlLmVhY2goaSxmdW5jdGlvbihlLGkpe3MuX3JlbmRlckl0ZW1EYXRhKHQsaSl9KX0sX3JlbmRlckl0ZW1EYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3JlbmRlckl0ZW0oZSx0KS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIsdCl9LF9yZW5kZXJJdGVtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUoIjxsaT4iKS50ZXh0KGkubGFiZWwpLmFwcGVuZFRvKHQpfSxfbW92ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKT90aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSYmL15wcmV2aW91cy8udGVzdChlKXx8dGhpcy5tZW51LmlzTGFzdEl0ZW0oKSYmL15uZXh0Ly50ZXN0KGUpPyh0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLl92YWx1ZSh0aGlzLnRlcm0pLHRoaXMubWVudS5ibHVyKCksdm9pZCAwKToodGhpcy5tZW51W2VdKHQpLHZvaWQgMCk6KHRoaXMuc2VhcmNoKG51bGwsdCksdm9pZCAwKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudS5lbGVtZW50fSxfdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU1ldGhvZC5hcHBseSh0aGlzLmVsZW1lbnQsYXJndW1lbnRzKX0sX2tleUV2ZW50OmZ1bmN0aW9uKGUsdCl7KCF0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSkmJih0aGlzLl9tb3ZlKGUsdCksdC5wcmV2ZW50RGVmYXVsdCgpKX19KSxlLmV4dGVuZChlLnVpLmF1dG9jb21wbGV0ZSx7ZXNjYXBlUmVnZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfSxmaWx0ZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz1SZWdFeHAoZS51aS5hdXRvY29tcGxldGUuZXNjYXBlUmVnZXgoaSksImkiKTtyZXR1cm4gZS5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIHMudGVzdChlLmxhYmVsfHxlLnZhbHVlfHxlKX0pfX0pLGUud2lkZ2V0KCJ1aS5hdXRvY29tcGxldGUiLGUudWkuYXV0b2NvbXBsZXRlLHtvcHRpb25zOnttZXNzYWdlczp7bm9SZXN1bHRzOiJObyBzZWFyY2ggcmVzdWx0cy4iLHJlc3VsdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUrKGU+MT8iIHJlc3VsdHMgYXJlIjoiIHJlc3VsdCBpcyIpKyIgYXZhaWxhYmxlLCB1c2UgdXAgYW5kIGRvd24gYXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4ifX19LF9fcmVzcG9uc2U6ZnVuY3Rpb24odCl7dmFyIGk7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5jYW5jZWxTZWFyY2h8fChpPXQmJnQubGVuZ3RoP3RoaXMub3B0aW9ucy5tZXNzYWdlcy5yZXN1bHRzKHQubGVuZ3RoKTp0aGlzLm9wdGlvbnMubWVzc2FnZXMubm9SZXN1bHRzLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKCI8ZGl2PiIpLnRleHQoaSkuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSl9fSksZS51aS5hdXRvY29tcGxldGU7dmFyIGMscD0idWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLGY9InVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRvbi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1dHRvbi10ZXh0LW9ubHkiLG09ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmZpbmQoIjp1aS1idXR0b24iKS5idXR0b24oInJlZnJlc2giKX0sMSl9LGc9ZnVuY3Rpb24odCl7dmFyIGk9dC5uYW1lLHM9dC5mb3JtLG49ZShbXSk7cmV0dXJuIGkmJihpPWkucmVwbGFjZSgvJy9nLCJcXCciKSxuPXM/ZShzKS5maW5kKCJbbmFtZT0nIitpKyInXVt0eXBlPXJhZGlvXSIpOmUoIltuYW1lPSciK2krIiddW3R5cGU9cmFkaW9dIix0Lm93bmVyRG9jdW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLmZvcm19KSksbn07ZS53aWRnZXQoInVpLmJ1dHRvbiIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxidXR0b24+IixvcHRpb25zOntkaXNhYmxlZDpudWxsLHRleHQ6ITAsbGFiZWw6bnVsbCxpY29uczp7cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5jbG9zZXN0KCJmb3JtIikudW5iaW5kKCJyZXNldCIrdGhpcy5ldmVudE5hbWVzcGFjZSkuYmluZCgicmVzZXQiK3RoaXMuZXZlbnROYW1lc3BhY2UsbSksImJvb2xlYW4iIT10eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkP3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hIXRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9kZXRlcm1pbmVCdXR0b25UeXBlKCksdGhpcy5oYXNUaXRsZT0hIXRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCJ0aXRsZSIpO3ZhciB0PXRoaXMsaT10aGlzLm9wdGlvbnMscz0iY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlLG49cz8iIjoidWktc3RhdGUtYWN0aXZlIjtudWxsPT09aS5sYWJlbCYmKGkubGFiZWw9ImlucHV0Ij09PXRoaXMudHlwZT90aGlzLmJ1dHRvbkVsZW1lbnQudmFsKCk6dGhpcy5idXR0b25FbGVtZW50Lmh0bWwoKSksdGhpcy5faG92ZXJhYmxlKHRoaXMuYnV0dG9uRWxlbWVudCksdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKHApLmF0dHIoInJvbGUiLCJidXR0b24iKS5iaW5kKCJtb3VzZWVudGVyIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aS5kaXNhYmxlZHx8dGhpcz09PWMmJmUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgibW91c2VsZWF2ZSIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2kuZGlzYWJsZWR8fGUodGhpcykucmVtb3ZlQ2xhc3Mobil9KS5iaW5kKCJjbGljayIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbihlKXtpLmRpc2FibGVkJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5fb24oe2ZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSxibHVyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfX0pLHMmJnRoaXMuZWxlbWVudC5iaW5kKCJjaGFuZ2UiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXt0LnJlZnJlc2goKX0pLCJjaGVja2JveCI9PT10aGlzLnR5cGU/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGlzYWJsZWQ/ITE6dm9pZCAwfSk6InJhZGlvIj09PXRoaXMudHlwZT90aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgiY2xpY2siK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZihpLmRpc2FibGVkKXJldHVybiExO2UodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHQuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik7dmFyIHM9dC5lbGVtZW50WzBdO2cocykubm90KHMpLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKX0pOih0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGlzYWJsZWQ/ITE6KGUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGM9dGhpcyx0LmRvY3VtZW50Lm9uZSgibW91c2V1cCIsZnVuY3Rpb24oKXtjPW51bGx9KSx2b2lkIDApfSkuYmluZCgibW91c2V1cCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe3JldHVybiBpLmRpc2FibGVkPyExOihlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx2b2lkIDApfSkuYmluZCgia2V5ZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbih0KXtyZXR1cm4gaS5kaXNhYmxlZD8hMTooKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5TUEFDRXx8dC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVOVEVSKSYmZSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdm9pZCAwKX0pLmJpbmQoImtleXVwIit0aGlzLmV2ZW50TmFtZXNwYWNlKyIgYmx1ciIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSksdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuU1BBQ0UmJmUodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixpLmRpc2FibGVkKSx0aGlzLl9yZXNldEJ1dHRvbigpfSxfZGV0ZXJtaW5lQnV0dG9uVHlwZTpmdW5jdGlvbigpe3ZhciBlLHQsaTt0aGlzLnR5cGU9dGhpcy5lbGVtZW50LmlzKCJbdHlwZT1jaGVja2JveF0iKT8iY2hlY2tib3giOnRoaXMuZWxlbWVudC5pcygiW3R5cGU9cmFkaW9dIik/InJhZGlvIjp0aGlzLmVsZW1lbnQuaXMoImlucHV0Iik/ImlucHV0IjoiYnV0dG9uIiwiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlPyhlPXRoaXMuZWxlbWVudC5wYXJlbnRzKCkubGFzdCgpLHQ9ImxhYmVsW2Zvcj0nIit0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSsiJ10iLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbmQodCksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KGU9ZS5sZW5ndGg/ZS5zaWJsaW5ncygpOnRoaXMuZWxlbWVudC5zaWJsaW5ncygpLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbHRlcih0KSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwodGhpcy5idXR0b25FbGVtZW50PWUuZmluZCh0KSkpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiksaT10aGlzLmVsZW1lbnQuaXMoIjpjaGVja2VkIiksaSYmdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucHJvcCgiYXJpYS1wcmVzc2VkIixpKSk6dGhpcy5idXR0b25FbGVtZW50PXRoaXMuZWxlbWVudH0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9uRWxlbWVudH0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhwKyIgdWktc3RhdGUtYWN0aXZlICIrZikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtcHJlc3NlZCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSksdGhpcy5oYXNUaXRsZXx8dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc3VwZXIoZSx0KSwiZGlzYWJsZWQiPT09ZT8odGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCksdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIiwhIXQpLHQmJigiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlP3RoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIHVpLXN0YXRlLWFjdGl2ZSIpKSx2b2lkIDApOih0aGlzLl9yZXNldEJ1dHRvbigpLHZvaWQgMCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuaXMoImlucHV0LCBidXR0b24iKT90aGlzLmVsZW1lbnQuaXMoIjpkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5oYXNDbGFzcygidWktYnV0dG9uLWRpc2FibGVkIik7dCE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdCksInJhZGlvIj09PXRoaXMudHlwZT9nKHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe2UodGhpcykuaXMoIjpjaGVja2VkIik/ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik6ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6ImNoZWNrYm94Ij09PXRoaXMudHlwZSYmKHRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKT90aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIikpfSxfcmVzZXRCdXR0b246ZnVuY3Rpb24oKXtpZigiaW5wdXQiPT09dGhpcy50eXBlKXJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMuZWxlbWVudC52YWwodGhpcy5vcHRpb25zLmxhYmVsKSx2b2lkIDA7dmFyIHQ9dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGYpLGk9ZSgiPHNwYW4+PC9zcGFuPiIsdGhpcy5kb2N1bWVudFswXSkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKHQuZW1wdHkoKSkudGV4dCgpLHM9dGhpcy5vcHRpb25zLmljb25zLG49cy5wcmltYXJ5JiZzLnNlY29uZGFyeSxhPVtdO3MucHJpbWFyeXx8cy5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZhLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhuPyJzIjpzLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxzLnByaW1hcnkmJnQucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK3MucHJpbWFyeSsiJz48L3NwYW4+Iikscy5zZWNvbmRhcnkmJnQuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIitzLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChhLnB1c2gobj8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8dC5hdHRyKCJ0aXRsZSIsZS50cmltKGkpKSkpOmEucHVzaCgidWktYnV0dG9uLXRleHQtb25seSIpLHQuYWRkQ2xhc3MoYS5qb2luKCIgIikpfX0pLGUud2lkZ2V0KCJ1aS5idXR0b25zZXQiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2l0ZW1zOiJidXR0b24sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dLCBhLCA6ZGF0YSh1aS1idXR0b24pIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYnV0dG9uc2V0Iil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXsiZGlzYWJsZWQiPT09ZSYmdGhpcy5idXR0b25zLmJ1dHRvbigib3B0aW9uIixlLHQpLHRoaXMuX3N1cGVyKGUsdCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD0icnRsIj09PXRoaXMuZWxlbWVudC5jc3MoImRpcmVjdGlvbiIpLGk9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKSxzPWkuZmlsdGVyKCI6dWktYnV0dG9uIik7aS5ub3QoIjp1aS1idXR0b24iKS5idXR0b24oKSxzLmJ1dHRvbigicmVmcmVzaCIpLHRoaXMuYnV0dG9ucz1pLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCB1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5maWx0ZXIoIjpmaXJzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1yaWdodCI6InVpLWNvcm5lci1sZWZ0IikuZW5kKCkuZmlsdGVyKCI6bGFzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1sZWZ0IjoidWktY29ybmVyLXJpZ2h0IikuZW5kKCkuZW5kKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1idXR0b25zZXQiKSx0aGlzLmJ1dHRvbnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5idXR0b24oImRlc3Ryb3kiKX19KSxlLnVpLmJ1dHRvbixlLmV4dGVuZChlLnVpLHtkYXRlcGlja2VyOnt2ZXJzaW9uOiIxLjExLjQifX0pO3ZhciB2O2UuZXh0ZW5kKG4ucHJvdG90eXBlLHttYXJrZXJDbGFzc05hbWU6Imhhc0RhdGVwaWNrZXIiLG1heFJvd3M6NCxfd2lkZ2V0RGF0ZXBpY2tlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRwRGl2fSxzZXREZWZhdWx0czpmdW5jdGlvbihlKXtyZXR1cm4gcih0aGlzLl9kZWZhdWx0cyxlfHx7fSksdGhpc30sX2F0dGFjaERhdGVwaWNrZXI6ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGE7cz10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj0iZGl2Ij09PXN8fCJzcGFuIj09PXMsdC5pZHx8KHRoaXMudXVpZCs9MSx0LmlkPSJkcCIrdGhpcy51dWlkKSxhPXRoaXMuX25ld0luc3QoZSh0KSxuKSxhLnNldHRpbmdzPWUuZXh0ZW5kKHt9LGl8fHt9KSwiaW5wdXQiPT09cz90aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0LGEpOm4mJnRoaXMuX2lubGluZURhdGVwaWNrZXIodCxhKX0sX25ld0luc3Q6ZnVuY3Rpb24odCxpKXt2YXIgcz10WzBdLmlkLnJlcGxhY2UoLyhbXkEtWmEtejAtOV9cLV0pL2csIlxcXFwkMSIpO3JldHVybntpZDpzLGlucHV0OnQsc2VsZWN0ZWREYXk6MCxzZWxlY3RlZE1vbnRoOjAsc2VsZWN0ZWRZZWFyOjAsZHJhd01vbnRoOjAsZHJhd1llYXI6MCxpbmxpbmU6aSxkcERpdjppP2EoZSgiPGRpdiBjbGFzcz0nIit0aGlzLl9pbmxpbmVDbGFzcysiIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsJz48L2Rpdj4iKSk6dGhpcy5kcERpdn19LF9jb25uZWN0RGF0ZXBpY2tlcjpmdW5jdGlvbih0LGkpe3ZhciBzPWUodCk7aS5hcHBlbmQ9ZShbXSksaS50cmlnZ2VyPWUoW10pLHMuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpfHwodGhpcy5fYXR0YWNobWVudHMocyxpKSxzLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5rZXlkb3duKHRoaXMuX2RvS2V5RG93bikua2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykua2V5dXAodGhpcy5fZG9LZXlVcCksdGhpcy5fYXV0b1NpemUoaSksZS5kYXRhKHQsImRhdGVwaWNrZXIiLGkpLGkuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKHQpKX0sX2F0dGFjaG1lbnRzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89dGhpcy5fZ2V0KGksImFwcGVuZFRleHQiKSxyPXRoaXMuX2dldChpLCJpc1JUTCIpO2kuYXBwZW5kJiZpLmFwcGVuZC5yZW1vdmUoKSxvJiYoaS5hcHBlbmQ9ZSgiPHNwYW4gY2xhc3M9JyIrdGhpcy5fYXBwZW5kQ2xhc3MrIic+IitvKyI8L3NwYW4+IiksdFtyPyJiZWZvcmUiOiJhZnRlciJdKGkuYXBwZW5kKSksdC51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlciksaS50cmlnZ2VyJiZpLnRyaWdnZXIucmVtb3ZlKCkscz10aGlzLl9nZXQoaSwic2hvd09uIiksKCJmb2N1cyI9PT1zfHwiYm90aCI9PT1zKSYmdC5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlciksKCJidXR0b24iPT09c3x8ImJvdGgiPT09cykmJihuPXRoaXMuX2dldChpLCJidXR0b25UZXh0IiksYT10aGlzLl9nZXQoaSwiYnV0dG9uSW1hZ2UiKSxpLnRyaWdnZXI9ZSh0aGlzLl9nZXQoaSwiYnV0dG9uSW1hZ2VPbmx5Iik/ZSgiPGltZy8+IikuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5hdHRyKHtzcmM6YSxhbHQ6bix0aXRsZTpufSk6ZSgiPGJ1dHRvbiB0eXBlPSdidXR0b24nPjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuaHRtbChhP2UoIjxpbWcvPiIpLmF0dHIoe3NyYzphLGFsdDpuLHRpdGxlOm59KTpuKSksdFtyPyJiZWZvcmUiOiJhZnRlciJdKGkudHJpZ2dlciksaS50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmUuZGF0ZXBpY2tlci5fbGFzdElucHV0PT09dFswXT9lLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk6ZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmZS5kYXRlcGlja2VyLl9sYXN0SW5wdXQhPT10WzBdPyhlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0WzBdKSk6ZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0WzBdKSwhMX0pKX0sX2F1dG9TaXplOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldChlLCJhdXRvU2l6ZSIpJiYhZS5pbmxpbmUpe3ZhciB0LGkscyxuLGE9bmV3IERhdGUoMjAwOSwxMSwyMCksbz10aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpO28ubWF0Y2goL1tETV0vKSYmKHQ9ZnVuY3Rpb24oZSl7Zm9yKGk9MCxzPTAsbj0wO2UubGVuZ3RoPm47bisrKWVbbl0ubGVuZ3RoPmkmJihpPWVbbl0ubGVuZ3RoLHM9bik7cmV0dXJuIHN9LGEuc2V0TW9udGgodCh0aGlzLl9nZXQoZSxvLm1hdGNoKC9NTS8pPyJtb250aE5hbWVzIjoibW9udGhOYW1lc1Nob3J0IikpKSxhLnNldERhdGUodCh0aGlzLl9nZXQoZSxvLm1hdGNoKC9ERC8pPyJkYXlOYW1lcyI6ImRheU5hbWVzU2hvcnQiKSkrMjAtYS5nZXREYXkoKSkpLGUuaW5wdXQuYXR0cigic2l6ZSIsdGhpcy5fZm9ybWF0RGF0ZShlLGEpLmxlbmd0aCl9fSxfaW5saW5lRGF0ZXBpY2tlcjpmdW5jdGlvbih0LGkpe3ZhciBzPWUodCk7cy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSl8fChzLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5hcHBlbmQoaS5kcERpdiksZS5kYXRhKHQsImRhdGVwaWNrZXIiLGkpLHRoaXMuX3NldERhdGUoaSx0aGlzLl9nZXREZWZhdWx0RGF0ZShpKSwhMCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoaSksaS5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIodCksaS5kcERpdi5jc3MoImRpc3BsYXkiLCJibG9jayIpKX0sX2RpYWxvZ0RhdGVwaWNrZXI6ZnVuY3Rpb24odCxpLHMsbixhKXt2YXIgbyxoLGwsdSxkLGM9dGhpcy5fZGlhbG9nSW5zdDtyZXR1cm4gY3x8KHRoaXMudXVpZCs9MSxvPSJkcCIrdGhpcy51dWlkLHRoaXMuX2RpYWxvZ0lucHV0PWUoIjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nIitvKyInIHN0eWxlPSdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OycvPiIpLHRoaXMuX2RpYWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9LZXlEb3duKSxlKCJib2R5IikuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KSxjPXRoaXMuX2RpYWxvZ0luc3Q9dGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwhMSksYy5zZXR0aW5ncz17fSxlLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sImRhdGVwaWNrZXIiLGMpKSxyKGMuc2V0dGluZ3Msbnx8e30pLGk9aSYmaS5jb25zdHJ1Y3Rvcj09PURhdGU/dGhpcy5fZm9ybWF0RGF0ZShjLGkpOmksdGhpcy5fZGlhbG9nSW5wdXQudmFsKGkpLHRoaXMuX3Bvcz1hP2EubGVuZ3RoP2E6W2EucGFnZVgsYS5wYWdlWV06bnVsbCx0aGlzLl9wb3N8fChoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxsPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LGQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsdGhpcy5fcG9zPVtoLzItMTAwK3UsbC8yLTE1MCtkXSksdGhpcy5fZGlhbG9nSW5wdXQuY3NzKCJsZWZ0Iix0aGlzLl9wb3NbMF0rMjArInB4IikuY3NzKCJ0b3AiLHRoaXMuX3Bvc1sxXSsicHgiKSxjLnNldHRpbmdzLm9uU2VsZWN0PXMsdGhpcy5faW5EaWFsb2c9ITAsdGhpcy5kcERpdi5hZGRDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcyksdGhpcy5fc2hvd0RhdGVwaWNrZXIodGhpcy5fZGlhbG9nSW5wdXRbMF0pLGUuYmxvY2tVSSYmZS5ibG9ja1VJKHRoaXMuZHBEaXYpLGUuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSwiZGF0ZXBpY2tlciIsYyksdGhpcwotfSxfZGVzdHJveURhdGVwaWNrZXI6ZnVuY3Rpb24odCl7dmFyIGkscz1lKHQpLG49ZS5kYXRhKHQsImRhdGVwaWNrZXIiKTtzLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSYmKGk9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGUucmVtb3ZlRGF0YSh0LCJkYXRlcGlja2VyIiksImlucHV0Ij09PWk/KG4uYXBwZW5kLnJlbW92ZSgpLG4udHJpZ2dlci5yZW1vdmUoKSxzLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlcikudW5iaW5kKCJrZXlkb3duIix0aGlzLl9kb0tleURvd24pLnVuYmluZCgia2V5cHJlc3MiLHRoaXMuX2RvS2V5UHJlc3MpLnVuYmluZCgia2V5dXAiLHRoaXMuX2RvS2V5VXApKTooImRpdiI9PT1pfHwic3BhbiI9PT1pKSYmcy5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuZW1wdHkoKSx2PT09biYmKHY9bnVsbCkpfSxfZW5hYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt2YXIgaSxzLG49ZSh0KSxhPWUuZGF0YSh0LCJkYXRlcGlja2VyIik7bi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkmJihpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwiaW5wdXQiPT09aT8odC5kaXNhYmxlZD0hMSxhLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMX0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIxLjAiLGN1cnNvcjoiIn0pKTooImRpdiI9PT1pfHwic3BhbiI9PT1pKSYmKHM9bi5jaGlsZHJlbigiLiIrdGhpcy5faW5saW5lQ2xhc3MpLHMuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxzLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikucHJvcCgiZGlzYWJsZWQiLCExKSksdGhpcy5fZGlzYWJsZWRJbnB1dHM9ZS5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10P251bGw6ZX0pKX0sX2Rpc2FibGVEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj1lKHQpLGE9ZS5kYXRhKHQsImRhdGVwaWNrZXIiKTtuLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSYmKGk9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCJpbnB1dCI9PT1pPyh0LmRpc2FibGVkPSEwLGEudHJpZ2dlci5maWx0ZXIoImJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPSEwfSkuZW5kKCkuZmlsdGVyKCJpbWciKS5jc3Moe29wYWNpdHk6IjAuNSIsY3Vyc29yOiJkZWZhdWx0In0pKTooImRpdiI9PT1pfHwic3BhbiI9PT1pKSYmKHM9bi5jaGlsZHJlbigiLiIrdGhpcy5faW5saW5lQ2xhc3MpLHMuY2hpbGRyZW4oKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxzLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikucHJvcCgiZGlzYWJsZWQiLCEwKSksdGhpcy5fZGlzYWJsZWRJbnB1dHM9ZS5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10P251bGw6ZX0pLHRoaXMuX2Rpc2FibGVkSW5wdXRzW3RoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aF09dCl9LF9pc0Rpc2FibGVkRGF0ZXBpY2tlcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4hMTtmb3IodmFyIHQ9MDt0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGg+dDt0KyspaWYodGhpcy5fZGlzYWJsZWRJbnB1dHNbdF09PT1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0SW5zdDpmdW5jdGlvbih0KXt0cnl7cmV0dXJuIGUuZGF0YSh0LCJkYXRlcGlja2VyIil9Y2F0Y2goaSl7dGhyb3ciTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXIifX0sX29wdGlvbkRhdGVwaWNrZXI6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbyxoLGw9dGhpcy5fZ2V0SW5zdCh0KTtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgaT8iZGVmYXVsdHMiPT09aT9lLmV4dGVuZCh7fSxlLmRhdGVwaWNrZXIuX2RlZmF1bHRzKTpsPyJhbGwiPT09aT9lLmV4dGVuZCh7fSxsLnNldHRpbmdzKTp0aGlzLl9nZXQobCxpKTpudWxsOihuPWl8fHt9LCJzdHJpbmciPT10eXBlb2YgaSYmKG49e30sbltpXT1zKSxsJiYodGhpcy5fY3VySW5zdD09PWwmJnRoaXMuX2hpZGVEYXRlcGlja2VyKCksYT10aGlzLl9nZXREYXRlRGF0ZXBpY2tlcih0LCEwKSxvPXRoaXMuX2dldE1pbk1heERhdGUobCwibWluIiksaD10aGlzLl9nZXRNaW5NYXhEYXRlKGwsIm1heCIpLHIobC5zZXR0aW5ncyxuKSxudWxsIT09byYmdm9pZCAwIT09bi5kYXRlRm9ybWF0JiZ2b2lkIDA9PT1uLm1pbkRhdGUmJihsLnNldHRpbmdzLm1pbkRhdGU9dGhpcy5fZm9ybWF0RGF0ZShsLG8pKSxudWxsIT09aCYmdm9pZCAwIT09bi5kYXRlRm9ybWF0JiZ2b2lkIDA9PT1uLm1heERhdGUmJihsLnNldHRpbmdzLm1heERhdGU9dGhpcy5fZm9ybWF0RGF0ZShsLGgpKSwiZGlzYWJsZWQiaW4gbiYmKG4uZGlzYWJsZWQ/dGhpcy5fZGlzYWJsZURhdGVwaWNrZXIodCk6dGhpcy5fZW5hYmxlRGF0ZXBpY2tlcih0KSksdGhpcy5fYXR0YWNobWVudHMoZSh0KSxsKSx0aGlzLl9hdXRvU2l6ZShsKSx0aGlzLl9zZXREYXRlKGwsYSksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGwpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIobCkpLHZvaWQgMCl9LF9jaGFuZ2VEYXRlcGlja2VyOmZ1bmN0aW9uKGUsdCxpKXt0aGlzLl9vcHRpb25EYXRlcGlja2VyKGUsdCxpKX0sX3JlZnJlc2hEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldEluc3QoZSk7dCYmdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcih0KX0sX3NldERhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5fZ2V0SW5zdChlKTtpJiYodGhpcy5fc2V0RGF0ZShpLHQpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaSksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGkpKX0sX2dldERhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5fZ2V0SW5zdChlKTtyZXR1cm4gaSYmIWkuaW5saW5lJiZ0aGlzLl9zZXREYXRlRnJvbUZpZWxkKGksdCksaT90aGlzLl9nZXREYXRlKGkpOm51bGx9LF9kb0tleURvd246ZnVuY3Rpb24odCl7dmFyIGkscyxuLGE9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KHQudGFyZ2V0KSxvPSEwLHI9YS5kcERpdi5pcygiLnVpLWRhdGVwaWNrZXItcnRsIik7aWYoYS5fa2V5RXZlbnQ9ITAsZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZylzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDk6ZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLG89ITE7YnJlYWs7Y2FzZSAxMzpyZXR1cm4gbj1lKCJ0ZC4iK2UuZGF0ZXBpY2tlci5fZGF5T3ZlckNsYXNzKyI6bm90KC4iK2UuZGF0ZXBpY2tlci5fY3VycmVudENsYXNzKyIpIixhLmRwRGl2KSxuWzBdJiZlLmRhdGVwaWNrZXIuX3NlbGVjdERheSh0LnRhcmdldCxhLnNlbGVjdGVkTW9udGgsYS5zZWxlY3RlZFllYXIsblswXSksaT1lLmRhdGVwaWNrZXIuX2dldChhLCJvblNlbGVjdCIpLGk/KHM9ZS5kYXRlcGlja2VyLl9mb3JtYXREYXRlKGEpLGkuYXBwbHkoYS5pbnB1dD9hLmlucHV0WzBdOm51bGwsW3MsYV0pKTplLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksITE7Y2FzZSAyNzplLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7YnJlYWs7Y2FzZSAzMzplLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsdC5jdHJsS2V5Py1lLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwQmlnTW9udGhzIik6LWUuZGF0ZXBpY2tlci5fZ2V0KGEsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzQ6ZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHQuY3RybEtleT8rZS5kYXRlcGlja2VyLl9nZXQoYSwic3RlcEJpZ01vbnRocyIpOitlLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM1Oih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fY2xlYXJEYXRlKHQudGFyZ2V0KSxvPXQuY3RybEtleXx8dC5tZXRhS2V5O2JyZWFrO2Nhc2UgMzY6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9nb3RvVG9kYXkodC50YXJnZXQpLG89dC5jdHJsS2V5fHx0Lm1ldGFLZXk7YnJlYWs7Y2FzZSAzNzoodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQscj8xOi0xLCJEIiksbz10LmN0cmxLZXl8fHQubWV0YUtleSx0Lm9yaWdpbmFsRXZlbnQuYWx0S2V5JiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsdC5jdHJsS2V5Py1lLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwQmlnTW9udGhzIik6LWUuZGF0ZXBpY2tlci5fZ2V0KGEsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzg6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LC03LCJEIiksbz10LmN0cmxLZXl8fHQubWV0YUtleTticmVhaztjYXNlIDM5Oih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCxyPy0xOjEsIkQiKSxvPXQuY3RybEtleXx8dC5tZXRhS2V5LHQub3JpZ2luYWxFdmVudC5hbHRLZXkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCx0LmN0cmxLZXk/K2UuZGF0ZXBpY2tlci5fZ2V0KGEsInN0ZXBCaWdNb250aHMiKTorZS5kYXRlcGlja2VyLl9nZXQoYSwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSA0MDoodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsNywiRCIpLG89dC5jdHJsS2V5fHx0Lm1ldGFLZXk7YnJlYWs7ZGVmYXVsdDpvPSExfWVsc2UgMzY9PT10LmtleUNvZGUmJnQuY3RybEtleT9lLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKHRoaXMpOm89ITE7byYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKX0sX2RvS2V5UHJlc3M6ZnVuY3Rpb24odCl7dmFyIGkscyxuPWUuZGF0ZXBpY2tlci5fZ2V0SW5zdCh0LnRhcmdldCk7cmV0dXJuIGUuZGF0ZXBpY2tlci5fZ2V0KG4sImNvbnN0cmFpbklucHV0Iik/KGk9ZS5kYXRlcGlja2VyLl9wb3NzaWJsZUNoYXJzKGUuZGF0ZXBpY2tlci5fZ2V0KG4sImRhdGVGb3JtYXQiKSkscz1TdHJpbmcuZnJvbUNoYXJDb2RlKG51bGw9PXQuY2hhckNvZGU/dC5rZXlDb2RlOnQuY2hhckNvZGUpLHQuY3RybEtleXx8dC5tZXRhS2V5fHwiICI+c3x8IWl8fGkuaW5kZXhPZihzKT4tMSk6dm9pZCAwfSxfZG9LZXlVcDpmdW5jdGlvbih0KXt2YXIgaSxzPWUuZGF0ZXBpY2tlci5fZ2V0SW5zdCh0LnRhcmdldCk7aWYocy5pbnB1dC52YWwoKSE9PXMubGFzdFZhbCl0cnl7aT1lLmRhdGVwaWNrZXIucGFyc2VEYXRlKGUuZGF0ZXBpY2tlci5fZ2V0KHMsImRhdGVGb3JtYXQiKSxzLmlucHV0P3MuaW5wdXQudmFsKCk6bnVsbCxlLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhzKSksaSYmKGUuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChzKSxlLmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZShzKSxlLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIocykpfWNhdGNoKG4pe31yZXR1cm4hMH0sX3Nob3dEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe2lmKHQ9dC50YXJnZXR8fHQsImlucHV0IiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKHQ9ZSgiaW5wdXQiLHQucGFyZW50Tm9kZSlbMF0pLCFlLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKHQpJiZlLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCE9PXQpe3ZhciBpLG4sYSxvLGgsbCx1O2k9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KHQpLGUuZGF0ZXBpY2tlci5fY3VySW5zdCYmZS5kYXRlcGlja2VyLl9jdXJJbnN0IT09aSYmKGUuZGF0ZXBpY2tlci5fY3VySW5zdC5kcERpdi5zdG9wKCEwLCEwKSxpJiZlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKGUuZGF0ZXBpY2tlci5fY3VySW5zdC5pbnB1dFswXSkpLG49ZS5kYXRlcGlja2VyLl9nZXQoaSwiYmVmb3JlU2hvdyIpLGE9bj9uLmFwcGx5KHQsW3QsaV0pOnt9LGEhPT0hMSYmKHIoaS5zZXR0aW5ncyxhKSxpLmxhc3RWYWw9bnVsbCxlLmRhdGVwaWNrZXIuX2xhc3RJbnB1dD10LGUuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChpKSxlLmRhdGVwaWNrZXIuX2luRGlhbG9nJiYodC52YWx1ZT0iIiksZS5kYXRlcGlja2VyLl9wb3N8fChlLmRhdGVwaWNrZXIuX3Bvcz1lLmRhdGVwaWNrZXIuX2ZpbmRQb3ModCksZS5kYXRlcGlja2VyLl9wb3NbMV0rPXQub2Zmc2V0SGVpZ2h0KSxvPSExLGUodCkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gb3w9ImZpeGVkIj09PWUodGhpcykuY3NzKCJwb3NpdGlvbiIpLCFvfSksaD17bGVmdDplLmRhdGVwaWNrZXIuX3Bvc1swXSx0b3A6ZS5kYXRlcGlja2VyLl9wb3NbMV19LGUuZGF0ZXBpY2tlci5fcG9zPW51bGwsaS5kcERpdi5lbXB0eSgpLGkuZHBEaXYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6ImJsb2NrIix0b3A6Ii0xMDAwcHgifSksZS5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGkpLGg9ZS5kYXRlcGlja2VyLl9jaGVja09mZnNldChpLGgsbyksaS5kcERpdi5jc3Moe3Bvc2l0aW9uOmUuZGF0ZXBpY2tlci5faW5EaWFsb2cmJmUuYmxvY2tVST8ic3RhdGljIjpvPyJmaXhlZCI6ImFic29sdXRlIixkaXNwbGF5OiJub25lIixsZWZ0OmgubGVmdCsicHgiLHRvcDpoLnRvcCsicHgifSksaS5pbmxpbmV8fChsPWUuZGF0ZXBpY2tlci5fZ2V0KGksInNob3dBbmltIiksdT1lLmRhdGVwaWNrZXIuX2dldChpLCJkdXJhdGlvbiIpLGkuZHBEaXYuY3NzKCJ6LWluZGV4IixzKGUodCkpKzEpLGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmc9ITAsZS5lZmZlY3RzJiZlLmVmZmVjdHMuZWZmZWN0W2xdP2kuZHBEaXYuc2hvdyhsLGUuZGF0ZXBpY2tlci5fZ2V0KGksInNob3dPcHRpb25zIiksdSk6aS5kcERpdltsfHwic2hvdyJdKGw/dTpudWxsKSxlLmRhdGVwaWNrZXIuX3Nob3VsZEZvY3VzSW5wdXQoaSkmJmkuaW5wdXQuZm9jdXMoKSxlLmRhdGVwaWNrZXIuX2N1ckluc3Q9aSkpfX0sX3VwZGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24odCl7dGhpcy5tYXhSb3dzPTQsdj10LHQuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKHQpKSx0aGlzLl9hdHRhY2hIYW5kbGVycyh0KTt2YXIgaSxzPXRoaXMuX2dldE51bWJlck9mTW9udGhzKHQpLG49c1sxXSxhPTE3LHI9dC5kcERpdi5maW5kKCIuIit0aGlzLl9kYXlPdmVyQ2xhc3MrIiBhIik7ci5sZW5ndGg+MCYmby5hcHBseShyLmdldCgwKSksdC5kcERpdi5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0yIHVpLWRhdGVwaWNrZXItbXVsdGktMyB1aS1kYXRlcGlja2VyLW11bHRpLTQiKS53aWR0aCgiIiksbj4xJiZ0LmRwRGl2LmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLSIrbikuY3NzKCJ3aWR0aCIsYSpuKyJlbSIpLHQuZHBEaXZbKDEhPT1zWzBdfHwxIT09c1sxXT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItbXVsdGkiKSx0LmRwRGl2Wyh0aGlzLl9nZXQodCwiaXNSVEwiKT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIiksdD09PWUuZGF0ZXBpY2tlci5fY3VySW5zdCYmZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmZS5kYXRlcGlja2VyLl9zaG91bGRGb2N1c0lucHV0KHQpJiZ0LmlucHV0LmZvY3VzKCksdC55ZWFyc2h0bWwmJihpPXQueWVhcnNodG1sLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPT09dC55ZWFyc2h0bWwmJnQueWVhcnNodG1sJiZ0LmRwRGl2LmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLXllYXI6Zmlyc3QiKS5yZXBsYWNlV2l0aCh0LnllYXJzaHRtbCksaT10LnllYXJzaHRtbD1udWxsfSwwKSl9LF9zaG91bGRGb2N1c0lucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmlucHV0JiZlLmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhZS5pbnB1dC5pcygiOmRpc2FibGVkIikmJiFlLmlucHV0LmlzKCI6Zm9jdXMiKX0sX2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj10LmRwRGl2Lm91dGVyV2lkdGgoKSxhPXQuZHBEaXYub3V0ZXJIZWlnaHQoKSxvPXQuaW5wdXQ/dC5pbnB1dC5vdXRlcldpZHRoKCk6MCxyPXQuaW5wdXQ/dC5pbnB1dC5vdXRlckhlaWdodCgpOjAsaD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgrKHM/MDplKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpLGw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCsocz8wOmUoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTtyZXR1cm4gaS5sZWZ0LT10aGlzLl9nZXQodCwiaXNSVEwiKT9uLW86MCxpLmxlZnQtPXMmJmkubGVmdD09PXQuaW5wdXQub2Zmc2V0KCkubGVmdD9lKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk6MCxpLnRvcC09cyYmaS50b3A9PT10LmlucHV0Lm9mZnNldCgpLnRvcCtyP2UoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOjAsaS5sZWZ0LT1NYXRoLm1pbihpLmxlZnQsaS5sZWZ0K24+aCYmaD5uP01hdGguYWJzKGkubGVmdCtuLWgpOjApLGkudG9wLT1NYXRoLm1pbihpLnRvcCxpLnRvcCthPmwmJmw+YT9NYXRoLmFicyhhK3IpOjApLGl9LF9maW5kUG9zOmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxzPXRoaXMuX2dldEluc3QodCksbj10aGlzLl9nZXQocywiaXNSVEwiKTt0JiYoImhpZGRlbiI9PT10LnR5cGV8fDEhPT10Lm5vZGVUeXBlfHxlLmV4cHIuZmlsdGVycy5oaWRkZW4odCkpOyl0PXRbbj8icHJldmlvdXNTaWJsaW5nIjoibmV4dFNpYmxpbmciXTtyZXR1cm4gaT1lKHQpLm9mZnNldCgpLFtpLmxlZnQsaS50b3BdfSxfaGlkZURhdGVwaWNrZXI6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz10aGlzLl9jdXJJbnN0OyFvfHx0JiZvIT09ZS5kYXRhKHQsImRhdGVwaWNrZXIiKXx8dGhpcy5fZGF0ZXBpY2tlclNob3dpbmcmJihpPXRoaXMuX2dldChvLCJzaG93QW5pbSIpLHM9dGhpcy5fZ2V0KG8sImR1cmF0aW9uIiksbj1mdW5jdGlvbigpe2UuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyhvKX0sZS5lZmZlY3RzJiYoZS5lZmZlY3RzLmVmZmVjdFtpXXx8ZS5lZmZlY3RzW2ldKT9vLmRwRGl2LmhpZGUoaSxlLmRhdGVwaWNrZXIuX2dldChvLCJzaG93T3B0aW9ucyIpLHMsbik6by5kcERpdlsic2xpZGVEb3duIj09PWk/InNsaWRlVXAiOiJmYWRlSW4iPT09aT8iZmFkZU91dCI6ImhpZGUiXShpP3M6bnVsbCxuKSxpfHxuKCksdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITEsYT10aGlzLl9nZXQobywib25DbG9zZSIpLGEmJmEuYXBwbHkoby5pbnB1dD9vLmlucHV0WzBdOm51bGwsW28uaW5wdXQ/by5pbnB1dC52YWwoKToiIixvXSksdGhpcy5fbGFzdElucHV0PW51bGwsdGhpcy5faW5EaWFsb2cmJih0aGlzLl9kaWFsb2dJbnB1dC5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiMCIsdG9wOiItMTAwcHgifSksZS5ibG9ja1VJJiYoZS51bmJsb2NrVUkoKSxlKCJib2R5IikuYXBwZW5kKHRoaXMuZHBEaXYpKSksdGhpcy5faW5EaWFsb2c9ITEpfSxfdGlkeURpYWxvZzpmdW5jdGlvbihlKXtlLmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKS51bmJpbmQoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIil9LF9jaGVja0V4dGVybmFsQ2xpY2s6ZnVuY3Rpb24odCl7aWYoZS5kYXRlcGlja2VyLl9jdXJJbnN0KXt2YXIgaT1lKHQudGFyZ2V0KSxzPWUuZGF0ZXBpY2tlci5fZ2V0SW5zdChpWzBdKTsoaVswXS5pZCE9PWUuZGF0ZXBpY2tlci5fbWFpbkRpdklkJiYwPT09aS5wYXJlbnRzKCIjIitlLmRhdGVwaWNrZXIuX21haW5EaXZJZCkubGVuZ3RoJiYhaS5oYXNDbGFzcyhlLmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSYmIWkuY2xvc2VzdCgiLiIrZS5kYXRlcGlja2VyLl90cmlnZ2VyQ2xhc3MpLmxlbmd0aCYmZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmKCFlLmRhdGVwaWNrZXIuX2luRGlhbG9nfHwhZS5ibG9ja1VJKXx8aS5oYXNDbGFzcyhlLmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSYmZS5kYXRlcGlja2VyLl9jdXJJbnN0IT09cykmJmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKX19LF9hZGp1c3REYXRlOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKHQpLGE9dGhpcy5fZ2V0SW5zdChuWzBdKTt0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihuWzBdKXx8KHRoaXMuX2FkanVzdEluc3REYXRlKGEsaSsoIk0iPT09cz90aGlzLl9nZXQoYSwic2hvd0N1cnJlbnRBdFBvcyIpOjApLHMpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoYSkpfSxfZ290b1RvZGF5OmZ1bmN0aW9uKHQpe3ZhciBpLHM9ZSh0KSxuPXRoaXMuX2dldEluc3Qoc1swXSk7dGhpcy5fZ2V0KG4sImdvdG9DdXJyZW50IikmJm4uY3VycmVudERheT8obi5zZWxlY3RlZERheT1uLmN1cnJlbnREYXksbi5kcmF3TW9udGg9bi5zZWxlY3RlZE1vbnRoPW4uY3VycmVudE1vbnRoLG4uZHJhd1llYXI9bi5zZWxlY3RlZFllYXI9bi5jdXJyZW50WWVhcik6KGk9bmV3IERhdGUsbi5zZWxlY3RlZERheT1pLmdldERhdGUoKSxuLmRyYXdNb250aD1uLnNlbGVjdGVkTW9udGg9aS5nZXRNb250aCgpLG4uZHJhd1llYXI9bi5zZWxlY3RlZFllYXI9aS5nZXRGdWxsWWVhcigpKSx0aGlzLl9ub3RpZnlDaGFuZ2UobiksdGhpcy5fYWRqdXN0RGF0ZShzKX0sX3NlbGVjdE1vbnRoWWVhcjpmdW5jdGlvbih0LGkscyl7dmFyIG49ZSh0KSxhPXRoaXMuX2dldEluc3QoblswXSk7YVsic2VsZWN0ZWQiKygiTSI9PT1zPyJNb250aCI6IlllYXIiKV09YVsiZHJhdyIrKCJNIj09PXM/Ik1vbnRoIjoiWWVhciIpXT1wYXJzZUludChpLm9wdGlvbnNbaS5zZWxlY3RlZEluZGV4XS52YWx1ZSwxMCksdGhpcy5fbm90aWZ5Q2hhbmdlKGEpLHRoaXMuX2FkanVzdERhdGUobil9LF9zZWxlY3REYXk6ZnVuY3Rpb24odCxpLHMsbil7dmFyIGEsbz1lKHQpO2UobikuaGFzQ2xhc3ModGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MpfHx0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihvWzBdKXx8KGE9dGhpcy5fZ2V0SW5zdChvWzBdKSxhLnNlbGVjdGVkRGF5PWEuY3VycmVudERheT1lKCJhIixuKS5odG1sKCksYS5zZWxlY3RlZE1vbnRoPWEuY3VycmVudE1vbnRoPWksYS5zZWxlY3RlZFllYXI9YS5jdXJyZW50WWVhcj1zLHRoaXMuX3NlbGVjdERhdGUodCx0aGlzLl9mb3JtYXREYXRlKGEsYS5jdXJyZW50RGF5LGEuY3VycmVudE1vbnRoLGEuY3VycmVudFllYXIpKSl9LF9jbGVhckRhdGU6ZnVuY3Rpb24odCl7dmFyIGk9ZSh0KTt0aGlzLl9zZWxlY3REYXRlKGksIiIpfSxfc2VsZWN0RGF0ZTpmdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0KSxhPXRoaXMuX2dldEluc3QoblswXSk7aT1udWxsIT1pP2k6dGhpcy5fZm9ybWF0RGF0ZShhKSxhLmlucHV0JiZhLmlucHV0LnZhbChpKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoYSkscz10aGlzLl9nZXQoYSwib25TZWxlY3QiKSxzP3MuYXBwbHkoYS5pbnB1dD9hLmlucHV0WzBdOm51bGwsW2ksYV0pOmEuaW5wdXQmJmEuaW5wdXQudHJpZ2dlcigiY2hhbmdlIiksYS5pbmxpbmU/dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihhKToodGhpcy5faGlkZURhdGVwaWNrZXIoKSx0aGlzLl9sYXN0SW5wdXQ9YS5pbnB1dFswXSwib2JqZWN0IiE9dHlwZW9mIGEuaW5wdXRbMF0mJmEuaW5wdXQuZm9jdXMoKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCl9LF91cGRhdGVBbHRlcm5hdGU6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGE9dGhpcy5fZ2V0KHQsImFsdEZpZWxkIik7YSYmKGk9dGhpcy5fZ2V0KHQsImFsdEZvcm1hdCIpfHx0aGlzLl9nZXQodCwiZGF0ZUZvcm1hdCIpLHM9dGhpcy5fZ2V0RGF0ZSh0KSxuPXRoaXMuZm9ybWF0RGF0ZShpLHMsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKHQpKSxlKGEpLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLnZhbChuKX0pKX0sbm9XZWVrZW5kczpmdW5jdGlvbihlKXt2YXIgdD1lLmdldERheSgpO3JldHVyblt0PjAmJjY+dCwiIl19LGlzbzg2MDFXZWVrOmZ1bmN0aW9uKGUpe3ZhciB0LGk9bmV3IERhdGUoZS5nZXRUaW1lKCkpO3JldHVybiBpLnNldERhdGUoaS5nZXREYXRlKCkrNC0oaS5nZXREYXkoKXx8NykpLHQ9aS5nZXRUaW1lKCksaS5zZXRNb250aCgwKSxpLnNldERhdGUoMSksTWF0aC5mbG9vcihNYXRoLnJvdW5kKCh0LWkpLzg2NGU1KS83KSsxfSxwYXJzZURhdGU6ZnVuY3Rpb24odCxpLHMpe2lmKG51bGw9PXR8fG51bGw9PWkpdGhyb3ciSW52YWxpZCBhcmd1bWVudHMiO2lmKGk9Im9iamVjdCI9PXR5cGVvZiBpPyIiK2k6aSsiIiwiIj09PWkpcmV0dXJuIG51bGw7dmFyIG4sYSxvLHIsaD0wLGw9KHM/cy5zaG9ydFllYXJDdXRvZmY6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLnNob3J0WWVhckN1dG9mZix1PSJzdHJpbmciIT10eXBlb2YgbD9sOihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQobCwxMCksZD0ocz9zLmRheU5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQsYz0ocz9zLmRheU5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lcyxwPShzP3MubW9udGhOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQsZj0ocz9zLm1vbnRoTmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXMsbT0tMSxnPS0xLHY9LTEseT0tMSxiPSExLF89ZnVuY3Rpb24oZSl7dmFyIGk9dC5sZW5ndGg+bisxJiZ0LmNoYXJBdChuKzEpPT09ZTtyZXR1cm4gaSYmbisrLGl9LHg9ZnVuY3Rpb24oZSl7dmFyIHQ9XyhlKSxzPSJAIj09PWU/MTQ6IiEiPT09ZT8yMDoieSI9PT1lJiZ0PzQ6Im8iPT09ZT8zOjIsbj0ieSI9PT1lP3M6MSxhPVJlZ0V4cCgiXlxcZHsiK24rIiwiK3MrIn0iKSxvPWkuc3Vic3RyaW5nKGgpLm1hdGNoKGEpO2lmKCFvKXRocm93Ik1pc3NpbmcgbnVtYmVyIGF0IHBvc2l0aW9uICIraDtyZXR1cm4gaCs9b1swXS5sZW5ndGgscGFyc2VJbnQob1swXSwxMCl9LHc9ZnVuY3Rpb24odCxzLG4pe3ZhciBhPS0xLG89ZS5tYXAoXyh0KT9uOnMsZnVuY3Rpb24oZSx0KXtyZXR1cm5bW3QsZV1dfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybi0oZVsxXS5sZW5ndGgtdFsxXS5sZW5ndGgpfSk7aWYoZS5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgcz10WzFdO3JldHVybiBpLnN1YnN0cihoLHMubGVuZ3RoKS50b0xvd2VyQ2FzZSgpPT09cy50b0xvd2VyQ2FzZSgpPyhhPXRbMF0saCs9cy5sZW5ndGgsITEpOnZvaWQgMH0pLC0xIT09YSlyZXR1cm4gYSsxO3Rocm93IlVua25vd24gbmFtZSBhdCBwb3NpdGlvbiAiK2h9LGs9ZnVuY3Rpb24oKXtpZihpLmNoYXJBdChoKSE9PXQuY2hhckF0KG4pKXRocm93IlVuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAiK2g7aCsrfTtmb3Iobj0wO3QubGVuZ3RoPm47bisrKWlmKGIpIiciIT09dC5jaGFyQXQobil8fF8oIiciKT9rKCk6Yj0hMTtlbHNlIHN3aXRjaCh0LmNoYXJBdChuKSl7Y2FzZSJkIjp2PXgoImQiKTticmVhaztjYXNlIkQiOncoIkQiLGQsYyk7YnJlYWs7Y2FzZSJvIjp5PXgoIm8iKTticmVhaztjYXNlIm0iOmc9eCgibSIpO2JyZWFrO2Nhc2UiTSI6Zz13KCJNIixwLGYpO2JyZWFrO2Nhc2UieSI6bT14KCJ5Iik7YnJlYWs7Y2FzZSJAIjpyPW5ldyBEYXRlKHgoIkAiKSksbT1yLmdldEZ1bGxZZWFyKCksZz1yLmdldE1vbnRoKCkrMSx2PXIuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiISI6cj1uZXcgRGF0ZSgoeCgiISIpLXRoaXMuX3RpY2tzVG8xOTcwKS8xZTQpLG09ci5nZXRGdWxsWWVhcigpLGc9ci5nZXRNb250aCgpKzEsdj1yLmdldERhdGUoKTticmVhaztjYXNlIiciOl8oIiciKT9rKCk6Yj0hMDticmVhaztkZWZhdWx0OmsoKX1pZihpLmxlbmd0aD5oJiYobz1pLnN1YnN0cihoKSwhL15ccysvLnRlc3QobykpKXRocm93IkV4dHJhL3VucGFyc2VkIGNoYXJhY3RlcnMgZm91bmQgaW4gZGF0ZTogIitvO2lmKC0xPT09bT9tPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKToxMDA+bSYmKG0rPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKS0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwKyh1Pj1tPzA6LTEwMCkpLHk+LTEpZm9yKGc9MSx2PXk7Oyl7aWYoYT10aGlzLl9nZXREYXlzSW5Nb250aChtLGctMSksYT49dilicmVhaztnKyssdi09YX1pZihyPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG0sZy0xLHYpKSxyLmdldEZ1bGxZZWFyKCkhPT1tfHxyLmdldE1vbnRoKCkrMSE9PWd8fHIuZ2V0RGF0ZSgpIT09dil0aHJvdyJJbnZhbGlkIGRhdGUiO3JldHVybiByfSxBVE9NOiJ5eS1tbS1kZCIsQ09PS0lFOiJELCBkZCBNIHl5IixJU09fODYwMToieXktbW0tZGQiLFJGQ184MjI6IkQsIGQgTSB5IixSRkNfODUwOiJERCwgZGQtTS15IixSRkNfMTAzNjoiRCwgZCBNIHkiLFJGQ18xMTIzOiJELCBkIE0geXkiLFJGQ18yODIyOiJELCBkIE0geXkiLFJTUzoiRCwgZCBNIHkiLFRJQ0tTOiIhIixUSU1FU1RBTVA6IkAiLFczQzoieXktbW0tZGQiLF90aWNrc1RvMTk3MDoxZTcqNjAqNjAqMjQqKDcxODY4NStNYXRoLmZsb29yKDQ5Mi41KS1NYXRoLmZsb29yKDE5LjcpK01hdGguZmxvb3IoNC45MjUpKSxmb3JtYXREYXRlOmZ1bmN0aW9uKGUsdCxpKXtpZighdClyZXR1cm4iIjt2YXIgcyxuPShpP2kuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxhPShpP2kuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLG89KGk/aS5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxyPShpP2kubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxoPWZ1bmN0aW9uKHQpe3ZhciBpPWUubGVuZ3RoPnMrMSYmZS5jaGFyQXQocysxKT09PXQ7cmV0dXJuIGkmJnMrKyxpfSxsPWZ1bmN0aW9uKGUsdCxpKXt2YXIgcz0iIit0O2lmKGgoZSkpZm9yKDtpPnMubGVuZ3RoOylzPSIwIitzO3JldHVybiBzfSx1PWZ1bmN0aW9uKGUsdCxpLHMpe3JldHVybiBoKGUpP3NbdF06aVt0XX0sZD0iIixjPSExO2lmKHQpZm9yKHM9MDtlLmxlbmd0aD5zO3MrKylpZihjKSInIiE9PWUuY2hhckF0KHMpfHxoKCInIik/ZCs9ZS5jaGFyQXQocyk6Yz0hMTtlbHNlIHN3aXRjaChlLmNoYXJBdChzKSl7Y2FzZSJkIjpkKz1sKCJkIix0LmdldERhdGUoKSwyKTticmVhaztjYXNlIkQiOmQrPXUoIkQiLHQuZ2V0RGF5KCksbixhKTticmVhaztjYXNlIm8iOmQrPWwoIm8iLE1hdGgucm91bmQoKG5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCkpLmdldFRpbWUoKS1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwwKS5nZXRUaW1lKCkpLzg2NGU1KSwzKTticmVhaztjYXNlIm0iOmQrPWwoIm0iLHQuZ2V0TW9udGgoKSsxLDIpO2JyZWFrO2Nhc2UiTSI6ZCs9dSgiTSIsdC5nZXRNb250aCgpLG8scik7YnJlYWs7Y2FzZSJ5IjpkKz1oKCJ5Iik/dC5nZXRGdWxsWWVhcigpOigxMD50LmdldFllYXIoKSUxMDA/IjAiOiIiKSt0LmdldFllYXIoKSUxMDA7YnJlYWs7Y2FzZSJAIjpkKz10LmdldFRpbWUoKTticmVhaztjYXNlIiEiOmQrPTFlNCp0LmdldFRpbWUoKSt0aGlzLl90aWNrc1RvMTk3MDticmVhaztjYXNlIiciOmgoIiciKT9kKz0iJyI6Yz0hMDticmVhaztkZWZhdWx0OmQrPWUuY2hhckF0KHMpfXJldHVybiBkfSxfcG9zc2libGVDaGFyczpmdW5jdGlvbihlKXt2YXIgdCxpPSIiLHM9ITEsbj1mdW5jdGlvbihpKXt2YXIgcz1lLmxlbmd0aD50KzEmJmUuY2hhckF0KHQrMSk9PT1pO3JldHVybiBzJiZ0Kyssc307Zm9yKHQ9MDtlLmxlbmd0aD50O3QrKylpZihzKSInIiE9PWUuY2hhckF0KHQpfHxuKCInIik/aSs9ZS5jaGFyQXQodCk6cz0hMTtlbHNlIHN3aXRjaChlLmNoYXJBdCh0KSl7Y2FzZSJkIjpjYXNlIm0iOmNhc2UieSI6Y2FzZSJAIjppKz0iMDEyMzQ1Njc4OSI7YnJlYWs7Y2FzZSJEIjpjYXNlIk0iOnJldHVybiBudWxsO2Nhc2UiJyI6bigiJyIpP2krPSInIjpzPSEwO2JyZWFrO2RlZmF1bHQ6aSs9ZS5jaGFyQXQodCl9cmV0dXJuIGl9LF9nZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09ZS5zZXR0aW5nc1t0XT9lLnNldHRpbmdzW3RdOnRoaXMuX2RlZmF1bHRzW3RdfSxfc2V0RGF0ZUZyb21GaWVsZDpmdW5jdGlvbihlLHQpe2lmKGUuaW5wdXQudmFsKCkhPT1lLmxhc3RWYWwpe3ZhciBpPXRoaXMuX2dldChlLCJkYXRlRm9ybWF0Iikscz1lLmxhc3RWYWw9ZS5pbnB1dD9lLmlucHV0LnZhbCgpOm51bGwsbj10aGlzLl9nZXREZWZhdWx0RGF0ZShlKSxhPW4sbz10aGlzLl9nZXRGb3JtYXRDb25maWcoZSk7dHJ5e2E9dGhpcy5wYXJzZURhdGUoaSxzLG8pfHxufWNhdGNoKHIpe3M9dD8iIjpzfWUuc2VsZWN0ZWREYXk9YS5nZXREYXRlKCksZS5kcmF3TW9udGg9ZS5zZWxlY3RlZE1vbnRoPWEuZ2V0TW9udGgoKSxlLmRyYXdZZWFyPWUuc2VsZWN0ZWRZZWFyPWEuZ2V0RnVsbFllYXIoKSxlLmN1cnJlbnREYXk9cz9hLmdldERhdGUoKTowLGUuY3VycmVudE1vbnRoPXM/YS5nZXRNb250aCgpOjAsZS5jdXJyZW50WWVhcj1zP2EuZ2V0RnVsbFllYXIoKTowLHRoaXMuX2FkanVzdEluc3REYXRlKGUpfX0sX2dldERlZmF1bHREYXRlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXN0cmljdE1pbk1heChlLHRoaXMuX2RldGVybWluZURhdGUoZSx0aGlzLl9nZXQoZSwiZGVmYXVsdERhdGUiKSxuZXcgRGF0ZSkpfSxfZGV0ZXJtaW5lRGF0ZTpmdW5jdGlvbih0LGkscyl7dmFyIG49ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IERhdGU7cmV0dXJuIHQuc2V0RGF0ZSh0LmdldERhdGUoKStlKSx0fSxhPWZ1bmN0aW9uKGkpe3RyeXtyZXR1cm4gZS5kYXRlcGlja2VyLnBhcnNlRGF0ZShlLmRhdGVwaWNrZXIuX2dldCh0LCJkYXRlRm9ybWF0IiksaSxlLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyh0KSl9Y2F0Y2gocyl7fWZvcih2YXIgbj0oaS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eYy8pP2UuZGF0ZXBpY2tlci5fZ2V0RGF0ZSh0KTpudWxsKXx8bmV3IERhdGUsYT1uLmdldEZ1bGxZZWFyKCksbz1uLmdldE1vbnRoKCkscj1uLmdldERhdGUoKSxoPS8oWytcLV0/WzAtOV0rKVxzKihkfER8d3xXfG18TXx5fFkpPy9nLGw9aC5leGVjKGkpO2w7KXtzd2l0Y2gobFsyXXx8ImQiKXtjYXNlImQiOmNhc2UiRCI6cis9cGFyc2VJbnQobFsxXSwxMCk7YnJlYWs7Y2FzZSJ3IjpjYXNlIlciOnIrPTcqcGFyc2VJbnQobFsxXSwxMCk7YnJlYWs7Y2FzZSJtIjpjYXNlIk0iOm8rPXBhcnNlSW50KGxbMV0sMTApLHI9TWF0aC5taW4ocixlLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGEsbykpO2JyZWFrO2Nhc2UieSI6Y2FzZSJZIjphKz1wYXJzZUludChsWzFdLDEwKSxyPU1hdGgubWluKHIsZS5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aChhLG8pKX1sPWguZXhlYyhpKX1yZXR1cm4gbmV3IERhdGUoYSxvLHIpfSxvPW51bGw9PWl8fCIiPT09aT9zOiJzdHJpbmciPT10eXBlb2YgaT9hKGkpOiJudW1iZXIiPT10eXBlb2YgaT9pc05hTihpKT9zOm4oaSk6bmV3IERhdGUoaS5nZXRUaW1lKCkpO3JldHVybiBvPW8mJiJJbnZhbGlkIERhdGUiPT0iIitvP3M6byxvJiYoby5zZXRIb3VycygwKSxvLnNldE1pbnV0ZXMoMCksby5zZXRTZWNvbmRzKDApLG8uc2V0TWlsbGlzZWNvbmRzKDApKSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChvKX0sX2RheWxpZ2h0U2F2aW5nQWRqdXN0OmZ1bmN0aW9uKGUpe3JldHVybiBlPyhlLnNldEhvdXJzKGUuZ2V0SG91cnMoKT4xMj9lLmdldEhvdXJzKCkrMjowKSxlKTpudWxsfSxfc2V0RGF0ZTpmdW5jdGlvbihlLHQsaSl7dmFyIHM9IXQsbj1lLnNlbGVjdGVkTW9udGgsYT1lLnNlbGVjdGVkWWVhcixvPXRoaXMuX3Jlc3RyaWN0TWluTWF4KGUsdGhpcy5fZGV0ZXJtaW5lRGF0ZShlLHQsbmV3IERhdGUpKTtlLnNlbGVjdGVkRGF5PWUuY3VycmVudERheT1vLmdldERhdGUoKSxlLmRyYXdNb250aD1lLnNlbGVjdGVkTW9udGg9ZS5jdXJyZW50TW9udGg9by5nZXRNb250aCgpLGUuZHJhd1llYXI9ZS5zZWxlY3RlZFllYXI9ZS5jdXJyZW50WWVhcj1vLmdldEZ1bGxZZWFyKCksbj09PWUuc2VsZWN0ZWRNb250aCYmYT09PWUuc2VsZWN0ZWRZZWFyfHxpfHx0aGlzLl9ub3RpZnlDaGFuZ2UoZSksdGhpcy5fYWRqdXN0SW5zdERhdGUoZSksZS5pbnB1dCYmZS5pbnB1dC52YWwocz8iIjp0aGlzLl9mb3JtYXREYXRlKGUpKX0sX2dldERhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9IWUuY3VycmVudFllYXJ8fGUuaW5wdXQmJiIiPT09ZS5pbnB1dC52YWwoKT9udWxsOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGUuY3VycmVudFllYXIsZS5jdXJyZW50TW9udGgsZS5jdXJyZW50RGF5KSk7cmV0dXJuIHR9LF9hdHRhY2hIYW5kbGVyczpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9nZXQodCwic3RlcE1vbnRocyIpLHM9IiMiK3QuaWQucmVwbGFjZSgvXFxcXC9nLCJcXCIpO3QuZHBEaXYuZmluZCgiW2RhdGEtaGFuZGxlcl0iKS5tYXAoZnVuY3Rpb24oKXt2YXIgdD17cHJldjpmdW5jdGlvbigpe2UuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShzLC1pLCJNIil9LG5leHQ6ZnVuY3Rpb24oKXtlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUocywraSwiTSIpfSxoaWRlOmZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpfSx0b2RheTpmdW5jdGlvbigpe2UuZGF0ZXBpY2tlci5fZ290b1RvZGF5KHMpfSxzZWxlY3REYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRlcGlja2VyLl9zZWxlY3REYXkocywrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtbW9udGgiKSwrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEteWVhciIpLHRoaXMpLCExfSxzZWxlY3RNb250aDpmdW5jdGlvbigpe3JldHVybiBlLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihzLHRoaXMsIk0iKSwhMX0sc2VsZWN0WWVhcjpmdW5jdGlvbigpe3JldHVybiBlLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihzLHRoaXMsIlkiKSwhMX19O2UodGhpcykuYmluZCh0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1ldmVudCIpLHRbdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtaGFuZGxlciIpXSl9KX0sX2dlbmVyYXRlSFRNTDpmdW5jdGlvbihlKXt2YXIgdCxpLHMsbixhLG8scixoLGwsdSxkLGMscCxmLG0sZyx2LHksYixfLHgsdyxrLFQsRCxTLE0sQyxOLEEsUCxJLEgseixGLEUsTyxqLFcsTD1uZXcgRGF0ZSxSPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKEwuZ2V0RnVsbFllYXIoKSxMLmdldE1vbnRoKCksTC5nZXREYXRlKCkpKSxZPXRoaXMuX2dldChlLCJpc1JUTCIpLEI9dGhpcy5fZ2V0KGUsInNob3dCdXR0b25QYW5lbCIpLEo9dGhpcy5fZ2V0KGUsImhpZGVJZk5vUHJldk5leHQiKSxxPXRoaXMuX2dldChlLCJuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0IiksSz10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhlKSxWPXRoaXMuX2dldChlLCJzaG93Q3VycmVudEF0UG9zIiksVT10aGlzLl9nZXQoZSwic3RlcE1vbnRocyIpLFE9MSE9PUtbMF18fDEhPT1LWzFdLEc9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoZS5jdXJyZW50RGF5P25ldyBEYXRlKGUuY3VycmVudFllYXIsZS5jdXJyZW50TW9udGgsZS5jdXJyZW50RGF5KTpuZXcgRGF0ZSg5OTk5LDksOSkpLFg9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtaW4iKSwkPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWF4IiksWj1lLmRyYXdNb250aC1WLGV0PWUuZHJhd1llYXI7aWYoMD5aJiYoWis9MTIsZXQtLSksJClmb3IodD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSgkLmdldEZ1bGxZZWFyKCksJC5nZXRNb250aCgpLUtbMF0qS1sxXSsxLCQuZ2V0RGF0ZSgpKSksdD1YJiZYPnQ/WDp0O3RoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGV0LFosMSkpPnQ7KVotLSwwPlomJihaPTExLGV0LS0pO2ZvcihlLmRyYXdNb250aD1aLGUuZHJhd1llYXI9ZXQsaT10aGlzLl9nZXQoZSwicHJldlRleHQiKSxpPXE/dGhpcy5mb3JtYXREYXRlKGksdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZXQsWi1VLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoZSkpOmkscz10aGlzLl9jYW5BZGp1c3RNb250aChlLC0xLGV0LFopPyI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0ncHJldicgZGF0YS1ldmVudD0nY2xpY2snIHRpdGxlPSciK2krIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIisoWT8iZSI6InciKSsiJz4iK2krIjwvc3Bhbj48L2E+IjpKPyIiOiI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQnIHRpdGxlPSciK2krIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIisoWT8iZSI6InciKSsiJz4iK2krIjwvc3Bhbj48L2E+IixuPXRoaXMuX2dldChlLCJuZXh0VGV4dCIpLG49cT90aGlzLmZvcm1hdERhdGUobix0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaK1UsMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6bixhPXRoaXMuX2NhbkFkanVzdE1vbnRoKGUsMSxldCxaKT8iPGEgY2xhc3M9J3VpLWRhdGVwaWNrZXItbmV4dCB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9J25leHQnIGRhdGEtZXZlbnQ9J2NsaWNrJyB0aXRsZT0nIituKyInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIrKFk/InciOiJlIikrIic+IituKyI8L3NwYW4+PC9hPiI6Sj8iIjoiPGEgY2xhc3M9J3VpLWRhdGVwaWNrZXItbmV4dCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkJyB0aXRsZT0nIituKyInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIrKFk/InciOiJlIikrIic+IituKyI8L3NwYW4+PC9hPiIsbz10aGlzLl9nZXQoZSwiY3VycmVudFRleHQiKSxyPXRoaXMuX2dldChlLCJnb3RvQ3VycmVudCIpJiZlLmN1cnJlbnREYXk/RzpSLG89cT90aGlzLmZvcm1hdERhdGUobyxyLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6byxoPWUuaW5saW5lPyIiOiI8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J3VpLWRhdGVwaWNrZXItY2xvc2UgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1wcmltYXJ5IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0naGlkZScgZGF0YS1ldmVudD0nY2xpY2snPiIrdGhpcy5fZ2V0KGUsImNsb3NlVGV4dCIpKyI8L2J1dHRvbj4iLGw9Qj8iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50Jz4iKyhZP2g6IiIpKyh0aGlzLl9pc0luUmFuZ2UoZSxyKT8iPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSd1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSd0b2RheScgZGF0YS1ldmVudD0nY2xpY2snPiIrbysiPC9idXR0b24+IjoiIikrKFk/IiI6aCkrIjwvZGl2PiI6IiIsdT1wYXJzZUludCh0aGlzLl9nZXQoZSwiZmlyc3REYXkiKSwxMCksdT1pc05hTih1KT8wOnUsZD10aGlzLl9nZXQoZSwic2hvd1dlZWsiKSxjPXRoaXMuX2dldChlLCJkYXlOYW1lcyIpLHA9dGhpcy5fZ2V0KGUsImRheU5hbWVzTWluIiksZj10aGlzLl9nZXQoZSwibW9udGhOYW1lcyIpLG09dGhpcy5fZ2V0KGUsIm1vbnRoTmFtZXNTaG9ydCIpLGc9dGhpcy5fZ2V0KGUsImJlZm9yZVNob3dEYXkiKSx2PXRoaXMuX2dldChlLCJzaG93T3RoZXJNb250aHMiKSx5PXRoaXMuX2dldChlLCJzZWxlY3RPdGhlck1vbnRocyIpLGI9dGhpcy5fZ2V0RGVmYXVsdERhdGUoZSksXz0iIix3PTA7S1swXT53O3crKyl7Zm9yKGs9IiIsdGhpcy5tYXhSb3dzPTQsVD0wO0tbMV0+VDtUKyspe2lmKEQ9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZXQsWixlLnNlbGVjdGVkRGF5KSksUz0iIHVpLWNvcm5lci1hbGwiLE09IiIsUSl7aWYoTSs9IjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItZ3JvdXAiLEtbMV0+MSlzd2l0Y2goVCl7Y2FzZSAwOk0rPSIgdWktZGF0ZXBpY2tlci1ncm91cC1maXJzdCIsUz0iIHVpLWNvcm5lci0iKyhZPyJyaWdodCI6ImxlZnQiKTticmVhaztjYXNlIEtbMV0tMTpNKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCIsUz0iIHVpLWNvcm5lci0iKyhZPyJsZWZ0IjoicmlnaHQiKTticmVhaztkZWZhdWx0Ok0rPSIgdWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUiLFM9IiJ9TSs9Iic+In1mb3IoTSs9IjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItaGVhZGVyIHVpLXdpZGdldC1oZWFkZXIgdWktaGVscGVyLWNsZWFyZml4IitTKyInPiIrKC9hbGx8bGVmdC8udGVzdChTKSYmMD09PXc/WT9hOnM6IiIpKygvYWxsfHJpZ2h0Ly50ZXN0KFMpJiYwPT09dz9ZP3M6YToiIikrdGhpcy5fZ2VuZXJhdGVNb250aFllYXJIZWFkZXIoZSxaLGV0LFgsJCx3PjB8fFQ+MCxmLG0pKyI8L2Rpdj48dGFibGUgY2xhc3M9J3VpLWRhdGVwaWNrZXItY2FsZW5kYXInPjx0aGVhZD4iKyI8dHI+IixDPWQ/Ijx0aCBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWNvbCc+Iit0aGlzLl9nZXQoZSwid2Vla0hlYWRlciIpKyI8L3RoPiI6IiIseD0wOzc+eDt4KyspTj0oeCt1KSU3LEMrPSI8dGggc2NvcGU9J2NvbCciKygoeCt1KzYpJTc+PTU/IiBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWVuZCciOiIiKSsiPiIrIjxzcGFuIHRpdGxlPSciK2NbTl0rIic+IitwW05dKyI8L3NwYW4+PC90aD4iO2ZvcihNKz1DKyI8L3RyPjwvdGhlYWQ+PHRib2R5PiIsQT10aGlzLl9nZXREYXlzSW5Nb250aChldCxaKSxldD09PWUuc2VsZWN0ZWRZZWFyJiZaPT09ZS5zZWxlY3RlZE1vbnRoJiYoZS5zZWxlY3RlZERheT1NYXRoLm1pbihlLnNlbGVjdGVkRGF5LEEpKSxQPSh0aGlzLl9nZXRGaXJzdERheU9mTW9udGgoZXQsWiktdSs3KSU3LEk9TWF0aC5jZWlsKChQK0EpLzcpLEg9UT90aGlzLm1heFJvd3M+ST90aGlzLm1heFJvd3M6STpJLHRoaXMubWF4Um93cz1ILHo9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZXQsWiwxLVApKSxGPTA7SD5GO0YrKyl7Zm9yKE0rPSI8dHI+IixFPWQ/Ijx0ZCBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWNvbCc+Iit0aGlzLl9nZXQoZSwiY2FsY3VsYXRlV2VlayIpKHopKyI8L3RkPiI6IiIseD0wOzc+eDt4KyspTz1nP2cuYXBwbHkoZS5pbnB1dD9lLmlucHV0WzBdOm51bGwsW3pdKTpbITAsIiJdLGo9ei5nZXRNb250aCgpIT09WixXPWomJiF5fHwhT1swXXx8WCYmWD56fHwkJiZ6PiQsRSs9Ijx0ZCBjbGFzcz0nIisoKHgrdSs2KSU3Pj01PyIgdWktZGF0ZXBpY2tlci13ZWVrLWVuZCI6IiIpKyhqPyIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aCI6IiIpKyh6LmdldFRpbWUoKT09PUQuZ2V0VGltZSgpJiZaPT09ZS5zZWxlY3RlZE1vbnRoJiZlLl9rZXlFdmVudHx8Yi5nZXRUaW1lKCk9PT16LmdldFRpbWUoKSYmYi5nZXRUaW1lKCk9PT1ELmdldFRpbWUoKT8iICIrdGhpcy5fZGF5T3ZlckNsYXNzOiIiKSsoVz8iICIrdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MrIiB1aS1zdGF0ZS1kaXNhYmxlZCI6IiIpKyhqJiYhdj8iIjoiICIrT1sxXSsoei5nZXRUaW1lKCk9PT1HLmdldFRpbWUoKT8iICIrdGhpcy5fY3VycmVudENsYXNzOiIiKSsoei5nZXRUaW1lKCk9PT1SLmdldFRpbWUoKT8iIHVpLWRhdGVwaWNrZXItdG9kYXkiOiIiKSkrIiciKyhqJiYhdnx8IU9bMl0/IiI6IiB0aXRsZT0nIitPWzJdLnJlcGxhY2UoLycvZywiJiMzOTsiKSsiJyIpKyhXPyIiOiIgZGF0YS1oYW5kbGVyPSdzZWxlY3REYXknIGRhdGEtZXZlbnQ9J2NsaWNrJyBkYXRhLW1vbnRoPSciK3ouZ2V0TW9udGgoKSsiJyBkYXRhLXllYXI9JyIrei5nZXRGdWxsWWVhcigpKyInIikrIj4iKyhqJiYhdj8iJiN4YTA7IjpXPyI8c3BhbiBjbGFzcz0ndWktc3RhdGUtZGVmYXVsdCc+Iit6LmdldERhdGUoKSsiPC9zcGFuPiI6IjxhIGNsYXNzPSd1aS1zdGF0ZS1kZWZhdWx0Iisoei5nZXRUaW1lKCk9PT1SLmdldFRpbWUoKT8iIHVpLXN0YXRlLWhpZ2hsaWdodCI6IiIpKyh6LmdldFRpbWUoKT09PUcuZ2V0VGltZSgpPyIgdWktc3RhdGUtYWN0aXZlIjoiIikrKGo/IiB1aS1wcmlvcml0eS1zZWNvbmRhcnkiOiIiKSsiJyBocmVmPScjJz4iK3ouZ2V0RGF0ZSgpKyI8L2E+IikrIjwvdGQ+Iix6LnNldERhdGUoei5nZXREYXRlKCkrMSksej10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdCh6KTtNKz1FKyI8L3RyPiJ9WisrLFo+MTEmJihaPTAsZXQrKyksTSs9IjwvdGJvZHk+PC90YWJsZT4iKyhRPyI8L2Rpdj4iKyhLWzBdPjAmJlQ9PT1LWzFdLTE/IjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItcm93LWJyZWFrJz48L2Rpdj4iOiIiKToiIiksays9TX1fKz1rfXJldHVybiBfKz1sLGUuX2tleUV2ZW50PSExLF99LF9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcjpmdW5jdGlvbihlLHQsaSxzLG4sYSxvLHIpe3ZhciBoLGwsdSxkLGMscCxmLG0sZz10aGlzLl9nZXQoZSwiY2hhbmdlTW9udGgiKSx2PXRoaXMuX2dldChlLCJjaGFuZ2VZZWFyIikseT10aGlzLl9nZXQoZSwic2hvd01vbnRoQWZ0ZXJZZWFyIiksYj0iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci10aXRsZSc+IixfPSIiO2lmKGF8fCFnKV8rPSI8c3BhbiBjbGFzcz0ndWktZGF0ZXBpY2tlci1tb250aCc+IitvW3RdKyI8L3NwYW4+IjtlbHNle2ZvcihoPXMmJnMuZ2V0RnVsbFllYXIoKT09PWksbD1uJiZuLmdldEZ1bGxZZWFyKCk9PT1pLF8rPSI8c2VsZWN0IGNsYXNzPSd1aS1kYXRlcGlja2VyLW1vbnRoJyBkYXRhLWhhbmRsZXI9J3NlbGVjdE1vbnRoJyBkYXRhLWV2ZW50PSdjaGFuZ2UnPiIsdT0wOzEyPnU7dSsrKSghaHx8dT49cy5nZXRNb250aCgpKSYmKCFsfHxuLmdldE1vbnRoKCk+PXUpJiYoXys9IjxvcHRpb24gdmFsdWU9JyIrdSsiJyIrKHU9PT10PyIgc2VsZWN0ZWQ9J3NlbGVjdGVkJyI6IiIpKyI+IityW3VdKyI8L29wdGlvbj4iKTtfKz0iPC9zZWxlY3Q+In1pZih5fHwoYis9XysoIWEmJmcmJnY/IiI6IiYjeGEwOyIpKSwhZS55ZWFyc2h0bWwpaWYoZS55ZWFyc2h0bWw9IiIsYXx8IXYpYis9IjxzcGFuIGNsYXNzPSd1aS1kYXRlcGlja2VyLXllYXInPiIraSsiPC9zcGFuPiI7ZWxzZXtmb3IoZD10aGlzLl9nZXQoZSwieWVhclJhbmdlIikuc3BsaXQoIjoiKSxjPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxwPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goL2NbK1wtXS4qLyk/aStwYXJzZUludChlLnN1YnN0cmluZygxKSwxMCk6ZS5tYXRjaCgvWytcLV0uKi8pP2MrcGFyc2VJbnQoZSwxMCk6cGFyc2VJbnQoZSwxMCk7cmV0dXJuIGlzTmFOKHQpP2M6dH0sZj1wKGRbMF0pLG09TWF0aC5tYXgoZixwKGRbMV18fCIiKSksZj1zP01hdGgubWF4KGYscy5nZXRGdWxsWWVhcigpKTpmLG09bj9NYXRoLm1pbihtLG4uZ2V0RnVsbFllYXIoKSk6bSxlLnllYXJzaHRtbCs9IjxzZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcicgZGF0YS1oYW5kbGVyPSdzZWxlY3RZZWFyJyBkYXRhLWV2ZW50PSdjaGFuZ2UnPiI7bT49ZjtmKyspZS55ZWFyc2h0bWwrPSI8b3B0aW9uIHZhbHVlPSciK2YrIiciKyhmPT09aT8iIHNlbGVjdGVkPSdzZWxlY3RlZCciOiIiKSsiPiIrZisiPC9vcHRpb24+IjtlLnllYXJzaHRtbCs9Ijwvc2VsZWN0PiIsYis9ZS55ZWFyc2h0bWwsZS55ZWFyc2h0bWw9bnVsbH1yZXR1cm4gYis9dGhpcy5fZ2V0KGUsInllYXJTdWZmaXgiKSx5JiYoYis9KCFhJiZnJiZ2PyIiOiImI3hhMDsiKStfKSxiKz0iPC9kaXY+In0sX2FkanVzdEluc3REYXRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz1lLmRyYXdZZWFyKygiWSI9PT1pP3Q6MCksbj1lLmRyYXdNb250aCsoIk0iPT09aT90OjApLGE9TWF0aC5taW4oZS5zZWxlY3RlZERheSx0aGlzLl9nZXREYXlzSW5Nb250aChzLG4pKSsoIkQiPT09aT90OjApLG89dGhpcy5fcmVzdHJpY3RNaW5NYXgoZSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShzLG4sYSkpKTtlLnNlbGVjdGVkRGF5PW8uZ2V0RGF0ZSgpLGUuZHJhd01vbnRoPWUuc2VsZWN0ZWRNb250aD1vLmdldE1vbnRoKCksZS5kcmF3WWVhcj1lLnNlbGVjdGVkWWVhcj1vLmdldEZ1bGxZZWFyKCksKCJNIj09PWl8fCJZIj09PWkpJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoZSl9LF9yZXN0cmljdE1pbk1heDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWluIikscz10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1heCIpLG49aSYmaT50P2k6dDtyZXR1cm4gcyYmbj5zP3M6bn0sX25vdGlmeUNoYW5nZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXQoZSwib25DaGFuZ2VNb250aFllYXIiKTt0JiZ0LmFwcGx5KGUuaW5wdXQ/ZS5pbnB1dFswXTpudWxsLFtlLnNlbGVjdGVkWWVhcixlLnNlbGVjdGVkTW9udGgrMSxlXSl9LF9nZXROdW1iZXJPZk1vbnRoczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXQoZSwibnVtYmVyT2ZNb250aHMiKTtyZXR1cm4gbnVsbD09dD9bMSwxXToibnVtYmVyIj09dHlwZW9mIHQ/WzEsdF06dH0sX2dldE1pbk1heERhdGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fZGV0ZXJtaW5lRGF0ZShlLHRoaXMuX2dldChlLHQrIkRhdGUiKSxudWxsKX0sX2dldERheXNJbk1vbnRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIDMyLXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGUsdCwzMikpLmdldERhdGUoKX0sX2dldEZpcnN0RGF5T2ZNb250aDpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgRGF0ZShlLHQsMSkuZ2V0RGF5KCl9LF9jYW5BZGp1c3RNb250aDpmdW5jdGlvbihlLHQsaSxzKXt2YXIgbj10aGlzLl9nZXROdW1iZXJPZk1vbnRocyhlKSxhPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGkscysoMD50P3Q6blswXSpuWzFdKSwxKSk7cmV0dXJuIDA+dCYmYS5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCkpKSx0aGlzLl9pc0luUmFuZ2UoZSxhKX0sX2lzSW5SYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBpLHMsbj10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1pbiIpLGE9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtYXgiKSxvPW51bGwscj1udWxsLGg9dGhpcy5fZ2V0KGUsInllYXJSYW5nZSIpO3JldHVybiBoJiYoaT1oLnNwbGl0KCI6Iikscz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksbz1wYXJzZUludChpWzBdLDEwKSxyPXBhcnNlSW50KGlbMV0sMTApLGlbMF0ubWF0Y2goL1srXC1dLiovKSYmKG8rPXMpLGlbMV0ubWF0Y2goL1srXC1dLiovKSYmKHIrPXMpKSwoIW58fHQuZ2V0VGltZSgpPj1uLmdldFRpbWUoKSkmJighYXx8dC5nZXRUaW1lKCk8PWEuZ2V0VGltZSgpKSYmKCFvfHx0LmdldEZ1bGxZZWFyKCk+PW8pJiYoIXJ8fHI+PXQuZ2V0RnVsbFllYXIoKSl9LF9nZXRGb3JtYXRDb25maWc6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0KGUsInNob3J0WWVhckN1dG9mZiIpO3JldHVybiB0PSJzdHJpbmciIT10eXBlb2YgdD90OihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQodCwxMCkse3Nob3J0WWVhckN1dG9mZjp0LGRheU5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGUsImRheU5hbWVzU2hvcnQiKSxkYXlOYW1lczp0aGlzLl9nZXQoZSwiZGF5TmFtZXMiKSxtb250aE5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGUsIm1vbnRoTmFtZXNTaG9ydCIpLG1vbnRoTmFtZXM6dGhpcy5fZ2V0KGUsIm1vbnRoTmFtZXMiKX19LF9mb3JtYXREYXRlOmZ1bmN0aW9uKGUsdCxpLHMpe3R8fChlLmN1cnJlbnREYXk9ZS5zZWxlY3RlZERheSxlLmN1cnJlbnRNb250aD1lLnNlbGVjdGVkTW9udGgsZS5jdXJyZW50WWVhcj1lLnNlbGVjdGVkWWVhcik7dmFyIG49dD8ib2JqZWN0Ij09dHlwZW9mIHQ/dDp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShzLGksdCkpOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGUuY3VycmVudFllYXIsZS5jdXJyZW50TW9udGgsZS5jdXJyZW50RGF5KSk7cmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpLG4sdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKX19KSxlLmZuLmRhdGVwaWNrZXI9ZnVuY3Rpb24odCl7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO2UuZGF0ZXBpY2tlci5pbml0aWFsaXplZHx8KGUoZG9jdW1lbnQpLm1vdXNlZG93bihlLmRhdGVwaWNrZXIuX2NoZWNrRXh0ZXJuYWxDbGljayksZS5kYXRlcGlja2VyLmluaXRpYWxpemVkPSEwKSwwPT09ZSgiIyIrZS5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aCYmZSgiYm9keSIpLmFwcGVuZChlLmRhdGVwaWNrZXIuZHBEaXYpO3ZhciBpPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHR8fCJpc0Rpc2FibGVkIiE9PXQmJiJnZXREYXRlIiE9PXQmJiJ3aWRnZXQiIT09dD8ib3B0aW9uIj09PXQmJjI9PT1hcmd1bWVudHMubGVuZ3RoJiYic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1sxXT9lLmRhdGVwaWNrZXJbIl8iK3QrIkRhdGVwaWNrZXIiXS5hcHBseShlLmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdChpKSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7InN0cmluZyI9PXR5cGVvZiB0P2UuZGF0ZXBpY2tlclsiXyIrdCsiRGF0ZXBpY2tlciJdLmFwcGx5KGUuZGF0ZXBpY2tlcixbdGhpc10uY29uY2F0KGkpKTplLmRhdGVwaWNrZXIuX2F0dGFjaERhdGVwaWNrZXIodGhpcyx0KX0pOmUuZGF0ZXBpY2tlclsiXyIrdCsiRGF0ZXBpY2tlciJdLmFwcGx5KGUuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KGkpKX0sZS5kYXRlcGlja2VyPW5ldyBuLGUuZGF0ZXBpY2tlci5pbml0aWFsaXplZD0hMSxlLmRhdGVwaWNrZXIudXVpZD0obmV3IERhdGUpLmdldFRpbWUoKSxlLmRhdGVwaWNrZXIudmVyc2lvbj0iMS4xMS40IixlLmRhdGVwaWNrZXIsZS53aWRnZXQoInVpLmRpYWxvZyIse3ZlcnNpb246IjEuMTEuNCIsb3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9PcGVuOiEwLGJ1dHRvbnM6W10sY2xvc2VPbkVzY2FwZTohMCxjbG9zZVRleHQ6IkNsb3NlIixkaWFsb2dDbGFzczoiIixkcmFnZ2FibGU6ITAsaGlkZTpudWxsLGhlaWdodDoiYXV0byIsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDohMSxwb3NpdGlvbjp7bXk6ImNlbnRlciIsYXQ6ImNlbnRlciIsb2Y6d2luZG93LGNvbGxpc2lvbjoiZml0Iix1c2luZzpmdW5jdGlvbih0KXt2YXIgaT1lKHRoaXMpLmNzcyh0KS5vZmZzZXQoKS50b3A7MD5pJiZlKHRoaXMpLmNzcygidG9wIix0LnRvcC1pKX19LHJlc2l6YWJsZTohMCxzaG93Om51bGwsdGl0bGU6bnVsbCx3aWR0aDozMDAsYmVmb3JlQ2xvc2U6bnVsbCxjbG9zZTpudWxsLGRyYWc6bnVsbCxkcmFnU3RhcnQ6bnVsbCxkcmFnU3RvcDpudWxsLGZvY3VzOm51bGwsb3BlbjpudWxsLHJlc2l6ZTpudWxsLHJlc2l6ZVN0YXJ0Om51bGwscmVzaXplU3RvcDpudWxsfSxzaXplUmVsYXRlZE9wdGlvbnM6e2J1dHRvbnM6ITAsaGVpZ2h0OiEwLG1heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITAsd2lkdGg6ITB9LHJlc2l6YWJsZVJlbGF0ZWRPcHRpb25zOnttYXhIZWlnaHQ6ITAsbWF4V2lkdGg6ITAsbWluSGVpZ2h0OiEwLG1pbldpZHRoOiEwfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW5hbENzcz17ZGlzcGxheTp0aGlzLmVsZW1lbnRbMF0uc3R5bGUuZGlzcGxheSx3aWR0aDp0aGlzLmVsZW1lbnRbMF0uc3R5bGUud2lkdGgsbWluSGVpZ2h0OnRoaXMuZWxlbWVudFswXS5zdHlsZS5taW5IZWlnaHQsbWF4SGVpZ2h0OnRoaXMuZWxlbWVudFswXS5zdHlsZS5tYXhIZWlnaHQsaGVpZ2h0OnRoaXMuZWxlbWVudFswXS5zdHlsZS5oZWlnaHR9LHRoaXMub3JpZ2luYWxQb3NpdGlvbj17cGFyZW50OnRoaXMuZWxlbWVudC5wYXJlbnQoKSxpbmRleDp0aGlzLmVsZW1lbnQucGFyZW50KCkuY2hpbGRyZW4oKS5pbmRleCh0aGlzLmVsZW1lbnQpfSx0aGlzLm9yaWdpbmFsVGl0bGU9dGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIiksdGhpcy5vcHRpb25zLnRpdGxlPXRoaXMub3B0aW9ucy50aXRsZXx8dGhpcy5vcmlnaW5hbFRpdGxlLHRoaXMuX2NyZWF0ZVdyYXBwZXIoKSx0aGlzLmVsZW1lbnQuc2hvdygpLnJlbW92ZUF0dHIoInRpdGxlIikuYWRkQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikuYXBwZW5kVG8odGhpcy51aURpYWxvZyksdGhpcy5fY3JlYXRlVGl0bGViYXIoKSx0aGlzLl9jcmVhdGVCdXR0b25QYW5lKCksdGhpcy5vcHRpb25zLmRyYWdnYWJsZSYmZS5mbi5kcmFnZ2FibGUmJnRoaXMuX21ha2VEcmFnZ2FibGUoKSx0aGlzLm9wdGlvbnMucmVzaXphYmxlJiZlLmZuLnJlc2l6YWJsZSYmdGhpcy5fbWFrZVJlc2l6YWJsZSgpLHRoaXMuX2lzT3Blbj0hMSx0aGlzLl90cmFja0ZvY3VzKCl9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmF1dG9PcGVuJiZ0aGlzLm9wZW4oKX0sX2FwcGVuZFRvOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmFwcGVuZFRvO3JldHVybiB0JiYodC5qcXVlcnl8fHQubm9kZVR5cGUpP2UodCk6dGhpcy5kb2N1bWVudC5maW5kKHR8fCJib2R5IikuZXEoMCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLm9yaWdpbmFsUG9zaXRpb247dGhpcy5fdW50cmFja0luc3RhbmNlKCksdGhpcy5fZGVzdHJveU92ZXJsYXkoKSx0aGlzLmVsZW1lbnQucmVtb3ZlVW5pcXVlSWQoKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5jc3ModGhpcy5vcmlnaW5hbENzcykuZGV0YWNoKCksdGhpcy51aURpYWxvZy5zdG9wKCEwLCEwKS5yZW1vdmUoKSx0aGlzLm9yaWdpbmFsVGl0bGUmJnRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIsdGhpcy5vcmlnaW5hbFRpdGxlKSxlPXQucGFyZW50LmNoaWxkcmVuKCkuZXEodC5pbmRleCksZS5sZW5ndGgmJmVbMF0hPT10aGlzLmVsZW1lbnRbMF0/ZS5iZWZvcmUodGhpcy5lbGVtZW50KTp0LnBhcmVudC5hcHBlbmQodGhpcy5lbGVtZW50KX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWlEaWFsb2d9LGRpc2FibGU6ZS5ub29wLGVuYWJsZTplLm5vb3AsY2xvc2U6ZnVuY3Rpb24odCl7dmFyIGkscz10aGlzO2lmKHRoaXMuX2lzT3BlbiYmdGhpcy5fdHJpZ2dlcigiYmVmb3JlQ2xvc2UiLHQpIT09ITEpe2lmKHRoaXMuX2lzT3Blbj0hMSx0aGlzLl9mb2N1c2VkRWxlbWVudD1udWxsLHRoaXMuX2Rlc3Ryb3lPdmVybGF5KCksdGhpcy5fdW50cmFja0luc3RhbmNlKCksIXRoaXMub3BlbmVyLmZpbHRlcigiOmZvY3VzYWJsZSIpLmZvY3VzKCkubGVuZ3RoKXRyeXtpPXRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCxpJiYiYm9keSIhPT1pLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUoaSkuYmx1cigpfWNhdGNoKG4pe310aGlzLl9oaWRlKHRoaXMudWlEaWFsb2csdGhpcy5vcHRpb25zLmhpZGUsZnVuY3Rpb24oKXtzLl90cmlnZ2VyKCJjbG9zZSIsdCl9KX19LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc09wZW59LG1vdmVUb1RvcDpmdW5jdGlvbigpe3RoaXMuX21vdmVUb1RvcCgpfSxfbW92ZVRvVG9wOmZ1bmN0aW9uKHQsaSl7dmFyIHM9ITEsbj10aGlzLnVpRGlhbG9nLnNpYmxpbmdzKCIudWktZnJvbnQ6dmlzaWJsZSIpLm1hcChmdW5jdGlvbigpe3JldHVybitlKHRoaXMpLmNzcygiei1pbmRleCIpfSkuZ2V0KCksYT1NYXRoLm1heC5hcHBseShudWxsLG4pO3JldHVybiBhPj0rdGhpcy51aURpYWxvZy5jc3MoInotaW5kZXgiKSYmKHRoaXMudWlEaWFsb2cuY3NzKCJ6LWluZGV4IixhKzEpLHM9ITApLHMmJiFpJiZ0aGlzLl90cmlnZ2VyKCJmb2N1cyIsdCksc30sb3BlbjpmdW5jdGlvbigpe3ZhciB0PXRoaXM7Ci1yZXR1cm4gdGhpcy5faXNPcGVuPyh0aGlzLl9tb3ZlVG9Ub3AoKSYmdGhpcy5fZm9jdXNUYWJiYWJsZSgpLHZvaWQgMCk6KHRoaXMuX2lzT3Blbj0hMCx0aGlzLm9wZW5lcj1lKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCksdGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKCksdGhpcy5fY3JlYXRlT3ZlcmxheSgpLHRoaXMuX21vdmVUb1RvcChudWxsLCEwKSx0aGlzLm92ZXJsYXkmJnRoaXMub3ZlcmxheS5jc3MoInotaW5kZXgiLHRoaXMudWlEaWFsb2cuY3NzKCJ6LWluZGV4IiktMSksdGhpcy5fc2hvdyh0aGlzLnVpRGlhbG9nLHRoaXMub3B0aW9ucy5zaG93LGZ1bmN0aW9uKCl7dC5fZm9jdXNUYWJiYWJsZSgpLHQuX3RyaWdnZXIoImZvY3VzIil9KSx0aGlzLl9tYWtlRm9jdXNUYXJnZXQoKSx0aGlzLl90cmlnZ2VyKCJvcGVuIiksdm9pZCAwKX0sX2ZvY3VzVGFiYmFibGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9mb2N1c2VkRWxlbWVudDtlfHwoZT10aGlzLmVsZW1lbnQuZmluZCgiW2F1dG9mb2N1c10iKSksZS5sZW5ndGh8fChlPXRoaXMuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmZpbmQoIjp0YWJiYWJsZSIpKSxlLmxlbmd0aHx8KGU9dGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2UuZmlsdGVyKCI6dGFiYmFibGUiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2cpLGUuZXEoMCkuZm9jdXMoKX0sX2tlZXBGb2N1czpmdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7dmFyIHQ9dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50LGk9dGhpcy51aURpYWxvZ1swXT09PXR8fGUuY29udGFpbnModGhpcy51aURpYWxvZ1swXSx0KTtpfHx0aGlzLl9mb2N1c1RhYmJhYmxlKCl9dC5wcmV2ZW50RGVmYXVsdCgpLGkuY2FsbCh0aGlzKSx0aGlzLl9kZWxheShpKX0sX2NyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oKXt0aGlzLnVpRGlhbG9nPWUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS1mcm9udCAiK3RoaXMub3B0aW9ucy5kaWFsb2dDbGFzcykuaGlkZSgpLmF0dHIoe3RhYkluZGV4Oi0xLHJvbGU6ImRpYWxvZyJ9KS5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSx0aGlzLl9vbih0aGlzLnVpRGlhbG9nLHtrZXlkb3duOmZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5jbG9zZU9uRXNjYXBlJiYhdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmdC5rZXlDb2RlJiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuRVNDQVBFKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksdGhpcy5jbG9zZSh0KSx2b2lkIDA7aWYodC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlRBQiYmIXQuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciBpPXRoaXMudWlEaWFsb2cuZmluZCgiOnRhYmJhYmxlIikscz1pLmZpbHRlcigiOmZpcnN0Iiksbj1pLmZpbHRlcigiOmxhc3QiKTt0LnRhcmdldCE9PW5bMF0mJnQudGFyZ2V0IT09dGhpcy51aURpYWxvZ1swXXx8dC5zaGlmdEtleT90LnRhcmdldCE9PXNbMF0mJnQudGFyZ2V0IT09dGhpcy51aURpYWxvZ1swXXx8IXQuc2hpZnRLZXl8fCh0aGlzLl9kZWxheShmdW5jdGlvbigpe24uZm9jdXMoKX0pLHQucHJldmVudERlZmF1bHQoKSk6KHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7cy5mb2N1cygpfSksdC5wcmV2ZW50RGVmYXVsdCgpKX19LG1vdXNlZG93bjpmdW5jdGlvbihlKXt0aGlzLl9tb3ZlVG9Ub3AoZSkmJnRoaXMuX2ZvY3VzVGFiYmFibGUoKX19KSx0aGlzLmVsZW1lbnQuZmluZCgiW2FyaWEtZGVzY3JpYmVkYnldIikubGVuZ3RofHx0aGlzLnVpRGlhbG9nLmF0dHIoeyJhcmlhLWRlc2NyaWJlZGJ5Ijp0aGlzLmVsZW1lbnQudW5pcXVlSWQoKS5hdHRyKCJpZCIpfSl9LF9jcmVhdGVUaXRsZWJhcjpmdW5jdGlvbigpe3ZhciB0O3RoaXMudWlEaWFsb2dUaXRsZWJhcj1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLWhlbHBlci1jbGVhcmZpeCIpLnByZXBlbmRUbyh0aGlzLnVpRGlhbG9nKSx0aGlzLl9vbih0aGlzLnVpRGlhbG9nVGl0bGViYXIse21vdXNlZG93bjpmdW5jdGlvbih0KXtlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIil8fHRoaXMudWlEaWFsb2cuZm9jdXMoKX19KSx0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZT1lKCI8YnV0dG9uIHR5cGU9J2J1dHRvbic+PC9idXR0b24+IikuYnV0dG9uKHtsYWJlbDp0aGlzLm9wdGlvbnMuY2xvc2VUZXh0LGljb25zOntwcmltYXJ5OiJ1aS1pY29uLWNsb3NldGhpY2sifSx0ZXh0OiExfSkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIpLmFwcGVuZFRvKHRoaXMudWlEaWFsb2dUaXRsZWJhciksdGhpcy5fb24odGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2Use2NsaWNrOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlKGUpfX0pLHQ9ZSgiPHNwYW4+IikudW5pcXVlSWQoKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlIikucHJlcGVuZFRvKHRoaXMudWlEaWFsb2dUaXRsZWJhciksdGhpcy5fdGl0bGUodCksdGhpcy51aURpYWxvZy5hdHRyKHsiYXJpYS1sYWJlbGxlZGJ5Ijp0LmF0dHIoImlkIil9KX0sX3RpdGxlOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy50aXRsZXx8ZS5odG1sKCImIzE2MDsiKSxlLnRleHQodGhpcy5vcHRpb25zLnRpdGxlKX0sX2NyZWF0ZUJ1dHRvblBhbmU6ZnVuY3Rpb24oKXt0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZT1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXgiKSx0aGlzLnVpQnV0dG9uU2V0PWUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zZXQiKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZSksdGhpcy5fY3JlYXRlQnV0dG9ucygpfSxfY3JlYXRlQnV0dG9uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT10aGlzLm9wdGlvbnMuYnV0dG9ucztyZXR1cm4gdGhpcy51aURpYWxvZ0J1dHRvblBhbmUucmVtb3ZlKCksdGhpcy51aUJ1dHRvblNldC5lbXB0eSgpLGUuaXNFbXB0eU9iamVjdChpKXx8ZS5pc0FycmF5KGkpJiYhaS5sZW5ndGg/KHRoaXMudWlEaWFsb2cucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zIiksdm9pZCAwKTooZS5lYWNoKGksZnVuY3Rpb24oaSxzKXt2YXIgbixhO3M9ZS5pc0Z1bmN0aW9uKHMpP3tjbGljazpzLHRleHQ6aX06cyxzPWUuZXh0ZW5kKHt0eXBlOiJidXR0b24ifSxzKSxuPXMuY2xpY2sscy5jbGljaz1mdW5jdGlvbigpe24uYXBwbHkodC5lbGVtZW50WzBdLGFyZ3VtZW50cyl9LGE9e2ljb25zOnMuaWNvbnMsdGV4dDpzLnNob3dUZXh0fSxkZWxldGUgcy5pY29ucyxkZWxldGUgcy5zaG93VGV4dCxlKCI8YnV0dG9uPjwvYnV0dG9uPiIscykuYnV0dG9uKGEpLmFwcGVuZFRvKHQudWlCdXR0b25TZXQpfSksdGhpcy51aURpYWxvZy5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnMiKSx0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nKSx2b2lkIDApfSxfbWFrZURyYWdnYWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7cmV0dXJue3Bvc2l0aW9uOmUucG9zaXRpb24sb2Zmc2V0OmUub2Zmc2V0fX12YXIgaT10aGlzLHM9dGhpcy5vcHRpb25zO3RoaXMudWlEaWFsb2cuZHJhZ2dhYmxlKHtjYW5jZWw6Ii51aS1kaWFsb2ctY29udGVudCwgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIsaGFuZGxlOiIudWktZGlhbG9nLXRpdGxlYmFyIixjb250YWlubWVudDoiZG9jdW1lbnQiLHN0YXJ0OmZ1bmN0aW9uKHMsbil7ZSh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIiksaS5fYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKCJkcmFnU3RhcnQiLHMsdChuKSl9LGRyYWc6ZnVuY3Rpb24oZSxzKXtpLl90cmlnZ2VyKCJkcmFnIixlLHQocykpfSxzdG9wOmZ1bmN0aW9uKG4sYSl7dmFyIG89YS5vZmZzZXQubGVmdC1pLmRvY3VtZW50LnNjcm9sbExlZnQoKSxyPWEub2Zmc2V0LnRvcC1pLmRvY3VtZW50LnNjcm9sbFRvcCgpO3MucG9zaXRpb249e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQiKyhvPj0wPyIrIjoiIikrbysiICIrInRvcCIrKHI+PTA/IisiOiIiKStyLG9mOmkud2luZG93fSxlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctZHJhZ2dpbmciKSxpLl91bmJsb2NrRnJhbWVzKCksaS5fdHJpZ2dlcigiZHJhZ1N0b3AiLG4sdChhKSl9fSl9LF9tYWtlUmVzaXphYmxlOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtyZXR1cm57b3JpZ2luYWxQb3NpdGlvbjplLm9yaWdpbmFsUG9zaXRpb24sb3JpZ2luYWxTaXplOmUub3JpZ2luYWxTaXplLHBvc2l0aW9uOmUucG9zaXRpb24sc2l6ZTplLnNpemV9fXZhciBpPXRoaXMscz10aGlzLm9wdGlvbnMsbj1zLnJlc2l6YWJsZSxhPXRoaXMudWlEaWFsb2cuY3NzKCJwb3NpdGlvbiIpLG89InN0cmluZyI9PXR5cGVvZiBuP246Im4sZSxzLHcsc2Usc3csbmUsbnciO3RoaXMudWlEaWFsb2cucmVzaXphYmxlKHtjYW5jZWw6Ii51aS1kaWFsb2ctY29udGVudCIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixhbHNvUmVzaXplOnRoaXMuZWxlbWVudCxtYXhXaWR0aDpzLm1heFdpZHRoLG1heEhlaWdodDpzLm1heEhlaWdodCxtaW5XaWR0aDpzLm1pbldpZHRoLG1pbkhlaWdodDp0aGlzLl9taW5IZWlnaHQoKSxoYW5kbGVzOm8sc3RhcnQ6ZnVuY3Rpb24ocyxuKXtlKHRoaXMpLmFkZENsYXNzKCJ1aS1kaWFsb2ctcmVzaXppbmciKSxpLl9ibG9ja0ZyYW1lcygpLGkuX3RyaWdnZXIoInJlc2l6ZVN0YXJ0IixzLHQobikpfSxyZXNpemU6ZnVuY3Rpb24oZSxzKXtpLl90cmlnZ2VyKCJyZXNpemUiLGUsdChzKSl9LHN0b3A6ZnVuY3Rpb24obixhKXt2YXIgbz1pLnVpRGlhbG9nLm9mZnNldCgpLHI9by5sZWZ0LWkuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpLGg9by50b3AtaS5kb2N1bWVudC5zY3JvbGxUb3AoKTtzLmhlaWdodD1pLnVpRGlhbG9nLmhlaWdodCgpLHMud2lkdGg9aS51aURpYWxvZy53aWR0aCgpLHMucG9zaXRpb249e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQiKyhyPj0wPyIrIjoiIikrcisiICIrInRvcCIrKGg+PTA/IisiOiIiKStoLG9mOmkud2luZG93fSxlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctcmVzaXppbmciKSxpLl91bmJsb2NrRnJhbWVzKCksaS5fdHJpZ2dlcigicmVzaXplU3RvcCIsbix0KGEpKX19KS5jc3MoInBvc2l0aW9uIixhKX0sX3RyYWNrRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9vbih0aGlzLndpZGdldCgpLHtmb2N1c2luOmZ1bmN0aW9uKHQpe3RoaXMuX21ha2VGb2N1c1RhcmdldCgpLHRoaXMuX2ZvY3VzZWRFbGVtZW50PWUodC50YXJnZXQpfX0pfSxfbWFrZUZvY3VzVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5fdW50cmFja0luc3RhbmNlKCksdGhpcy5fdHJhY2tpbmdJbnN0YW5jZXMoKS51bnNoaWZ0KHRoaXMpfSxfdW50cmFja0luc3RhbmNlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdHJhY2tpbmdJbnN0YW5jZXMoKSxpPWUuaW5BcnJheSh0aGlzLHQpOy0xIT09aSYmdC5zcGxpY2UoaSwxKX0sX3RyYWNraW5nSW5zdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctaW5zdGFuY2VzIik7cmV0dXJuIGV8fChlPVtdLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLWluc3RhbmNlcyIsZSkpLGV9LF9taW5IZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnM7cmV0dXJuImF1dG8iPT09ZS5oZWlnaHQ/ZS5taW5IZWlnaHQ6TWF0aC5taW4oZS5taW5IZWlnaHQsZS5oZWlnaHQpfSxfcG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpRGlhbG9nLmlzKCI6dmlzaWJsZSIpO2V8fHRoaXMudWlEaWFsb2cuc2hvdygpLHRoaXMudWlEaWFsb2cucG9zaXRpb24odGhpcy5vcHRpb25zLnBvc2l0aW9uKSxlfHx0aGlzLnVpRGlhbG9nLmhpZGUoKX0sX3NldE9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcyxzPSExLG49e307ZS5lYWNoKHQsZnVuY3Rpb24oZSx0KXtpLl9zZXRPcHRpb24oZSx0KSxlIGluIGkuc2l6ZVJlbGF0ZWRPcHRpb25zJiYocz0hMCksZSBpbiBpLnJlc2l6YWJsZVJlbGF0ZWRPcHRpb25zJiYobltlXT10KX0pLHMmJih0aGlzLl9zaXplKCksdGhpcy5fcG9zaXRpb24oKSksdGhpcy51aURpYWxvZy5pcygiOmRhdGEodWktcmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIixuKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBpLHMsbj10aGlzLnVpRGlhbG9nOyJkaWFsb2dDbGFzcyI9PT1lJiZuLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5kaWFsb2dDbGFzcykuYWRkQ2xhc3ModCksImRpc2FibGVkIiE9PWUmJih0aGlzLl9zdXBlcihlLHQpLCJhcHBlbmRUbyI9PT1lJiZ0aGlzLnVpRGlhbG9nLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLCJidXR0b25zIj09PWUmJnRoaXMuX2NyZWF0ZUJ1dHRvbnMoKSwiY2xvc2VUZXh0Ij09PWUmJnRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlLmJ1dHRvbih7bGFiZWw6IiIrdH0pLCJkcmFnZ2FibGUiPT09ZSYmKGk9bi5pcygiOmRhdGEodWktZHJhZ2dhYmxlKSIpLGkmJiF0JiZuLmRyYWdnYWJsZSgiZGVzdHJveSIpLCFpJiZ0JiZ0aGlzLl9tYWtlRHJhZ2dhYmxlKCkpLCJwb3NpdGlvbiI9PT1lJiZ0aGlzLl9wb3NpdGlvbigpLCJyZXNpemFibGUiPT09ZSYmKHM9bi5pcygiOmRhdGEodWktcmVzaXphYmxlKSIpLHMmJiF0JiZuLnJlc2l6YWJsZSgiZGVzdHJveSIpLHMmJiJzdHJpbmciPT10eXBlb2YgdCYmbi5yZXNpemFibGUoIm9wdGlvbiIsImhhbmRsZXMiLHQpLHN8fHQ9PT0hMXx8dGhpcy5fbWFrZVJlc2l6YWJsZSgpKSwidGl0bGUiPT09ZSYmdGhpcy5fdGl0bGUodGhpcy51aURpYWxvZ1RpdGxlYmFyLmZpbmQoIi51aS1kaWFsb2ctdGl0bGUiKSkpfSxfc2l6ZTpmdW5jdGlvbigpe3ZhciBlLHQsaSxzPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnQuc2hvdygpLmNzcyh7d2lkdGg6ImF1dG8iLG1pbkhlaWdodDowLG1heEhlaWdodDoibm9uZSIsaGVpZ2h0OjB9KSxzLm1pbldpZHRoPnMud2lkdGgmJihzLndpZHRoPXMubWluV2lkdGgpLGU9dGhpcy51aURpYWxvZy5jc3Moe2hlaWdodDoiYXV0byIsd2lkdGg6cy53aWR0aH0pLm91dGVySGVpZ2h0KCksdD1NYXRoLm1heCgwLHMubWluSGVpZ2h0LWUpLGk9Im51bWJlciI9PXR5cGVvZiBzLm1heEhlaWdodD9NYXRoLm1heCgwLHMubWF4SGVpZ2h0LWUpOiJub25lIiwiYXV0byI9PT1zLmhlaWdodD90aGlzLmVsZW1lbnQuY3NzKHttaW5IZWlnaHQ6dCxtYXhIZWlnaHQ6aSxoZWlnaHQ6ImF1dG8ifSk6dGhpcy5lbGVtZW50LmhlaWdodChNYXRoLm1heCgwLHMuaGVpZ2h0LWUpKSx0aGlzLnVpRGlhbG9nLmlzKCI6ZGF0YSh1aS1yZXNpemFibGUpIikmJnRoaXMudWlEaWFsb2cucmVzaXphYmxlKCJvcHRpb24iLCJtaW5IZWlnaHQiLHRoaXMuX21pbkhlaWdodCgpKX0sX2Jsb2NrRnJhbWVzOmZ1bmN0aW9uKCl7dGhpcy5pZnJhbWVCbG9ja3M9dGhpcy5kb2N1bWVudC5maW5kKCJpZnJhbWUiKS5tYXAoZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3JldHVybiBlKCI8ZGl2PiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix3aWR0aDp0Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dC5vdXRlckhlaWdodCgpfSkuYXBwZW5kVG8odC5wYXJlbnQoKSkub2Zmc2V0KHQub2Zmc2V0KCkpWzBdfSl9LF91bmJsb2NrRnJhbWVzOmZ1bmN0aW9uKCl7dGhpcy5pZnJhbWVCbG9ja3MmJih0aGlzLmlmcmFtZUJsb2Nrcy5yZW1vdmUoKSxkZWxldGUgdGhpcy5pZnJhbWVCbG9ja3MpfSxfYWxsb3dJbnRlcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gZSh0LnRhcmdldCkuY2xvc2VzdCgiLnVpLWRpYWxvZyIpLmxlbmd0aD8hMDohIWUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1kYXRlcGlja2VyIikubGVuZ3RofSxfY3JlYXRlT3ZlcmxheTpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5tb2RhbCl7dmFyIHQ9ITA7dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0PSExfSksdGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKXx8dGhpcy5fb24odGhpcy5kb2N1bWVudCx7Zm9jdXNpbjpmdW5jdGlvbihlKXt0fHx0aGlzLl9hbGxvd0ludGVyYWN0aW9uKGUpfHwoZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3RyYWNraW5nSW5zdGFuY2VzKClbMF0uX2ZvY3VzVGFiYmFibGUoKSl9fSksdGhpcy5vdmVybGF5PWUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLXdpZGdldC1vdmVybGF5IHVpLWZyb250IikuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksdGhpcy5fb24odGhpcy5vdmVybGF5LHttb3VzZWRvd246Il9rZWVwRm9jdXMifSksdGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiLCh0aGlzLmRvY3VtZW50LmRhdGEoInVpLWRpYWxvZy1vdmVybGF5cyIpfHwwKSsxKX19LF9kZXN0cm95T3ZlcmxheTpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5tb2RhbCYmdGhpcy5vdmVybGF5KXt2YXIgZT10aGlzLmRvY3VtZW50LmRhdGEoInVpLWRpYWxvZy1vdmVybGF5cyIpLTE7ZT90aGlzLmRvY3VtZW50LmRhdGEoInVpLWRpYWxvZy1vdmVybGF5cyIsZSk6dGhpcy5kb2N1bWVudC51bmJpbmQoImZvY3VzaW4iKS5yZW1vdmVEYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKSx0aGlzLm92ZXJsYXkucmVtb3ZlKCksdGhpcy5vdmVybGF5PW51bGx9fX0pLGUud2lkZ2V0KCJ1aS5wcm9ncmVzc2JhciIse3ZlcnNpb246IjEuMTEuNCIsb3B0aW9uczp7bWF4OjEwMCx2YWx1ZTowLGNoYW5nZTpudWxsLGNvbXBsZXRlOm51bGx9LG1pbjowLF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9sZFZhbHVlPXRoaXMub3B0aW9ucy52YWx1ZT10aGlzLl9jb25zdHJhaW5lZFZhbHVlKCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLmF0dHIoe3JvbGU6InByb2dyZXNzYmFyIiwiYXJpYS12YWx1ZW1pbiI6dGhpcy5taW59KSx0aGlzLnZhbHVlRGl2PWUoIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLXZhbHVlIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWxlZnQnPjwvZGl2PiIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1wcm9ncmVzc2JhciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWluIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1heCIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVub3ciKSx0aGlzLnZhbHVlRGl2LnJlbW92ZSgpfSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLm9wdGlvbnMudmFsdWU6KHRoaXMub3B0aW9ucy52YWx1ZT10aGlzLl9jb25zdHJhaW5lZFZhbHVlKGUpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHZvaWQgMCl9LF9jb25zdHJhaW5lZFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10aGlzLm9wdGlvbnMudmFsdWUpLHRoaXMuaW5kZXRlcm1pbmF0ZT1lPT09ITEsIm51bWJlciIhPXR5cGVvZiBlJiYoZT0wKSx0aGlzLmluZGV0ZXJtaW5hdGU/ITE6TWF0aC5taW4odGhpcy5vcHRpb25zLm1heCxNYXRoLm1heCh0aGlzLm1pbixlKSl9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGUpe3ZhciB0PWUudmFsdWU7ZGVsZXRlIGUudmFsdWUsdGhpcy5fc3VwZXIoZSksdGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX2NvbnN0cmFpbmVkVmFsdWUodCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXsibWF4Ij09PWUmJih0PU1hdGgubWF4KHRoaXMubWluLHQpKSwiZGlzYWJsZWQiPT09ZSYmdGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KS5hdHRyKCJhcmlhLWRpc2FibGVkIix0KSx0aGlzLl9zdXBlcihlLHQpfSxfcGVyY2VudGFnZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV0ZXJtaW5hdGU/MTAwOjEwMCoodGhpcy5vcHRpb25zLnZhbHVlLXRoaXMubWluKS8odGhpcy5vcHRpb25zLm1heC10aGlzLm1pbil9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMudmFsdWUsaT10aGlzLl9wZXJjZW50YWdlKCk7dGhpcy52YWx1ZURpdi50b2dnbGUodGhpcy5pbmRldGVybWluYXRlfHx0PnRoaXMubWluKS50b2dnbGVDbGFzcygidWktY29ybmVyLXJpZ2h0Iix0PT09dGhpcy5vcHRpb25zLm1heCkud2lkdGgoaS50b0ZpeGVkKDApKyIlIiksdGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKCJ1aS1wcm9ncmVzc2Jhci1pbmRldGVybWluYXRlIix0aGlzLmluZGV0ZXJtaW5hdGUpLHRoaXMuaW5kZXRlcm1pbmF0ZT8odGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoImFyaWEtdmFsdWVub3ciKSx0aGlzLm92ZXJsYXlEaXZ8fCh0aGlzLm92ZXJsYXlEaXY9ZSgiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItb3ZlcmxheSc+PC9kaXY+IikuYXBwZW5kVG8odGhpcy52YWx1ZURpdikpKToodGhpcy5lbGVtZW50LmF0dHIoeyJhcmlhLXZhbHVlbWF4Ijp0aGlzLm9wdGlvbnMubWF4LCJhcmlhLXZhbHVlbm93Ijp0fSksdGhpcy5vdmVybGF5RGl2JiYodGhpcy5vdmVybGF5RGl2LnJlbW92ZSgpLHRoaXMub3ZlcmxheURpdj1udWxsKSksdGhpcy5vbGRWYWx1ZSE9PXQmJih0aGlzLm9sZFZhbHVlPXQsdGhpcy5fdHJpZ2dlcigiY2hhbmdlIikpLHQ9PT10aGlzLm9wdGlvbnMubWF4JiZ0aGlzLl90cmlnZ2VyKCJjb21wbGV0ZSIpfX0pLGUud2lkZ2V0KCJ1aS5zZWxlY3RtZW51Iix7dmVyc2lvbjoiMS4xMS40IixkZWZhdWx0RWxlbWVudDoiPHNlbGVjdD4iLG9wdGlvbnM6e2FwcGVuZFRvOm51bGwsZGlzYWJsZWQ6bnVsbCxpY29uczp7YnV0dG9uOiJ1aS1pY29uLXRyaWFuZ2xlLTEtcyJ9LHBvc2l0aW9uOntteToibGVmdCB0b3AiLGF0OiJsZWZ0IGJvdHRvbSIsY29sbGlzaW9uOiJub25lIn0sd2lkdGg6bnVsbCxjaGFuZ2U6bnVsbCxjbG9zZTpudWxsLGZvY3VzOm51bGwsb3BlbjpudWxsLHNlbGVjdDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50LnVuaXF1ZUlkKCkuYXR0cigiaWQiKTt0aGlzLmlkcz17ZWxlbWVudDplLGJ1dHRvbjplKyItYnV0dG9uIixtZW51OmUrIi1tZW51In0sdGhpcy5fZHJhd0J1dHRvbigpLHRoaXMuX2RyYXdNZW51KCksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmRpc2FibGUoKX0sX2RyYXdCdXR0b246ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMubGFiZWw9ZSgibGFiZWxbZm9yPSciK3RoaXMuaWRzLmVsZW1lbnQrIiddIikuYXR0cigiZm9yIix0aGlzLmlkcy5idXR0b24pLHRoaXMuX29uKHRoaXMubGFiZWwse2NsaWNrOmZ1bmN0aW9uKGUpe3RoaXMuYnV0dG9uLmZvY3VzKCksZS5wcmV2ZW50RGVmYXVsdCgpfX0pLHRoaXMuZWxlbWVudC5oaWRlKCksdGhpcy5idXR0b249ZSgiPHNwYW4+Iix7ImNsYXNzIjoidWktc2VsZWN0bWVudS1idXR0b24gdWktd2lkZ2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIsdGFiaW5kZXg6dGhpcy5vcHRpb25zLmRpc2FibGVkPy0xOjAsaWQ6dGhpcy5pZHMuYnV0dG9uLHJvbGU6ImNvbWJvYm94IiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIiwiYXJpYS1hdXRvY29tcGxldGUiOiJsaXN0IiwiYXJpYS1vd25zIjp0aGlzLmlkcy5tZW51LCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9KS5pbnNlcnRBZnRlcih0aGlzLmVsZW1lbnQpLGUoIjxzcGFuPiIseyJjbGFzcyI6InVpLWljb24gIit0aGlzLm9wdGlvbnMuaWNvbnMuYnV0dG9ufSkucHJlcGVuZFRvKHRoaXMuYnV0dG9uKSx0aGlzLmJ1dHRvblRleHQ9ZSgiPHNwYW4+Iix7ImNsYXNzIjoidWktc2VsZWN0bWVudS10ZXh0In0pLmFwcGVuZFRvKHRoaXMuYnV0dG9uKSx0aGlzLl9zZXRUZXh0KHRoaXMuYnV0dG9uVGV4dCx0aGlzLmVsZW1lbnQuZmluZCgib3B0aW9uOnNlbGVjdGVkIikudGV4dCgpKSx0aGlzLl9yZXNpemVCdXR0b24oKSx0aGlzLl9vbih0aGlzLmJ1dHRvbix0aGlzLl9idXR0b25FdmVudHMpLHRoaXMuYnV0dG9uLm9uZSgiZm9jdXNpbiIsZnVuY3Rpb24oKXt0Lm1lbnVJdGVtc3x8dC5fcmVmcmVzaE1lbnUoKX0pLHRoaXMuX2hvdmVyYWJsZSh0aGlzLmJ1dHRvbiksdGhpcy5fZm9jdXNhYmxlKHRoaXMuYnV0dG9uKX0sX2RyYXdNZW51OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLm1lbnU9ZSgiPHVsPiIseyJhcmlhLWhpZGRlbiI6InRydWUiLCJhcmlhLWxhYmVsbGVkYnkiOnRoaXMuaWRzLmJ1dHRvbixpZDp0aGlzLmlkcy5tZW51fSksdGhpcy5tZW51V3JhcD1lKCI8ZGl2PiIseyJjbGFzcyI6InVpLXNlbGVjdG1lbnUtbWVudSB1aS1mcm9udCJ9KS5hcHBlbmQodGhpcy5tZW51KS5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSx0aGlzLm1lbnVJbnN0YW5jZT10aGlzLm1lbnUubWVudSh7cm9sZToibGlzdGJveCIsc2VsZWN0OmZ1bmN0aW9uKGUsaSl7ZS5wcmV2ZW50RGVmYXVsdCgpLHQuX3NldFNlbGVjdGlvbigpLHQuX3NlbGVjdChpLml0ZW0uZGF0YSgidWktc2VsZWN0bWVudS1pdGVtIiksZSl9LGZvY3VzOmZ1bmN0aW9uKGUsaSl7dmFyIHM9aS5pdGVtLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIpO251bGwhPXQuZm9jdXNJbmRleCYmcy5pbmRleCE9PXQuZm9jdXNJbmRleCYmKHQuX3RyaWdnZXIoImZvY3VzIixlLHtpdGVtOnN9KSx0LmlzT3Blbnx8dC5fc2VsZWN0KHMsZSkpLHQuZm9jdXNJbmRleD1zLmluZGV4LHQuYnV0dG9uLmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsdC5tZW51SXRlbXMuZXEocy5pbmRleCkuYXR0cigiaWQiKSl9fSkubWVudSgiaW5zdGFuY2UiKSx0aGlzLm1lbnUuYWRkQ2xhc3MoInVpLWNvcm5lci1ib3R0b20iKS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCIpLHRoaXMubWVudUluc3RhbmNlLl9vZmYodGhpcy5tZW51LCJtb3VzZWxlYXZlIiksdGhpcy5tZW51SW5zdGFuY2UuX2Nsb3NlT25Eb2N1bWVudENsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHRoaXMubWVudUluc3RhbmNlLl9pc0RpdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMX19LHJlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9yZWZyZXNoTWVudSgpLHRoaXMuX3NldFRleHQodGhpcy5idXR0b25UZXh0LHRoaXMuX2dldFNlbGVjdGVkSXRlbSgpLnRleHQoKSksdGhpcy5vcHRpb25zLndpZHRofHx0aGlzLl9yZXNpemVCdXR0b24oKX0sX3JlZnJlc2hNZW51OmZ1bmN0aW9uKCl7dGhpcy5tZW51LmVtcHR5KCk7dmFyIGUsdD10aGlzLmVsZW1lbnQuZmluZCgib3B0aW9uIik7dC5sZW5ndGgmJih0aGlzLl9wYXJzZU9wdGlvbnModCksdGhpcy5fcmVuZGVyTWVudSh0aGlzLm1lbnUsdGhpcy5pdGVtcyksdGhpcy5tZW51SW5zdGFuY2UucmVmcmVzaCgpLHRoaXMubWVudUl0ZW1zPXRoaXMubWVudS5maW5kKCJsaSIpLm5vdCgiLnVpLXNlbGVjdG1lbnUtb3B0Z3JvdXAiKSxlPXRoaXMuX2dldFNlbGVjdGVkSXRlbSgpLHRoaXMubWVudUluc3RhbmNlLmZvY3VzKG51bGwsZSksdGhpcy5fc2V0QXJpYShlLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIpKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIix0aGlzLmVsZW1lbnQucHJvcCgiZGlzYWJsZWQiKSkpfSxvcGVuOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy5kaXNhYmxlZHx8KHRoaXMubWVudUl0ZW1zPyh0aGlzLm1lbnUuZmluZCgiLnVpLXN0YXRlLWZvY3VzIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIiksdGhpcy5tZW51SW5zdGFuY2UuZm9jdXMobnVsbCx0aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKSkpOnRoaXMuX3JlZnJlc2hNZW51KCksdGhpcy5pc09wZW49ITAsdGhpcy5fdG9nZ2xlQXR0cigpLHRoaXMuX3Jlc2l6ZU1lbnUoKSx0aGlzLl9wb3NpdGlvbigpLHRoaXMuX29uKHRoaXMuZG9jdW1lbnQsdGhpcy5fZG9jdW1lbnRDbGljayksdGhpcy5fdHJpZ2dlcigib3BlbiIsZSkpfSxfcG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLm1lbnVXcmFwLnBvc2l0aW9uKGUuZXh0ZW5kKHtvZjp0aGlzLmJ1dHRvbn0sdGhpcy5vcHRpb25zLnBvc2l0aW9uKSl9LGNsb3NlOmZ1bmN0aW9uKGUpe3RoaXMuaXNPcGVuJiYodGhpcy5pc09wZW49ITEsdGhpcy5fdG9nZ2xlQXR0cigpLHRoaXMucmFuZ2U9bnVsbCx0aGlzLl9vZmYodGhpcy5kb2N1bWVudCksdGhpcy5fdHJpZ2dlcigiY2xvc2UiLGUpKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9ufSxtZW51V2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudX0sX3JlbmRlck1lbnU6ZnVuY3Rpb24odCxpKXt2YXIgcz10aGlzLG49IiI7ZS5lYWNoKGksZnVuY3Rpb24oaSxhKXthLm9wdGdyb3VwIT09biYmKGUoIjxsaT4iLHsiY2xhc3MiOiJ1aS1zZWxlY3RtZW51LW9wdGdyb3VwIHVpLW1lbnUtZGl2aWRlciIrKGEuZWxlbWVudC5wYXJlbnQoIm9wdGdyb3VwIikucHJvcCgiZGlzYWJsZWQiKT8iIHVpLXN0YXRlLWRpc2FibGVkIjoiIiksdGV4dDphLm9wdGdyb3VwfSkuYXBwZW5kVG8odCksbj1hLm9wdGdyb3VwKSxzLl9yZW5kZXJJdGVtRGF0YSh0LGEpfSl9LF9yZW5kZXJJdGVtRGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9yZW5kZXJJdGVtKGUsdCkuZGF0YSgidWktc2VsZWN0bWVudS1pdGVtIix0KX0sX3JlbmRlckl0ZW06ZnVuY3Rpb24odCxpKXt2YXIgcz1lKCI8bGk+Iik7cmV0dXJuIGkuZGlzYWJsZWQmJnMuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksdGhpcy5fc2V0VGV4dChzLGkubGFiZWwpLHMuYXBwZW5kVG8odCl9LF9zZXRUZXh0OmZ1bmN0aW9uKGUsdCl7dD9lLnRleHQodCk6ZS5odG1sKCImIzE2MDsiKX0sX21vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49Ii51aS1tZW51LWl0ZW0iO3RoaXMuaXNPcGVuP2k9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5mb2N1c0luZGV4KTooaT10aGlzLm1lbnVJdGVtcy5lcSh0aGlzLmVsZW1lbnRbMF0uc2VsZWN0ZWRJbmRleCksbis9Ijpub3QoLnVpLXN0YXRlLWRpc2FibGVkKSIpLHM9ImZpcnN0Ij09PWV8fCJsYXN0Ij09PWU/aVsiZmlyc3QiPT09ZT8icHJldkFsbCI6Im5leHRBbGwiXShuKS5lcSgtMSk6aVtlKyJBbGwiXShuKS5lcSgwKSxzLmxlbmd0aCYmdGhpcy5tZW51SW5zdGFuY2UuZm9jdXModCxzKX0sX2dldFNlbGVjdGVkSXRlbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnVJdGVtcy5lcSh0aGlzLmVsZW1lbnRbMF0uc2VsZWN0ZWRJbmRleCl9LF90b2dnbGU6ZnVuY3Rpb24oZSl7dGhpc1t0aGlzLmlzT3Blbj8iY2xvc2UiOiJvcGVuIl0oZSl9LF9zZXRTZWxlY3Rpb246ZnVuY3Rpb24oKXt2YXIgZTt0aGlzLnJhbmdlJiYod2luZG93LmdldFNlbGVjdGlvbj8oZT13aW5kb3cuZ2V0U2VsZWN0aW9uKCksZS5yZW1vdmVBbGxSYW5nZXMoKSxlLmFkZFJhbmdlKHRoaXMucmFuZ2UpKTp0aGlzLnJhbmdlLnNlbGVjdCgpLHRoaXMuYnV0dG9uLmZvY3VzKCkpfSxfZG9jdW1lbnRDbGljazp7bW91c2Vkb3duOmZ1bmN0aW9uKHQpe3RoaXMuaXNPcGVuJiYoZSh0LnRhcmdldCkuY2xvc2VzdCgiLnVpLXNlbGVjdG1lbnUtbWVudSwgIyIrdGhpcy5pZHMuYnV0dG9uKS5sZW5ndGh8fHRoaXMuY2xvc2UodCkpfX0sX2J1dHRvbkV2ZW50czp7bW91c2Vkb3duOmZ1bmN0aW9uKCl7dmFyIGU7d2luZG93LmdldFNlbGVjdGlvbj8oZT13aW5kb3cuZ2V0U2VsZWN0aW9uKCksZS5yYW5nZUNvdW50JiYodGhpcy5yYW5nZT1lLmdldFJhbmdlQXQoMCkpKTp0aGlzLnJhbmdlPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpfSxjbGljazpmdW5jdGlvbihlKXt0aGlzLl9zZXRTZWxlY3Rpb24oKSx0aGlzLl90b2dnbGUoZSl9LGtleWRvd246ZnVuY3Rpb24odCl7dmFyIGk9ITA7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBlLnVpLmtleUNvZGUuVEFCOmNhc2UgZS51aS5rZXlDb2RlLkVTQ0FQRTp0aGlzLmNsb3NlKHQpLGk9ITE7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5URVI6dGhpcy5pc09wZW4mJnRoaXMuX3NlbGVjdEZvY3VzZWRJdGVtKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOnQuYWx0S2V5P3RoaXMuX3RvZ2dsZSh0KTp0aGlzLl9tb3ZlKCJwcmV2Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5ET1dOOnQuYWx0S2V5P3RoaXMuX3RvZ2dsZSh0KTp0aGlzLl9tb3ZlKCJuZXh0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5TUEFDRTp0aGlzLmlzT3Blbj90aGlzLl9zZWxlY3RGb2N1c2VkSXRlbSh0KTp0aGlzLl90b2dnbGUodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDp0aGlzLl9tb3ZlKCJwcmV2Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5SSUdIVDp0aGlzLl9tb3ZlKCJuZXh0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5IT01FOmNhc2UgZS51aS5rZXlDb2RlLlBBR0VfVVA6dGhpcy5fbW92ZSgiZmlyc3QiLHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkVORDpjYXNlIGUudWkua2V5Q29kZS5QQUdFX0RPV046dGhpcy5fbW92ZSgibGFzdCIsdCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm1lbnUudHJpZ2dlcih0KSxpPSExfWkmJnQucHJldmVudERlZmF1bHQoKX19LF9zZWxlY3RGb2N1c2VkSXRlbTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm1lbnVJdGVtcy5lcSh0aGlzLmZvY3VzSW5kZXgpO3QuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIil8fHRoaXMuX3NlbGVjdCh0LmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIpLGUpfSxfc2VsZWN0OmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXg7dGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXg9ZS5pbmRleCx0aGlzLl9zZXRUZXh0KHRoaXMuYnV0dG9uVGV4dCxlLmxhYmVsKSx0aGlzLl9zZXRBcmlhKGUpLHRoaXMuX3RyaWdnZXIoInNlbGVjdCIsdCx7aXRlbTplfSksZS5pbmRleCE9PWkmJnRoaXMuX3RyaWdnZXIoImNoYW5nZSIsdCx7aXRlbTplfSksdGhpcy5jbG9zZSh0KX0sX3NldEFyaWE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tZW51SXRlbXMuZXEoZS5pbmRleCkuYXR0cigiaWQiKTt0aGlzLmJ1dHRvbi5hdHRyKHsiYXJpYS1sYWJlbGxlZGJ5Ijp0LCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiOnR9KSx0aGlzLm1lbnUuYXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50Iix0KX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpeyJpY29ucyI9PT1lJiZ0aGlzLmJ1dHRvbi5maW5kKCJzcGFuLnVpLWljb24iKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaWNvbnMuYnV0dG9uKS5hZGRDbGFzcyh0LmJ1dHRvbiksdGhpcy5fc3VwZXIoZSx0KSwiYXBwZW5kVG8iPT09ZSYmdGhpcy5tZW51V3JhcC5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwiZGlzYWJsZWQiPT09ZSYmKHRoaXMubWVudUluc3RhbmNlLm9wdGlvbigiZGlzYWJsZWQiLHQpLHRoaXMuYnV0dG9uLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIix0KSx0Pyh0aGlzLmJ1dHRvbi5hdHRyKCJ0YWJpbmRleCIsLTEpLHRoaXMuY2xvc2UoKSk6dGhpcy5idXR0b24uYXR0cigidGFiaW5kZXgiLDApKSwid2lkdGgiPT09ZSYmdGhpcy5fcmVzaXplQnV0dG9uKCl9LF9hcHBlbmRUbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5hcHBlbmRUbztyZXR1cm4gdCYmKHQ9dC5qcXVlcnl8fHQubm9kZVR5cGU/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodCkuZXEoMCkpLHQmJnRbMF18fCh0PXRoaXMuZWxlbWVudC5jbG9zZXN0KCIudWktZnJvbnQiKSksdC5sZW5ndGh8fCh0PXRoaXMuZG9jdW1lbnRbMF0uYm9keSksdH0sX3RvZ2dsZUF0dHI6ZnVuY3Rpb24oKXt0aGlzLmJ1dHRvbi50b2dnbGVDbGFzcygidWktY29ybmVyLXRvcCIsdGhpcy5pc09wZW4pLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItYWxsIiwhdGhpcy5pc09wZW4pLmF0dHIoImFyaWEtZXhwYW5kZWQiLHRoaXMuaXNPcGVuKSx0aGlzLm1lbnVXcmFwLnRvZ2dsZUNsYXNzKCJ1aS1zZWxlY3RtZW51LW9wZW4iLHRoaXMuaXNPcGVuKSx0aGlzLm1lbnUuYXR0cigiYXJpYS1oaWRkZW4iLCF0aGlzLmlzT3Blbil9LF9yZXNpemVCdXR0b246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMud2lkdGg7ZXx8KGU9dGhpcy5lbGVtZW50LnNob3coKS5vdXRlcldpZHRoKCksdGhpcy5lbGVtZW50LmhpZGUoKSksdGhpcy5idXR0b24ub3V0ZXJXaWR0aChlKX0sX3Jlc2l6ZU1lbnU6ZnVuY3Rpb24oKXt0aGlzLm1lbnUub3V0ZXJXaWR0aChNYXRoLm1heCh0aGlzLmJ1dHRvbi5vdXRlcldpZHRoKCksdGhpcy5tZW51LndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSkpfSxfZ2V0Q3JlYXRlT3B0aW9uczpmdW5jdGlvbigpe3JldHVybntkaXNhYmxlZDp0aGlzLmVsZW1lbnQucHJvcCgiZGlzYWJsZWQiKX19LF9wYXJzZU9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGk9W107dC5lYWNoKGZ1bmN0aW9uKHQscyl7dmFyIG49ZShzKSxhPW4ucGFyZW50KCJvcHRncm91cCIpO2kucHVzaCh7ZWxlbWVudDpuLGluZGV4OnQsdmFsdWU6bi52YWwoKSxsYWJlbDpuLnRleHQoKSxvcHRncm91cDphLmF0dHIoImxhYmVsIil8fCIiLGRpc2FibGVkOmEucHJvcCgiZGlzYWJsZWQiKXx8bi5wcm9wKCJkaXNhYmxlZCIpfSl9KSx0aGlzLml0ZW1zPWl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5tZW51V3JhcC5yZW1vdmUoKSx0aGlzLmJ1dHRvbi5yZW1vdmUoKSx0aGlzLmVsZW1lbnQuc2hvdygpLHRoaXMuZWxlbWVudC5yZW1vdmVVbmlxdWVJZCgpLHRoaXMubGFiZWwuYXR0cigiZm9yIix0aGlzLmlkcy5lbGVtZW50KX19KSxlLndpZGdldCgidWkuc2xpZGVyIixlLnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjExLjQiLHdpZGdldEV2ZW50UHJlZml4OiJzbGlkZSIsb3B0aW9uczp7YW5pbWF0ZTohMSxkaXN0YW5jZTowLG1heDoxMDAsbWluOjAsb3JpZW50YXRpb246Imhvcml6b250YWwiLHJhbmdlOiExLHN0ZXA6MSx2YWx1ZTowLHZhbHVlczpudWxsLGNoYW5nZTpudWxsLHNsaWRlOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LG51bVBhZ2VzOjUsX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX2tleVNsaWRpbmc9ITEsdGhpcy5fbW91c2VTbGlkaW5nPSExLHRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5faGFuZGxlSW5kZXg9bnVsbCx0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuX2NhbGN1bGF0ZU5ld01heCgpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2xpZGVyIHVpLXNsaWRlci0iK3RoaXMub3JpZW50YXRpb24rIiB1aS13aWRnZXQiKyIgdWktd2lkZ2V0LWNvbnRlbnQiKyIgdWktY29ybmVyLWFsbCIpLHRoaXMuX3JlZnJlc2goKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIix0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLHRoaXMuX2FuaW1hdGVPZmY9ITF9LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fY3JlYXRlUmFuZ2UoKSx0aGlzLl9jcmVhdGVIYW5kbGVzKCksdGhpcy5fc2V0dXBFdmVudHMoKSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX2NyZWF0ZUhhbmRsZXM6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcy5vcHRpb25zLG49dGhpcy5lbGVtZW50LmZpbmQoIi51aS1zbGlkZXItaGFuZGxlIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLGE9IjxzcGFuIGNsYXNzPSd1aS1zbGlkZXItaGFuZGxlIHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcgdGFiaW5kZXg9JzAnPjwvc3Bhbj4iLG89W107Zm9yKGk9cy52YWx1ZXMmJnMudmFsdWVzLmxlbmd0aHx8MSxuLmxlbmd0aD5pJiYobi5zbGljZShpKS5yZW1vdmUoKSxuPW4uc2xpY2UoMCxpKSksdD1uLmxlbmd0aDtpPnQ7dCsrKW8ucHVzaChhKTt0aGlzLmhhbmRsZXM9bi5hZGQoZShvLmpvaW4oIiIpKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpKSx0aGlzLmhhbmRsZT10aGlzLmhhbmRsZXMuZXEoMCksdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24odCl7ZSh0aGlzKS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iix0KX0pfSxfY3JlYXRlUmFuZ2U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsaT0iIjt0LnJhbmdlPyh0LnJhbmdlPT09ITAmJih0LnZhbHVlcz90LnZhbHVlcy5sZW5ndGgmJjIhPT10LnZhbHVlcy5sZW5ndGg/dC52YWx1ZXM9W3QudmFsdWVzWzBdLHQudmFsdWVzWzBdXTplLmlzQXJyYXkodC52YWx1ZXMpJiYodC52YWx1ZXM9dC52YWx1ZXMuc2xpY2UoMCkpOnQudmFsdWVzPVt0aGlzLl92YWx1ZU1pbigpLHRoaXMuX3ZhbHVlTWluKCldKSx0aGlzLnJhbmdlJiZ0aGlzLnJhbmdlLmxlbmd0aD90aGlzLnJhbmdlLnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItcmFuZ2UtbWluIHVpLXNsaWRlci1yYW5nZS1tYXgiKS5jc3Moe2xlZnQ6IiIsYm90dG9tOiIifSk6KHRoaXMucmFuZ2U9ZSgiPGRpdj48L2Rpdj4iKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpLGk9InVpLXNsaWRlci1yYW5nZSB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKSx0aGlzLnJhbmdlLmFkZENsYXNzKGkrKCJtaW4iPT09dC5yYW5nZXx8Im1heCI9PT10LnJhbmdlPyIgdWktc2xpZGVyLXJhbmdlLSIrdC5yYW5nZToiIikpKToodGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLnJhbmdlPW51bGwpfSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLl9vZmYodGhpcy5oYW5kbGVzKSx0aGlzLl9vbih0aGlzLmhhbmRsZXMsdGhpcy5faGFuZGxlRXZlbnRzKSx0aGlzLl9ob3ZlcmFibGUodGhpcy5oYW5kbGVzKSx0aGlzLl9mb2N1c2FibGUodGhpcy5oYW5kbGVzKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXMucmVtb3ZlKCksdGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKSx0aGlzLl9tb3VzZURlc3Ryb3koKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvLHIsaCxsLHU9dGhpcyxkPXRoaXMub3B0aW9ucztyZXR1cm4gZC5kaXNhYmxlZD8hMToodGhpcy5lbGVtZW50U2l6ZT17d2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCl9LHRoaXMuZWxlbWVudE9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksaT17eDp0LnBhZ2VYLHk6dC5wYWdlWX0scz10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoaSksbj10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkrMSx0aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbih0KXt2YXIgaT1NYXRoLmFicyhzLXUudmFsdWVzKHQpKTsobj5pfHxuPT09aSYmKHQ9PT11Ll9sYXN0Q2hhbmdlZFZhbHVlfHx1LnZhbHVlcyh0KT09PWQubWluKSkmJihuPWksYT1lKHRoaXMpLG89dCl9KSxyPXRoaXMuX3N0YXJ0KHQsbykscj09PSExPyExOih0aGlzLl9tb3VzZVNsaWRpbmc9ITAsdGhpcy5faGFuZGxlSW5kZXg9byxhLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5mb2N1cygpLGg9YS5vZmZzZXQoKSxsPSFlKHQudGFyZ2V0KS5wYXJlbnRzKCkuYWRkQmFjaygpLmlzKCIudWktc2xpZGVyLWhhbmRsZSIpLHRoaXMuX2NsaWNrT2Zmc2V0PWw/e2xlZnQ6MCx0b3A6MH06e2xlZnQ6dC5wYWdlWC1oLmxlZnQtYS53aWR0aCgpLzIsdG9wOnQucGFnZVktaC50b3AtYS5oZWlnaHQoKS8yLShwYXJzZUludChhLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChhLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChhLmNzcygibWFyZ2luVG9wIiksMTApfHwwKX0sdGhpcy5oYW5kbGVzLmhhc0NsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfHx0aGlzLl9zbGlkZSh0LG8scyksdGhpcy5fYW5pbWF0ZU9mZj0hMCwhMCkpfSxfbW91c2VTdGFydDpmdW5jdGlvbigpe3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGUpe3ZhciB0PXt4OmUucGFnZVgseTplLnBhZ2VZfSxpPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZSh0KTtyZXR1cm4gdGhpcy5fc2xpZGUoZSx0aGlzLl9oYW5kbGVJbmRleCxpKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5oYW5kbGVzLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fc3RvcChlLHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9jaGFuZ2UoZSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5faGFuZGxlSW5kZXg9bnVsbCx0aGlzLl9jbGlja09mZnNldD1udWxsLHRoaXMuX2FuaW1hdGVPZmY9ITEsITF9LF9kZXRlY3RPcmllbnRhdGlvbjpmdW5jdGlvbigpe3RoaXMub3JpZW50YXRpb249InZlcnRpY2FsIj09PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbj8idmVydGljYWwiOiJob3Jpem9udGFsIn0sX25vcm1WYWx1ZUZyb21Nb3VzZTpmdW5jdGlvbihlKXt2YXIgdCxpLHMsbixhO3JldHVybiJob3Jpem9udGFsIj09PXRoaXMub3JpZW50YXRpb24/KHQ9dGhpcy5lbGVtZW50U2l6ZS53aWR0aCxpPWUueC10aGlzLmVsZW1lbnRPZmZzZXQubGVmdC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQubGVmdDowKSk6KHQ9dGhpcy5lbGVtZW50U2l6ZS5oZWlnaHQsaT1lLnktdGhpcy5lbGVtZW50T2Zmc2V0LnRvcC0odGhpcy5fY2xpY2tPZmZzZXQ/dGhpcy5fY2xpY2tPZmZzZXQudG9wOjApKSxzPWkvdCxzPjEmJihzPTEpLDA+cyYmKHM9MCksInZlcnRpY2FsIj09PXRoaXMub3JpZW50YXRpb24mJihzPTEtcyksbj10aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCksYT10aGlzLl92YWx1ZU1pbigpK3Mqbix0aGlzLl90cmltQWxpZ25WYWx1ZShhKX0sX3N0YXJ0OmZ1bmN0aW9uKGUsdCl7dmFyIGk9e2hhbmRsZTp0aGlzLmhhbmRsZXNbdF0sdmFsdWU6dGhpcy52YWx1ZSgpfTtyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihpLnZhbHVlPXRoaXMudmFsdWVzKHQpLGkudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixlLGkpfSxfc2xpZGU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzLG4sYTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD8ocz10aGlzLnZhbHVlcyh0PzA6MSksMj09PXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiZ0aGlzLm9wdGlvbnMucmFuZ2U9PT0hMCYmKDA9PT10JiZpPnN8fDE9PT10JiZzPmkpJiYoaT1zKSxpIT09dGhpcy52YWx1ZXModCkmJihuPXRoaXMudmFsdWVzKCksblt0XT1pLGE9dGhpcy5fdHJpZ2dlcigic2xpZGUiLGUse2hhbmRsZTp0aGlzLmhhbmRsZXNbdF0sdmFsdWU6aSx2YWx1ZXM6bn0pLHM9dGhpcy52YWx1ZXModD8wOjEpLGEhPT0hMSYmdGhpcy52YWx1ZXModCxpKSkpOmkhPT10aGlzLnZhbHVlKCkmJihhPXRoaXMuX3RyaWdnZXIoInNsaWRlIixlLHtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOml9KSxhIT09ITEmJnRoaXMudmFsdWUoaSkpfSxfc3RvcDpmdW5jdGlvbihlLHQpe3ZhciBpPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihpLnZhbHVlPXRoaXMudmFsdWVzKHQpLGkudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoInN0b3AiLGUsaSl9LF9jaGFuZ2U6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5fa2V5U2xpZGluZyYmIXRoaXMuX21vdXNlU2xpZGluZyl7dmFyIGk9e2hhbmRsZTp0aGlzLmhhbmRsZXNbdF0sdmFsdWU6dGhpcy52YWx1ZSgpfTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmKGkudmFsdWU9dGhpcy52YWx1ZXModCksaS52YWx1ZXM9dGhpcy52YWx1ZXMoKSksdGhpcy5fbGFzdENoYW5nZWRWYWx1ZT10LHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsZSxpKX19LHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdHJpbUFsaWduVmFsdWUoZSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsMCksdm9pZCAwKTp0aGlzLl92YWx1ZSgpfSx2YWx1ZXM6ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGE7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiB0aGlzLm9wdGlvbnMudmFsdWVzW3RdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGkpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLHQpLHZvaWQgMDtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdmFsdWVzKCk7aWYoIWUuaXNBcnJheShhcmd1bWVudHNbMF0pKXJldHVybiB0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLl92YWx1ZXModCk6dGhpcy52YWx1ZSgpO2ZvcihzPXRoaXMub3B0aW9ucy52YWx1ZXMsbj1hcmd1bWVudHNbMF0sYT0wO3MubGVuZ3RoPmE7YSs9MSlzW2FdPXRoaXMuX3RyaW1BbGlnblZhbHVlKG5bYV0pLHRoaXMuX2NoYW5nZShudWxsLGEpO3RoaXMuX3JlZnJlc2hWYWx1ZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbj0wO3N3aXRjaCgicmFuZ2UiPT09dCYmdGhpcy5vcHRpb25zLnJhbmdlPT09ITAmJigibWluIj09PWk/KHRoaXMub3B0aW9ucy52YWx1ZT10aGlzLl92YWx1ZXMoMCksdGhpcy5vcHRpb25zLnZhbHVlcz1udWxsKToibWF4Ij09PWkmJih0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoLTEpLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCkpLGUuaXNBcnJheSh0aGlzLm9wdGlvbnMudmFsdWVzKSYmKG49dGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgpLCJkaXNhYmxlZCI9PT10JiZ0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiwhIWkpLHRoaXMuX3N1cGVyKHQsaSksdCl7Y2FzZSJvcmllbnRhdGlvbiI6dGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCIpLmFkZENsYXNzKCJ1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLmhhbmRsZXMuY3NzKCJob3Jpem9udGFsIj09PWk/ImJvdHRvbSI6ImxlZnQiLCIiKTticmVhaztjYXNlInZhbHVlIjp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLDApLHRoaXMuX2FuaW1hdGVPZmY9ITE7YnJlYWs7Y2FzZSJ2YWx1ZXMiOmZvcih0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHM9MDtuPnM7cys9MSl0aGlzLl9jaGFuZ2UobnVsbCxzKTt0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2Uic3RlcCI6Y2FzZSJtaW4iOmNhc2UibWF4Ijp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2NhbGN1bGF0ZU5ld01heCgpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2FuaW1hdGVPZmY9ITE7YnJlYWs7Y2FzZSJyYW5nZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX19LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gZT10aGlzLl90cmltQWxpZ25WYWx1ZShlKX0sX3ZhbHVlczpmdW5jdGlvbihlKXt2YXIgdCxpLHM7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdD10aGlzLm9wdGlvbnMudmFsdWVzW2VdLHQ9dGhpcy5fdHJpbUFsaWduVmFsdWUodCk7aWYodGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgpe2ZvcihpPXRoaXMub3B0aW9ucy52YWx1ZXMuc2xpY2UoKSxzPTA7aS5sZW5ndGg+cztzKz0xKWlbc109dGhpcy5fdHJpbUFsaWduVmFsdWUoaVtzXSk7cmV0dXJuIGl9cmV0dXJuW119LF90cmltQWxpZ25WYWx1ZTpmdW5jdGlvbihlKXtpZih0aGlzLl92YWx1ZU1pbigpPj1lKXJldHVybiB0aGlzLl92YWx1ZU1pbigpO2lmKGU+PXRoaXMuX3ZhbHVlTWF4KCkpcmV0dXJuIHRoaXMuX3ZhbHVlTWF4KCk7dmFyIHQ9dGhpcy5vcHRpb25zLnN0ZXA+MD90aGlzLm9wdGlvbnMuc3RlcDoxLGk9KGUtdGhpcy5fdmFsdWVNaW4oKSkldCxzPWUtaTtyZXR1cm4gMipNYXRoLmFicyhpKT49dCYmKHMrPWk+MD90Oi10KSxwYXJzZUZsb2F0KHMudG9GaXhlZCg1KSl9LF9jYWxjdWxhdGVOZXdNYXg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMubWF4LHQ9dGhpcy5fdmFsdWVNaW4oKSxpPXRoaXMub3B0aW9ucy5zdGVwLHM9TWF0aC5mbG9vcigrKGUtdCkudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkvaSkqaTtlPXMrdCx0aGlzLm1heD1wYXJzZUZsb2F0KGUudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkpfSxfcHJlY2lzaW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLnN0ZXApO3JldHVybiBudWxsIT09dGhpcy5vcHRpb25zLm1pbiYmKGU9TWF0aC5tYXgoZSx0aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMubWluKSkpLGV9LF9wcmVjaXNpb25PZjpmdW5jdGlvbihlKXt2YXIgdD0iIitlLGk9dC5pbmRleE9mKCIuIik7cmV0dXJuLTE9PT1pPzA6dC5sZW5ndGgtaS0xfSxfdmFsdWVNaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1pbn0sX3ZhbHVlTWF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4fSxfcmVmcmVzaFZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG4sYSxvPXRoaXMub3B0aW9ucy5yYW5nZSxyPXRoaXMub3B0aW9ucyxoPXRoaXMsbD10aGlzLl9hbmltYXRlT2ZmPyExOnIuYW5pbWF0ZSx1PXt9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoP3RoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKHMpe2k9MTAwKigoaC52YWx1ZXMocyktaC5fdmFsdWVNaW4oKSkvKGguX3ZhbHVlTWF4KCktaC5fdmFsdWVNaW4oKSkpLHVbImhvcml6b250YWwiPT09aC5vcmllbnRhdGlvbj8ibGVmdCI6ImJvdHRvbSJdPWkrIiUiLGUodGhpcykuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh1LHIuYW5pbWF0ZSksaC5vcHRpb25zLnJhbmdlPT09ITAmJigiaG9yaXpvbnRhbCI9PT1oLm9yaWVudGF0aW9uPygwPT09cyYmaC5yYW5nZS5zdG9wKDEsMSlbbD8iYW5pbWF0ZSI6ImNzcyJdKHtsZWZ0OmkrIiUifSxyLmFuaW1hdGUpLDE9PT1zJiZoLnJhbmdlW2w/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6aS10KyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOnIuYW5pbWF0ZX0pKTooMD09PXMmJmgucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7Ym90dG9tOmkrIiUifSxyLmFuaW1hdGUpLDE9PT1zJiZoLnJhbmdlW2w/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OmktdCsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpyLmFuaW1hdGV9KSkpLHQ9aX0pOihzPXRoaXMudmFsdWUoKSxuPXRoaXMuX3ZhbHVlTWluKCksYT10aGlzLl92YWx1ZU1heCgpLGk9YSE9PW4/MTAwKigocy1uKS8oYS1uKSk6MCx1WyJob3Jpem9udGFsIj09PXRoaXMub3JpZW50YXRpb24/ImxlZnQiOiJib3R0b20iXT1pKyIlIix0aGlzLmhhbmRsZS5zdG9wKDEsMSlbbD8iYW5pbWF0ZSI6ImNzcyJdKHUsci5hbmltYXRlKSwibWluIj09PW8mJiJob3Jpem9udGFsIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6aSsiJSJ9LHIuYW5pbWF0ZSksIm1heCI9PT1vJiYiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uJiZ0aGlzLnJhbmdlW2w/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6MTAwLWkrIiUifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSksIm1pbiI9PT1vJiYidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbbD8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6aSsiJSJ9LHIuYW5pbWF0ZSksIm1heCI9PT1vJiYidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDoxMDAtaSsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpyLmFuaW1hdGV9KSl9LF9oYW5kbGVFdmVudHM6e2tleWRvd246ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz1lKHQudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpjYXNlIGUudWkua2V5Q29kZS5FTkQ6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9VUDpjYXNlIGUudWkua2V5Q29kZS5QQUdFX0RPV046Y2FzZSBlLnVpLmtleUNvZGUuVVA6Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjpjYXNlIGUudWkua2V5Q29kZS5MRUZUOmlmKHQucHJldmVudERlZmF1bHQoKSwhdGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITAsZSh0LnRhcmdldCkuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGk9dGhpcy5fc3RhcnQodCxvKSxpPT09ITEpKXJldHVybn1zd2l0Y2goYT10aGlzLm9wdGlvbnMuc3RlcCxzPW49dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy52YWx1ZXMobyk6dGhpcy52YWx1ZSgpLHQua2V5Q29kZSl7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpuPXRoaXMuX3ZhbHVlTWluKCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOm49dGhpcy5fdmFsdWVNYXgoKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOm49dGhpcy5fdHJpbUFsaWduVmFsdWUocysodGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKS90aGlzLm51bVBhZ2VzKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5QQUdFX0RPV046bj10aGlzLl90cmltQWxpZ25WYWx1ZShzLSh0aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkpL3RoaXMubnVtUGFnZXMpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmlmKHM9PT10aGlzLl92YWx1ZU1heCgpKXJldHVybjtuPXRoaXMuX3RyaW1BbGlnblZhbHVlKHMrYSk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjpjYXNlIGUudWkua2V5Q29kZS5MRUZUOmlmKHM9PT10aGlzLl92YWx1ZU1pbigpKXJldHVybjtuPXRoaXMuX3RyaW1BbGlnblZhbHVlKHMtYSl9dGhpcy5fc2xpZGUodCxvLG4pfSxrZXl1cDpmdW5jdGlvbih0KXt2YXIgaT1lKHQudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7dGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITEsdGhpcy5fc3RvcCh0LGkpLHRoaXMuX2NoYW5nZSh0LGkpLGUodC50YXJnZXQpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSl9fX0pLGUud2lkZ2V0KCJ1aS5zcGlubmVyIix7dmVyc2lvbjoiMS4xMS40IixkZWZhdWx0RWxlbWVudDoiPGlucHV0PiIsd2lkZ2V0RXZlbnRQcmVmaXg6InNwaW4iLG9wdGlvbnM6e2N1bHR1cmU6bnVsbCxpY29uczp7ZG93bjoidWktaWNvbi10cmlhbmdsZS0xLXMiLHVwOiJ1aS1pY29uLXRyaWFuZ2xlLTEtbiJ9LGluY3JlbWVudGFsOiEwLG1heDpudWxsLG1pbjpudWxsLG51bWJlckZvcm1hdDpudWxsLHBhZ2U6MTAsc3RlcDoxLGNoYW5nZTpudWxsLHNwaW46bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3NldE9wdGlvbigibWF4Iix0aGlzLm9wdGlvbnMubWF4KSx0aGlzLl9zZXRPcHRpb24oIm1pbiIsdGhpcy5vcHRpb25zLm1pbiksdGhpcy5fc2V0T3B0aW9uKCJzdGVwIix0aGlzLm9wdGlvbnMuc3RlcCksIiIhPT10aGlzLnZhbHVlKCkmJnRoaXMuX3ZhbHVlKHRoaXMuZWxlbWVudC52YWwoKSwhMCksdGhpcy5fZHJhdygpLHRoaXMuX29uKHRoaXMuX2V2ZW50cyksdGhpcy5fcmVmcmVzaCgpLHRoaXMuX29uKHRoaXMud2luZG93LHtiZWZvcmV1bmxvYWQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIil9fSl9LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIHQ9e30saT10aGlzLmVsZW1lbnQ7cmV0dXJuIGUuZWFjaChbIm1pbiIsIm1heCIsInN0ZXAiXSxmdW5jdGlvbihlLHMpe3ZhciBuPWkuYXR0cihzKTt2b2lkIDAhPT1uJiZuLmxlbmd0aCYmKHRbc109bil9KSx0fSxfZXZlbnRzOntrZXlkb3duOmZ1bmN0aW9uKGUpe3RoaXMuX3N0YXJ0KGUpJiZ0aGlzLl9rZXlkb3duKGUpJiZlLnByZXZlbnREZWZhdWx0KCl9LGtleXVwOiJfc3RvcCIsZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXRoaXMuZWxlbWVudC52YWwoKX0sYmx1cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jYW5jZWxCbHVyPyhkZWxldGUgdGhpcy5jYW5jZWxCbHVyLHZvaWQgMCk6KHRoaXMuX3N0b3AoKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5wcmV2aW91cyE9PXRoaXMuZWxlbWVudC52YWwoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlKSx2b2lkIDApfSxtb3VzZXdoZWVsOmZ1bmN0aW9uKGUsdCl7aWYodCl7aWYoIXRoaXMuc3Bpbm5pbmcmJiF0aGlzLl9zdGFydChlKSlyZXR1cm4hMTt0aGlzLl9zcGluKCh0PjA/MTotMSkqdGhpcy5vcHRpb25zLnN0ZXAsZSksY2xlYXJUaW1lb3V0KHRoaXMubW91c2V3aGVlbFRpbWVyKSx0aGlzLm1vdXNld2hlZWxUaW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuc3Bpbm5pbmcmJnRoaXMuX3N0b3AoZSl9LDEwMCksZS5wcmV2ZW50RGVmYXVsdCgpfX0sIm1vdXNlZG93biAudWktc3Bpbm5lci1idXR0b24iOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkoKXt2YXIgZT10aGlzLmVsZW1lbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQ7ZXx8KHRoaXMuZWxlbWVudC5mb2N1cygpLHRoaXMucHJldmlvdXM9cyx0aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMucHJldmlvdXM9c30pKX12YXIgcztzPXRoaXMuZWxlbWVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudD90aGlzLnByZXZpb3VzOnRoaXMuZWxlbWVudC52YWwoKSx0LnByZXZlbnREZWZhdWx0KCksaS5jYWxsKHRoaXMpLHRoaXMuY2FuY2VsQmx1cj0hMCx0aGlzLl9kZWxheShmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmNhbmNlbEJsdXIsaS5jYWxsKHRoaXMpfSksdGhpcy5fc3RhcnQodCkhPT0hMSYmdGhpcy5fcmVwZWF0KG51bGwsZSh0LmN1cnJlbnRUYXJnZXQpLmhhc0NsYXNzKCJ1aS1zcGlubmVyLXVwIik/MTotMSx0KX0sIm1vdXNldXAgLnVpLXNwaW5uZXItYnV0dG9uIjoiX3N0b3AiLCJtb3VzZWVudGVyIC51aS1zcGlubmVyLWJ1dHRvbiI6ZnVuY3Rpb24odCl7cmV0dXJuIGUodC5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcygidWktc3RhdGUtYWN0aXZlIik/dGhpcy5fc3RhcnQodCk9PT0hMT8hMToodGhpcy5fcmVwZWF0KG51bGwsZSh0LmN1cnJlbnRUYXJnZXQpLmhhc0NsYXNzKCJ1aS1zcGlubmVyLXVwIik/MTotMSx0KSx2b2lkIDApOnZvaWQgMH0sIm1vdXNlbGVhdmUgLnVpLXNwaW5uZXItYnV0dG9uIjoiX3N0b3AifSxfZHJhdzpmdW5jdGlvbigpe3ZhciBlPXRoaXMudWlTcGlubmVyPXRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc3Bpbm5lci1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLndyYXAodGhpcy5fdWlTcGlubmVySHRtbCgpKS5wYXJlbnQoKS5hcHBlbmQodGhpcy5fYnV0dG9uSHRtbCgpKTt0aGlzLmVsZW1lbnQuYXR0cigicm9sZSIsInNwaW5idXR0b24iKSx0aGlzLmJ1dHRvbnM9ZS5maW5kKCIudWktc3Bpbm5lci1idXR0b24iKS5hdHRyKCJ0YWJJbmRleCIsLTEpLmJ1dHRvbigpLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIiksdGhpcy5idXR0b25zLmhlaWdodCgpPk1hdGguY2VpbCguNSplLmhlaWdodCgpKSYmZS5oZWlnaHQoKT4wJiZlLmhlaWdodChlLmhlaWdodCgpKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZGlzYWJsZSgpCi19LF9rZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPWUudWkua2V5Q29kZTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIHMuVVA6cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLDEsdCksITA7Y2FzZSBzLkRPV046cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLC0xLHQpLCEwO2Nhc2Ugcy5QQUdFX1VQOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCxpLnBhZ2UsdCksITA7Y2FzZSBzLlBBR0VfRE9XTjpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsLWkucGFnZSx0KSwhMH1yZXR1cm4hMX0sX3VpU3Bpbm5lckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPHNwYW4gY2xhc3M9J3VpLXNwaW5uZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwnPjwvc3Bhbj4ifSxfYnV0dG9uSHRtbDpmdW5jdGlvbigpe3JldHVybiI8YSBjbGFzcz0ndWktc3Bpbm5lci1idXR0b24gdWktc3Bpbm5lci11cCB1aS1jb3JuZXItdHInPjxzcGFuIGNsYXNzPSd1aS1pY29uICIrdGhpcy5vcHRpb25zLmljb25zLnVwKyInPiYjOTY1MDs8L3NwYW4+IisiPC9hPiIrIjxhIGNsYXNzPSd1aS1zcGlubmVyLWJ1dHRvbiB1aS1zcGlubmVyLWRvd24gdWktY29ybmVyLWJyJz4iKyI8c3BhbiBjbGFzcz0ndWktaWNvbiAiK3RoaXMub3B0aW9ucy5pY29ucy5kb3duKyInPiYjOTY2MDs8L3NwYW4+IisiPC9hPiJ9LF9zdGFydDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zcGlubmluZ3x8dGhpcy5fdHJpZ2dlcigic3RhcnQiLGUpIT09ITE/KHRoaXMuY291bnRlcnx8KHRoaXMuY291bnRlcj0xKSx0aGlzLnNwaW5uaW5nPSEwLCEwKTohMX0sX3JlcGVhdDpmdW5jdGlvbihlLHQsaSl7ZT1lfHw1MDAsY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9yZXBlYXQoNDAsdCxpKX0sZSksdGhpcy5fc3Bpbih0KnRoaXMub3B0aW9ucy5zdGVwLGkpfSxfc3BpbjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMudmFsdWUoKXx8MDt0aGlzLmNvdW50ZXJ8fCh0aGlzLmNvdW50ZXI9MSksaT10aGlzLl9hZGp1c3RWYWx1ZShpK2UqdGhpcy5faW5jcmVtZW50KHRoaXMuY291bnRlcikpLHRoaXMuc3Bpbm5pbmcmJnRoaXMuX3RyaWdnZXIoInNwaW4iLHQse3ZhbHVlOml9KT09PSExfHwodGhpcy5fdmFsdWUoaSksdGhpcy5jb3VudGVyKyspfSxfaW5jcmVtZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5pbmNyZW1lbnRhbDtyZXR1cm4gaT9lLmlzRnVuY3Rpb24oaSk/aSh0KTpNYXRoLmZsb29yKHQqdCp0LzVlNC10KnQvNTAwKzE3KnQvMjAwKzEpOjF9LF9wcmVjaXNpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMuc3RlcCk7cmV0dXJuIG51bGwhPT10aGlzLm9wdGlvbnMubWluJiYoZT1NYXRoLm1heChlLHRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5taW4pKSksZX0sX3ByZWNpc2lvbk9mOmZ1bmN0aW9uKGUpe3ZhciB0PSIiK2UsaT10LmluZGV4T2YoIi4iKTtyZXR1cm4tMT09PWk/MDp0Lmxlbmd0aC1pLTF9LF9hZGp1c3RWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxpLHM9dGhpcy5vcHRpb25zO3JldHVybiB0PW51bGwhPT1zLm1pbj9zLm1pbjowLGk9ZS10LGk9TWF0aC5yb3VuZChpL3Muc3RlcCkqcy5zdGVwLGU9dCtpLGU9cGFyc2VGbG9hdChlLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpKSxudWxsIT09cy5tYXgmJmU+cy5tYXg/cy5tYXg6bnVsbCE9PXMubWluJiZzLm1pbj5lP3MubWluOmV9LF9zdG9wOmZ1bmN0aW9uKGUpe3RoaXMuc3Bpbm5pbmcmJihjbGVhclRpbWVvdXQodGhpcy50aW1lciksY2xlYXJUaW1lb3V0KHRoaXMubW91c2V3aGVlbFRpbWVyKSx0aGlzLmNvdW50ZXI9MCx0aGlzLnNwaW5uaW5nPSExLHRoaXMuX3RyaWdnZXIoInN0b3AiLGUpKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2lmKCJjdWx0dXJlIj09PWV8fCJudW1iZXJGb3JtYXQiPT09ZSl7dmFyIGk9dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKTtyZXR1cm4gdGhpcy5vcHRpb25zW2VdPXQsdGhpcy5lbGVtZW50LnZhbCh0aGlzLl9mb3JtYXQoaSkpLHZvaWQgMH0oIm1heCI9PT1lfHwibWluIj09PWV8fCJzdGVwIj09PWUpJiYic3RyaW5nIj09dHlwZW9mIHQmJih0PXRoaXMuX3BhcnNlKHQpKSwiaWNvbnMiPT09ZSYmKHRoaXMuYnV0dG9ucy5maXJzdCgpLmZpbmQoIi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLnVwKS5hZGRDbGFzcyh0LnVwKSx0aGlzLmJ1dHRvbnMubGFzdCgpLmZpbmQoIi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLmRvd24pLmFkZENsYXNzKHQuZG93bikpLHRoaXMuX3N1cGVyKGUsdCksImRpc2FibGVkIj09PWUmJih0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KSx0aGlzLmVsZW1lbnQucHJvcCgiZGlzYWJsZWQiLCEhdCksdGhpcy5idXR0b25zLmJ1dHRvbih0PyJkaXNhYmxlIjoiZW5hYmxlIikpfSxfc2V0T3B0aW9uczpoKGZ1bmN0aW9uKGUpe3RoaXMuX3N1cGVyKGUpfSksX3BhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmIiIhPT1lJiYoZT13aW5kb3cuR2xvYmFsaXplJiZ0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0P0dsb2JhbGl6ZS5wYXJzZUZsb2F0KGUsMTAsdGhpcy5vcHRpb25zLmN1bHR1cmUpOitlKSwiIj09PWV8fGlzTmFOKGUpP251bGw6ZX0sX2Zvcm1hdDpmdW5jdGlvbihlKXtyZXR1cm4iIj09PWU/IiI6d2luZG93Lkdsb2JhbGl6ZSYmdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdD9HbG9iYWxpemUuZm9ybWF0KGUsdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdCx0aGlzLm9wdGlvbnMuY3VsdHVyZSk6ZX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYXR0cih7ImFyaWEtdmFsdWVtaW4iOnRoaXMub3B0aW9ucy5taW4sImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnRoaXMuX3BhcnNlKHRoaXMuZWxlbWVudC52YWwoKSl9KX0saXNWYWxpZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMudmFsdWUoKTtyZXR1cm4gbnVsbD09PWU/ITE6ZT09PXRoaXMuX2FkanVzdFZhbHVlKGUpfSxfdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgaTsiIiE9PWUmJihpPXRoaXMuX3BhcnNlKGUpLG51bGwhPT1pJiYodHx8KGk9dGhpcy5fYWRqdXN0VmFsdWUoaSkpLGU9dGhpcy5fZm9ybWF0KGkpKSksdGhpcy5lbGVtZW50LnZhbChlKSx0aGlzLl9yZWZyZXNoKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zcGlubmVyLWlucHV0IikucHJvcCgiZGlzYWJsZWQiLCExKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1pbiIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtYXgiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy51aVNwaW5uZXIucmVwbGFjZVdpdGgodGhpcy5lbGVtZW50KX0sc3RlcFVwOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKGUpfSksX3N0ZXBVcDpmdW5jdGlvbihlKXt0aGlzLl9zdGFydCgpJiYodGhpcy5fc3BpbigoZXx8MSkqdGhpcy5vcHRpb25zLnN0ZXApLHRoaXMuX3N0b3AoKSl9LHN0ZXBEb3duOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcERvd24oZSl9KSxfc3RlcERvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnQoKSYmKHRoaXMuX3NwaW4oKGV8fDEpKi10aGlzLm9wdGlvbnMuc3RlcCksdGhpcy5fc3RvcCgpKX0scGFnZVVwOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSxwYWdlRG93bjpoKGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBEb3duKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaCh0aGlzLl92YWx1ZSkuY2FsbCh0aGlzLGUpLHZvaWQgMCk6dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWlTcGlubmVyfX0pLGUud2lkZ2V0KCJ1aS50YWJzIix7dmVyc2lvbjoiMS4xMS40IixkZWxheTozMDAsb3B0aW9uczp7YWN0aXZlOm51bGwsY29sbGFwc2libGU6ITEsZXZlbnQ6ImNsaWNrIixoZWlnaHRTdHlsZToiY29udGVudCIsaGlkZTpudWxsLHNob3c6bnVsbCxhY3RpdmF0ZTpudWxsLGJlZm9yZUFjdGl2YXRlOm51bGwsYmVmb3JlTG9hZDpudWxsLGxvYWQ6bnVsbH0sX2lzTG9jYWw6ZnVuY3Rpb24oKXt2YXIgZT0vIy4qJC87cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBpLHM7dD10LmNsb25lTm9kZSghMSksaT10LmhyZWYucmVwbGFjZShlLCIiKSxzPWxvY2F0aW9uLmhyZWYucmVwbGFjZShlLCIiKTt0cnl7aT1kZWNvZGVVUklDb21wb25lbnQoaSl9Y2F0Y2gobil7fXRyeXtzPWRlY29kZVVSSUNvbXBvbmVudChzKX1jYXRjaChuKXt9cmV0dXJuIHQuaGFzaC5sZW5ndGg+MSYmaT09PXN9fSgpLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5vcHRpb25zO3RoaXMucnVubmluZz0hMSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsaS5jb2xsYXBzaWJsZSksdGhpcy5fcHJvY2Vzc1RhYnMoKSxpLmFjdGl2ZT10aGlzLl9pbml0aWFsQWN0aXZlKCksZS5pc0FycmF5KGkuZGlzYWJsZWQpJiYoaS5kaXNhYmxlZD1lLnVuaXF1ZShpLmRpc2FibGVkLmNvbmNhdChlLm1hcCh0aGlzLnRhYnMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gdC50YWJzLmluZGV4KGUpfSkpKS5zb3J0KCkpLHRoaXMuYWN0aXZlPXRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLl9maW5kQWN0aXZlKGkuYWN0aXZlKTplKCksdGhpcy5fcmVmcmVzaCgpLHRoaXMuYWN0aXZlLmxlbmd0aCYmdGhpcy5sb2FkKGkuYWN0aXZlKX0sX2luaXRpYWxBY3RpdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYWN0aXZlLGk9dGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlLHM9bG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSk7cmV0dXJuIG51bGw9PT10JiYocyYmdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oaSxuKXtyZXR1cm4gZShuKS5hdHRyKCJhcmlhLWNvbnRyb2xzIik9PT1zPyh0PWksITEpOnZvaWQgMH0pLG51bGw9PT10JiYodD10aGlzLnRhYnMuaW5kZXgodGhpcy50YWJzLmZpbHRlcigiLnVpLXRhYnMtYWN0aXZlIikpKSwobnVsbD09PXR8fC0xPT09dCkmJih0PXRoaXMudGFicy5sZW5ndGg/MDohMSkpLHQhPT0hMSYmKHQ9dGhpcy50YWJzLmluZGV4KHRoaXMudGFicy5lcSh0KSksLTE9PT10JiYodD1pPyExOjApKSwhaSYmdD09PSExJiZ0aGlzLmFuY2hvcnMubGVuZ3RoJiYodD0wKSx0fSxfZ2V0Q3JlYXRlRXZlbnREYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3RhYjp0aGlzLmFjdGl2ZSxwYW5lbDp0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpOmUoKX19LF90YWJLZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KCJsaSIpLHM9dGhpcy50YWJzLmluZGV4KGkpLG49ITA7aWYoIXRoaXMuX2hhbmRsZVBhZ2VOYXYodCkpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgZS51aS5rZXlDb2RlLkRPV046cysrO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLkxFRlQ6bj0hMSxzLS07YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnM9dGhpcy5hbmNob3JzLmxlbmd0aC0xO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6cz0wO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlNQQUNFOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocyksdm9pZCAwO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocz09PXRoaXMub3B0aW9ucy5hY3RpdmU/ITE6cyksdm9pZCAwO2RlZmF1bHQ6cmV0dXJufXQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSxzPXRoaXMuX2ZvY3VzTmV4dFRhYihzLG4pLHQuY3RybEtleXx8dC5tZXRhS2V5fHwoaS5hdHRyKCJhcmlhLXNlbGVjdGVkIiwiZmFsc2UiKSx0aGlzLnRhYnMuZXEocykuYXR0cigiYXJpYS1zZWxlY3RlZCIsInRydWUiKSx0aGlzLmFjdGl2YXRpbmc9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLm9wdGlvbigiYWN0aXZlIixzKX0sdGhpcy5kZWxheSkpfX0sX3BhbmVsS2V5ZG93bjpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVQYWdlTmF2KHQpfHx0LmN0cmxLZXkmJnQua2V5Q29kZT09PWUudWkua2V5Q29kZS5VUCYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLmFjdGl2ZS5mb2N1cygpKX0sX2hhbmRsZVBhZ2VOYXY6ZnVuY3Rpb24odCl7cmV0dXJuIHQuYWx0S2V5JiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuUEFHRV9VUD8odGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUtMSwhMSkpLCEwKTp0LmFsdEtleSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlBBR0VfRE9XTj8odGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUrMSwhMCkpLCEwKTp2b2lkIDB9LF9maW5kTmV4dFRhYjpmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXtyZXR1cm4gdD5uJiYodD0wKSwwPnQmJih0PW4pLHR9Zm9yKHZhciBuPXRoaXMudGFicy5sZW5ndGgtMTstMSE9PWUuaW5BcnJheShzKCksdGhpcy5vcHRpb25zLmRpc2FibGVkKTspdD1pP3QrMTp0LTE7cmV0dXJuIHR9LF9mb2N1c05leHRUYWI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT10aGlzLl9maW5kTmV4dFRhYihlLHQpLHRoaXMudGFicy5lcShlKS5mb2N1cygpLGV9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4iYWN0aXZlIj09PWU/KHRoaXMuX2FjdGl2YXRlKHQpLHZvaWQgMCk6ImRpc2FibGVkIj09PWU/KHRoaXMuX3NldHVwRGlzYWJsZWQodCksdm9pZCAwKToodGhpcy5fc3VwZXIoZSx0KSwiY29sbGFwc2libGUiPT09ZSYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsdCksdHx8dGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExfHx0aGlzLl9hY3RpdmF0ZSgwKSksImV2ZW50Ij09PWUmJnRoaXMuX3NldHVwRXZlbnRzKHQpLCJoZWlnaHRTdHlsZSI9PT1lJiZ0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHQpLHZvaWQgMCl9LF9zYW5pdGl6ZVNlbGVjdG9yOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UucmVwbGFjZSgvWyEiJCUmJygpKissLlwvOjs8PT4/QFxbXF1cXmB7fH1+XS9nLCJcXCQmIik6IiJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsaT10aGlzLnRhYmxpc3QuY2hpbGRyZW4oIjpoYXMoYVtocmVmXSkiKTt0LmRpc2FibGVkPWUubWFwKGkuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gaS5pbmRleChlKX0pLHRoaXMuX3Byb2Nlc3NUYWJzKCksdC5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLmFjdGl2ZS5sZW5ndGgmJiFlLmNvbnRhaW5zKHRoaXMudGFibGlzdFswXSx0aGlzLmFjdGl2ZVswXSk/dGhpcy50YWJzLmxlbmd0aD09PXQuZGlzYWJsZWQubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZpbmROZXh0VGFiKE1hdGgubWF4KDAsdC5hY3RpdmUtMSksITEpKTp0LmFjdGl2ZT10aGlzLnRhYnMuaW5kZXgodGhpcy5hY3RpdmUpOih0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpLHRoaXMuX3JlZnJlc2goKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9zZXR1cERpc2FibGVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fc2V0dXBFdmVudHModGhpcy5vcHRpb25zLmV2ZW50KSx0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSksdGhpcy50YWJzLm5vdCh0aGlzLmFjdGl2ZSkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KSx0aGlzLnBhbmVscy5ub3QodGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpKS5oaWRlKCkuYXR0cih7ImFyaWEtaGlkZGVuIjoidHJ1ZSJ9KSx0aGlzLmFjdGl2ZS5sZW5ndGg/KHRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLHRoaXMuX2dldFBhbmVsRm9yVGFiKHRoaXMuYWN0aXZlKS5zaG93KCkuYXR0cih7ImFyaWEtaGlkZGVuIjoiZmFsc2UifSkpOnRoaXMudGFicy5lcSgwKS5hdHRyKCJ0YWJJbmRleCIsMCl9LF9wcm9jZXNzVGFiczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT10aGlzLnRhYnMscz10aGlzLmFuY2hvcnMsbj10aGlzLnBhbmVsczt0aGlzLnRhYmxpc3Q9dGhpcy5fZ2V0TGlzdCgpLmFkZENsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLmF0dHIoInJvbGUiLCJ0YWJsaXN0IikuZGVsZWdhdGUoIj4gbGkiLCJtb3VzZWRvd24iK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24odCl7ZSh0aGlzKS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJnQucHJldmVudERlZmF1bHQoKX0pLmRlbGVnYXRlKCIudWktdGFicy1hbmNob3IiLCJmb2N1cyIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2UodGhpcykuY2xvc2VzdCgibGkiKS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJnRoaXMuYmx1cigpfSksdGhpcy50YWJzPXRoaXMudGFibGlzdC5maW5kKCI+IGxpOmhhcyhhW2hyZWZdKSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKS5hdHRyKHtyb2xlOiJ0YWIiLHRhYkluZGV4Oi0xfSksdGhpcy5hbmNob3JzPXRoaXMudGFicy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZSgiYSIsdGhpcylbMF19KS5hZGRDbGFzcygidWktdGFicy1hbmNob3IiKS5hdHRyKHtyb2xlOiJwcmVzZW50YXRpb24iLHRhYkluZGV4Oi0xfSksdGhpcy5wYW5lbHM9ZSgpLHRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGkscyl7dmFyIG4sYSxvLHI9ZShzKS51bmlxdWVJZCgpLmF0dHIoImlkIiksaD1lKHMpLmNsb3Nlc3QoImxpIiksbD1oLmF0dHIoImFyaWEtY29udHJvbHMiKTt0Ll9pc0xvY2FsKHMpPyhuPXMuaGFzaCxvPW4uc3Vic3RyaW5nKDEpLGE9dC5lbGVtZW50LmZpbmQodC5fc2FuaXRpemVTZWxlY3RvcihuKSkpOihvPWguYXR0cigiYXJpYS1jb250cm9scyIpfHxlKHt9KS51bmlxdWVJZCgpWzBdLmlkLG49IiMiK28sYT10LmVsZW1lbnQuZmluZChuKSxhLmxlbmd0aHx8KGE9dC5fY3JlYXRlUGFuZWwobyksYS5pbnNlcnRBZnRlcih0LnBhbmVsc1tpLTFdfHx0LnRhYmxpc3QpKSxhLmF0dHIoImFyaWEtbGl2ZSIsInBvbGl0ZSIpKSxhLmxlbmd0aCYmKHQucGFuZWxzPXQucGFuZWxzLmFkZChhKSksbCYmaC5kYXRhKCJ1aS10YWJzLWFyaWEtY29udHJvbHMiLGwpLGguYXR0cih7ImFyaWEtY29udHJvbHMiOm8sImFyaWEtbGFiZWxsZWRieSI6cn0pLGEuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixyKX0pLHRoaXMucGFuZWxzLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKS5hdHRyKCJyb2xlIiwidGFicGFuZWwiKSxpJiYodGhpcy5fb2ZmKGkubm90KHRoaXMudGFicykpLHRoaXMuX29mZihzLm5vdCh0aGlzLmFuY2hvcnMpKSx0aGlzLl9vZmYobi5ub3QodGhpcy5wYW5lbHMpKSl9LF9nZXRMaXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFibGlzdHx8dGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCl9LF9jcmVhdGVQYW5lbDpmdW5jdGlvbih0KXtyZXR1cm4gZSgiPGRpdj4iKS5hdHRyKCJpZCIsdCkuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmRhdGEoInVpLXRhYnMtZGVzdHJveSIsITApfSxfc2V0dXBEaXNhYmxlZDpmdW5jdGlvbih0KXtlLmlzQXJyYXkodCkmJih0Lmxlbmd0aD90Lmxlbmd0aD09PXRoaXMuYW5jaG9ycy5sZW5ndGgmJih0PSEwKTp0PSExKTtmb3IodmFyIGkscz0wO2k9dGhpcy50YWJzW3NdO3MrKyl0PT09ITB8fC0xIT09ZS5pbkFycmF5KHMsdCk/ZShpKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKS5hdHRyKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpOmUoaSkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpO3RoaXMub3B0aW9ucy5kaXNhYmxlZD10fSxfc2V0dXBFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGk9e307dCYmZS5lYWNoKHQuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2lbdF09Il9ldmVudEhhbmRsZXIifSksdGhpcy5fb2ZmKHRoaXMuYW5jaG9ycy5hZGQodGhpcy50YWJzKS5hZGQodGhpcy5wYW5lbHMpKSx0aGlzLl9vbighMCx0aGlzLmFuY2hvcnMse2NsaWNrOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX19KSx0aGlzLl9vbih0aGlzLmFuY2hvcnMsaSksdGhpcy5fb24odGhpcy50YWJzLHtrZXlkb3duOiJfdGFiS2V5ZG93biJ9KSx0aGlzLl9vbih0aGlzLnBhbmVscyx7a2V5ZG93bjoiX3BhbmVsS2V5ZG93biJ9KSx0aGlzLl9mb2N1c2FibGUodGhpcy50YWJzKSx0aGlzLl9ob3ZlcmFibGUodGhpcy50YWJzKX0sX3NldHVwSGVpZ2h0U3R5bGU6ZnVuY3Rpb24odCl7dmFyIGkscz10aGlzLmVsZW1lbnQucGFyZW50KCk7ImZpbGwiPT09dD8oaT1zLmhlaWdodCgpLGktPXRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmVsZW1lbnQuc2libGluZ3MoIjp2aXNpYmxlIikuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcykscz10LmNzcygicG9zaXRpb24iKTsiYWJzb2x1dGUiIT09cyYmImZpeGVkIiE9PXMmJihpLT10Lm91dGVySGVpZ2h0KCEwKSl9KSx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oKS5ub3QodGhpcy5wYW5lbHMpLmVhY2goZnVuY3Rpb24oKXtpLT1lKHRoaXMpLm91dGVySGVpZ2h0KCEwKX0pLHRoaXMucGFuZWxzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmhlaWdodChNYXRoLm1heCgwLGktZSh0aGlzKS5pbm5lckhlaWdodCgpK2UodGhpcykuaGVpZ2h0KCkpKX0pLmNzcygib3ZlcmZsb3ciLCJhdXRvIikpOiJhdXRvIj09PXQmJihpPTAsdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpe2k9TWF0aC5tYXgoaSxlKHRoaXMpLmhlaWdodCgiIikuaGVpZ2h0KCkpfSkuaGVpZ2h0KGkpKX0sX2V2ZW50SGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMscz10aGlzLmFjdGl2ZSxuPWUodC5jdXJyZW50VGFyZ2V0KSxhPW4uY2xvc2VzdCgibGkiKSxvPWFbMF09PT1zWzBdLHI9byYmaS5jb2xsYXBzaWJsZSxoPXI/ZSgpOnRoaXMuX2dldFBhbmVsRm9yVGFiKGEpLGw9cy5sZW5ndGg/dGhpcy5fZ2V0UGFuZWxGb3JUYWIocyk6ZSgpLHU9e29sZFRhYjpzLG9sZFBhbmVsOmwsbmV3VGFiOnI/ZSgpOmEsbmV3UGFuZWw6aH07dC5wcmV2ZW50RGVmYXVsdCgpLGEuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIil8fGEuaGFzQ2xhc3MoInVpLXRhYnMtbG9hZGluZyIpfHx0aGlzLnJ1bm5pbmd8fG8mJiFpLmNvbGxhcHNpYmxlfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVBY3RpdmF0ZSIsdCx1KT09PSExfHwoaS5hY3RpdmU9cj8hMTp0aGlzLnRhYnMuaW5kZXgoYSksdGhpcy5hY3RpdmU9bz9lKCk6YSx0aGlzLnhociYmdGhpcy54aHIuYWJvcnQoKSxsLmxlbmd0aHx8aC5sZW5ndGh8fGUuZXJyb3IoImpRdWVyeSBVSSBUYWJzOiBNaXNtYXRjaGluZyBmcmFnbWVudCBpZGVudGlmaWVyLiIpLGgubGVuZ3RoJiZ0aGlzLmxvYWQodGhpcy50YWJzLmluZGV4KGEpLHQpLHRoaXMuX3RvZ2dsZSh0LHUpKX0sX3RvZ2dsZTpmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXthLnJ1bm5pbmc9ITEsYS5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsaSl9ZnVuY3Rpb24gbigpe2kubmV3VGFiLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLG8ubGVuZ3RoJiZhLm9wdGlvbnMuc2hvdz9hLl9zaG93KG8sYS5vcHRpb25zLnNob3cscyk6KG8uc2hvdygpLHMoKSl9dmFyIGE9dGhpcyxvPWkubmV3UGFuZWwscj1pLm9sZFBhbmVsO3RoaXMucnVubmluZz0hMCxyLmxlbmd0aCYmdGhpcy5vcHRpb25zLmhpZGU/dGhpcy5faGlkZShyLHRoaXMub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7aS5vbGRUYWIuY2xvc2VzdCgibGkiKS5yZW1vdmVDbGFzcygidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiksbigpfSk6KGkub2xkVGFiLmNsb3Nlc3QoImxpIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLHIuaGlkZSgpLG4oKSksci5hdHRyKCJhcmlhLWhpZGRlbiIsInRydWUiKSxpLm9sZFRhYi5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6ImZhbHNlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pLG8ubGVuZ3RoJiZyLmxlbmd0aD9pLm9sZFRhYi5hdHRyKCJ0YWJJbmRleCIsLTEpOm8ubGVuZ3RoJiZ0aGlzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1lKHRoaXMpLmF0dHIoInRhYkluZGV4Iil9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLG8uYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpLGkubmV3VGFiLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoidHJ1ZSIsImFyaWEtZXhwYW5kZWQiOiJ0cnVlIix0YWJJbmRleDowfSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgaSxzPXRoaXMuX2ZpbmRBY3RpdmUodCk7c1swXSE9PXRoaXMuYWN0aXZlWzBdJiYocy5sZW5ndGh8fChzPXRoaXMuYWN0aXZlKSxpPXMuZmluZCgiLnVpLXRhYnMtYW5jaG9yIilbMF0sdGhpcy5fZXZlbnRIYW5kbGVyKHt0YXJnZXQ6aSxjdXJyZW50VGFyZ2V0OmkscHJldmVudERlZmF1bHQ6ZS5ub29wfSkpfSxfZmluZEFjdGl2ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD09PSExP2UoKTp0aGlzLnRhYnMuZXEodCl9LF9nZXRJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPXRoaXMuYW5jaG9ycy5pbmRleCh0aGlzLmFuY2hvcnMuZmlsdGVyKCJbaHJlZiQ9JyIrZSsiJ10iKSkpLGV9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy54aHImJnRoaXMueGhyLmFib3J0KCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIHVpLXRhYnMtY29sbGFwc2libGUiKSx0aGlzLnRhYmxpc3QucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIikucmVtb3ZlQXR0cigicm9sZSIpLHRoaXMuYW5jaG9ycy5yZW1vdmVDbGFzcygidWktdGFicy1hbmNob3IiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVVbmlxdWVJZCgpLHRoaXMudGFibGlzdC51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSksdGhpcy50YWJzLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2UuZGF0YSh0aGlzLCJ1aS10YWJzLWRlc3Ryb3kiKT9lKHRoaXMpLnJlbW92ZSgpOmUodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIHVpLWNvcm5lci10b3AgdWktY29ybmVyLWJvdHRvbSB1aS13aWRnZXQtY29udGVudCB1aS10YWJzLWFjdGl2ZSB1aS10YWJzLXBhbmVsIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVBdHRyKCJhcmlhLWxpdmUiKS5yZW1vdmVBdHRyKCJhcmlhLWJ1c3kiKS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIikucmVtb3ZlQXR0cigiYXJpYS1sYWJlbGxlZGJ5IikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigicm9sZSIpfSksdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5kYXRhKCJ1aS10YWJzLWFyaWEtY29udHJvbHMiKTtpP3QuYXR0cigiYXJpYS1jb250cm9scyIsaSkucmVtb3ZlRGF0YSgidWktdGFicy1hcmlhLWNvbnRyb2xzIik6dC5yZW1vdmVBdHRyKCJhcmlhLWNvbnRyb2xzIil9KSx0aGlzLnBhbmVscy5zaG93KCksImNvbnRlbnQiIT09dGhpcy5vcHRpb25zLmhlaWdodFN0eWxlJiZ0aGlzLnBhbmVscy5jc3MoImhlaWdodCIsIiIpfSxlbmFibGU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLmRpc2FibGVkO2khPT0hMSYmKHZvaWQgMD09PXQ/aT0hMToodD10aGlzLl9nZXRJbmRleCh0KSxpPWUuaXNBcnJheShpKT9lLm1hcChpLGZ1bmN0aW9uKGUpe3JldHVybiBlIT09dD9lOm51bGx9KTplLm1hcCh0aGlzLnRhYnMsZnVuY3Rpb24oZSxpKXtyZXR1cm4gaSE9PXQ/aTpudWxsfSkpLHRoaXMuX3NldHVwRGlzYWJsZWQoaSkpfSxkaXNhYmxlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5kaXNhYmxlZDtpZihpIT09ITApe2lmKHZvaWQgMD09PXQpaT0hMDtlbHNle2lmKHQ9dGhpcy5fZ2V0SW5kZXgodCksLTEhPT1lLmluQXJyYXkodCxpKSlyZXR1cm47aT1lLmlzQXJyYXkoaSk/ZS5tZXJnZShbdF0saSkuc29ydCgpOlt0XX10aGlzLl9zZXR1cERpc2FibGVkKGkpfX0sbG9hZDpmdW5jdGlvbih0LGkpe3Q9dGhpcy5fZ2V0SW5kZXgodCk7dmFyIHM9dGhpcyxuPXRoaXMudGFicy5lcSh0KSxhPW4uZmluZCgiLnVpLXRhYnMtYW5jaG9yIiksbz10aGlzLl9nZXRQYW5lbEZvclRhYihuKSxyPXt0YWI6bixwYW5lbDpvfSxoPWZ1bmN0aW9uKGUsdCl7ImFib3J0Ij09PXQmJnMucGFuZWxzLnN0b3AoITEsITApLG4ucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbG9hZGluZyIpLG8ucmVtb3ZlQXR0cigiYXJpYS1idXN5IiksZT09PXMueGhyJiZkZWxldGUgcy54aHJ9O3RoaXMuX2lzTG9jYWwoYVswXSl8fCh0aGlzLnhocj1lLmFqYXgodGhpcy5fYWpheFNldHRpbmdzKGEsaSxyKSksdGhpcy54aHImJiJjYW5jZWxlZCIhPT10aGlzLnhoci5zdGF0dXNUZXh0JiYobi5hZGRDbGFzcygidWktdGFicy1sb2FkaW5nIiksby5hdHRyKCJhcmlhLWJ1c3kiLCJ0cnVlIiksdGhpcy54aHIuZG9uZShmdW5jdGlvbihlLHQsbil7c2V0VGltZW91dChmdW5jdGlvbigpe28uaHRtbChlKSxzLl90cmlnZ2VyKCJsb2FkIixpLHIpLGgobix0KX0sMSl9KS5mYWlsKGZ1bmN0aW9uKGUsdCl7c2V0VGltZW91dChmdW5jdGlvbigpe2goZSx0KX0sMSl9KSkpfSxfYWpheFNldHRpbmdzOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj10aGlzO3JldHVybnt1cmw6dC5hdHRyKCJocmVmIiksYmVmb3JlU2VuZDpmdW5jdGlvbih0LGEpe3JldHVybiBuLl90cmlnZ2VyKCJiZWZvcmVMb2FkIixpLGUuZXh0ZW5kKHtqcVhIUjp0LGFqYXhTZXR0aW5nczphfSxzKSl9fX0sX2dldFBhbmVsRm9yVGFiOmZ1bmN0aW9uKHQpe3ZhciBpPWUodCkuYXR0cigiYXJpYS1jb250cm9scyIpO3JldHVybiB0aGlzLmVsZW1lbnQuZmluZCh0aGlzLl9zYW5pdGl6ZVNlbGVjdG9yKCIjIitpKSl9fSksZS53aWRnZXQoInVpLnRvb2x0aXAiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2NvbnRlbnQ6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLmF0dHIoInRpdGxlIil8fCIiO3JldHVybiBlKCI8YT4iKS50ZXh0KHQpLmh0bWwoKX0saGlkZTohMCxpdGVtczoiW3RpdGxlXTpub3QoW2Rpc2FibGVkXSkiLHBvc2l0aW9uOntteToibGVmdCB0b3ArMTUiLGF0OiJsZWZ0IGJvdHRvbSIsY29sbGlzaW9uOiJmbGlwZml0IGZsaXAifSxzaG93OiEwLHRvb2x0aXBDbGFzczpudWxsLHRyYWNrOiExLGNsb3NlOm51bGwsb3BlbjpudWxsfSxfYWRkRGVzY3JpYmVkQnk6ZnVuY3Rpb24odCxpKXt2YXIgcz0odC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5Iil8fCIiKS5zcGxpdCgvXHMrLyk7cy5wdXNoKGkpLHQuZGF0YSgidWktdG9vbHRpcC1pZCIsaSkuYXR0cigiYXJpYS1kZXNjcmliZWRieSIsZS50cmltKHMuam9pbigiICIpKSl9LF9yZW1vdmVEZXNjcmliZWRCeTpmdW5jdGlvbih0KXt2YXIgaT10LmRhdGEoInVpLXRvb2x0aXAtaWQiKSxzPSh0LmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKXx8IiIpLnNwbGl0KC9ccysvKSxuPWUuaW5BcnJheShpLHMpOy0xIT09biYmcy5zcGxpY2UobiwxKSx0LnJlbW92ZURhdGEoInVpLXRvb2x0aXAtaWQiKSxzPWUudHJpbShzLmpvaW4oIiAiKSkscz90LmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLHMpOnQucmVtb3ZlQXR0cigiYXJpYS1kZXNjcmliZWRieSIpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb24oe21vdXNlb3Zlcjoib3BlbiIsZm9jdXNpbjoib3BlbiJ9KSx0aGlzLnRvb2x0aXBzPXt9LHRoaXMucGFyZW50cz17fSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGUoKSx0aGlzLmxpdmVSZWdpb249ZSgiPGRpdj4iKS5hdHRyKHtyb2xlOiJsb2ciLCJhcmlhLWxpdmUiOiJhc3NlcnRpdmUiLCJhcmlhLXJlbGV2YW50IjoiYWRkaXRpb25zIn0pLmFkZENsYXNzKCJ1aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUiKS5hcHBlbmRUbyh0aGlzLmRvY3VtZW50WzBdLmJvZHkpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcztyZXR1cm4iZGlzYWJsZWQiPT09dD8odGhpc1tpPyJfZGlzYWJsZSI6Il9lbmFibGUiXSgpLHRoaXMub3B0aW9uc1t0XT1pLHZvaWQgMCk6KHRoaXMuX3N1cGVyKHQsaSksImNvbnRlbnQiPT09dCYmZS5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24oZSx0KXtzLl91cGRhdGVDb250ZW50KHQuZWxlbWVudCl9KSx2b2lkIDApfSxfZGlzYWJsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ZS5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24oaSxzKXt2YXIgbj1lLkV2ZW50KCJibHVyIik7bi50YXJnZXQ9bi5jdXJyZW50VGFyZ2V0PXMuZWxlbWVudFswXSx0LmNsb3NlKG4sITApfSksdGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5pcygiW3RpdGxlXSIpJiZ0LmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiLHQuYXR0cigidGl0bGUiKSkucmVtb3ZlQXR0cigidGl0bGUiKX0pfSxfZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7dC5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikmJnQuYXR0cigidGl0bGUiLHQuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpKX0pfSxvcGVuOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz1lKHQ/dC50YXJnZXQ6dGhpcy5lbGVtZW50KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5pdGVtcyk7cy5sZW5ndGgmJiFzLmRhdGEoInVpLXRvb2x0aXAtaWQiKSYmKHMuYXR0cigidGl0bGUiKSYmcy5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIixzLmF0dHIoInRpdGxlIikpLHMuZGF0YSgidWktdG9vbHRpcC1vcGVuIiwhMCksdCYmIm1vdXNlb3ZlciI9PT10LnR5cGUmJnMucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxzPWUodGhpcyk7cy5kYXRhKCJ1aS10b29sdGlwLW9wZW4iKSYmKHQ9ZS5FdmVudCgiYmx1ciIpLHQudGFyZ2V0PXQuY3VycmVudFRhcmdldD10aGlzLGkuY2xvc2UodCwhMCkpLHMuYXR0cigidGl0bGUiKSYmKHMudW5pcXVlSWQoKSxpLnBhcmVudHNbdGhpcy5pZF09e2VsZW1lbnQ6dGhpcyx0aXRsZTpzLmF0dHIoInRpdGxlIil9LHMuYXR0cigidGl0bGUiLCIiKSl9KSx0aGlzLl9yZWdpc3RlckNsb3NlSGFuZGxlcnModCxzKSx0aGlzLl91cGRhdGVDb250ZW50KHMsdCkpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbihlLHQpe3ZhciBpLHM9dGhpcy5vcHRpb25zLmNvbnRlbnQsbj10aGlzLGE9dD90LnR5cGU6bnVsbDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHM/dGhpcy5fb3Blbih0LGUscyk6KGk9cy5jYWxsKGVbMF0sZnVuY3Rpb24oaSl7bi5fZGVsYXkoZnVuY3Rpb24oKXtlLmRhdGEoInVpLXRvb2x0aXAtb3BlbiIpJiYodCYmKHQudHlwZT1hKSx0aGlzLl9vcGVuKHQsZSxpKSl9KX0pLGkmJnRoaXMuX29wZW4odCxlLGkpLHZvaWQgMCl9LF9vcGVuOmZ1bmN0aW9uKHQsaSxzKXtmdW5jdGlvbiBuKGUpe2wub2Y9ZSxvLmlzKCI6aGlkZGVuIil8fG8ucG9zaXRpb24obCl9dmFyIGEsbyxyLGgsbD1lLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pO2lmKHMpe2lmKGE9dGhpcy5fZmluZChpKSlyZXR1cm4gYS50b29sdGlwLmZpbmQoIi51aS10b29sdGlwLWNvbnRlbnQiKS5odG1sKHMpLHZvaWQgMDtpLmlzKCJbdGl0bGVdIikmJih0JiYibW91c2VvdmVyIj09PXQudHlwZT9pLmF0dHIoInRpdGxlIiwiIik6aS5yZW1vdmVBdHRyKCJ0aXRsZSIpKSxhPXRoaXMuX3Rvb2x0aXAoaSksbz1hLnRvb2x0aXAsdGhpcy5fYWRkRGVzY3JpYmVkQnkoaSxvLmF0dHIoImlkIikpLG8uZmluZCgiLnVpLXRvb2x0aXAtY29udGVudCIpLmh0bWwocyksdGhpcy5saXZlUmVnaW9uLmNoaWxkcmVuKCkuaGlkZSgpLHMuY2xvbmU/KGg9cy5jbG9uZSgpLGgucmVtb3ZlQXR0cigiaWQiKS5maW5kKCJbaWRdIikucmVtb3ZlQXR0cigiaWQiKSk6aD1zLGUoIjxkaXY+IikuaHRtbChoKS5hcHBlbmRUbyh0aGlzLmxpdmVSZWdpb24pLHRoaXMub3B0aW9ucy50cmFjayYmdCYmL15tb3VzZS8udGVzdCh0LnR5cGUpPyh0aGlzLl9vbih0aGlzLmRvY3VtZW50LHttb3VzZW1vdmU6bn0pLG4odCkpOm8ucG9zaXRpb24oZS5leHRlbmQoe29mOml9LHRoaXMub3B0aW9ucy5wb3NpdGlvbikpLG8uaGlkZSgpLHRoaXMuX3Nob3cobyx0aGlzLm9wdGlvbnMuc2hvdyksdGhpcy5vcHRpb25zLnNob3cmJnRoaXMub3B0aW9ucy5zaG93LmRlbGF5JiYocj10aGlzLmRlbGF5ZWRTaG93PXNldEludGVydmFsKGZ1bmN0aW9uKCl7by5pcygiOnZpc2libGUiKSYmKG4obC5vZiksY2xlYXJJbnRlcnZhbChyKSl9LGUuZnguaW50ZXJ2YWwpKSx0aGlzLl90cmlnZ2VyKCJvcGVuIix0LHt0b29sdGlwOm99KX19LF9yZWdpc3RlckNsb3NlSGFuZGxlcnM6ZnVuY3Rpb24odCxpKXt2YXIgcz17a2V5dXA6ZnVuY3Rpb24odCl7aWYodC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVTQ0FQRSl7dmFyIHM9ZS5FdmVudCh0KTtzLmN1cnJlbnRUYXJnZXQ9aVswXSx0aGlzLmNsb3NlKHMsITApfX19O2lbMF0hPT10aGlzLmVsZW1lbnRbMF0mJihzLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3JlbW92ZVRvb2x0aXAodGhpcy5fZmluZChpKS50b29sdGlwKX0pLHQmJiJtb3VzZW92ZXIiIT09dC50eXBlfHwocy5tb3VzZWxlYXZlPSJjbG9zZSIpLHQmJiJmb2N1c2luIiE9PXQudHlwZXx8KHMuZm9jdXNvdXQ9ImNsb3NlIiksdGhpcy5fb24oITAsaSxzKX0sY2xvc2U6ZnVuY3Rpb24odCl7dmFyIGkscz10aGlzLG49ZSh0P3QuY3VycmVudFRhcmdldDp0aGlzLmVsZW1lbnQpLGE9dGhpcy5fZmluZChuKTtyZXR1cm4gYT8oaT1hLnRvb2x0aXAsYS5jbG9zaW5nfHwoY2xlYXJJbnRlcnZhbCh0aGlzLmRlbGF5ZWRTaG93KSxuLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSYmIW4uYXR0cigidGl0bGUiKSYmbi5hdHRyKCJ0aXRsZSIsbi5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpLHRoaXMuX3JlbW92ZURlc2NyaWJlZEJ5KG4pLGEuaGlkaW5nPSEwLGkuc3RvcCghMCksdGhpcy5faGlkZShpLHRoaXMub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7cy5fcmVtb3ZlVG9vbHRpcChlKHRoaXMpKX0pLG4ucmVtb3ZlRGF0YSgidWktdG9vbHRpcC1vcGVuIiksdGhpcy5fb2ZmKG4sIm1vdXNlbGVhdmUgZm9jdXNvdXQga2V5dXAiKSxuWzBdIT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLl9vZmYobiwicmVtb3ZlIiksdGhpcy5fb2ZmKHRoaXMuZG9jdW1lbnQsIm1vdXNlbW92ZSIpLHQmJiJtb3VzZWxlYXZlIj09PXQudHlwZSYmZS5lYWNoKHRoaXMucGFyZW50cyxmdW5jdGlvbih0LGkpe2UoaS5lbGVtZW50KS5hdHRyKCJ0aXRsZSIsaS50aXRsZSksZGVsZXRlIHMucGFyZW50c1t0XX0pLGEuY2xvc2luZz0hMCx0aGlzLl90cmlnZ2VyKCJjbG9zZSIsdCx7dG9vbHRpcDppfSksYS5oaWRpbmd8fChhLmNsb3Npbmc9ITEpKSx2b2lkIDApOihuLnJlbW92ZURhdGEoInVpLXRvb2x0aXAtb3BlbiIpLHZvaWQgMCl9LF90b29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBpPWUoIjxkaXY+IikuYXR0cigicm9sZSIsInRvb2x0aXAiKS5hZGRDbGFzcygidWktdG9vbHRpcCB1aS13aWRnZXQgdWktY29ybmVyLWFsbCB1aS13aWRnZXQtY29udGVudCAiKyh0aGlzLm9wdGlvbnMudG9vbHRpcENsYXNzfHwiIikpLHM9aS51bmlxdWVJZCgpLmF0dHIoImlkIik7cmV0dXJuIGUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLXRvb2x0aXAtY29udGVudCIpLmFwcGVuZFRvKGkpLGkuYXBwZW5kVG8odGhpcy5kb2N1bWVudFswXS5ib2R5KSx0aGlzLnRvb2x0aXBzW3NdPXtlbGVtZW50OnQsdG9vbHRpcDppfX0sX2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhKCJ1aS10b29sdGlwLWlkIik7cmV0dXJuIHQ/dGhpcy50b29sdGlwc1t0XTpudWxsfSxfcmVtb3ZlVG9vbHRpcDpmdW5jdGlvbihlKXtlLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLnRvb2x0aXBzW2UuYXR0cigiaWQiKV19LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztlLmVhY2godGhpcy50b29sdGlwcyxmdW5jdGlvbihpLHMpe3ZhciBuPWUuRXZlbnQoImJsdXIiKSxhPXMuZWxlbWVudDtuLnRhcmdldD1uLmN1cnJlbnRUYXJnZXQ9YVswXSx0LmNsb3NlKG4sITApLGUoIiMiK2kpLnJlbW92ZSgpLGEuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpJiYoYS5hdHRyKCJ0aXRsZSIpfHxhLmF0dHIoInRpdGxlIixhLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSksYS5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpfSksdGhpcy5saXZlUmVnaW9uLnJlbW92ZSgpfX0pO3ZhciB5PSJ1aS1lZmZlY3RzLSIsYj1lO2UuZWZmZWN0cz17ZWZmZWN0Ont9fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0LGkpe3ZhciBzPWRbdC50eXBlXXx8e307cmV0dXJuIG51bGw9PWU/aXx8IXQuZGVmP251bGw6dC5kZWY6KGU9cy5mbG9vcj9+fmU6cGFyc2VGbG9hdChlKSxpc05hTihlKT90LmRlZjpzLm1vZD8oZStzLm1vZCklcy5tb2Q6MD5lPzA6ZT5zLm1heD9zLm1heDplKX1mdW5jdGlvbiBzKGkpe3ZhciBzPWwoKSxuPXMuX3JnYmE9W107cmV0dXJuIGk9aS50b0xvd2VyQ2FzZSgpLGYoaCxmdW5jdGlvbihlLGEpe3ZhciBvLHI9YS5yZS5leGVjKGkpLGg9ciYmYS5wYXJzZShyKSxsPWEuc3BhY2V8fCJyZ2JhIjtyZXR1cm4gaD8obz1zW2xdKGgpLHNbdVtsXS5jYWNoZV09b1t1W2xdLmNhY2hlXSxuPXMuX3JnYmE9by5fcmdiYSwhMSk6dH0pLG4ubGVuZ3RoPygiMCwwLDAsMCI9PT1uLmpvaW4oKSYmZS5leHRlbmQobixhLnRyYW5zcGFyZW50KSxzKTphW2ldfWZ1bmN0aW9uIG4oZSx0LGkpe3JldHVybiBpPShpKzEpJTEsMT42Kmk/ZSs2Kih0LWUpKmk6MT4yKmk/dDoyPjMqaT9lKzYqKHQtZSkqKDIvMy1pKTplfXZhciBhLG89ImJhY2tncm91bmRDb2xvciBib3JkZXJCb3R0b21Db2xvciBib3JkZXJMZWZ0Q29sb3IgYm9yZGVyUmlnaHRDb2xvciBib3JkZXJUb3BDb2xvciBjb2xvciBjb2x1bW5SdWxlQ29sb3Igb3V0bGluZUNvbG9yIHRleHREZWNvcmF0aW9uQ29sb3IgdGV4dEVtcGhhc2lzQ29sb3IiLHI9L14oW1wtK10pPVxzKihcZCtcLj9cZCopLyxoPVt7cmU6L3JnYmE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bZVsxXSxlWzJdLGVbM10sZVs0XV19fSx7cmU6L3JnYmE/XChccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bMi41NSplWzFdLDIuNTUqZVsyXSwyLjU1KmVbM10sZVs0XV19fSx7cmU6LyMoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdLDE2KSxwYXJzZUludChlWzJdLDE2KSxwYXJzZUludChlWzNdLDE2KV19fSx7cmU6LyMoW2EtZjAtOV0pKFthLWYwLTldKShbYS1mMC05XSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdK2VbMV0sMTYpLHBhcnNlSW50KGVbMl0rZVsyXSwxNikscGFyc2VJbnQoZVszXStlWzNdLDE2KV19fSx7cmU6L2hzbGE/XChccyooXGQrKD86XC5cZCspPylccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8sc3BhY2U6ImhzbGEiLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF1dfX1dLGw9ZS5Db2xvcj1mdW5jdGlvbih0LGkscyxuKXtyZXR1cm4gbmV3IGUuQ29sb3IuZm4ucGFyc2UodCxpLHMsbil9LHU9e3JnYmE6e3Byb3BzOntyZWQ6e2lkeDowLHR5cGU6ImJ5dGUifSxncmVlbjp7aWR4OjEsdHlwZToiYnl0ZSJ9LGJsdWU6e2lkeDoyLHR5cGU6ImJ5dGUifX19LGhzbGE6e3Byb3BzOntodWU6e2lkeDowLHR5cGU6ImRlZ3JlZXMifSxzYXR1cmF0aW9uOntpZHg6MSx0eXBlOiJwZXJjZW50In0sbGlnaHRuZXNzOntpZHg6Mix0eXBlOiJwZXJjZW50In19fX0sZD17ImJ5dGUiOntmbG9vcjohMCxtYXg6MjU1fSxwZXJjZW50OnttYXg6MX0sZGVncmVlczp7bW9kOjM2MCxmbG9vcjohMH19LGM9bC5zdXBwb3J0PXt9LHA9ZSgiPHA+IilbMF0sZj1lLmVhY2g7cC5zdHlsZS5jc3NUZXh0PSJiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMSwxLDEsLjUpIixjLnJnYmE9cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IuaW5kZXhPZigicmdiYSIpPi0xLGYodSxmdW5jdGlvbihlLHQpe3QuY2FjaGU9Il8iK2UsdC5wcm9wcy5hbHBoYT17aWR4OjMsdHlwZToicGVyY2VudCIsZGVmOjF9fSksbC5mbj1lLmV4dGVuZChsLnByb3RvdHlwZSx7cGFyc2U6ZnVuY3Rpb24obixvLHIsaCl7aWYobj09PXQpcmV0dXJuIHRoaXMuX3JnYmE9W251bGwsbnVsbCxudWxsLG51bGxdLHRoaXM7KG4uanF1ZXJ5fHxuLm5vZGVUeXBlKSYmKG49ZShuKS5jc3Mobyksbz10KTt2YXIgZD10aGlzLGM9ZS50eXBlKG4pLHA9dGhpcy5fcmdiYT1bXTtyZXR1cm4gbyE9PXQmJihuPVtuLG8scixoXSxjPSJhcnJheSIpLCJzdHJpbmciPT09Yz90aGlzLnBhcnNlKHMobil8fGEuX2RlZmF1bHQpOiJhcnJheSI9PT1jPyhmKHUucmdiYS5wcm9wcyxmdW5jdGlvbihlLHQpe3BbdC5pZHhdPWkoblt0LmlkeF0sdCl9KSx0aGlzKToib2JqZWN0Ij09PWM/KG4gaW5zdGFuY2VvZiBsP2YodSxmdW5jdGlvbihlLHQpe25bdC5jYWNoZV0mJihkW3QuY2FjaGVdPW5bdC5jYWNoZV0uc2xpY2UoKSl9KTpmKHUsZnVuY3Rpb24odCxzKXt2YXIgYT1zLmNhY2hlO2Yocy5wcm9wcyxmdW5jdGlvbihlLHQpe2lmKCFkW2FdJiZzLnRvKXtpZigiYWxwaGEiPT09ZXx8bnVsbD09bltlXSlyZXR1cm47ZFthXT1zLnRvKGQuX3JnYmEpfWRbYV1bdC5pZHhdPWkobltlXSx0LCEwKX0pLGRbYV0mJjA+ZS5pbkFycmF5KG51bGwsZFthXS5zbGljZSgwLDMpKSYmKGRbYV1bM109MSxzLmZyb20mJihkLl9yZ2JhPXMuZnJvbShkW2FdKSkpfSksdGhpcyk6dH0saXM6ZnVuY3Rpb24oZSl7dmFyIGk9bChlKSxzPSEwLG49dGhpcztyZXR1cm4gZih1LGZ1bmN0aW9uKGUsYSl7dmFyIG8scj1pW2EuY2FjaGVdO3JldHVybiByJiYobz1uW2EuY2FjaGVdfHxhLnRvJiZhLnRvKG4uX3JnYmEpfHxbXSxmKGEucHJvcHMsZnVuY3Rpb24oZSxpKXtyZXR1cm4gbnVsbCE9cltpLmlkeF0/cz1yW2kuaWR4XT09PW9baS5pZHhdOnR9KSksc30pLHN9LF9zcGFjZTpmdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcztyZXR1cm4gZih1LGZ1bmN0aW9uKGkscyl7dFtzLmNhY2hlXSYmZS5wdXNoKGkpfSksZS5wb3AoKX0sdHJhbnNpdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBzPWwoZSksbj1zLl9zcGFjZSgpLGE9dVtuXSxvPTA9PT10aGlzLmFscGhhKCk/bCgidHJhbnNwYXJlbnQiKTp0aGlzLHI9b1thLmNhY2hlXXx8YS50byhvLl9yZ2JhKSxoPXIuc2xpY2UoKTtyZXR1cm4gcz1zW2EuY2FjaGVdLGYoYS5wcm9wcyxmdW5jdGlvbihlLG4pe3ZhciBhPW4uaWR4LG89clthXSxsPXNbYV0sdT1kW24udHlwZV18fHt9O251bGwhPT1sJiYobnVsbD09PW8/aFthXT1sOih1Lm1vZCYmKGwtbz51Lm1vZC8yP28rPXUubW9kOm8tbD51Lm1vZC8yJiYoby09dS5tb2QpKSxoW2FdPWkoKGwtbykqdCtvLG4pKSl9KSx0aGlzW25dKGgpfSxibGVuZDpmdW5jdGlvbih0KXtpZigxPT09dGhpcy5fcmdiYVszXSlyZXR1cm4gdGhpczt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpLG49bCh0KS5fcmdiYTtyZXR1cm4gbChlLm1hcChpLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKDEtcykqblt0XStzKmV9KSl9LHRvUmdiYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PSJyZ2JhKCIsaT1lLm1hcCh0aGlzLl9yZ2JhLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWU/dD4yPzE6MDplfSk7cmV0dXJuIDE9PT1pWzNdJiYoaS5wb3AoKSx0PSJyZ2IoIiksdCtpLmpvaW4oKSsiKSJ9LHRvSHNsYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PSJoc2xhKCIsaT1lLm1hcCh0aGlzLmhzbGEoKSxmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lJiYoZT10PjI/MTowKSx0JiYzPnQmJihlPU1hdGgucm91bmQoMTAwKmUpKyIlIiksZX0pO3JldHVybiAxPT09aVszXSYmKGkucG9wKCksdD0iaHNsKCIpLHQraS5qb2luKCkrIikifSx0b0hleFN0cmluZzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpO3JldHVybiB0JiZpLnB1c2gofn4oMjU1KnMpKSwiIyIrZS5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8MCkudG9TdHJpbmcoMTYpLDE9PT1lLmxlbmd0aD8iMCIrZTplfSkuam9pbigiIil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9yZ2JhWzNdPyJ0cmFuc3BhcmVudCI6dGhpcy50b1JnYmFTdHJpbmcoKX19KSxsLmZuLnBhcnNlLnByb3RvdHlwZT1sLmZuLHUuaHNsYS50bz1mdW5jdGlvbihlKXtpZihudWxsPT1lWzBdfHxudWxsPT1lWzFdfHxudWxsPT1lWzJdKXJldHVybltudWxsLG51bGwsbnVsbCxlWzNdXTt2YXIgdCxpLHM9ZVswXS8yNTUsbj1lWzFdLzI1NSxhPWVbMl0vMjU1LG89ZVszXSxyPU1hdGgubWF4KHMsbixhKSxoPU1hdGgubWluKHMsbixhKSxsPXItaCx1PXIraCxkPS41KnU7cmV0dXJuIHQ9aD09PXI/MDpzPT09cj82MCoobi1hKS9sKzM2MDpuPT09cj82MCooYS1zKS9sKzEyMDo2MCoocy1uKS9sKzI0MCxpPTA9PT1sPzA6LjU+PWQ/bC91OmwvKDItdSksW01hdGgucm91bmQodCklMzYwLGksZCxudWxsPT1vPzE6b119LHUuaHNsYS5mcm9tPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWVbMF18fG51bGw9PWVbMV18fG51bGw9PWVbMl0pcmV0dXJuW251bGwsbnVsbCxudWxsLGVbM11dO3ZhciB0PWVbMF0vMzYwLGk9ZVsxXSxzPWVbMl0sYT1lWzNdLG89LjU+PXM/cyooMStpKTpzK2ktcyppLHI9MipzLW87cmV0dXJuW01hdGgucm91bmQoMjU1Km4ocixvLHQrMS8zKSksTWF0aC5yb3VuZCgyNTUqbihyLG8sdCkpLE1hdGgucm91bmQoMjU1Km4ocixvLHQtMS8zKSksYV19LGYodSxmdW5jdGlvbihzLG4pe3ZhciBhPW4ucHJvcHMsbz1uLmNhY2hlLGg9bi50byx1PW4uZnJvbTtsLmZuW3NdPWZ1bmN0aW9uKHMpe2lmKGgmJiF0aGlzW29dJiYodGhpc1tvXT1oKHRoaXMuX3JnYmEpKSxzPT09dClyZXR1cm4gdGhpc1tvXS5zbGljZSgpO3ZhciBuLHI9ZS50eXBlKHMpLGQ9ImFycmF5Ij09PXJ8fCJvYmplY3QiPT09cj9zOmFyZ3VtZW50cyxjPXRoaXNbb10uc2xpY2UoKTtyZXR1cm4gZihhLGZ1bmN0aW9uKGUsdCl7dmFyIHM9ZFsib2JqZWN0Ij09PXI/ZTp0LmlkeF07bnVsbD09cyYmKHM9Y1t0LmlkeF0pLGNbdC5pZHhdPWkocyx0KX0pLHU/KG49bCh1KGMpKSxuW29dPWMsbik6bChjKX0sZihhLGZ1bmN0aW9uKHQsaSl7bC5mblt0XXx8KGwuZm5bdF09ZnVuY3Rpb24obil7dmFyIGEsbz1lLnR5cGUobiksaD0iYWxwaGEiPT09dD90aGlzLl9oc2xhPyJoc2xhIjoicmdiYSI6cyxsPXRoaXNbaF0oKSx1PWxbaS5pZHhdO3JldHVybiJ1bmRlZmluZWQiPT09bz91OigiZnVuY3Rpb24iPT09byYmKG49bi5jYWxsKHRoaXMsdSksbz1lLnR5cGUobikpLG51bGw9PW4mJmkuZW1wdHk/dGhpczooInN0cmluZyI9PT1vJiYoYT1yLmV4ZWMobiksYSYmKG49dStwYXJzZUZsb2F0KGFbMl0pKigiKyI9PT1hWzFdPzE6LTEpKSksbFtpLmlkeF09bix0aGlzW2hdKGwpKSl9KX0pfSksbC5ob29rPWZ1bmN0aW9uKHQpe3ZhciBpPXQuc3BsaXQoIiAiKTtmKGksZnVuY3Rpb24odCxpKXtlLmNzc0hvb2tzW2ldPXtzZXQ6ZnVuY3Rpb24odCxuKXt2YXIgYSxvLHI9IiI7aWYoInRyYW5zcGFyZW50IiE9PW4mJigic3RyaW5nIiE9PWUudHlwZShuKXx8KGE9cyhuKSkpKXtpZihuPWwoYXx8biksIWMucmdiYSYmMSE9PW4uX3JnYmFbM10pe2ZvcihvPSJiYWNrZ3JvdW5kQ29sb3IiPT09aT90LnBhcmVudE5vZGU6dDsoIiI9PT1yfHwidHJhbnNwYXJlbnQiPT09cikmJm8mJm8uc3R5bGU7KXRyeXtyPWUuY3NzKG8sImJhY2tncm91bmRDb2xvciIpLG89by5wYXJlbnROb2RlfWNhdGNoKGgpe31uPW4uYmxlbmQociYmInRyYW5zcGFyZW50IiE9PXI/cjoiX2RlZmF1bHQiKX1uPW4udG9SZ2JhU3RyaW5nKCl9dHJ5e3Quc3R5bGVbaV09bn1jYXRjaChoKXt9fX0sZS5meC5zdGVwW2ldPWZ1bmN0aW9uKHQpe3QuY29sb3JJbml0fHwodC5zdGFydD1sKHQuZWxlbSxpKSx0LmVuZD1sKHQuZW5kKSx0LmNvbG9ySW5pdD0hMCksZS5jc3NIb29rc1tpXS5zZXQodC5lbGVtLHQuc3RhcnQudHJhbnNpdGlvbih0LmVuZCx0LnBvcykpfX0pfSxsLmhvb2sobyksZS5jc3NIb29rcy5ib3JkZXJDb2xvcj17ZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBmKFsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZnVuY3Rpb24oaSxzKXt0WyJib3JkZXIiK3MrIkNvbG9yIl09ZX0pLHR9fSxhPWUuQ29sb3IubmFtZXM9e2FxdWE6IiMwMGZmZmYiLGJsYWNrOiIjMDAwMDAwIixibHVlOiIjMDAwMGZmIixmdWNoc2lhOiIjZmYwMGZmIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsbGltZToiIzAwZmYwMCIsbWFyb29uOiIjODAwMDAwIixuYXZ5OiIjMDAwMDgwIixvbGl2ZToiIzgwODAwMCIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHNpbHZlcjoiI2MwYzBjMCIsdGVhbDoiIzAwODA4MCIsd2hpdGU6IiNmZmZmZmYiLHllbGxvdzoiI2ZmZmYwMCIsdHJhbnNwYXJlbnQ6W251bGwsbnVsbCxudWxsLDBdLF9kZWZhdWx0OiIjZmZmZmZmIn19KGIpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxzLG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3P3Qub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCk6dC5jdXJyZW50U3R5bGUsYT17fTtpZihuJiZuLmxlbmd0aCYmblswXSYmbltuWzBdXSlmb3Iocz1uLmxlbmd0aDtzLS07KWk9bltzXSwic3RyaW5nIj09dHlwZW9mIG5baV0mJihhW2UuY2FtZWxDYXNlKGkpXT1uW2ldKTtlbHNlIGZvcihpIGluIG4pInN0cmluZyI9PXR5cGVvZiBuW2ldJiYoYVtpXT1uW2ldKTtyZXR1cm4gYX1mdW5jdGlvbiBpKHQsaSl7dmFyIHMsYSxvPXt9O2ZvcihzIGluIGkpYT1pW3NdLHRbc10hPT1hJiYobltzXXx8KGUuZnguc3RlcFtzXXx8IWlzTmFOKHBhcnNlRmxvYXQoYSkpKSYmKG9bc109YSkpO3JldHVybiBvfXZhciBzPVsiYWRkIiwicmVtb3ZlIiwidG9nZ2xlIl0sbj17Ym9yZGVyOjEsYm9yZGVyQm90dG9tOjEsYm9yZGVyQ29sb3I6MSxib3JkZXJMZWZ0OjEsYm9yZGVyUmlnaHQ6MSxib3JkZXJUb3A6MSxib3JkZXJXaWR0aDoxLG1hcmdpbjoxLHBhZGRpbmc6MX07ZS5lYWNoKFsiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyVG9wU3R5bGUiXSxmdW5jdGlvbih0LGkpe2UuZnguc3RlcFtpXT1mdW5jdGlvbihlKXsoIm5vbmUiIT09ZS5lbmQmJiFlLnNldEF0dHJ8fDE9PT1lLnBvcyYmIWUuc2V0QXR0cikmJihiLnN0eWxlKGUuZWxlbSxpLGUuZW5kKSxlLnNldEF0dHI9ITApfX0pLGUuZm4uYWRkQmFja3x8KGUuZm4uYWRkQmFjaz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9KSxlLmVmZmVjdHMuYW5pbWF0ZUNsYXNzPWZ1bmN0aW9uKG4sYSxvLHIpe3ZhciBoPWUuc3BlZWQoYSxvLHIpO3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGEsbz1lKHRoaXMpLHI9by5hdHRyKCJjbGFzcyIpfHwiIixsPWguY2hpbGRyZW4/by5maW5kKCIqIikuYWRkQmFjaygpOm87bD1sLm1hcChmdW5jdGlvbigpe3ZhciBpPWUodGhpcyk7cmV0dXJue2VsOmksc3RhcnQ6dCh0aGlzKX19KSxhPWZ1bmN0aW9uKCl7ZS5lYWNoKHMsZnVuY3Rpb24oZSx0KXtuW3RdJiZvW3QrIkNsYXNzIl0oblt0XSl9KX0sYSgpLGw9bC5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmQ9dCh0aGlzLmVsWzBdKSx0aGlzLmRpZmY9aSh0aGlzLnN0YXJ0LHRoaXMuZW5kKSx0aGlzfSksby5hdHRyKCJjbGFzcyIsciksbD1sLm1hcChmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT1lLkRlZmVycmVkKCkscz1lLmV4dGVuZCh7fSxoLHtxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpe2kucmVzb2x2ZSh0KX19KTtyZXR1cm4gdGhpcy5lbC5hbmltYXRlKHRoaXMuZGlmZixzKSxpLnByb21pc2UoKX0pLGUud2hlbi5hcHBseShlLGwuZ2V0KCkpLmRvbmUoZnVuY3Rpb24oKXthKCksZS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWw7ZS5lYWNoKHRoaXMuZGlmZixmdW5jdGlvbihlKXt0LmNzcyhlLCIiKX0pfSksaC5jb21wbGV0ZS5jYWxsKG9bMF0pfSl9KX0sZS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMsbixhKXtyZXR1cm4gcz9lLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7YWRkOml9LHMsbixhKTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KGUuZm4uYWRkQ2xhc3MpLHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMsbixhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHtyZW1vdmU6aX0scyxuLGEpOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oZS5mbi5yZW1vdmVDbGFzcyksdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkscyxuLGEsbyl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2Ygc3x8dm9pZCAwPT09cz9uP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHM/e2FkZDppfTp7cmVtb3ZlOml9LG4sYSxvKTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7dG9nZ2xlOml9LHMsbixhKX19KGUuZm4udG9nZ2xlQ2xhc3MpLHN3aXRjaENsYXNzOmZ1bmN0aW9uKHQsaSxzLG4sYSl7cmV0dXJuIGUuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHthZGQ6aSxyZW1vdmU6dH0scyxuLGEpfX0pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGkscyxuKXtyZXR1cm4gZS5pc1BsYWluT2JqZWN0KHQpJiYoaT10LHQ9dC5lZmZlY3QpLHQ9e2VmZmVjdDp0fSxudWxsPT1pJiYoaT17fSksZS5pc0Z1bmN0aW9uKGkpJiYobj1pLHM9bnVsbCxpPXt9KSwoIm51bWJlciI9PXR5cGVvZiBpfHxlLmZ4LnNwZWVkc1tpXSkmJihuPXMscz1pLGk9e30pLGUuaXNGdW5jdGlvbihzKSYmKG49cyxzPW51bGwpLGkmJmUuZXh0ZW5kKHQsaSkscz1zfHxpLmR1cmF0aW9uLHQuZHVyYXRpb249ZS5meC5vZmY/MDoibnVtYmVyIj09dHlwZW9mIHM/czpzIGluIGUuZnguc3BlZWRzP2UuZnguc3BlZWRzW3NdOmUuZnguc3BlZWRzLl9kZWZhdWx0LHQuY29tcGxldGU9bnx8aS5jb21wbGV0ZSx0fWZ1bmN0aW9uIGkodCl7cmV0dXJuIXR8fCJudW1iZXIiPT10eXBlb2YgdHx8ZS5meC5zcGVlZHNbdF0/ITA6InN0cmluZyIhPXR5cGVvZiB0fHxlLmVmZmVjdHMuZWZmZWN0W3RdP2UuaXNGdW5jdGlvbih0KT8hMDoib2JqZWN0IiE9dHlwZW9mIHR8fHQuZWZmZWN0PyExOiEwOiEwfWUuZXh0ZW5kKGUuZWZmZWN0cyx7dmVyc2lvbjoiMS4xMS40IixzYXZlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpPTA7dC5sZW5ndGg+aTtpKyspbnVsbCE9PXRbaV0mJmUuZGF0YSh5K3RbaV0sZVswXS5zdHlsZVt0W2ldXSl9LHJlc3RvcmU6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO2ZvcihzPTA7dC5sZW5ndGg+cztzKyspbnVsbCE9PXRbc10mJihpPWUuZGF0YSh5K3Rbc10pLHZvaWQgMD09PWkmJihpPSIiKSxlLmNzcyh0W3NdLGkpKX0sc2V0TW9kZTpmdW5jdGlvbihlLHQpe3JldHVybiJ0b2dnbGUiPT09dCYmKHQ9ZS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLHR9LGdldEJhc2VsaW5lOmZ1bmN0aW9uKGUsdCl7dmFyIGkscztzd2l0Y2goZVswXSl7Y2FzZSJ0b3AiOmk9MDticmVhaztjYXNlIm1pZGRsZSI6aT0uNTticmVhaztjYXNlImJvdHRvbSI6aT0xO2JyZWFrO2RlZmF1bHQ6aT1lWzBdL3QuaGVpZ2h0fXN3aXRjaChlWzFdKXtjYXNlImxlZnQiOnM9MDticmVhaztjYXNlImNlbnRlciI6cz0uNTticmVhaztjYXNlInJpZ2h0IjpzPTE7YnJlYWs7ZGVmYXVsdDpzPWVbMV0vdC53aWR0aH1yZXR1cm57eDpzLHk6aX19LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24odCl7aWYodC5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiB0LnBhcmVudCgpO3ZhciBpPXt3aWR0aDp0Lm91dGVyV2lkdGgoITApLGhlaWdodDp0Lm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOnQuY3NzKCJmbG9hdCIpfSxzPWUoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLG49e3dpZHRoOnQud2lkdGgoKSxoZWlnaHQ6dC5oZWlnaHQoKX0sYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3RyeXthLmlkfWNhdGNoKG8pe2E9ZG9jdW1lbnQuYm9keX1yZXR1cm4gdC53cmFwKHMpLCh0WzBdPT09YXx8ZS5jb250YWlucyh0WzBdLGEpKSYmZShhKS5mb2N1cygpLHM9dC5wYXJlbnQoKSwic3RhdGljIj09PXQuY3NzKCJwb3NpdGlvbiIpPyhzLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLHQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOihlLmV4dGVuZChpLHtwb3NpdGlvbjp0LmNzcygicG9zaXRpb24iKSx6SW5kZXg6dC5jc3MoInotaW5kZXgiKX0pLGUuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKGUscyl7aVtzXT10LmNzcyhzKSxpc05hTihwYXJzZUludChpW3NdLDEwKSkmJihpW3NdPSJhdXRvIil9KSx0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksdC5jc3Mobikscy5jc3MoaSkuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKHQpe3ZhciBpPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7Ci1yZXR1cm4gdC5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpJiYodC5wYXJlbnQoKS5yZXBsYWNlV2l0aCh0KSwodFswXT09PWl8fGUuY29udGFpbnModFswXSxpKSkmJmUoaSkuZm9jdXMoKSksdH0sc2V0VHJhbnNpdGlvbjpmdW5jdGlvbih0LGkscyxuKXtyZXR1cm4gbj1ufHx7fSxlLmVhY2goaSxmdW5jdGlvbihlLGkpe3ZhciBhPXQuY3NzVW5pdChpKTthWzBdPjAmJihuW2ldPWFbMF0qcythWzFdKX0pLG59fSksZS5mbi5leHRlbmQoe2VmZmVjdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGkodCl7ZnVuY3Rpb24gaSgpe2UuaXNGdW5jdGlvbihhKSYmYS5jYWxsKG5bMF0pLGUuaXNGdW5jdGlvbih0KSYmdCgpfXZhciBuPWUodGhpcyksYT1zLmNvbXBsZXRlLHI9cy5tb2RlOyhuLmlzKCI6aGlkZGVuIik/ImhpZGUiPT09cjoic2hvdyI9PT1yKT8obltyXSgpLGkoKSk6by5jYWxsKG5bMF0scyxpKX12YXIgcz10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuPXMubW9kZSxhPXMucXVldWUsbz1lLmVmZmVjdHMuZWZmZWN0W3MuZWZmZWN0XTtyZXR1cm4gZS5meC5vZmZ8fCFvP24/dGhpc1tuXShzLmR1cmF0aW9uLHMuY29tcGxldGUpOnRoaXMuZWFjaChmdW5jdGlvbigpe3MuY29tcGxldGUmJnMuY29tcGxldGUuY2FsbCh0aGlzKX0pOmE9PT0hMT90aGlzLmVhY2goaSk6dGhpcy5xdWV1ZShhfHwiZngiLGkpfSxzaG93OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtpZihpKHMpKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPSJzaG93Iix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fShlLmZuLnNob3cpLGhpZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHMpe2lmKGkocykpcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBuLm1vZGU9ImhpZGUiLHRoaXMuZWZmZWN0LmNhbGwodGhpcyxuKX19KGUuZm4uaGlkZSksdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtpZihpKHMpfHwiYm9vbGVhbiI9PXR5cGVvZiBzKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPSJ0b2dnbGUiLHRoaXMuZWZmZWN0LmNhbGwodGhpcyxuKX19KGUuZm4udG9nZ2xlKSxjc3NVbml0OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuY3NzKHQpLHM9W107cmV0dXJuIGUuZWFjaChbImVtIiwicHgiLCIlIiwicHQiXSxmdW5jdGlvbihlLHQpe2kuaW5kZXhPZih0KT4wJiYocz1bcGFyc2VGbG9hdChpKSx0XSl9KSxzfX0pfSgpLGZ1bmN0aW9uKCl7dmFyIHQ9e307ZS5lYWNoKFsiUXVhZCIsIkN1YmljIiwiUXVhcnQiLCJRdWludCIsIkV4cG8iXSxmdW5jdGlvbihlLGkpe3RbaV09ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KHQsZSsyKX19KSxlLmV4dGVuZCh0LHtTaW5lOmZ1bmN0aW9uKGUpe3JldHVybiAxLU1hdGguY29zKGUqTWF0aC5QSS8yKX0sQ2lyYzpmdW5jdGlvbihlKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1lKmUpfSxFbGFzdGljOmZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZXx8MT09PWU/ZTotTWF0aC5wb3coMiw4KihlLTEpKSpNYXRoLnNpbigoODAqKGUtMSktNy41KSpNYXRoLlBJLzE1KX0sQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gZSplKigzKmUtMil9LEJvdW5jZTpmdW5jdGlvbihlKXtmb3IodmFyIHQsaT00OygodD1NYXRoLnBvdygyLC0taSkpLTEpLzExPmU7KTtyZXR1cm4gMS9NYXRoLnBvdyg0LDMtaSktNy41NjI1Kk1hdGgucG93KCgzKnQtMikvMjItZSwyKX19KSxlLmVhY2godCxmdW5jdGlvbih0LGkpe2UuZWFzaW5nWyJlYXNlSW4iK3RdPWksZS5lYXNpbmdbImVhc2VPdXQiK3RdPWZ1bmN0aW9uKGUpe3JldHVybiAxLWkoMS1lKX0sZS5lYXNpbmdbImVhc2VJbk91dCIrdF09ZnVuY3Rpb24oZSl7cmV0dXJuLjU+ZT9pKDIqZSkvMjoxLWkoLTIqZSsyKS8yfX0pfSgpLGUuZWZmZWN0cyxlLmVmZmVjdHMuZWZmZWN0LmJsaW5kPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89ZSh0aGlzKSxyPS91cHxkb3dufHZlcnRpY2FsLyxoPS91cHxsZWZ0fHZlcnRpY2FsfGhvcml6b250YWwvLGw9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sdT1lLmVmZmVjdHMuc2V0TW9kZShvLHQubW9kZXx8ImhpZGUiKSxkPXQuZGlyZWN0aW9ufHwidXAiLGM9ci50ZXN0KGQpLHA9Yz8iaGVpZ2h0Ijoid2lkdGgiLGY9Yz8idG9wIjoibGVmdCIsbT1oLnRlc3QoZCksZz17fSx2PSJzaG93Ij09PXU7by5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpP2UuZWZmZWN0cy5zYXZlKG8ucGFyZW50KCksbCk6ZS5lZmZlY3RzLnNhdmUobyxsKSxvLnNob3coKSxzPWUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG8pLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxuPXNbcF0oKSxhPXBhcnNlRmxvYXQocy5jc3MoZikpfHwwLGdbcF09dj9uOjAsbXx8KG8uY3NzKGM/ImJvdHRvbSI6InJpZ2h0IiwwKS5jc3MoYz8idG9wIjoibGVmdCIsImF1dG8iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSJ9KSxnW2ZdPXY/YTpuK2EpLHYmJihzLmNzcyhwLDApLG18fHMuY3NzKGYsYStuKSkscy5hbmltYXRlKGcse2R1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLHF1ZXVlOiExLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ImhpZGUiPT09dSYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyxsKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihvKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QuYm91bmNlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89ZSh0aGlzKSxyPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLGg9ZS5lZmZlY3RzLnNldE1vZGUobyx0Lm1vZGV8fCJlZmZlY3QiKSxsPSJoaWRlIj09PWgsdT0ic2hvdyI9PT1oLGQ9dC5kaXJlY3Rpb258fCJ1cCIsYz10LmRpc3RhbmNlLHA9dC50aW1lc3x8NSxmPTIqcCsodXx8bD8xOjApLG09dC5kdXJhdGlvbi9mLGc9dC5lYXNpbmcsdj0idXAiPT09ZHx8ImRvd24iPT09ZD8idG9wIjoibGVmdCIseT0idXAiPT09ZHx8ImxlZnQiPT09ZCxiPW8ucXVldWUoKSxfPWIubGVuZ3RoO2ZvcigodXx8bCkmJnIucHVzaCgib3BhY2l0eSIpLGUuZWZmZWN0cy5zYXZlKG8sciksby5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobyksY3x8KGM9b1sidG9wIj09PXY/Im91dGVySGVpZ2h0Ijoib3V0ZXJXaWR0aCJdKCkvMyksdSYmKGE9e29wYWNpdHk6MX0sYVt2XT0wLG8uY3NzKCJvcGFjaXR5IiwwKS5jc3Modix5PzIqLWM6MipjKS5hbmltYXRlKGEsbSxnKSksbCYmKGMvPU1hdGgucG93KDIscC0xKSksYT17fSxhW3ZdPTAscz0wO3A+cztzKyspbj17fSxuW3ZdPSh5PyItPSI6Iis9IikrYyxvLmFuaW1hdGUobixtLGcpLmFuaW1hdGUoYSxtLGcpLGM9bD8yKmM6Yy8yO2wmJihuPXtvcGFjaXR5OjB9LG5bdl09KHk/Ii09IjoiKz0iKStjLG8uYW5pbWF0ZShuLG0sZykpLG8ucXVldWUoZnVuY3Rpb24oKXtsJiZvLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShvLHIpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKG8pLGkoKX0pLF8+MSYmYi5zcGxpY2UuYXBwbHkoYixbMSwwXS5jb25jYXQoYi5zcGxpY2UoXyxmKzEpKSksby5kZXF1ZXVlKCl9LGUuZWZmZWN0cy5lZmZlY3QuY2xpcD1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYSxvPWUodGhpcykscj1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSxoPWUuZWZmZWN0cy5zZXRNb2RlKG8sdC5tb2RlfHwiaGlkZSIpLGw9InNob3ciPT09aCx1PXQuZGlyZWN0aW9ufHwidmVydGljYWwiLGQ9InZlcnRpY2FsIj09PXUsYz1kPyJoZWlnaHQiOiJ3aWR0aCIscD1kPyJ0b3AiOiJsZWZ0IixmPXt9O2UuZWZmZWN0cy5zYXZlKG8sciksby5zaG93KCkscz1lLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihvKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksbj0iSU1HIj09PW9bMF0udGFnTmFtZT9zOm8sYT1uW2NdKCksbCYmKG4uY3NzKGMsMCksbi5jc3MocCxhLzIpKSxmW2NdPWw/YTowLGZbcF09bD8wOmEvMixuLmFuaW1hdGUoZix7cXVldWU6ITEsZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtsfHxvLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShvLHIpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKG8pLGkoKX19KX0sZS5lZmZlY3RzLmVmZmVjdC5kcm9wPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHRoaXMpLGE9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIm9wYWNpdHkiLCJoZWlnaHQiLCJ3aWR0aCJdLG89ZS5lZmZlY3RzLnNldE1vZGUobix0Lm1vZGV8fCJoaWRlIikscj0ic2hvdyI9PT1vLGg9dC5kaXJlY3Rpb258fCJsZWZ0IixsPSJ1cCI9PT1ofHwiZG93biI9PT1oPyJ0b3AiOiJsZWZ0Iix1PSJ1cCI9PT1ofHwibGVmdCI9PT1oPyJwb3MiOiJuZWciLGQ9e29wYWNpdHk6cj8xOjB9O2UuZWZmZWN0cy5zYXZlKG4sYSksbi5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobikscz10LmRpc3RhbmNlfHxuWyJ0b3AiPT09bD8ib3V0ZXJIZWlnaHQiOiJvdXRlcldpZHRoIl0oITApLzIsciYmbi5jc3MoIm9wYWNpdHkiLDApLmNzcyhsLCJwb3MiPT09dT8tczpzKSxkW2xdPShyPyJwb3MiPT09dT8iKz0iOiItPSI6InBvcyI9PT11PyItPSI6Iis9IikrcyxuLmFuaW1hdGUoZCx7cXVldWU6ITEsZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXsiaGlkZSI9PT1vJiZuLmhpZGUoKSxlLmVmZmVjdHMucmVzdG9yZShuLGEpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKG4pLGkoKX19KX0sZS5lZmZlY3RzLmVmZmVjdC5leHBsb2RlPWZ1bmN0aW9uKHQsaSl7ZnVuY3Rpb24gcygpe2IucHVzaCh0aGlzKSxiLmxlbmd0aD09PWQqYyYmbigpfWZ1bmN0aW9uIG4oKXtwLmNzcyh7dmlzaWJpbGl0eToidmlzaWJsZSJ9KSxlKGIpLnJlbW92ZSgpLG18fHAuaGlkZSgpLGkoKX12YXIgYSxvLHIsaCxsLHUsZD10LnBpZWNlcz9NYXRoLnJvdW5kKE1hdGguc3FydCh0LnBpZWNlcykpOjMsYz1kLHA9ZSh0aGlzKSxmPWUuZWZmZWN0cy5zZXRNb2RlKHAsdC5tb2RlfHwiaGlkZSIpLG09InNob3ciPT09ZixnPXAuc2hvdygpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLm9mZnNldCgpLHY9TWF0aC5jZWlsKHAub3V0ZXJXaWR0aCgpL2MpLHk9TWF0aC5jZWlsKHAub3V0ZXJIZWlnaHQoKS9kKSxiPVtdO2ZvcihhPTA7ZD5hO2ErKylmb3IoaD1nLnRvcCthKnksdT1hLShkLTEpLzIsbz0wO2M+bztvKyspcj1nLmxlZnQrbyp2LGw9by0oYy0xKS8yLHAuY2xvbmUoKS5hcHBlbmRUbygiYm9keSIpLndyYXAoIjxkaXY+PC9kaXY+IikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6InZpc2libGUiLGxlZnQ6LW8qdix0b3A6LWEqeX0pLnBhcmVudCgpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLWV4cGxvZGUiKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsb3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6dixoZWlnaHQ6eSxsZWZ0OnIrKG0/bCp2OjApLHRvcDpoKyhtP3UqeTowKSxvcGFjaXR5Om0/MDoxfSkuYW5pbWF0ZSh7bGVmdDpyKyhtPzA6bCp2KSx0b3A6aCsobT8wOnUqeSksb3BhY2l0eTptPzE6MH0sdC5kdXJhdGlvbnx8NTAwLHQuZWFzaW5nLHMpfSxlLmVmZmVjdHMuZWZmZWN0LmZhZGU9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG49ZS5lZmZlY3RzLnNldE1vZGUocyx0Lm1vZGV8fCJ0b2dnbGUiKTtzLmFuaW1hdGUoe29wYWNpdHk6bn0se3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOml9KX0sZS5lZmZlY3RzLmVmZmVjdC5mb2xkPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhPWUodGhpcyksbz1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSxyPWUuZWZmZWN0cy5zZXRNb2RlKGEsdC5tb2RlfHwiaGlkZSIpLGg9InNob3ciPT09cixsPSJoaWRlIj09PXIsdT10LnNpemV8fDE1LGQ9LyhbMC05XSspJS8uZXhlYyh1KSxjPSEhdC5ob3JpekZpcnN0LHA9aCE9PWMsZj1wP1sid2lkdGgiLCJoZWlnaHQiXTpbImhlaWdodCIsIndpZHRoIl0sbT10LmR1cmF0aW9uLzIsZz17fSx2PXt9O2UuZWZmZWN0cy5zYXZlKGEsbyksYS5zaG93KCkscz1lLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihhKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksbj1wP1tzLndpZHRoKCkscy5oZWlnaHQoKV06W3MuaGVpZ2h0KCkscy53aWR0aCgpXSxkJiYodT1wYXJzZUludChkWzFdLDEwKS8xMDAqbltsPzA6MV0pLGgmJnMuY3NzKGM/e2hlaWdodDowLHdpZHRoOnV9OntoZWlnaHQ6dSx3aWR0aDowfSksZ1tmWzBdXT1oP25bMF06dSx2W2ZbMV1dPWg/blsxXTowLHMuYW5pbWF0ZShnLG0sdC5lYXNpbmcpLmFuaW1hdGUodixtLHQuZWFzaW5nLGZ1bmN0aW9uKCl7bCYmYS5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUoYSxvKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihhKSxpKCl9KX0sZS5lZmZlY3RzLmVmZmVjdC5oaWdobGlnaHQ9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG49WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kQ29sb3IiLCJvcGFjaXR5Il0sYT1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8InNob3ciKSxvPXtiYWNrZ3JvdW5kQ29sb3I6cy5jc3MoImJhY2tncm91bmRDb2xvciIpfTsiaGlkZSI9PT1hJiYoby5vcGFjaXR5PTApLGUuZWZmZWN0cy5zYXZlKHMsbikscy5zaG93KCkuY3NzKHtiYWNrZ3JvdW5kSW1hZ2U6Im5vbmUiLGJhY2tncm91bmRDb2xvcjp0LmNvbG9yfHwiI2ZmZmY5OSJ9KS5hbmltYXRlKG8se3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ImhpZGUiPT09YSYmcy5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUocyxuKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3Quc2l6ZT1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYSxvPWUodGhpcykscj1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxoPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJvdmVyZmxvdyIsIm9wYWNpdHkiXSxsPVsid2lkdGgiLCJoZWlnaHQiLCJvdmVyZmxvdyJdLHU9WyJmb250U2l6ZSJdLGQ9WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxjPVsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0scD1lLmVmZmVjdHMuc2V0TW9kZShvLHQubW9kZXx8ImVmZmVjdCIpLGY9dC5yZXN0b3JlfHwiZWZmZWN0IiE9PXAsbT10LnNjYWxlfHwiYm90aCIsZz10Lm9yaWdpbnx8WyJtaWRkbGUiLCJjZW50ZXIiXSx2PW8uY3NzKCJwb3NpdGlvbiIpLHk9Zj9yOmgsYj17aGVpZ2h0OjAsd2lkdGg6MCxvdXRlckhlaWdodDowLG91dGVyV2lkdGg6MH07InNob3ciPT09cCYmby5zaG93KCkscz17aGVpZ2h0Om8uaGVpZ2h0KCksd2lkdGg6by53aWR0aCgpLG91dGVySGVpZ2h0Om8ub3V0ZXJIZWlnaHQoKSxvdXRlcldpZHRoOm8ub3V0ZXJXaWR0aCgpfSwidG9nZ2xlIj09PXQubW9kZSYmInNob3ciPT09cD8oby5mcm9tPXQudG98fGIsby50bz10LmZyb218fHMpOihvLmZyb209dC5mcm9tfHwoInNob3ciPT09cD9iOnMpLG8udG89dC50b3x8KCJoaWRlIj09PXA/YjpzKSksYT17ZnJvbTp7eTpvLmZyb20uaGVpZ2h0L3MuaGVpZ2h0LHg6by5mcm9tLndpZHRoL3Mud2lkdGh9LHRvOnt5Om8udG8uaGVpZ2h0L3MuaGVpZ2h0LHg6by50by53aWR0aC9zLndpZHRofX0sKCJib3giPT09bXx8ImJvdGgiPT09bSkmJihhLmZyb20ueSE9PWEudG8ueSYmKHk9eS5jb25jYXQoZCksby5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sZCxhLmZyb20ueSxvLmZyb20pLG8udG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxkLGEudG8ueSxvLnRvKSksYS5mcm9tLnghPT1hLnRvLngmJih5PXkuY29uY2F0KGMpLG8uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGMsYS5mcm9tLngsby5mcm9tKSxvLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sYyxhLnRvLngsby50bykpKSwoImNvbnRlbnQiPT09bXx8ImJvdGgiPT09bSkmJmEuZnJvbS55IT09YS50by55JiYoeT15LmNvbmNhdCh1KS5jb25jYXQobCksby5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sdSxhLmZyb20ueSxvLmZyb20pLG8udG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyx1LGEudG8ueSxvLnRvKSksZS5lZmZlY3RzLnNhdmUobyx5KSxvLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihvKSxvLmNzcygib3ZlcmZsb3ciLCJoaWRkZW4iKS5jc3Moby5mcm9tKSxnJiYobj1lLmVmZmVjdHMuZ2V0QmFzZWxpbmUoZyxzKSxvLmZyb20udG9wPShzLm91dGVySGVpZ2h0LW8ub3V0ZXJIZWlnaHQoKSkqbi55LG8uZnJvbS5sZWZ0PShzLm91dGVyV2lkdGgtby5vdXRlcldpZHRoKCkpKm4ueCxvLnRvLnRvcD0ocy5vdXRlckhlaWdodC1vLnRvLm91dGVySGVpZ2h0KSpuLnksby50by5sZWZ0PShzLm91dGVyV2lkdGgtby50by5vdXRlcldpZHRoKSpuLngpLG8uY3NzKG8uZnJvbSksKCJjb250ZW50Ij09PW18fCJib3RoIj09PW0pJiYoZD1kLmNvbmNhdChbIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSJdKS5jb25jYXQodSksYz1jLmNvbmNhdChbIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCJdKSxsPXIuY29uY2F0KGQpLmNvbmNhdChjKSxvLmZpbmQoIipbd2lkdGhdIikuZWFjaChmdW5jdGlvbigpe3ZhciBpPWUodGhpcykscz17aGVpZ2h0OmkuaGVpZ2h0KCksd2lkdGg6aS53aWR0aCgpLG91dGVySGVpZ2h0Omkub3V0ZXJIZWlnaHQoKSxvdXRlcldpZHRoOmkub3V0ZXJXaWR0aCgpfTtmJiZlLmVmZmVjdHMuc2F2ZShpLGwpLGkuZnJvbT17aGVpZ2h0OnMuaGVpZ2h0KmEuZnJvbS55LHdpZHRoOnMud2lkdGgqYS5mcm9tLngsb3V0ZXJIZWlnaHQ6cy5vdXRlckhlaWdodCphLmZyb20ueSxvdXRlcldpZHRoOnMub3V0ZXJXaWR0aCphLmZyb20ueH0saS50bz17aGVpZ2h0OnMuaGVpZ2h0KmEudG8ueSx3aWR0aDpzLndpZHRoKmEudG8ueCxvdXRlckhlaWdodDpzLmhlaWdodCphLnRvLnksb3V0ZXJXaWR0aDpzLndpZHRoKmEudG8ueH0sYS5mcm9tLnkhPT1hLnRvLnkmJihpLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24oaSxkLGEuZnJvbS55LGkuZnJvbSksaS50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihpLGQsYS50by55LGkudG8pKSxhLmZyb20ueCE9PWEudG8ueCYmKGkuZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihpLGMsYS5mcm9tLngsaS5mcm9tKSxpLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksYyxhLnRvLngsaS50bykpLGkuY3NzKGkuZnJvbSksaS5hbmltYXRlKGkudG8sdC5kdXJhdGlvbix0LmVhc2luZyxmdW5jdGlvbigpe2YmJmUuZWZmZWN0cy5yZXN0b3JlKGksbCl9KX0pKSxvLmFuaW1hdGUoby50byx7cXVldWU6ITEsZHVyYXRpb246dC5kdXJhdGlvbixlYXNpbmc6dC5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXswPT09by50by5vcGFjaXR5JiZvLmNzcygib3BhY2l0eSIsby5mcm9tLm9wYWNpdHkpLCJoaWRlIj09PXAmJm8uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG8seSksZnx8KCJzdGF0aWMiPT09dj9vLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6by50by50b3AsbGVmdDpvLnRvLmxlZnR9KTplLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXtvLmNzcyh0LGZ1bmN0aW9uKHQsaSl7dmFyIHM9cGFyc2VJbnQoaSwxMCksbj1lP28udG8ubGVmdDpvLnRvLnRvcDtyZXR1cm4iYXV0byI9PT1pP24rInB4IjpzK24rInB4In0pfSkpLGUuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKG8pLGkoKX19KX0sZS5lZmZlY3RzLmVmZmVjdC5zY2FsZT1mdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcyksbj1lLmV4dGVuZCghMCx7fSx0KSxhPWUuZWZmZWN0cy5zZXRNb2RlKHMsdC5tb2RlfHwiZWZmZWN0Iiksbz1wYXJzZUludCh0LnBlcmNlbnQsMTApfHwoMD09PXBhcnNlSW50KHQucGVyY2VudCwxMCk/MDoiaGlkZSI9PT1hPzA6MTAwKSxyPXQuZGlyZWN0aW9ufHwiYm90aCIsaD10Lm9yaWdpbixsPXtoZWlnaHQ6cy5oZWlnaHQoKSx3aWR0aDpzLndpZHRoKCksb3V0ZXJIZWlnaHQ6cy5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKCl9LHU9e3k6Imhvcml6b250YWwiIT09cj9vLzEwMDoxLHg6InZlcnRpY2FsIiE9PXI/by8xMDA6MX07bi5lZmZlY3Q9InNpemUiLG4ucXVldWU9ITEsbi5jb21wbGV0ZT1pLCJlZmZlY3QiIT09YSYmKG4ub3JpZ2luPWh8fFsibWlkZGxlIiwiY2VudGVyIl0sbi5yZXN0b3JlPSEwKSxuLmZyb209dC5mcm9tfHwoInNob3ciPT09YT97aGVpZ2h0OjAsd2lkdGg6MCxvdXRlckhlaWdodDowLG91dGVyV2lkdGg6MH06bCksbi50bz17aGVpZ2h0OmwuaGVpZ2h0KnUueSx3aWR0aDpsLndpZHRoKnUueCxvdXRlckhlaWdodDpsLm91dGVySGVpZ2h0KnUueSxvdXRlcldpZHRoOmwub3V0ZXJXaWR0aCp1Lnh9LG4uZmFkZSYmKCJzaG93Ij09PWEmJihuLmZyb20ub3BhY2l0eT0wLG4udG8ub3BhY2l0eT0xKSwiaGlkZSI9PT1hJiYobi5mcm9tLm9wYWNpdHk9MSxuLnRvLm9wYWNpdHk9MCkpLHMuZWZmZWN0KG4pfSxlLmVmZmVjdHMuZWZmZWN0LnB1ZmY9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG49ZS5lZmZlY3RzLnNldE1vZGUocyx0Lm1vZGV8fCJoaWRlIiksYT0iaGlkZSI9PT1uLG89cGFyc2VJbnQodC5wZXJjZW50LDEwKXx8MTUwLHI9by8xMDAsaD17aGVpZ2h0OnMuaGVpZ2h0KCksd2lkdGg6cy53aWR0aCgpLG91dGVySGVpZ2h0OnMub3V0ZXJIZWlnaHQoKSxvdXRlcldpZHRoOnMub3V0ZXJXaWR0aCgpfTtlLmV4dGVuZCh0LHtlZmZlY3Q6InNjYWxlIixxdWV1ZTohMSxmYWRlOiEwLG1vZGU6bixjb21wbGV0ZTppLHBlcmNlbnQ6YT9vOjEwMCxmcm9tOmE/aDp7aGVpZ2h0OmguaGVpZ2h0KnIsd2lkdGg6aC53aWR0aCpyLG91dGVySGVpZ2h0Omgub3V0ZXJIZWlnaHQqcixvdXRlcldpZHRoOmgub3V0ZXJXaWR0aCpyfX0pLHMuZWZmZWN0KHQpfSxlLmVmZmVjdHMuZWZmZWN0LnB1bHNhdGU9ZnVuY3Rpb24odCxpKXt2YXIgcyxuPWUodGhpcyksYT1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8InNob3ciKSxvPSJzaG93Ij09PWEscj0iaGlkZSI9PT1hLGg9b3x8ImhpZGUiPT09YSxsPTIqKHQudGltZXN8fDUpKyhoPzE6MCksdT10LmR1cmF0aW9uL2wsZD0wLGM9bi5xdWV1ZSgpLHA9Yy5sZW5ndGg7Zm9yKChvfHwhbi5pcygiOnZpc2libGUiKSkmJihuLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLGQ9MSkscz0xO2w+cztzKyspbi5hbmltYXRlKHtvcGFjaXR5OmR9LHUsdC5lYXNpbmcpLGQ9MS1kO24uYW5pbWF0ZSh7b3BhY2l0eTpkfSx1LHQuZWFzaW5nKSxuLnF1ZXVlKGZ1bmN0aW9uKCl7ciYmbi5oaWRlKCksaSgpfSkscD4xJiZjLnNwbGljZS5hcHBseShjLFsxLDBdLmNvbmNhdChjLnNwbGljZShwLGwrMSkpKSxuLmRlcXVldWUoKX0sZS5lZmZlY3RzLmVmZmVjdC5zaGFrZT1mdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0aGlzKSxhPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLG89ZS5lZmZlY3RzLnNldE1vZGUobix0Lm1vZGV8fCJlZmZlY3QiKSxyPXQuZGlyZWN0aW9ufHwibGVmdCIsaD10LmRpc3RhbmNlfHwyMCxsPXQudGltZXN8fDMsdT0yKmwrMSxkPU1hdGgucm91bmQodC5kdXJhdGlvbi91KSxjPSJ1cCI9PT1yfHwiZG93biI9PT1yPyJ0b3AiOiJsZWZ0IixwPSJ1cCI9PT1yfHwibGVmdCI9PT1yLGY9e30sbT17fSxnPXt9LHY9bi5xdWV1ZSgpLHk9di5sZW5ndGg7Zm9yKGUuZWZmZWN0cy5zYXZlKG4sYSksbi5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobiksZltjXT0ocD8iLT0iOiIrPSIpK2gsbVtjXT0ocD8iKz0iOiItPSIpKzIqaCxnW2NdPShwPyItPSI6Iis9IikrMipoLG4uYW5pbWF0ZShmLGQsdC5lYXNpbmcpLHM9MTtsPnM7cysrKW4uYW5pbWF0ZShtLGQsdC5lYXNpbmcpLmFuaW1hdGUoZyxkLHQuZWFzaW5nKTtuLmFuaW1hdGUobSxkLHQuZWFzaW5nKS5hbmltYXRlKGYsZC8yLHQuZWFzaW5nKS5xdWV1ZShmdW5jdGlvbigpeyJoaWRlIj09PW8mJm4uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG4sYSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobiksaSgpfSkseT4xJiZ2LnNwbGljZS5hcHBseSh2LFsxLDBdLmNvbmNhdCh2LnNwbGljZSh5LHUrMSkpKSxuLmRlcXVldWUoKX0sZS5lZmZlY3RzLmVmZmVjdC5zbGlkZT1mdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0aGlzKSxhPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJ3aWR0aCIsImhlaWdodCJdLG89ZS5lZmZlY3RzLnNldE1vZGUobix0Lm1vZGV8fCJzaG93Iikscj0ic2hvdyI9PT1vLGg9dC5kaXJlY3Rpb258fCJsZWZ0IixsPSJ1cCI9PT1ofHwiZG93biI9PT1oPyJ0b3AiOiJsZWZ0Iix1PSJ1cCI9PT1ofHwibGVmdCI9PT1oLGQ9e307ZS5lZmZlY3RzLnNhdmUobixhKSxuLnNob3coKSxzPXQuZGlzdGFuY2V8fG5bInRvcCI9PT1sPyJvdXRlckhlaWdodCI6Im91dGVyV2lkdGgiXSghMCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobikuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pLHImJm4uY3NzKGwsdT9pc05hTihzKT8iLSIrczotczpzKSxkW2xdPShyP3U/Iis9IjoiLT0iOnU/Ii09IjoiKz0iKStzLG4uYW5pbWF0ZShkLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpeyJoaWRlIj09PW8mJm4uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG4sYSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobiksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LnRyYW5zZmVyPWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPWUodC50byksYT0iZml4ZWQiPT09bi5jc3MoInBvc2l0aW9uIiksbz1lKCJib2R5Iikscj1hP28uc2Nyb2xsVG9wKCk6MCxoPWE/by5zY3JvbGxMZWZ0KCk6MCxsPW4ub2Zmc2V0KCksdT17dG9wOmwudG9wLXIsbGVmdDpsLmxlZnQtaCxoZWlnaHQ6bi5pbm5lckhlaWdodCgpLHdpZHRoOm4uaW5uZXJXaWR0aCgpfSxkPXMub2Zmc2V0KCksYz1lKCI8ZGl2IGNsYXNzPSd1aS1lZmZlY3RzLXRyYW5zZmVyJz48L2Rpdj4iKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5hZGRDbGFzcyh0LmNsYXNzTmFtZSkuY3NzKHt0b3A6ZC50b3AtcixsZWZ0OmQubGVmdC1oLGhlaWdodDpzLmlubmVySGVpZ2h0KCksd2lkdGg6cy5pbm5lcldpZHRoKCkscG9zaXRpb246YT8iZml4ZWQiOiJhYnNvbHV0ZSJ9KS5hbmltYXRlKHUsdC5kdXJhdGlvbix0LmVhc2luZyxmdW5jdGlvbigpe2MucmVtb3ZlKCksaSgpfSl9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vanF1ZXJ5LXVpLnN0cnVjdHVyZS5taW4uY3NzIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vanF1ZXJ5LXVpLnN0cnVjdHVyZS5taW4uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFhMzk2Li4wMDAwMDAwCi0tLSBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2pxdWVyeS11aS5zdHJ1Y3R1cmUubWluLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotLyohIGpRdWVyeSBVSSAtIHYxLjExLjQgLSAyMDE2LTAyLTI4Ci0qIGh0dHA6Ly9qcXVlcnl1aS5jb20KLSogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnM7IExpY2Vuc2VkIE1JVCAqLwotCi0udWktaGVscGVyLWhpZGRlbntkaXNwbGF5Om5vbmV9LnVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweH0udWktaGVscGVyLXJlc2V0e21hcmdpbjowO3BhZGRpbmc6MDtib3JkZXI6MDtvdXRsaW5lOjA7bGluZS1oZWlnaHQ6MS4zO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxMDAlO2xpc3Qtc3R5bGU6bm9uZX0udWktaGVscGVyLWNsZWFyZml4OmJlZm9yZSwudWktaGVscGVyLWNsZWFyZml4OmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTp0YWJsZTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2V9LnVpLWhlbHBlci1jbGVhcmZpeDphZnRlcntjbGVhcjpib3RofS51aS1oZWxwZXItY2xlYXJmaXh7bWluLWhlaWdodDowfS51aS1oZWxwZXItemZpeHt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MCl9LnVpLWZyb250e3otaW5kZXg6MTAwfS51aS1zdGF0ZS1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdCFpbXBvcnRhbnR9LnVpLWljb257ZGlzcGxheTpibG9jazt0ZXh0LWluZGVudDotOTk5OTlweDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS51aS13aWRnZXQtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0udWktZHJhZ2dhYmxlLWhhbmRsZXstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLXJlc2l6YWJsZXtwb3NpdGlvbjpyZWxhdGl2ZX0udWktcmVzaXphYmxlLWhhbmRsZXtwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6MC4xcHg7ZGlzcGxheTpibG9jazstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLXJlc2l6YWJsZS1kaXNhYmxlZCAudWktcmVzaXphYmxlLWhhbmRsZSwudWktcmVzaXphYmxlLWF1dG9oaWRlIC51aS1yZXNpemFibGUtaGFuZGxle2Rpc3BsYXk6bm9uZX0udWktcmVzaXphYmxlLW57Y3Vyc29yOm4tcmVzaXplO2hlaWdodDo3cHg7d2lkdGg6MTAwJTt0b3A6LTVweDtsZWZ0OjB9LnVpLXJlc2l6YWJsZS1ze2N1cnNvcjpzLXJlc2l6ZTtoZWlnaHQ6N3B4O3dpZHRoOjEwMCU7Ym90dG9tOi01cHg7bGVmdDowfS51aS1yZXNpemFibGUtZXtjdXJzb3I6ZS1yZXNpemU7d2lkdGg6N3B4O3JpZ2h0Oi01cHg7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXJlc2l6YWJsZS13e2N1cnNvcjp3LXJlc2l6ZTt3aWR0aDo3cHg7bGVmdDotNXB4O3RvcDowO2hlaWdodDoxMDAlfS51aS1yZXNpemFibGUtc2V7Y3Vyc29yOnNlLXJlc2l6ZTt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O3JpZ2h0OjFweDtib3R0b206MXB4fS51aS1yZXNpemFibGUtc3d7Y3Vyc29yOnN3LXJlc2l6ZTt3aWR0aDo5cHg7aGVpZ2h0OjlweDtsZWZ0Oi01cHg7Ym90dG9tOi01cHh9LnVpLXJlc2l6YWJsZS1ud3tjdXJzb3I6bnctcmVzaXplO3dpZHRoOjlweDtoZWlnaHQ6OXB4O2xlZnQ6LTVweDt0b3A6LTVweH0udWktcmVzaXphYmxlLW5le2N1cnNvcjpuZS1yZXNpemU7d2lkdGg6OXB4O2hlaWdodDo5cHg7cmlnaHQ6LTVweDt0b3A6LTVweH0udWktc2VsZWN0YWJsZXstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLXNlbGVjdGFibGUtaGVscGVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwO2JvcmRlcjoxcHggZG90dGVkIGJsYWNrfS51aS1zb3J0YWJsZS1oYW5kbGV7LW1zLXRvdWNoLWFjdGlvbjpub25lO3RvdWNoLWFjdGlvbjpub25lfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXJ7ZGlzcGxheTpibG9jaztjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MnB4IDAgMCAwO3BhZGRpbmc6LjVlbSAuNWVtIC41ZW0gLjdlbTttaW4taGVpZ2h0OjA7Zm9udC1zaXplOjEwMCV9LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWljb25ze3BhZGRpbmctbGVmdDoyLjJlbX0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taWNvbnMgLnVpLWFjY29yZGlvbi1pY29uc3twYWRkaW5nLWxlZnQ6Mi4yZW19LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWhlYWRlciAudWktYWNjb3JkaW9uLWhlYWRlci1pY29ue3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6LjVlbTt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24tY29udGVudHtwYWRkaW5nOjFlbSAyLjJlbTtib3JkZXItdG9wOjA7b3ZlcmZsb3c6YXV0b30udWktYXV0b2NvbXBsZXRle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtjdXJzb3I6ZGVmYXVsdH0udWktYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6MDtsaW5lLWhlaWdodDpub3JtYWw7bWFyZ2luLXJpZ2h0Oi4xZW07Y3Vyc29yOnBvaW50ZXI7dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyO292ZXJmbG93OnZpc2libGV9LnVpLWJ1dHRvbiwudWktYnV0dG9uOmxpbmssLnVpLWJ1dHRvbjp2aXNpdGVkLC51aS1idXR0b246aG92ZXIsLnVpLWJ1dHRvbjphY3RpdmV7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLWJ1dHRvbi1pY29uLW9ubHl7d2lkdGg6Mi4yZW19YnV0dG9uLnVpLWJ1dHRvbi1pY29uLW9ubHl7d2lkdGg6Mi40ZW19LnVpLWJ1dHRvbi1pY29ucy1vbmx5e3dpZHRoOjMuNGVtfWJ1dHRvbi51aS1idXR0b24taWNvbnMtb25seXt3aWR0aDozLjdlbX0udWktYnV0dG9uIC51aS1idXR0b24tdGV4dHtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0Om5vcm1hbH0udWktYnV0dG9uLXRleHQtb25seSAudWktYnV0dG9uLXRleHR7cGFkZGluZzouNGVtIDFlbX0udWktYnV0dG9uLWljb24tb25seSAudWktYnV0dG9uLXRleHQsLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24tdGV4dHtwYWRkaW5nOi40ZW07dGV4dC1pbmRlbnQ6LTk5OTk5OTlweH0udWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IC51aS1idXR0b24tdGV4dCwudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmc6LjRlbSAxZW0gLjRlbSAyLjFlbX0udWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWJ1dHRvbi10ZXh0LC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLXRleHR7cGFkZGluZzouNGVtIDIuMWVtIC40ZW0gMWVtfS51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLXRleHR7cGFkZGluZy1sZWZ0OjIuMWVtO3BhZGRpbmctcmlnaHQ6Mi4xZW19aW5wdXQudWktYnV0dG9ue3BhZGRpbmc6LjRlbSAxZW19LnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb24sLnVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSAudWktaWNvbiwudWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWljb24sLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1pY29uLC51aS1idXR0b24taWNvbnMtb25seSAudWktaWNvbntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktYnV0dG9uLWljb24tb25seSAudWktaWNvbntsZWZ0OjUwJTttYXJnaW4tbGVmdDotOHB4fS51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnksLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1wcmltYXJ5LC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tcHJpbWFyeXtsZWZ0Oi41ZW19LnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnl7cmlnaHQ6LjVlbX0udWktYnV0dG9uc2V0e21hcmdpbi1yaWdodDo3cHh9LnVpLWJ1dHRvbnNldCAudWktYnV0dG9ue21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0Oi0uM2VtfWlucHV0LnVpLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixidXR0b24udWktYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowO3BhZGRpbmc6MH0udWktZGF0ZXBpY2tlcnt3aWR0aDoxN2VtO3BhZGRpbmc6LjJlbSAuMmVtIDA7ZGlzcGxheTpub25lfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOi4yZW0gMH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDt3aWR0aDoxLjhlbTtoZWlnaHQ6MS44ZW19LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciwudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVye3RvcDoxcHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldntsZWZ0OjJweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0e3JpZ2h0OjJweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVye2xlZnQ6MXB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQtaG92ZXJ7cmlnaHQ6MXB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYgc3BhbiwudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0IHNwYW57ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotOHB4O3RvcDo1MCU7bWFyZ2luLXRvcDotOHB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXRpdGxle21hcmdpbjowIDIuM2VtO2xpbmUtaGVpZ2h0OjEuOGVtO3RleHQtYWxpZ246Y2VudGVyfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXRpdGxlIHNlbGVjdHtmb250LXNpemU6MWVtO21hcmdpbjoxcHggMH0udWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwudWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFye3dpZHRoOjQ1JX0udWktZGF0ZXBpY2tlciB0YWJsZXt3aWR0aDoxMDAlO2ZvbnQtc2l6ZTouOWVtO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTttYXJnaW46MCAwIC40ZW19LnVpLWRhdGVwaWNrZXIgdGh7cGFkZGluZzouN2VtIC4zZW07dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDtib3JkZXI6MH0udWktZGF0ZXBpY2tlciB0ZHtib3JkZXI6MDtwYWRkaW5nOjFweH0udWktZGF0ZXBpY2tlciB0ZCBzcGFuLC51aS1kYXRlcGlja2VyIHRkIGF7ZGlzcGxheTpibG9jaztwYWRkaW5nOi4yZW07dGV4dC1hbGlnbjpyaWdodDt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2JhY2tncm91bmQtaW1hZ2U6bm9uZTttYXJnaW46LjdlbSAwIDAgMDtwYWRkaW5nOjAgLjJlbTtib3JkZXItbGVmdDowO2JvcmRlci1yaWdodDowO2JvcmRlci1ib3R0b206MH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbntmbG9hdDpyaWdodDttYXJnaW46LjVlbSAuMmVtIC40ZW07Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzouMmVtIC42ZW0gLjNlbSAuNmVtO3dpZHRoOmF1dG87b3ZlcmZsb3c6dmlzaWJsZX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnR7ZmxvYXQ6bGVmdH0udWktZGF0ZXBpY2tlci51aS1kYXRlcGlja2VyLW11bHRpe3dpZHRoOmF1dG99LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXB7ZmxvYXQ6bGVmdH0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cCB0YWJsZXt3aWR0aDo5NSU7bWFyZ2luOjAgYXV0byAuNGVtfS51aS1kYXRlcGlja2VyLW11bHRpLTIgLnVpLWRhdGVwaWNrZXItZ3JvdXB7d2lkdGg6NTAlfS51aS1kYXRlcGlja2VyLW11bHRpLTMgLnVpLWRhdGVwaWNrZXItZ3JvdXB7d2lkdGg6MzMuMyV9LnVpLWRhdGVwaWNrZXItbXVsdGktNCAudWktZGF0ZXBpY2tlci1ncm91cHt3aWR0aDoyNSV9LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCAudWktZGF0ZXBpY2tlci1oZWFkZXIsLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIC51aS1kYXRlcGlja2VyLWhlYWRlcntib3JkZXItbGVmdC13aWR0aDowfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmV7Y2xlYXI6bGVmdH0udWktZGF0ZXBpY2tlci1yb3ctYnJlYWt7Y2xlYXI6Ym90aDt3aWR0aDoxMDAlO2ZvbnQtc2l6ZTowfS51aS1kYXRlcGlja2VyLXJ0bHtkaXJlY3Rpb246cnRsfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1wcmV2e3JpZ2h0OjJweDtsZWZ0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLW5leHR7bGVmdDoycHg7cmlnaHQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItcHJldjpob3ZlcntyaWdodDoxcHg7bGVmdDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0OmhvdmVye2xlZnQ6MXB4O3JpZ2h0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmV7Y2xlYXI6cmlnaHR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9ue2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uLnVpLWRhdGVwaWNrZXItY3VycmVudCwudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXB7ZmxvYXQ6cmlnaHR9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVyLC51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUgLnVpLWRhdGVwaWNrZXItaGVhZGVye2JvcmRlci1yaWdodC13aWR0aDowO2JvcmRlci1sZWZ0LXdpZHRoOjFweH0udWktZGlhbG9ne292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cGFkZGluZzouMmVtO291dGxpbmU6MH0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXJ7cGFkZGluZzouNGVtIDFlbTtwb3NpdGlvbjpyZWxhdGl2ZX0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGV7ZmxvYXQ6bGVmdDttYXJnaW46LjFlbSAwO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDo5MCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9LnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3Nle3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi4zZW07dG9wOjUwJTt3aWR0aDoyMHB4O21hcmdpbjotMTBweCAwIDAgMDtwYWRkaW5nOjFweDtoZWlnaHQ6MjBweH0udWktZGlhbG9nIC51aS1kaWFsb2ctY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXI6MDtwYWRkaW5nOi41ZW0gMWVtO2JhY2tncm91bmQ6bm9uZTtvdmVyZmxvdzphdXRvfS51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5le3RleHQtYWxpZ246bGVmdDtib3JkZXItd2lkdGg6MXB4IDAgMCAwO2JhY2tncm91bmQtaW1hZ2U6bm9uZTttYXJnaW4tdG9wOi41ZW07cGFkZGluZzouM2VtIDFlbSAuNWVtIC40ZW19LnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgLnVpLWRpYWxvZy1idXR0b25zZXR7ZmxvYXQ6cmlnaHR9LnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgYnV0dG9ue21hcmdpbjouNWVtIC40ZW0gLjVlbSAwO2N1cnNvcjpwb2ludGVyfS51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1zZXt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O3JpZ2h0Oi01cHg7Ym90dG9tOi01cHg7YmFja2dyb3VuZC1wb3NpdGlvbjoxNnB4IDE2cHh9LnVpLWRyYWdnYWJsZSAudWktZGlhbG9nLXRpdGxlYmFye2N1cnNvcjptb3ZlfS51aS1tZW51e2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOjA7bWFyZ2luOjA7ZGlzcGxheTpibG9jaztvdXRsaW5lOm5vbmV9LnVpLW1lbnUgLnVpLW1lbnV7cG9zaXRpb246YWJzb2x1dGV9LnVpLW1lbnUgLnVpLW1lbnUtaXRlbXtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MDtwYWRkaW5nOjNweCAxZW0gM3B4IC40ZW07Y3Vyc29yOnBvaW50ZXI7bWluLWhlaWdodDowO2xpc3Qtc3R5bGUtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTciKX0udWktbWVudSAudWktbWVudS1kaXZpZGVye21hcmdpbjo1cHggMDtoZWlnaHQ6MDtmb250LXNpemU6MDtsaW5lLWhlaWdodDowO2JvcmRlci13aWR0aDoxcHggMCAwIDB9LnVpLW1lbnUgLnVpLXN0YXRlLWZvY3VzLC51aS1tZW51IC51aS1zdGF0ZS1hY3RpdmV7bWFyZ2luOi0xcHh9LnVpLW1lbnUtaWNvbnN7cG9zaXRpb246cmVsYXRpdmV9LnVpLW1lbnUtaWNvbnMgLnVpLW1lbnUtaXRlbXtwYWRkaW5nLWxlZnQ6MmVtfS51aS1tZW51IC51aS1pY29ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6LjJlbTttYXJnaW46YXV0byAwfS51aS1tZW51IC51aS1tZW51LWljb257bGVmdDphdXRvO3JpZ2h0OjB9LnVpLXByb2dyZXNzYmFye2hlaWdodDoyZW07dGV4dC1hbGlnbjpsZWZ0O292ZXJmbG93OmhpZGRlbn0udWktcHJvZ3Jlc3NiYXIgLnVpLXByb2dyZXNzYmFyLXZhbHVle21hcmdpbjotMXB4O2hlaWdodDoxMDAlfS51aS1wcm9ncmVzc2JhciAudWktcHJvZ3Jlc3NiYXItb3ZlcmxheXtiYWNrZ3JvdW5kOnVybCgiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoS0FBb0FJQUJBQUFBQVAvLy95SC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFKQVFBQkFDd0FBQUFBS0FBb0FBQUNrWXdOcVhyZEM1MkRTMDZhN01GWkkrNEZIQkNLb0RlV0tYcXltUHFHcXh2SnJYWmJNeDdUdGMrdzlYZ1UyRkIzbE95UVJXRVQySUZHaVU5bTFmckRWcHhaWmM2YmZId3Y0YzFZWFA2azFWZHkyOTJGYjZVa3V2RnRYcHZXU3pBK0h5Y1hKSFVYaUdZSWlNZzJSNlc0NTlnbldHZkhOZGpJcURXVnFlbUgyZWtwT2JrcE9scHBXVXFaaXFyNmVkcXFXUUFBSWZrRUNRRUFBUUFzQUFBQUFDZ0FLQUFBQXBTTWdabkdmYXFjZzFFMnV1ekRtbUhVQlI4UWlsOTVoaVBLcVduM2FxdExzUzE4eTdHMVN6TmVvd1dCRU50UWQrVDFKa3RQMDVuelBUZEpabFI2dlV4TldXalYrdlVXaFdOa1dGd3hsOVZwWlJlZFljZmxJT0xhZmFhMjhYZHNIL3lubGNjMXVQVkRaeFFJUjBLMjUrY0lDQ21vcUNlNW1HaFpPZmVZU1VoNXlKY0p5cmtaV1dwYVI4ZG9KMm80TllxNjJsQUFBQ0g1QkFrQkFBRUFMQUFBQUFBb0FDZ0FBQUtWREk0WXkyMlpuSU5STnFvc3cwQnY3aTFneUhVa0ZqN29TYVdsdTNvdkM4R3hOc281Zmx1ejNxTFZoQlZlVC9MejdaVEh5eEw1ZERhbFFXUFZPc1FXdFJudXdYYUZUajlqVlZoOHBtYTlKalo0ellTajVaT3ltYTd1dW9sZmZoK0lSNWFXOTdjSHVCVVhLR0tYbEtqbitEaUhXTWNZSmFoNE4wbFlDTWxKT1hpcEdScjVxZGdvU1RycVdTcTZXRmwyeXBvYVVBQUFJZmtFQ1FFQUFRQXNBQUFBQUNnQUtBQUFBcGFFYjZITGdkL2lPN0ZOV3RjRldlK3VmT0RHalJmb2lKMmFrU2hidWViMHd0STUwem0wMnBidndmV0VNV0JRMXpLR2xMSWhza2lFUG05UjZ2Ulh4VjRaeldUMnlIT0dwV015b3JibEtsTnA4SG1IRWIvbENYamNXN2JtdFhQOFh0MjI5T1ZXUjFmb2QyZVdxTmZIdU1qWENQa0lHTmlsZU9pSW1WbUNPRW1vU2ZuM3lYbEpXbW9IR2hxcDZpbFl1V1lwbVRxS1VnQUFJZmtFQ1FFQUFRQXNBQUFBQUNnQUtBQUFBcGlFSDZrYjU4YmlRM0ZOV3RNRldXM2VOVmNvanVGR2ZxblpxU2VidVMwNnc1VjgwL1gwMnBLZTh6RndQNkVGV09UMWxERms4ckdFUmgxVFROT29jUTYxSG00WG0yVmV4VUhwemp5bVZpSHJGYmlFTHNlZlZybjZYS2ZudDJROUcvK1hkaWU0OTlYSGQyZzRoN2lvT0doWEdKYm9HQW5YU0Jub0J3S1l5ZmlvdWJaSjJIbjBSdVJaYWZsWk9pbDU2WnA2aWlvS1NYcFVBQUFoK1FRSkFRQUJBQ3dBQUFBQUtBQW9BQUFDa29RUnFSdm54dUk3a1UxYTFVVTViZDV0blNlT1pYaG1uNWxXSzNxTlRXdlJkUXhQOHF2YUMrL3lhWVF6WE83Qk12YVVFbUpSZDNUc2lNQWdzd21OWXJTZ1pkWXJUWDZ0U0hHWk83M2V6dUF3MnV4dVErQmJlWmZNeHNleFkzNSsvUWU0SjFpblYwZzR4M1dIdU1oSWwyalhPS1QyUStWVTVmZ29TVUk1MlZmWnlma0pHa2hhNmptWSthYVlkaXJxK2xRQUFDSDVCQWtCQUFFQUxBQUFBQUFvQUNnQUFBS1dCSUtwWWUwTDNZTktUb3Fzd1VsdnpuaWdkNHdpUjRLaFpyS3Q5VXBxaXA2MWk5RTN2TXZ4UmRIbGJFRmlFWGZrOVlBUll4T1paRDZWUTJwVXVuQm10UlhvMUxmOGhNVlZjTmw4SmFmVjM4YU0yL0Z1NVYxNkJuNjNyNnh0OTdqMDkrTVhTRmk0Qm5pR0ZhZTNoemJIOStoWUJ6a3B1VWg1YVptSHVhblpPWmdJdXZiR2lOZW9tQ25heHhhcDJ1cGFDWnNxKzFrQUFDSDVCQWtCQUFFQUxBQUFBQUFvQUNnQUFBS1hqSThCeTV6ZjRrT3hUVnJYTlZsdjFYMGQ4SUdaR0tMbk5wWXRtOExyOWNxVmV1T1N2Zk9XNzlEOWFESGl6TmhESmlkRlpoTnlkRWFoT2FESDZub210SmpwMXR1dEtvTldrdkE2SnFmUlZMSFUvUVVmYXU5bDJ4N0c1NGQxZmw5OTV4Y0lHQWRYcU1mQk5hZG9ZcmhIK01nMktCbHBWcGJsdUNpWG1NbloyU2g0R0JxSitja0lPcXFKNkxtS1NsbFptc29xNndwUUFBQWgrUVFKQVFBQkFDd0FBQUFBS0FBb0FBQUNsWXgvb0x2b3h1SkRrVTFhMVlVWmJKNTluU2QyWlhoV3FiUmEyL2dGOEd1MkRZM2lxczd5cnEreEJZRWtZdkZTTThhU1NPYkUrWmdSbDFCSEZaTnI3cFJDYXZaNUJXMjE0MmhZM0FOL3pXdHNtZjEycDlYeHhGbDJscExuMXJzZXp0ZlhaamRJV0lmMnM1ZEl0d2pZS0Jnbzl5ZzVwSGd6SlhURWVHbFp1ZW5weVBtcEdRb0tPV2tZbVNwYVNucUtpbGVJMkZBQUFDSDVCQWtCQUFFQUxBQUFBQUFvQUNnQUFBS1ZqQitndStqRzRrT1JUVnJWaFJsc25uMmRKM1psZUZhcHRGcmIrQ1htTzlPb3plTDVWZlA5OUh2QVdocGlVZGN3a3BCSDM4MjVBd1lkVTh4VHFsTEdodENvc0FyS01wdmZhMW1NUmFlOVZ2V1pmZUIyWGZQa2VMbW0xOGxVY0JqK3A1ZG5OOGpYWjNZSUdFaFl1T1VuNDVhb0NEa3AxNmhsNUlqWUp2aldLY25vR1FwcXlQbHBPaHIzYUVsYXFycTU2QnE3VkFBQU93PT0iKTtoZWlnaHQ6MTAwJTtmaWx0ZXI6YWxwaGEob3BhY2l0eT0yNSk7b3BhY2l0eTowLjI1fS51aS1wcm9ncmVzc2Jhci1pbmRldGVybWluYXRlIC51aS1wcm9ncmVzc2Jhci12YWx1ZXtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLXNlbGVjdG1lbnUtbWVudXtwYWRkaW5nOjA7bWFyZ2luOjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2Rpc3BsYXk6bm9uZX0udWktc2VsZWN0bWVudS1tZW51IC51aS1tZW51e292ZXJmbG93OmF1dG87b3ZlcmZsb3cteDpoaWRkZW47cGFkZGluZy1ib3R0b206MXB4fS51aS1zZWxlY3RtZW51LW1lbnUgLnVpLW1lbnUgLnVpLXNlbGVjdG1lbnUtb3B0Z3JvdXB7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjEuNTtwYWRkaW5nOjJweCAwLjRlbTttYXJnaW46MC41ZW0gMCAwIDA7aGVpZ2h0OmF1dG87Ym9yZGVyOjB9LnVpLXNlbGVjdG1lbnUtb3BlbntkaXNwbGF5OmJsb2NrfS51aS1zZWxlY3RtZW51LWJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXJ9LnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktaWNvbntyaWdodDowLjVlbTtsZWZ0OmF1dG87bWFyZ2luLXRvcDotOHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCV9LnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktc2VsZWN0bWVudS10ZXh0e3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjAuNGVtIDIuMWVtIDAuNGVtIDFlbTtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjEuNDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLXNsaWRlcntwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmxlZnR9LnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7d2lkdGg6MS4yZW07aGVpZ2h0OjEuMmVtO2N1cnNvcjpkZWZhdWx0Oy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc2xpZGVyIC51aS1zbGlkZXItcmFuZ2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO2ZvbnQtc2l6ZTouN2VtO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOjA7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9LnVpLXNsaWRlci51aS1zdGF0ZS1kaXNhYmxlZCAudWktc2xpZGVyLWhhbmRsZSwudWktc2xpZGVyLnVpLXN0YXRlLWRpc2FibGVkIC51aS1zbGlkZXItcmFuZ2V7ZmlsdGVyOmluaGVyaXR9LnVpLXNsaWRlci1ob3Jpem9udGFse2hlaWdodDouOGVtfS51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLWhhbmRsZXt0b3A6LS4zZW07bWFyZ2luLWxlZnQ6LS42ZW19LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2V7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWlue2xlZnQ6MH0udWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZS1tYXh7cmlnaHQ6MH0udWktc2xpZGVyLXZlcnRpY2Fse3dpZHRoOi44ZW07aGVpZ2h0OjEwMHB4fS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1oYW5kbGV7bGVmdDotLjNlbTttYXJnaW4tbGVmdDowO21hcmdpbi1ib3R0b206LS42ZW19LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdle2xlZnQ6MDt3aWR0aDoxMDAlfS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZS1taW57Ym90dG9tOjB9LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1heHt0b3A6MH0udWktc3Bpbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWktc3Bpbm5lci1pbnB1dHtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7Y29sb3I6aW5oZXJpdDtwYWRkaW5nOjA7bWFyZ2luOi4yZW0gMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLWxlZnQ6LjRlbTttYXJnaW4tcmlnaHQ6MjJweH0udWktc3Bpbm5lci1idXR0b257d2lkdGg6MTZweDtoZWlnaHQ6NTAlO2ZvbnQtc2l6ZTouNWVtO3BhZGRpbmc6MDttYXJnaW46MDt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtjdXJzb3I6ZGVmYXVsdDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtyaWdodDowfS51aS1zcGlubmVyIGEudWktc3Bpbm5lci1idXR0b257Ym9yZGVyLXRvcDpub25lO2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItcmlnaHQ6bm9uZX0udWktc3Bpbm5lciAudWktaWNvbntwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tdG9wOi04cHg7dG9wOjUwJTtsZWZ0OjB9LnVpLXNwaW5uZXItdXB7dG9wOjB9LnVpLXNwaW5uZXItZG93bntib3R0b206MH0udWktc3Bpbm5lciAudWktaWNvbi10cmlhbmdsZS0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjVweCAtMTZweH0udWktdGFic3twb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOi4yZW19LnVpLXRhYnMgLnVpLXRhYnMtbmF2e21hcmdpbjowO3BhZGRpbmc6LjJlbSAuMmVtIDB9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpe2xpc3Qtc3R5bGU6bm9uZTtmbG9hdDpsZWZ0O3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDowO21hcmdpbjoxcHggLjJlbSAwIDA7Ym9yZGVyLWJvdHRvbS13aWR0aDowO3BhZGRpbmc6MDt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IC51aS10YWJzLWFuY2hvcntmbG9hdDpsZWZ0O3BhZGRpbmc6LjVlbSAxZW07dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZle21hcmdpbi1ib3R0b206LTFweDtwYWRkaW5nLWJvdHRvbToxcHh9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZlIC51aS10YWJzLWFuY2hvciwudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtZGlzYWJsZWQgLnVpLXRhYnMtYW5jaG9yLC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWxvYWRpbmcgLnVpLXRhYnMtYW5jaG9ye2N1cnNvcjp0ZXh0fS51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSAudWktdGFicy1hbmNob3J7Y3Vyc29yOnBvaW50ZXJ9LnVpLXRhYnMgLnVpLXRhYnMtcGFuZWx7ZGlzcGxheTpibG9jaztib3JkZXItd2lkdGg6MDtwYWRkaW5nOjFlbSAxLjRlbTtiYWNrZ3JvdW5kOm5vbmV9LnVpLXRvb2x0aXB7cGFkZGluZzo4cHg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo5OTk5O21heC13aWR0aDozMDBweDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDVweCAjYWFhO2JveC1zaGFkb3c6MCAwIDVweCAjYWFhfWJvZHkgLnVpLXRvb2x0aXB7Ym9yZGVyLXdpZHRoOjJweH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9qcXVlcnktdWkudGhlbWUubWluLmNzcyBiL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2pxdWVyeS11aS50aGVtZS5taW4uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA0NDg1Li4wMDAwMDAwCi0tLSBhL2NvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2pxdWVyeS11aS50aGVtZS5taW4uY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKiEgalF1ZXJ5IFVJIC0gdjEuMTEuNCAtIDIwMTYtMDMtMDEKLSogaHR0cDovL2pxdWVyeXVpLmNvbQotKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCi0KLS51aS13aWRnZXR7Zm9udC1mYW1pbHk6THVjaWRhIEdyYW5kZSxMdWNpZGEgU2FucyxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxLjFlbX0udWktd2lkZ2V0IC51aS13aWRnZXR7Zm9udC1zaXplOjFlbX0udWktd2lkZ2V0IGlucHV0LC51aS13aWRnZXQgc2VsZWN0LC51aS13aWRnZXQgdGV4dGFyZWEsLnVpLXdpZGdldCBidXR0b257Zm9udC1mYW1pbHk6THVjaWRhIEdyYW5kZSxMdWNpZGEgU2FucyxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxZW19LnVpLXdpZGdldC1jb250ZW50e2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmMmY1ZjcgdXJsKCJpbWFnZXMvdWktYmdfaGlnaGxpZ2h0LWhhcmRfMTAwX2YyZjVmN18xeDEwMC5wbmciKSA1MCUgdG9wIHJlcGVhdC14O2NvbG9yOiMzNjJiMzZ9LnVpLXdpZGdldC1jb250ZW50IGF7Y29sb3I6IzM2MmIzNn0udWktd2lkZ2V0LWhlYWRlcntib3JkZXI6MXB4IHNvbGlkICNhZWQwZWE7YmFja2dyb3VuZDojZGVlZGY3IHVybCgiaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0XzEwMF9kZWVkZjdfMXgxMDAucG5nIikgNTAlIDUwJSByZXBlYXQteDtjb2xvcjojMjIyO2ZvbnQtd2VpZ2h0OmJvbGR9LnVpLXdpZGdldC1oZWFkZXIgYXtjb2xvcjojMjIyfS51aS1zdGF0ZS1kZWZhdWx0LC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGVmYXVsdCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGVmYXVsdHtib3JkZXI6MXB4IHNvbGlkICNhZWQwZWE7YmFja2dyb3VuZDojZDdlYmY5IHVybCgiaW1hZ2VzL3VpLWJnX2dsYXNzXzgwX2Q3ZWJmOV8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6IzI3NzlhYX0udWktc3RhdGUtZGVmYXVsdCBhLC51aS1zdGF0ZS1kZWZhdWx0IGE6bGluaywudWktc3RhdGUtZGVmYXVsdCBhOnZpc2l0ZWR7Y29sb3I6IzI3NzlhYTt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktc3RhdGUtaG92ZXIsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1ob3ZlciwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaG92ZXIsLnVpLXN0YXRlLWZvY3VzLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZm9jdXMsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWZvY3Vze2JvcmRlcjoxcHggc29saWQgIzc0YjJlMjtiYWNrZ3JvdW5kOiNlNGYxZmIgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfMTAwX2U0ZjFmYl8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6IzAwNzBhM30udWktc3RhdGUtaG92ZXIgYSwudWktc3RhdGUtaG92ZXIgYTpob3ZlciwudWktc3RhdGUtaG92ZXIgYTpsaW5rLC51aS1zdGF0ZS1ob3ZlciBhOnZpc2l0ZWQsLnVpLXN0YXRlLWZvY3VzIGEsLnVpLXN0YXRlLWZvY3VzIGE6aG92ZXIsLnVpLXN0YXRlLWZvY3VzIGE6bGluaywudWktc3RhdGUtZm9jdXMgYTp2aXNpdGVke2NvbG9yOiMwMDcwYTM7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXN0YXRlLWFjdGl2ZSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtYWN0aXZle2JvcmRlcjoxcHggc29saWQgIzI2OTRlODtiYWNrZ3JvdW5kOiMzYmFhZTMgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfNTBfM2JhYWUzXzF4NDAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojZmZmfS51aS1zdGF0ZS1hY3RpdmUgYSwudWktc3RhdGUtYWN0aXZlIGE6bGluaywudWktc3RhdGUtYWN0aXZlIGE6dmlzaXRlZHtjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1zdGF0ZS1oaWdobGlnaHQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodHtib3JkZXI6MXB4IHNvbGlkICNmOWRkMzQ7YmFja2dyb3VuZDojZmZlZjhmIHVybCgiaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0XzI1X2ZmZWY4Zl8xeDEwMC5wbmciKSA1MCUgdG9wIHJlcGVhdC14O2NvbG9yOiMzNjM2MzZ9LnVpLXN0YXRlLWhpZ2hsaWdodCBhLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCBhe2NvbG9yOiMzNjM2MzZ9LnVpLXN0YXRlLWVycm9yLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9ye2JvcmRlcjoxcHggc29saWQgI2NkMGEwYTtiYWNrZ3JvdW5kOiNjZDBhMGE7Y29sb3I6I2ZmZn0udWktc3RhdGUtZXJyb3IgYSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yIGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yIGF7Y29sb3I6I2ZmZn0udWktc3RhdGUtZXJyb3ItdGV4dCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLXRleHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yLXRleHR7Y29sb3I6I2ZmZn0udWktcHJpb3JpdHktcHJpbWFyeSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXByaW1hcnksLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXByaW1hcnl7Zm9udC13ZWlnaHQ6Ym9sZH0udWktcHJpb3JpdHktc2Vjb25kYXJ5LC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktc2Vjb25kYXJ5LC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1zZWNvbmRhcnl7b3BhY2l0eTouNztmaWx0ZXI6QWxwaGEoT3BhY2l0eT03MCk7Zm9udC13ZWlnaHQ6bm9ybWFsfS51aS1zdGF0ZS1kaXNhYmxlZCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRpc2FibGVkLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kaXNhYmxlZHtvcGFjaXR5Oi4zNTtmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSk7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS1zdGF0ZS1kaXNhYmxlZCAudWktaWNvbntmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSl9LnVpLWljb257d2lkdGg6MTZweDtoZWlnaHQ6MTZweH0udWktaWNvbiwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc183MmE3Y2ZfMjU2eDI0MC5wbmciKX0udWktd2lkZ2V0LWhlYWRlciAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zXzcyYTdjZl8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1kZWZhdWx0IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfM2Q4MGIzXzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWhvdmVyIC51aS1pY29uLC51aS1zdGF0ZS1mb2N1cyAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zXzI2OTRlOF8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1hY3RpdmUgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc19mZmZmZmZfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtaGlnaGxpZ2h0IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfMmU4M2ZmXzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWVycm9yIC51aS1pY29uLC51aS1zdGF0ZS1lcnJvci10ZXh0IC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZmZmZmZmXzI1NngyNDAucG5nIil9LnVpLWljb24tYmxhbmt7YmFja2dyb3VuZC1wb3NpdGlvbjoxNnB4IDE2cHh9LnVpLWljb24tY2FyYXQtMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAwfS51aS1pY29uLWNhcmF0LTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAwfS51aS1pY29uLWNhcmF0LTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IDB9LnVpLWljb24tY2FyYXQtMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IDB9LnVpLWljb24tY2FyYXQtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggMH0udWktaWNvbi1jYXJhdC0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggMH0udWktaWNvbi1jYXJhdC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAwfS51aS1pY29uLWNhcmF0LTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggMH0udWktaWNvbi1jYXJhdC0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAwfS51aS1pY29uLWNhcmF0LTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IDB9LnVpLWljb24tdHJpYW5nbGUtMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xNnB4fS51aS1pY29uLWFycm93LTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTMycHh9LnVpLWljb24tYXJyb3ctMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTMycHh9LnVpLWljb24tYXJyb3ctMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLW5lLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItc2Utbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMzJweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLW5lLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLXNlLW53e2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtNDhweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm4tMS13e2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm4tMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm4tMS1le2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm4tMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTY0cHh9LnVpLWljb24tYXJyb3ctNHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTgwcHh9LnVpLWljb24tYXJyb3ctNC1kaWFne2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTgwcHh9LnVpLWljb24tZXh0bGlua3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC04MHB4fS51aS1pY29uLW5ld3dpbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC04MHB4fS51aS1pY29uLXJlZnJlc2h7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtODBweH0udWktaWNvbi1zaHVmZmxle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTgwcHh9LnVpLWljb24tdHJhbnNmZXItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTgwcHh9LnVpLWljb24tdHJhbnNmZXJ0aGljay1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTgwcHh9LnVpLWljb24tZm9sZGVyLWNvbGxhcHNlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTk2cHh9LnVpLWljb24tZm9sZGVyLW9wZW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtOTZweH0udWktaWNvbi1kb2N1bWVudHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC05NnB4fS51aS1pY29uLWRvY3VtZW50LWJ7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtOTZweH0udWktaWNvbi1ub3Rle2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTk2cHh9LnVpLWljb24tbWFpbC1jbG9zZWR7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtOTZweH0udWktaWNvbi1tYWlsLW9wZW57YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtOTZweH0udWktaWNvbi1zdWl0Y2FzZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtOTZweH0udWktaWNvbi1jb21tZW50e2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC05NnB4fS51aS1pY29uLXBlcnNvbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtOTZweH0udWktaWNvbi1wcmludHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtOTZweH0udWktaWNvbi10cmFzaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtOTZweH0udWktaWNvbi1sb2NrZWR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTk2cHh9LnVpLWljb24tdW5sb2NrZWR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTk2cHh9LnVpLWljb24tYm9va21hcmt7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTk2cHh9LnVpLWljb24tdGFne2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC05NnB4fS51aS1pY29uLWhvbWV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMTJweH0udWktaWNvbi1mbGFne2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTExMnB4fS51aS1pY29uLWNhbGVuZGFye2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTExMnB4fS51aS1pY29uLWNhcnR7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTEycHh9LnVpLWljb24tcGVuY2lse2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTExMnB4fS51aS1pY29uLWNsb2Nre2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTExMnB4fS51aS1pY29uLWRpc2t7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTEycHh9LnVpLWljb24tY2FsY3VsYXRvcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTEycHh9LnVpLWljb24tem9vbWlue2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xMTJweH0udWktaWNvbi16b29tb3V0e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xMTJweH0udWktaWNvbi1zZWFyY2h7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTExMnB4fS51aS1pY29uLXdyZW5jaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMTEycHh9LnVpLWljb24tZ2VhcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMTEycHh9LnVpLWljb24taGVhcnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTExMnB4fS51aS1pY29uLXN0YXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTExMnB4fS51aS1pY29uLWxpbmt7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTExMnB4fS51aS1pY29uLWNhbmNlbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEyOHB4fS51aS1pY29uLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTI4cHh9LnVpLWljb24tcGx1c3RoaWNre2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTEyOHB4fS51aS1pY29uLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTEyOHB4fS51aS1pY29uLW1pbnVzdGhpY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTI4cHh9LnVpLWljb24tY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTI4cHh9LnVpLWljb24tY2xvc2V0aGlja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xMjhweH0udWktaWNvbi1rZXl7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTEyOHB4fS51aS1pY29uLWxpZ2h0YnVsYntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTI4cHh9LnVpLWljb24tc2Npc3NvcnN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTEyOHB4fS51aS1pY29uLWNsaXBib2FyZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTI4cHh9LnVpLWljb24tY29weXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMTI4cHh9LnVpLWljb24tY29udGFjdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMTI4cHh9LnVpLWljb24taW1hZ2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTEyOHB4fS51aS1pY29uLXZpZGVve2JhY2tncm91bmQtcG9zaXRpb246LTIyNHB4IC0xMjhweH0udWktaWNvbi1zY3JpcHR7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTEyOHB4fS51aS1pY29uLWFsZXJ0e2JhY2tncm91bmQtcG9zaXRpb246MCAtMTQ0cHh9LnVpLWljb24taW5mb3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNDRweH0udWktaWNvbi1ub3RpY2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTQ0cHh9LnVpLWljb24taGVscHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNDRweH0udWktaWNvbi1jaGVja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNDRweH0udWktaWNvbi1idWxsZXR7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTQ0cHh9LnVpLWljb24tcmFkaW8tb257YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTQ0cHh9LnVpLWljb24tcmFkaW8tb2Zme2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xNDRweH0udWktaWNvbi1waW4td3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMTQ0cHh9LnVpLWljb24tcGluLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE0NHB4fS51aS1pY29uLXBsYXl7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNjBweH0udWktaWNvbi1wYXVzZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNjBweH0udWktaWNvbi1zZWVrLW5leHR7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTYwcHh9LnVpLWljb24tc2Vlay1wcmV2e2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE2MHB4fS51aS1pY29uLXNlZWstZW5ke2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE2MHB4fS51aS1pY29uLXNlZWstc3RhcnR7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTYwcHh9LnVpLWljb24tc2Vlay1maXJzdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNjBweH0udWktaWNvbi1zdG9we2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE2MHB4fS51aS1pY29uLWVqZWN0e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xNjBweH0udWktaWNvbi12b2x1bWUtb2Zme2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNjBweH0udWktaWNvbi12b2x1bWUtb257YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE2MHB4fS51aS1pY29uLXBvd2Vye2JhY2tncm91bmQtcG9zaXRpb246MCAtMTc2cHh9LnVpLWljb24tc2lnbmFsLWRpYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTc2cHh9LnVpLWljb24tc2lnbmFse2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktMHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTF7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0ye2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktM3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNzZweH0udWktaWNvbi1jaXJjbGUtcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE5MnB4fS51aS1pY29uLWNpcmNsZS1taW51c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLW57YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS16b29taW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS16b29tb3V0e2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtY2hlY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZXNtYWxsLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yMDhweH0udWktaWNvbi1jaXJjbGVzbWFsbC1taW51c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0yMDhweH0udWktaWNvbi1jaXJjbGVzbWFsbC1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0yMDhweH0udWktaWNvbi1zcXVhcmVzbWFsbC1wbHVze2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTIwOHB4fS51aS1pY29uLXNxdWFyZXNtYWxsLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTIwOHB4fS51aS1pY29uLXNxdWFyZXNtYWxsLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTIwOHB4fS51aS1pY29uLWdyaXAtZG90dGVkLXZlcnRpY2Fse2JhY2tncm91bmQtcG9zaXRpb246MCAtMjI0cHh9LnVpLWljb24tZ3JpcC1kb3R0ZWQtaG9yaXpvbnRhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0yMjRweH0udWktaWNvbi1ncmlwLXNvbGlkLXZlcnRpY2Fse2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTIyNHB4fS51aS1pY29uLWdyaXAtc29saWQtaG9yaXpvbnRhbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0yMjRweH0udWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMjI0cHh9LnVpLWljb24tZ3JpcC1kaWFnb25hbC1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0yMjRweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLXRvcCwudWktY29ybmVyLWxlZnQsLnVpLWNvcm5lci10bHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjZweH0udWktY29ybmVyLWFsbCwudWktY29ybmVyLXRvcCwudWktY29ybmVyLXJpZ2h0LC51aS1jb3JuZXItdHJ7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NnB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItYm90dG9tLC51aS1jb3JuZXItbGVmdCwudWktY29ybmVyLWJse2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NnB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItYm90dG9tLC51aS1jb3JuZXItcmlnaHQsLnVpLWNvcm5lci1icntib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo2cHh9LnVpLXdpZGdldC1vdmVybGF5e2JhY2tncm91bmQ6I2VlZSB1cmwoImltYWdlcy91aS1iZ19kaWFnb25hbHMtdGhpY2tfOTBfZWVlZWVlXzQweDQwLnBuZyIpIDUwJSA1MCUgcmVwZWF0O29wYWNpdHk6Ljg7ZmlsdGVyOkFscGhhKE9wYWNpdHk9ODApfS51aS13aWRnZXQtc2hhZG93e21hcmdpbjotN3B4IDAgMCAtN3B4O3BhZGRpbmc6N3B4O2JhY2tncm91bmQ6IzAwMCB1cmwoImltYWdlcy91aS1iZ19oaWdobGlnaHQtaGFyZF83MF8wMDAwMDBfMXgxMDAucG5nIikgNTAlIHRvcCByZXBlYXQteDtvcGFjaXR5Oi4zO2ZpbHRlcjpBbHBoYShPcGFjaXR5PTMwKTtib3JkZXItcmFkaXVzOjhweH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9zYW5rZXlfZWRnZW50LmpzIGIvY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvc2Fua2V5X2VkZ2VudC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyN2E0Ni4uMDAwMDAwMAotLS0gYS9jb25zb2xlL3NlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9zYW5rZXlfZWRnZW50LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLWQzLnNhbmtleSA9IGZ1bmN0aW9uKCkgewotICB2YXIgc2Fua2V5ID0ge30sCi0gICAgICBub2RlV2lkdGggPSAyNCwKLSAgICAgIG5vZGVQYWRkaW5nID0gOCwKLSAgICAgIHNpemUgPSBbMSwgMV0sCi0gICAgICBub2RlcyA9IFtdLAotICAgICAgbGlua3MgPSBbXTsKLQotICBzYW5rZXkubm9kZVdpZHRoID0gZnVuY3Rpb24oXykgewotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVXaWR0aDsKLSAgICBub2RlV2lkdGggPSArXzsKLSAgICByZXR1cm4gc2Fua2V5OwotICB9OwotCi0gIHNhbmtleS5ub2RlUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsKLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlUGFkZGluZzsKLSAgICBub2RlUGFkZGluZyA9ICtfOwotICAgIHJldHVybiBzYW5rZXk7Ci0gIH07Ci0KLSAgc2Fua2V5Lm5vZGVzID0gZnVuY3Rpb24oXykgewotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVzOwotICAgIG5vZGVzID0gXzsKLSAgICByZXR1cm4gc2Fua2V5OwotICB9OwotCi0gIHNhbmtleS5saW5rcyA9IGZ1bmN0aW9uKF8pIHsKLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rczsKLSAgICBsaW5rcyA9IF87Ci0gICAgcmV0dXJuIHNhbmtleTsKLSAgfTsKLQotICBzYW5rZXkuc2l6ZSA9IGZ1bmN0aW9uKF8pIHsKLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwotICAgIHNpemUgPSBfOwotICAgIHJldHVybiBzYW5rZXk7Ci0gIH07Ci0KLSAgc2Fua2V5LmxheW91dCA9IGZ1bmN0aW9uKGl0ZXJhdGlvbnMpIHsKLSAgICBjb21wdXRlTm9kZUxpbmtzKCk7Ci0gICAgY29tcHV0ZU5vZGVWYWx1ZXMoKTsKLSAgICBjb21wdXRlTm9kZUJyZWFkdGhzKCk7Ci0gICAgY29tcHV0ZU5vZGVEZXB0aHMoaXRlcmF0aW9ucyk7Ci0gICAgY29tcHV0ZUxpbmtEZXB0aHMoKTsKLSAgICByZXR1cm4gc2Fua2V5OwotICB9OwotCi0gIHNhbmtleS5yZWxheW91dCA9IGZ1bmN0aW9uKCkgewotICAgIGNvbXB1dGVMaW5rRGVwdGhzKCk7Ci0gICAgcmV0dXJuIHNhbmtleTsKLSAgfTsKLQotICBzYW5rZXkubGluayA9IGZ1bmN0aW9uKCkgewotICAgIHZhciBjdXJ2YXR1cmUgPSAuNTsKLQotICAgIGZ1bmN0aW9uIGxpbmsoZCkgewotICAgICAgICB2YXIgeDAgPSBkLnNvdXJjZUlkeC54ICsgZC5zb3VyY2VJZHguZHgsCi0gICAgICAgIHgxID0gZC50YXJnZXRJZHgueCwKLSAgICAgICAgeGkgPSBkMy5pbnRlcnBvbGF0ZU51bWJlcih4MCwgeDEpLAotICAgICAgICB4MiA9IHhpKGN1cnZhdHVyZSksCi0gICAgICAgIHgzID0geGkoMSAtIGN1cnZhdHVyZSksCi0gICAgICAgIHkwID0gZC5zb3VyY2VJZHgueSArIGQuc3kgKyBkLmR5IC8gMiwKLSAgICAgICAgeTEgPSBkLnRhcmdldElkeC55ICsgZC50eSArIGQuZHkgLyAyOwotICAgIHJldHVybiAiTSIgKyB4MCArICIsIiArIHkwCi0gICAgICAgICArICJDIiArIHgyICsgIiwiICsgeTAKLSAgICAgICAgICsgIiAiICsgeDMgKyAiLCIgKyB5MQotICAgICAgICAgKyAiICIgKyB4MSArICIsIiArIHkxOwotICAgIH0KLQotICAgIGxpbmsuY3VydmF0dXJlID0gZnVuY3Rpb24oXykgewotICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY3VydmF0dXJlOwotICAgICAgY3VydmF0dXJlID0gK187Ci0gICAgICByZXR1cm4gbGluazsKLSAgICB9OwotCi0gICAgcmV0dXJuIGxpbms7Ci0gIH07Ci0KLSAgLy8gUG9wdWxhdGUgdGhlIHNvdXJjZUxpbmtzIGFuZCB0YXJnZXRMaW5rcyBmb3IgZWFjaCBub2RlLgotICAvLyBBbHNvLCBpZiB0aGUgc291cmNlIGFuZCB0YXJnZXQgYXJlIG5vdCBvYmplY3RzLCBhc3N1bWUgdGhleSBhcmUgaW5kaWNlcy4KLSAgZnVuY3Rpb24gY29tcHV0ZU5vZGVMaW5rcygpIHsKLSAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKLSAgICAgIG5vZGUuc291cmNlTGlua3MgPSBbXTsKLSAgICAgIG5vZGUudGFyZ2V0TGlua3MgPSBbXTsKLSAgICB9KTsKLSAgICBsaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsKLSAgICAgIHZhciBzb3VyY2UgPSBsaW5rLnNvdXJjZUlkeCwKLSAgICAgICAgICB0YXJnZXQgPSBsaW5rLnRhcmdldElkeDsKLSAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAibnVtYmVyIikgc291cmNlID0gbGluay5zb3VyY2VJZHggPSBub2Rlc1tsaW5rLnNvdXJjZUlkeF07Ci0gICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gIm51bWJlciIpIHRhcmdldCA9IGxpbmsudGFyZ2V0SWR4ID0gbm9kZXNbbGluay50YXJnZXRJZHhdOwotICAgICAgc291cmNlLnNvdXJjZUxpbmtzLnB1c2gobGluayk7Ci0gICAgICB0YXJnZXQudGFyZ2V0TGlua3MucHVzaChsaW5rKTsKLSAgICB9KTsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIHZhbHVlIChzaXplKSBvZiBlYWNoIG5vZGUgYnkgc3VtbWluZyB0aGUgYXNzb2NpYXRlZCBsaW5rcy4KLSAgZnVuY3Rpb24gY29tcHV0ZU5vZGVWYWx1ZXMoKSB7Ci0gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7Ci0gICAgICBub2RlLnZhbHVlID0gTWF0aC5tYXgoCi0gICAgICAgIGQzLnN1bShub2RlLnNvdXJjZUxpbmtzLCB2YWx1ZSksCi0gICAgICAgIGQzLnN1bShub2RlLnRhcmdldExpbmtzLCB2YWx1ZSkKLSAgICAgICk7Ci0gICAgfSk7Ci0gIH0KLQotICAvLyBJdGVyYXRpdmVseSBhc3NpZ24gdGhlIGJyZWFkdGggKHgtcG9zaXRpb24pIGZvciBlYWNoIG5vZGUuCi0gIC8vIE5vZGVzIGFyZSBhc3NpZ25lZCB0aGUgbWF4aW11bSBicmVhZHRoIG9mIGluY29taW5nIG5laWdoYm9ycyBwbHVzIG9uZTsKLSAgLy8gbm9kZXMgd2l0aCBubyBpbmNvbWluZyBsaW5rcyBhcmUgYXNzaWduZWQgYnJlYWR0aCB6ZXJvLCB3aGlsZQotICAvLyBub2RlcyB3aXRoIG5vIG91dGdvaW5nIGxpbmtzIGFyZSBhc3NpZ25lZCB0aGUgbWF4aW11bSBicmVhZHRoLgotICBmdW5jdGlvbiBjb21wdXRlTm9kZUJyZWFkdGhzKCkgewotICAgIHZhciByZW1haW5pbmdOb2RlcyA9IG5vZGVzLAotICAgICAgICBuZXh0Tm9kZXMsCi0gICAgICAgIHggPSAwOwotICAgIHdoaWxlIChyZW1haW5pbmdOb2Rlcy5sZW5ndGgpIHsKLSAgICAgIG5leHROb2RlcyA9IFtdOwotICAgICAgcmVtYWluaW5nTm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7Ci0gICAgCSAgbm9kZS54ID0geDsKLSAgICAgICAgbm9kZS5keCA9IG5vZGVXaWR0aDsKLSAgICAgICAgbm9kZS5zb3VyY2VMaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsKLSAgICAgICAgICAgIGlmIChuZXh0Tm9kZXMuaW5kZXhPZihsaW5rLnRhcmdldElkeCkgPCAwKSB7Ci0gICAgICAgICAgICAJbmV4dE5vZGVzLnB1c2gobGluay50YXJnZXRJZHgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICB9KTsKLSAgICAgIHJlbWFpbmluZ05vZGVzID0gbmV4dE5vZGVzOwotICAgICAgKyt4OwotICAgIH0KLQotICAgIC8vCi0gICAgbW92ZVNpbmtzUmlnaHQoeCk7Ci0gICAgc2NhbGVOb2RlQnJlYWR0aHMoKHNpemVbMF0gLSBub2RlV2lkdGgpIC8gKHggLSAxKSk7Ci0gIH0KLQotICBmdW5jdGlvbiBtb3ZlU291cmNlc1JpZ2h0KCkgewotICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewotICAgICAgaWYgKCFub2RlLnRhcmdldExpbmtzLmxlbmd0aCkgewotICAgICAgICBub2RlLnggPSBkMy5taW4obm9kZS5zb3VyY2VMaW5rcywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50YXJnZXQueDsgfSkgLSAxOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgZnVuY3Rpb24gbW92ZVNpbmtzUmlnaHQoeCkgewotICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewotICAgICAgaWYgKCFub2RlLnNvdXJjZUxpbmtzLmxlbmd0aCkgewotICAgICAgICBub2RlLnggPSB4IC0gMTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNjYWxlTm9kZUJyZWFkdGhzKGt4KSB7Ci0gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7Ci0gICAgICBub2RlLnggKj0ga3g7Ci0gICAgfSk7Ci0gIH0KLQotICBmdW5jdGlvbiBjb21wdXRlTm9kZURlcHRocyhpdGVyYXRpb25zKSB7Ci0gICAgdmFyIG5vZGVzQnlCcmVhZHRoID0gZDMubmVzdCgpCi0gICAgICAgIC5rZXkoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC54OyB9KQotICAgICAgICAuc29ydEtleXMoZDMuYXNjZW5kaW5nKQotICAgICAgICAuZW50cmllcyhub2RlcykKLSAgICAgICAgLm1hcChmdW5jdGlvbihkKSB7IHJldHVybiBkLnZhbHVlczsgfSk7Ci0KLSAgICAvLwotICAgIGluaXRpYWxpemVOb2RlRGVwdGgoKTsKLSAgICByZXNvbHZlQ29sbGlzaW9ucygpOwotICAgIGZvciAodmFyIGFscGhhID0gMTsgaXRlcmF0aW9ucyA+IDA7IC0taXRlcmF0aW9ucykgewotICAgICAgcmVsYXhSaWdodFRvTGVmdChhbHBoYSAqPSAuOTkpOwotICAgICAgcmVzb2x2ZUNvbGxpc2lvbnMoKTsKLSAgICAgIHJlbGF4TGVmdFRvUmlnaHQoYWxwaGEpOwotICAgICAgcmVzb2x2ZUNvbGxpc2lvbnMoKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBpbml0aWFsaXplTm9kZURlcHRoKCkgewotICAgICAgdmFyIGt5ID0gZDMubWluKG5vZGVzQnlCcmVhZHRoLCBmdW5jdGlvbihub2RlcykgewotICAgICAgICByZXR1cm4gKHNpemVbMV0gLSAobm9kZXMubGVuZ3RoIC0gMSkgKiBub2RlUGFkZGluZykgLyBkMy5zdW0obm9kZXMsIHZhbHVlKTsKLSAgICAgIH0pOwotCi0gICAgICBub2Rlc0J5QnJlYWR0aC5mb3JFYWNoKGZ1bmN0aW9uKG5vZGVzKSB7Ci0gICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSwgaSkgewotICAgICAgICAgIG5vZGUueSA9IGk7Ci0gICAgICAgICAgbm9kZS5keSA9IG5vZGUudmFsdWUgKiBreTsKLSAgICAgICAgfSk7Ci0gICAgICB9KTsKLQotICAgICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7Ci0gICAgICAgIGxpbmsuZHkgPSBsaW5rLnZhbHVlICoga3k7Ci0gICAgICB9KTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZWxheExlZnRUb1JpZ2h0KGFscGhhKSB7Ci0gICAgICBub2Rlc0J5QnJlYWR0aC5mb3JFYWNoKGZ1bmN0aW9uKG5vZGVzLCBicmVhZHRoKSB7Ci0gICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewotICAgICAgICAgIGlmIChub2RlLnRhcmdldExpbmtzLmxlbmd0aCkgewotICAgICAgICAgICAgdmFyIHkgPSBkMy5zdW0obm9kZS50YXJnZXRMaW5rcywgd2VpZ2h0ZWRTb3VyY2UpIC8gZDMuc3VtKG5vZGUudGFyZ2V0TGlua3MsIHZhbHVlKTsKLSAgICAgICAgICAgIG5vZGUueSArPSAoeSAtIGNlbnRlcihub2RlKSkgKiBhbHBoYTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfSk7Ci0KLSAgICAgIGZ1bmN0aW9uIHdlaWdodGVkU291cmNlKGxpbmspIHsKLSAgICAgICAgcmV0dXJuIGNlbnRlcihsaW5rLnNvdXJjZUlkKSAqIGxpbmsudmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gcmVsYXhSaWdodFRvTGVmdChhbHBoYSkgewotICAgICAgbm9kZXNCeUJyZWFkdGguc2xpY2UoKS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihub2RlcykgewotICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKLSAgICAgICAgICBpZiAobm9kZS5zb3VyY2VMaW5rcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHZhciB5ID0gZDMuc3VtKG5vZGUuc291cmNlTGlua3MsIHdlaWdodGVkVGFyZ2V0KSAvIGQzLnN1bShub2RlLnNvdXJjZUxpbmtzLCB2YWx1ZSk7Ci0gICAgICAgICAgICBub2RlLnkgKz0gKHkgLSBjZW50ZXIobm9kZSkpICogYWxwaGE7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0pOwotCi0gICAgICBmdW5jdGlvbiB3ZWlnaHRlZFRhcmdldChsaW5rKSB7Ci0gICAgICAgIHJldHVybiBjZW50ZXIobGluay50YXJnZXRJZHgpICogbGluay52YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZXNvbHZlQ29sbGlzaW9ucygpIHsKLSAgICAgIG5vZGVzQnlCcmVhZHRoLmZvckVhY2goZnVuY3Rpb24obm9kZXMpIHsKLSAgICAgICAgdmFyIG5vZGUsCi0gICAgICAgICAgICBkeSwKLSAgICAgICAgICAgIHkwID0gMCwKLSAgICAgICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCi0gICAgICAgICAgICBpOwotCi0gICAgICAgIC8vIFB1c2ggYW55IG92ZXJsYXBwaW5nIG5vZGVzIGRvd24uCi0gICAgICAgIG5vZGVzLnNvcnQoYXNjZW5kaW5nRGVwdGgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwotICAgICAgICAgIGR5ID0geTAgLSBub2RlLnk7Ci0gICAgICAgICAgaWYgKGR5ID4gMCkgbm9kZS55ICs9IGR5OwotICAgICAgICAgIHkwID0gbm9kZS55ICsgbm9kZS5keSArIG5vZGVQYWRkaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIGJvdHRvbW1vc3Qgbm9kZSBnb2VzIG91dHNpZGUgdGhlIGJvdW5kcywgcHVzaCBpdCBiYWNrIHVwLgotICAgICAgICBkeSA9IHkwIC0gbm9kZVBhZGRpbmcgLSBzaXplWzFdOwotICAgICAgICBpZiAoZHkgPiAwKSB7Ci0gICAgICAgICAgeTAgPSBub2RlLnkgLT0gZHk7Ci0KLSAgICAgICAgICAvLyBQdXNoIGFueSBvdmVybGFwcGluZyBub2RlcyBiYWNrIHVwLgotICAgICAgICAgIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwotICAgICAgICAgICAgZHkgPSBub2RlLnkgKyBub2RlLmR5ICsgbm9kZVBhZGRpbmcgLSB5MDsKLSAgICAgICAgICAgIGlmIChkeSA+IDApIG5vZGUueSAtPSBkeTsKLSAgICAgICAgICAgIHkwID0gbm9kZS55OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gYXNjZW5kaW5nRGVwdGgoYSwgYikgewotICAgICAgcmV0dXJuIGEueSAtIGIueTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBjb21wdXRlTGlua0RlcHRocygpIHsKLSAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKLSAgICAgIG5vZGUuc291cmNlTGlua3Muc29ydChhc2NlbmRpbmdUYXJnZXREZXB0aCk7Ci0gICAgICBub2RlLnRhcmdldExpbmtzLnNvcnQoYXNjZW5kaW5nU291cmNlRGVwdGgpOwotICAgIH0pOwotICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewotICAgICAgdmFyIHN5ID0gMCwgdHkgPSAwOwotICAgICAgbm9kZS5zb3VyY2VMaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsKLSAgICAgICAgbGluay5zeSA9IHN5OwotICAgICAgICBzeSArPSBsaW5rLmR5OwotICAgICAgfSk7Ci0gICAgICBub2RlLnRhcmdldExpbmtzLmZvckVhY2goZnVuY3Rpb24obGluaykgewotICAgICAgICBsaW5rLnR5ID0gdHk7Ci0gICAgICAgIHR5ICs9IGxpbmsuZHk7Ci0gICAgICB9KTsKLSAgICB9KTsKLQotICAgIGZ1bmN0aW9uIGFzY2VuZGluZ1NvdXJjZURlcHRoKGEsIGIpIHsKLSAgICAgIHJldHVybiBhLnNvdXJjZUlkeC55IC0gYi5zb3VyY2VJZHgueTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBhc2NlbmRpbmdUYXJnZXREZXB0aChhLCBiKSB7Ci0gICAgICByZXR1cm4gYS50YXJnZXRJZHgueSAtIGIudGFyZ2V0SWR4Lnk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gY2VudGVyKG5vZGUpIHsKLSAgICByZXR1cm4gbm9kZS55ICsgbm9kZS5keSAvIDI7Ci0gIH0KLQotICBmdW5jdGlvbiB2YWx1ZShsaW5rKSB7Ci0gICAgcmV0dXJuIGxpbmsudmFsdWU7Ci0gIH0KLQotICByZXR1cm4gc2Fua2V5OwotfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kaXN0cmlidXRpb24vcG9tLnhtbCBiL2Rpc3RyaWJ1dGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGYwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kaXN0cmlidXRpb24vcG9tLnhtbApAQCAtMCwwICsxLDIwNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtZGlzdHJpYnV0aW9uPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IERpc3RyaWJ1dGlvbjwvbmFtZT4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jcmVhdGUtYXJjaGl2ZTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPCEtLSBXZSBkb24ndCBuZWVkIGFueSBqYXJzIGFzIG91dHB1dCBpbiB0aGlzIG1vZHVsZSAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5kZWZhdWx0LWphcjwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+bm9uZTwvcGhhc2U+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5kZWZhdWx0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5ub25lPC9waGFzZT4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPCEtLSBUaGUgZ2VuZXJhbCBzdHJhdGVneSBoZXJlIGlzIHRvIG9ubHkgZGVjbGFyZSAidG9wLWxldmVsIgorICAgICAgICAgRWRnZW50IGFydGlmYWN0cywgbGlrZSBhbiBFZGdlbnQgYXBwbGljYXRpb24gcG9tIHdvdWxkLAorICAgICAgICAgYW5kIGxldCB0aG9zZSBhcnRpZmFjdHMgcHVsbCBpbiB0aGVpciBkZXBlbmRlbnQKKyAgICAgICAgIEVkZ2VudCBhcnRpZmFjdHMsIGV0Yy4KKyAgICAgICAgIFNvIGRlY2xhcmUgUHJvdmlkZXJzLCBBbmFseXRpY3MsIFV0aWxzLCBDb25uZWN0b3JzLgorICAgIC0tPgorCisgICAgPCEtLSBQcm92aWRlcnMgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGV2ZWxvcG1lbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gQW5hbHl0aWNzIC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYW5hbHl0aWNzLW1hdGgzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYW5hbHl0aWNzLXNlbnNvcnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8IS0tIFV0aWxzIC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtbWV0cmljczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLXN0cmVhbXNjb3BlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLSBDb25uZWN0b3JzIC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tYW5kPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNzdjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtZmlsZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1pb3RwPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1qZGJjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1rYWZrYTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtbXF0dDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtcHVic3ViPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1zZXJpYWw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LWpldHR5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLSBJbmNsdWRlIGNvbnNvbGUtc2VydmxldHMud2FyIHRvIGVuYWJsZSBhIHVzZXIgdG8gcnVuCisgICAgICAgICBpdCBpbiB0aGVpciBvd24gU2VydmxldHMgZW5naW5lLgorICAgICAgICAgSXQncyBidW5kbGVkIGluIHRoZSBlZGdlbnQtY29uc29sZS1zZXJ2ZXIuamFyLgorICAgICAgICAgTm90ZSwgZWRnZW50LWNvbnNvbGUtc2VydmVyIGlzIHB1bGxlZCBpbiBhcyBhIGRlcGVuZGVuY3kKKyAgICAgICAgIG9mIHRoZSBkZXZlbG9wbWVudCBwcm92aWRlci4KKyAgICAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbnNvbGUtc2VydmxldHM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9kaXN0cmlidXRpb24vc3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWwgYi9kaXN0cmlidXRpb24vc3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpc3RyaWJ1dGlvbi9zcmMvYXNzZW1ibHkvZGlzdHJpYnV0aW9uLnhtbApAQCAtMCwwICsxLDk5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjIiCisgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMi54c2QiPgorCisgIDwhLS0KKyAgICBOT1RFOiBlYWNoIHBsYXRmb3JtIChwbGF0Zm9ybXMvamF2YTcgYW5kIHBsYXRmb3Jtcy9hbmRyb2lkKSBoYXZlIHRoZWlyCisgICAgb3duIGRpc3RyaWJ1dGlvbiBwcm9qZWN0IGFuZCBhIGNvcHkgb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgdGhhdAorICAgIG11c3QgYmUgbWFudWFsbHkga2VwdCBpbiBzeW5jLiAKKyAgIC0tPgorICAgCisgIDxpZD5iaW48L2lkPgorCisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgICAgPGZvcm1hdD50YXIuYnoyPC9mb3JtYXQ+CisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorCisgIDxmaWxlU2V0cz4KKyAgICA8IS0tZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Lz4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+RElTQ0xBSU1FUjwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisKKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWNlbnNlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgIDwvZmlsZVNldC0tPgorCisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GPC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPkRFUEVOREVOQ0lFUzwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Lz4KKyAgICA8L2ZpbGVTZXQ+CisKKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX08L2RpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+UkVBRE1FPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxvdXRwdXREaXJlY3RvcnkvPgorICAgIDwvZmlsZVNldD4KKworICAgIDwhLS1maWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvY3M8L291dHB1dERpcmVjdG9yeT4KKyAgICA8L2ZpbGVTZXQtLT4KKyAgPC9maWxlU2V0cz4KKworICA8ZGVwZW5kZW5jeVNldHM+CisgICAgPCEtLSBBbnkgZWRnZW50IGxpYnMgLS0+CisgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYnM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5lZGdlbnQqPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5lZGdlbnQqOmVkZ2VudC1kaXN0cmlidXRpb248L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZGVwZW5kZW5jeVNldD4KKworICAgIDwhLS0gQWxsIG90aGVyIGxpYnMgYXJlIHRyZWF0ZWQgYXMgZXh0ZXJuYWwgbGlicyAtLT4KKyAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZXh0PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuZWRnZW50KjwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9kZXBlbmRlbmN5U2V0PgorICA8L2RlcGVuZGVuY3lTZXRzPgorCis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9SRUFETUUgYi9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTFjN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9SRUFETUUKQEAgLTAsMCArMSwxMiBAQAorVGhpcyBidW5kbGUgaW5jbHVkZXMgYSBudW1iZXIgb2YgYXJ0aWZhY3RzIHdpdGggc2VwYXJhdGUKK2NvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiAgWW91ciB1c2Ugb2YgYW4gYXJ0aWZhY3QKK2lzIHN1YmplY3QgdG8gdGhhdCBhcnRpZmFjdOKAmXMgbGljZW5zaW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCitUaGUgQXBhY2hlIEVkZ2VudCBhcnRpZmFjdHMgKGV2ZXJ5dGhpbmcgaW4gbGliKSBhbGwgaGF2ZSB0aGUKK2xpY2Vuc2Ug4oCcQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjDigJ0uCisKK0VkZ2VudOKAmXMgZGVwZW5kZW50IGFydGlmYWN0cyBpbiDigJxleHTigJ0gaGF2ZSBhbGwgYmVlbiBldmFsdWF0ZWQKK3RvIGJlIGNvbXBhdGlibGUgd2l0aCBFZGdlbnTigJlzIGxpY2Vuc2UuCisKK0EgYnVuZGxlZCBhcnRpZmFjdCdzIGFkdmVydGlzZWQgbGljZW5zZSBpbmZvcm1hdGlvbiBtYXkgYmUKK2ZvdW5kIGluIHRoZSBERVBFTkRFTkNJRVMgZmlsZSBpbiB0aGlzIGJ1bmRsZS4KZGlmZiAtLWdpdCBhL2VkZ2VudF9vdmVydmlldy5odG1sIGIvZWRnZW50X292ZXJ2aWV3Lmh0bWwKaW5kZXggYTIyZTlhYy4uMjIwNzEwMSAxMDA2NDQKLS0tIGEvZWRnZW50X292ZXJ2aWV3Lmh0bWwKKysrIGIvZWRnZW50X292ZXJ2aWV3Lmh0bWwKQEAgLTE4LDggKzE4LDcgQEAKIC0tPgogCiA8Ym9keT4KLUVkZ2VudCBwcm92aWRlcyBhbiBwcm9ncmFtbWluZyBtb2RlbCBhbmQgbWljcm8tc2VydmljZSBzdHlsZSBydW50aW1lCi1mb3IgZXhlY3V0aW5nIHN0cmVhbWluZyBhbmFseXRpY3MgYXQgdGhlIDxpPmVkZ2U8L2k+LgorQXBhY2hlIEVkZ2VudCBpcyBhbiBTREsgZm9yIGRldmVsb3BpbmcgYW5kIGV4ZWN1dGluZyBzdHJlYW1pbmcgYW5hbHl0aWNzIGF0IHRoZSA8aT5lZGdlPC9pPi4KIDxQPgogPGVtPgogQXBhY2hlIEVkZ2VudCBpcyBhbiBlZmZvcnQgdW5kZXJnb2luZyBpbmN1YmF0aW9uIGF0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSwgc3BvbnNvcmVkIGJ5IEFwYWNoZSBJbmN1YmF0b3IgUE1DLiBJbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZCBwcm9qZWN0cyB1bnRpbCBhIGZ1cnRoZXIgcmV2aWV3IGluZGljYXRlcyB0aGF0IHRoZSBpbmZyYXN0cnVjdHVyZSwgY29tbXVuaWNhdGlvbnMsIGFuZCBkZWNpc2lvbiBtYWtpbmcgcHJvY2VzcyBoYXZlIHN0YWJpbGl6ZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIG90aGVyIHN1Y2Nlc3NmdWwgQVNGIHByb2plY3RzLiBXaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uIG9mIHRoZSBjb21wbGV0ZW5lc3Mgb3Igc3RhYmlsaXR5IG9mIHRoZSBjb2RlLCBpdCBkb2VzIGluZGljYXRlIHRoYXQgdGhlIHByb2plY3QgaGFzIHlldCB0byBiZSBmdWxseSBlbmRvcnNlZCBieSB0aGUgQVNGLgpAQCAtMzMsMTEgKzMyLDE4IEBACiA8L09MPgogPGEgbmFtZT0ib3ZlcnZpZXciPjwvYT4KIDxIMj5PdmVydmlldzwvSDI+Ci1FZGdlbnQgcHJvdmlkZXMgYW4gcHJvZ3JhbW1pbmcgbW9kZWwgYW5kIHJ1bnRpbWUgZm9yIGV4ZWN1dGluZyBzdHJlYW1pbmcKLWFuYWx5dGljcyBhdCB0aGUgPGk+ZWRnZTwvaT4uIEVkZ2VudCBpcyBmb2N1c2luZyBvbiB0d28gZWRnZSBjYXNlczoKK0FwYWNoZSBFZGdlbnQgaXMgYW4gU0RLIGZvciBkZXZlbG9waW5nIGFuZCBleGVjdXRpbmcgc3RyZWFtaW5nIGFuYWx5dGljcyBhdCB0aGUgPGk+ZWRnZTwvaT4uCitFZGdlbnQgcHJvdmlkZXMgYSBzdHJlYW0gcHJvY2Vzc2luZyBzdHlsZSBwcm9ncmFtbWluZyBtb2RlbCBmb3IgCitjb21wb3Npbmcgc3RyZWFtIHByb2Nlc3NpbmcgZ3JhcGhzIGFuZCBhIG1pY3JvLXNlcnZpY2VzIHN0eWxlIHJ1bnRpbWUgZm9yCitleGVjdXRpbmcgdGhlIGdyYXBocy4gIFNvbWUgYW5hbHl0aWNzIGFuZCBhIHJpY2ggY29sbGVjdGlvbgorb2YgY29ubmVjdG9ycyBhcmUgcHJvdmlkZWQuIFVzZXJzIGNhbiBlYXNpbHkgZGV2ZWxvcCBhbmQgdXNlIHRoZWlyIAorb3duIGFuYWx5dGljcyBhbmQgY29ubmVjdG9ycy4gIAorQSBmcmFtZXdvcmsgZm9yIHRlc3RpbmcgcHJvY2Vzc2luZyBncmFwaHMgaXMgYWxzbyBpbmNsdWRlZC4KKzxQPgorRWRnZW50IGlzIGZvY3VzaW5nIG9uIHR3byBlZGdlIGNhc2VzOgogPFVMPgotPExJPkludGVybmV0IG9mIFRoaW5ncyAoSW9UKSAtIFdpZGVseSBkaXN0cmlidXRlZCBhbmQvb3IgbW9iaWxlIGRldmljZXMuPC9MST4KLTxMST5FbnRlcnByaXNlIEVtYmVkZGVkIC0gRWRnZSBhbmFseXRpY3Mgd2l0aGluIGFuIGVudGVycHJpc2UsIHN1Y2ggYXMgbG9jYWwgYW5hbHl0aWMgYXBwbGljYXRpb25zIG9mIGVhc2ggc3lzdGVtIGluIGEgbWFjaGluZSByb29tLCBvciBlcnJvciBsb2cgYW5hbHl0aWNzIGluIGFwcGxpY2F0aW9uIHNlcnZlcnMuPC9MST4KKzxMST5JbnRlcm5ldCBvZiBUaGluZ3MgKElvVCkgLSBXaWRlbHkgZGlzdHJpYnV0ZWQgYW5kL29yIG1vYmlsZSBkZXZpY2VzIGFuZCBnYXRld2F5cy48L0xJPgorPExJPkVudGVycHJpc2UgRW1iZWRkZWQgLSBFZGdlIGFuYWx5dGljcyB3aXRoaW4gYW4gZW50ZXJwcmlzZSwgc3VjaCBhcyBsb2NhbCBhbmFseXRpYyBhcHBsaWNhdGlvbnMgb2YgZWFjaCBzeXN0ZW0gaW4gYSBtYWNoaW5lIHJvb20sIG9yIGVycm9yIGxvZyBhbmFseXRpY3MgaW4gYXBwbGljYXRpb24gc2VydmVycy48L0xJPgogPC9VTD4KIEluIGJvdGggY2FzZXMgRWRnZW50IGFwcGxpY2F0aW9ucyBhbmFseXplIGxpdmUgZGF0YSBhbmQKIHNlbmQgcmVzdWx0cyBvZiB0aGF0IGFuYWx5dGljcyBhbmQvb3IgZGF0YSBpbnRlcm1pdHRlbnRseQpAQCAtMTIyLDEyNCArMTI4LDkgQEAKIGJ5IGRvd25zdHJlYW0gY29ubmVjdGVkIG9wbGV0IGludm9jYXRpb25zLgogPGEgbmFtZT0ic3RhcnQiPjwvYT4KIDxIMj5HZXR0aW5nIFN0YXJ0ZWQ8L0gyPgotQmVsb3csIHtAY29kZSA8ZWRnZW50LXRhcmdldD59IHJlZmVycyB0byBhbiBFZGdlbnQgcmVsZWFzZSdzIHBsYXRmb3JtIHRhcmdldAotZGlyZWN0b3J5IHN1Y2ggYXMge0Bjb2RlIC4uLi9lZGdlbnQvamF2YTh9LgogPFA+CiBBIG51bWJlciBvZiBzYW1wbGUgSmF2YSBhcHBsaWNhdGlvbnMgYXJlIHByb3ZpZGVkIHRoYXQgZGVtb25zdHJhdGUgdXNlIG9mIEVkZ2VudC4KLTxCUj4KLVRoZSBKYXZhIGNvZGUgZm9yIHRoZSBzYW1wbGVzIGlzIHVuZGVyIHtAY29kZSA8ZWRnZW50LXRhcmdldD4vc2FtcGxlc30uCi08UD4KLVNoZWxsIHNjcmlwdHMgdG8gcnVuIHRoZSBzYW1wbGVzIGFyZSB7QGNvZGUgPGVkZ2VudC10YXJnZXQ+L3NjcmlwdHN9LgotU2VlIHRoZSB7QGNvZGUgUkVBRE1FfSB0aGVyZS4KLTxQPgotU3VtbWFyeSBvZiBzYW1wbGVzOgotPFRBQkxFIGJvcmRlcj0xIHdpZHRoPSI4MCUiIHRhYmxlLWxheW91dD0iYXV0byI+Ci08VFIgY2xhc3M9InJvd0NvbG9yIj48VEg+U2FtcGxlPC9USD48VEg+RGVzY3JpcHRpb248L1RIPjxUSD5Gb2N1czwvVEg+PC9UUj4KLTxUUiBjbGFzcz0iYWx0Q29sb3IiPjxURD57QGxpbmsgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy50b3BvbG9neS5IZWxsb0VkZ2VudH08L1REPgotICA8VEQ+UHJpbnRzIEhlbGxvIEVkZ2VudCEgdG8gc3RhbmRhcmQgb3V0cHV0LjwvVEQ+Ci0gIDxURD5CYXNpYyBtZWNoYW5pY3Mgb2YgZGVjbGFyaW5nIGEgdG9wb2xvZ3kgYW5kIGV4ZWN1dGluZyBpdC48L1REPjwvVFI+Ci08VFIgY2xhc3M9ImFsdENvbG9yIj48VEQ+e0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuUGVyaW9kaWNTb3VyY2V9PC9URD4KLSAgPFREPlBvbGxzIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZm9yIGEgbmV3IHZhbHVlIGV2ZXJ5IHNlY29uZAotICAgICAgYW5kIHRoZW4gcHJpbnRzIG91dCB0aGUgcmF3IHZhbHVlIGFuZCBhIGZpbHRlcmVkIGFuZCB0cmFuc2Zvcm1lZCBzdHJlYW0uPC9URD4KLSAgPFREPlBvbGxpbmcgb2YgYSBkYXRhIHZhbHVlIHRvIGNyZWF0ZSBhIHNvdXJjZSBzdHJlYW0uPC9URD48L1RSPgotPFRSIGNsYXNzPSJhbHRDb2xvciI+PFREPntAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LlNlbnNvcnNBZ2dyZWdhdGVzfTwvVEQ+Ci0gIDxURD5EZW1vbnN0cmF0ZXMgcGFydGl0aW9uZWQgYWdncmVnYXRpb24gYW5kIGZpbHRlcmluZyBvZiBzaW11bGF0ZWQgc2Vuc29ycwotICAgICAgdGhhdCBhcmUgYnVyc3R5IGluIG5hdHVyZSwgc28gdGhhdCBvbmx5IGludGVybWl0dGVudGx5Ci0gICAgICBpcyB0aGUgZGF0YSBvdXRwdXQgdG8ge0Bjb2RlIFN5c3RlbS5vdXR9PC9URD4KLSAgPFREPlNpbXVsYXRlZCBzZW5zb3JzIHdpdGggd2luZG93ZWQgYWdncmVnYXRpb248L1REPjwvVFI+Ci08VFIgY2xhc3M9ImFsdENvbG9yIj48VEQ+e0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuU2ltcGxlRmlsdGVyVHJhbnNmb3JtfTwvVEQ+Ci0gIDxURD48L1REPgotICA8VEQ+PC9URD48L1RSPgotPFRSIGNsYXNzPSJhbHRDb2xvciI+PFREPjxhIGhyZWY9IntAZG9jUm9vdH0vb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2ZpbGUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotICAgICAgRmlsZTwvYT48L1REPgotICA8VEQ+V3JpdGUgYSBzdHJlYW0gb2YgdHVwbGVzIHRvIGZpbGVzLiAgV2F0Y2ggYSBkaXJlY3RvcnkgZm9yIG5ldyBmaWxlcwotICAgICAgYW5kIGNyZWF0ZSBhIHN0cmVhbSBvZiB0dXBsZXMgZnJvbSB0aGUgZmlsZSBjb250ZW50cy48L1REPgotICA8VEQ+VXNlIG9mIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9L29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvZmlsZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gICAgICBGaWxlIHN0cmVhbSBjb25uZWN0b3I8L2E+PC9URD48L1RSPgotPFRSIGNsYXNzPSJhbHRDb2xvciI+PFREPjxhIGhyZWY9IntAZG9jUm9vdH0vb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotICAgICAgaW90cDwvYT48L1REPgotICA8VEQ+U2VuZHMgc2ltdWxhdGVkIHNlbnNvciByZWFkaW5ncyB0byBhbiBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBpbnN0YW5jZSBhcyBkZXZpY2UgZXZlbnRzLgotICAgICAgUmVjZWl2ZSBkZXZpY2UgY29tbWFuZHMuPC9URD4KLSAgPFREPlVzZSBvZiB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fS9vcmcvYXBhY2hlL2VkZ2VudC9jb25uZWN0b3JzL2lvdHAvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotICAgICAgSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0gY29ubmVjdG9yPC9hPiB0byBzZW5kIGRldmljZSBldmVudHMgYW5kIHJlY2VpdmUgZGV2aWNlIGNvbW1hbmRzLjwvVEQ+PC9UUj4KLTxUUiBjbGFzcz0iYWx0Q29sb3IiPjxURD48YSBocmVmPSJ7QGRvY1Jvb3R9L29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9qZGJjL3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KLSAgICAgIEpEQkM8L2E+PC9URD4KLSAgPFREPldyaXRlIGEgc3RyZWFtIG9mIHR1cGxlcyB0byBhbiBBcGFjaGUgRGVyYnkgZGF0YWJhc2UgdGFibGUuCi0gICAgICBDcmVhdGUgYSBzdHJlYW0gb2YgdHVwbGVzIGJ5IHJlYWRpbmcgYSB0YWJsZS48L1REPgotICA8VEQ+VXNlIG9mIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9L29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvamRiYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gICAgICBKREJDIHN0cmVhbSBjb25uZWN0b3I8L2E+PC9URD48L1RSPgotPFRSIGNsYXNzPSJhbHRDb2xvciI+PFREPjxhIGhyZWY9IntAZG9jUm9vdH0vb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KLSAgICAgIEthZmthPC9hPjwvVEQ+Ci0gIDxURD5QdWJsaXNoIGEgc3RyZWFtIG9mIHR1cGxlcyB0byBhIEthZmthIHRvcGljLiAKLSAgICAgIENyZWF0ZSBhIHN0cmVhbSBvZiB0dXBsZXMgYnkgc3Vic2NyaWJpbmcgdG8gYSB0b3BpYyBhbmQgcmVjZWl2aW5nIAotICAgICAgbWVzc2FnZXMgZnJvbSBpdC48L1REPgotICA8VEQ+VXNlIG9mIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9L29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMva2Fma2EvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotICAgICAgS2Fma2Egc3RyZWFtIGNvbm5lY3RvcjwvYT48L1REPjwvVFI+Ci08VFIgY2xhc3M9ImFsdENvbG9yIj48VEQ+PGEgaHJlZj0ie0Bkb2NSb290fS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gICAgICBNUVRUPC9hPjwvVEQ+Ci0gIDxURD5QdWJsaXNoIGEgc3RyZWFtIG9mIHR1cGxlcyB0byBhIE1RVFQgdG9waWMuIAotICAgICAgQ3JlYXRlIGEgc3RyZWFtIG9mIHR1cGxlcyBieSBzdWJzY3JpYmluZyB0byBhIHRvcGljIGFuZCByZWNlaXZpbmcgCi0gICAgICBtZXNzYWdlcyBmcm9tIGl0LjwvVEQ+Ci0gIDxURD5Vc2Ugb2YgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH0vb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy9tcXR0L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KLSAgICAgIE1RVFQgc3RyZWFtIGNvbm5lY3RvcjwvYT48L1REPjwvVFI+Ci08VFIgY2xhc3M9ImFsdENvbG9yIj48VEQ+PGEgaHJlZj0ie0Bkb2NSb290fS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvc2Vuc29yQW5hbHl0aWNzL3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KLSAgICAgIFNlbnNvckFuYWx5dGljczwvYT48L1REPgotICA8VEQ+RGVtb25zdHJhdGVzIGEgU2Vuc29yIEFuYWx5dGljcyBhcHBsaWNhdGlvbiB0aGF0IGluY2x1ZGVzOiAKLSAgICAgIGNvbmZpZ3VyYXRpb24gY29udHJvbCwgYSBkZXZpY2Ugb2Ygb25lIG9yIG1vcmUgc2Vuc29ycyBhbmQKLSAgICAgIHNvbWUgdHlwaWNhbCBhbmFseXRpY3MsIHVzZSBvZiBNUVRUIGZvciBwdWJsaXNoaW5nIHJlc3VsdHMgYW5kIHJlY2VpdmluZwotICAgICAgY29tbWFuZHMsIGxvY2FsIHJlc3VsdHMgbG9nZ2luZywgY29uZGl0aW9uYWwgc3RyZWFtIHRyYWNpbmcuPC9URD4KLSAgPFREPkEgbW9yZSBjb21wbGV0ZSBzYW1wbGUgYXBwbGljYXRpb24gZGVtb25zdHJhdGluZyBjb21tb24gdGhlbWVzLjwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci08QlI+Ci1PdGhlciBzYW1wbGVzIGFyZSBhbHNvIHByb3ZpZGVkIGJ1dCBoYXZlIG5vdCB5ZXQgYmVlbiBmdWxseSBkb2N1bWVudGVkLgotRmVlbCBmcmVlIHRvIGV4cGxvcmUgdGhlbS4KLTxIMj5CdWlsZGluZyBBcHBsaWNhdGlvbnM8L0gyPgotWW91IG5lZWQgdG8gaW5jbHVkZSBvbmUgb3IgbW9yZSBFZGdlbnQgamFycyBpbiB5b3VyIHtAY29kZSBjbGFzc3BhdGh9IGRlcGVuZGluZwotb24gd2hhdCBmZWF0dXJlcyB5b3VyIGFwcGxpY2F0aW9uIHVzZXMuCi08UD4KLUluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIHRvcG9sb2d5IHByb3ZpZGVyczoKLTx1bD4KLTxsaT57QGNvZGUgPGVkZ2VudC10YXJnZXQ+L2xpYi9lZGdlbnQucHJvdmlkZXJzLmlvdC5qYXJ9IC0gaWYgeW91IHVzZSB0aGUKLXtAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuaW90LklvdFByb3ZpZGVyIElvdFByb3ZpZGVyfTwvbGk+Ci08bGk+e0Bjb2RlIDxlZGdlbnQtdGFyZ2V0Pi9saWIvZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuamFyfSAtIGlmIHlvdSB1c2UgdGhlCi17QGxpbmsgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlciBEaXJlY3RQcm92aWRlcn08L2xpPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vbGliL2VkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuamFyfSAtIGlmIHlvdSB1c2UgdGhlCi17QGxpbmsgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRldmVsb3BtZW50LkRldmVsb3BtZW50UHJvdmlkZXIgRGV2ZWxvcG1lbnRQcm92aWRlcn08L2xpPgotPC91bD4KLUluY2x1ZGUgdGhlIGphciBvZiBhbnkgRWRnZW50IGNvbm5lY3RvciB5b3UgdXNlOgotPHVsPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vY29ubmVjdG9ycy9jb21tYW5kL2xpYi9lZGdlbnQuY29ubmVjdG9ycy5jb21tYW5kLmphcn08L2xpPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vY29ubmVjdG9ycy9jc3YvbGliL2VkZ2VudC5jb25uZWN0b3JzLmNzdi5qYXJ9PC9saT4KLTxsaT57QGNvZGUgPGVkZ2VudC10YXJnZXQ+L2Nvbm5lY3RvcnMvZmlsZS9saWIvZWRnZW50LmNvbm5lY3RvcnMuZmlsZS5qYXJ9PC9saT4KLTxsaT57QGNvZGUgPGVkZ2VudC10YXJnZXQ+L2Nvbm5lY3RvcnMvaHR0cC9saWIvZWRnZW50LmNvbm5lY3RvcnMuaHR0cC5qYXJ9PC9saT4KLTxsaT57QGNvZGUgPGVkZ2VudC10YXJnZXQ+L2Nvbm5lY3RvcnMvaW90cC9saWIvZWRnZW50LmNvbm5lY3RvcnMuaW90cC5qYXJ9PC9saT4KLTxsaT57QGNvZGUgPGVkZ2VudC10YXJnZXQ+L2Nvbm5lY3RvcnMvamRiYy9saWIvZWRnZW50LmNvbm5lY3RvcnMuamRiYy5qYXJ9PC9saT4KLTxsaT57QGNvZGUgPGVkZ2VudC10YXJnZXQ+L2Nvbm5lY3RvcnMva2Fma2EvbGliL2VkZ2VudC5jb25uZWN0b3JzLmthZmthLmphcn08L2xpPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vY29ubmVjdG9ycy9tcXR0L2xpYi9lZGdlbnQuY29ubmVjdG9ycy5tcXR0Lmphcn08L2xpPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vY29ubmVjdG9ycy9wdWJzdWIvbGliL2VkZ2VudC5jb25uZWN0b3JzLnB1YnN1Yi5qYXJ9PC9saT4KLTxsaT57QGNvZGUgPGVkZ2VudC10YXJnZXQ+L2Nvbm5lY3RvcnMvd3NjbGllbnQtamF2YXgud2Vic29ja2V0L2xpYi9lZGdlbnQuY29ubmVjdG9ycy53c2NsaWVudC5qYXZheC53ZWJzb2NrZXQuamFyfSBbKl08L2xpPgotPC91bD4KLVsqXSBZb3UgYWxzbyBuZWVkIHRvIGluY2x1ZGUgYSB7QGNvZGUgamF2YXgud2Vic29ja2V0fSBjbGllbnQgaW1wbGVtZW50YXRpb24KLWlmIHlvdSB1c2UgdGhlIHtAY29kZSB3c2NsaWVudH0gY29ubmVjdG9yLiAgSW5jbHVkZSB0aGUgZm9sbG93aW5nIHRvIHVzZQotYW4gRWNsaXBzZSBKZXR0eSBiYXNlZCBpbXBsZW1lbnRhdGlvbjoKLTx1bD4KLTxsaT57QGNvZGUgPGVkZ2VudC10YXJnZXQ+L2Nvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LWNsaWVudC9saWIvamF2YXgud2Vic29ja2V0LWNsaWVudC5qYXJ9PC9saT4KLTwvdWw+Ci08cD4KLUluY2x1ZGUgamFycyBmb3IgYW55IEVkZ2VudCBhbmFseXRpYyBmZWF0dXJlcyB5b3UgdXNlOgotPHVsPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vYW5hbHl0aWNzL21hdGgzL2xpYi9lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLmphcn08L2xpPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vYW5hbHl0aWNzL3NlbnNvcnMvbGliL2VkZ2VudC5hbmFseXRpY3Muc2Vuc29ycy5qYXJ9PC9saT4KLTwvdWw+Ci1JbmNsdWRlIGphcnMgZm9yIGFueSBFZGdlbnQgdXRpbGl0eSBmZWF0dXJlcyB5b3UgdXNlOgotPHVsPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vdXRpbHMvbWV0cmljcy9saWIvZWRnZW50LnV0aWxzLm1ldHJpY3MuamFyfSAtIGZvciB0aGUge0Bjb2RlIG9yZy5hcGFjaGUuZWRnZW50Lm1ldHJpY3N9IHBhY2thZ2U8L2xpPgotPC91bD4KLUVkZ2VudCB1c2VzIDxhIGhyZWY9Ind3dy5zbGY0ai5vcmciPnNsZjRqPC9hPiBmb3IgbG9nZ2luZywKLWxlYXZpbmcgdGhlIGRlY2lzaW9uIG9mIHRoZSBhY3R1YWwgbG9nZ2luZyBpbXBsZW1lbnRhdGlvbiB0byB5b3VyIGFwcGxpY2F0aW9uCi0oZS5nLiwge0Bjb2RlIGphdmEudXRpbC5sb2dnaW5nfSBvciB7QGNvZGUgbG9nNGp9KS4gIAotRm9yIHtAY29kZSBqYXZhLnV0aWwubG9nZ2luZ30geW91IGNhbiBpbmNsdWRlOgotPHVsPgotPGxpPntAY29kZSA8ZWRnZW50LXRhcmdldD4vZXh0LyBzbGY0ai1qZGsxNC0xLjcuMTIuamFyfTwvbGk+Ci08L3VsPgorR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBFZGdlbnQgQXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgYW5kIAorc29tZSBkZXZlbG9wbWVudCB1dGlsaXRpZXMgYXJlIGluY2x1ZGVkLgorU2VlIDxhIGhyZWY9Imh0dHBzOi8vZWRnZW50LmFwYWNoZS5vcmcvZG9jcy9lZGdlbnQtZ2V0dGluZy1zdGFydGVkIj5HZXR0aW5nIFN0YXJ0ZWQ8L2E+LgogPC9ib2R5PgpkaWZmIC0tZ2l0IGEvZXh0Ly5jbGFzc3BhdGggYi9leHQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmMDFjNS4uMDAwMDAwMAotLS0gYS9leHQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9leHQvZ3Nvbi0yLjIuNC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2V4dC9tZXRyaWNzLWNvcmUtMy4xLjIuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9leHQvc2xmNGotYXBpLTEuNy4xMi5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0iLi4vZXh0ZXJuYWxKYXJzL2phdmE4L2V4dC9zbGY0ai1qZGsxNC0xLjcuMTIuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4dC8ucHJvamVjdCBiL2V4dC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3ZTFjMC4uMDAwMDAwMAotLS0gYS9leHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5leHQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZ3JhZGxlL2phY29jby5ncmFkbGUgYi9ncmFkbGUvamFjb2NvLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkYjczOC4uMDAwMDAwMAotLS0gYS9ncmFkbGUvamFjb2NvLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLSAKLXRhc2sgamFjb2NvVGVzdFJlcG9ydCB7Ci0gIGRlc2NyaXB0aW9uID0gIkdlbmVyYXRlcyBhIGNvdmVyYWdlIHJlcG9ydCBmcm9tIGFsbCBzdWJwcm9qZWN0cyAodXNlIGFmdGVyICd0ZXN0JykiCi0gIGV4dC50ZXN0N0FkanVzdEphY29jb1JlcG9ydCA9IGZhbHNlCi19Ci1qYWNvY29UZXN0UmVwb3J0IDw8IHsKLQotICBhbnQuZGVsZXRlKGRpcjogIiR7dGFyZ2V0X3JlcG9ydF9kaXJ9L2NvdmVyYWdlIikKLQotICBkZWYgbGliRGlyID0gbmV3IEZpbGUoIiR7dGFyZ2V0X2phdmE4X2Rpcn0iLCAibGliIikKLSAgZGVmIHV0aWxzRGlyID0gbmV3IEZpbGUoIiR7dGFyZ2V0X2phdmE4X2Rpcn0iLCAidXRpbHMiKQotICBkZWYgY29ubmVjdG9yc0RpciA9IG5ldyBGaWxlKCIke3RhcmdldF9qYXZhOF9kaXJ9IiwgImNvbm5lY3RvcnMiKQotICBkZWYgYW5hbHl0aWNzRGlyID0gbmV3IEZpbGUoIiR7dGFyZ2V0X2phdmE4X2Rpcn0iLCAiYW5hbHl0aWNzIikKLSAgZGVmIGNvbnNvbGVEaXIgPSBuZXcgRmlsZSgiJHt0YXJnZXRfamF2YThfZGlyfSIsICJjb25zb2xlIikKLQotICBpZiggIWxpYkRpci5leGlzdHMoKSApIHsgbGliRGlyLm1rZGlycygpIH0KLSAgaWYoICF1dGlsc0Rpci5leGlzdHMoKSApIHsgdXRpbHNEaXIubWtkaXJzKCkgfQotICBpZiggIWNvbm5lY3RvcnNEaXIuZXhpc3RzKCkgKSB7IGNvbm5lY3RvcnNEaXIubWtkaXJzKCkgfQotICBpZiggIWFuYWx5dGljc0Rpci5leGlzdHMoKSApIHsgYW5hbHl0aWNzRGlyLm1rZGlycygpIH0KLSAgaWYoICFjb25zb2xlRGlyLmV4aXN0cygpICkgeyBjb25zb2xlRGlyLm1rZGlycygpIH0KLQotICBGaWxlQ29sbGVjdGlvbiBleGVjdXRpb25EYXRhID0gZmlsZXMoKQotCi0gIHN1YnByb2plY3RzLmZpbmRBbGwgeyBzdWJwcm9qZWN0IC0+Ci0gICAgc3VicHJvamVjdC5wbHVnaW5NYW5hZ2VyLmhhc1BsdWdpbignamF2YScpICYmIHN1YnByb2plY3QucGx1Z2luTWFuYWdlci5oYXNQbHVnaW4oJ2phY29jbycpCi0gIH0uZWFjaCB7IHN1YnByb2plY3QgLT4KLSAgICBleGVjdXRpb25EYXRhICs9IHN1YnByb2plY3QudGFza3MuamFjb2NvVGVzdFJlcG9ydC5leGVjdXRpb25EYXRhCi0gIH0KLQotICBleGVjdXRpb25EYXRhID0gZmlsZXMoZXhlY3V0aW9uRGF0YS5maW5kQWxsIHsKLSAgICBpdC5leGlzdHMoKQotICB9KQotICBhbnQudGFza2RlZihuYW1lOiAnamFjb2NvUmVwb3J0JywgY2xhc3NuYW1lOiAnb3JnLmphY29jby5hbnQuUmVwb3J0VGFzaycsCi0gICAgICAgICAgY2xhc3NwYXRoOiBjb25maWd1cmF0aW9ucy5qdW5pdExpYnMuYXNQYXRoKQotICBhbnQuamFjb2NvUmVwb3J0IHsKLSAgICBleGVjdXRpb25kYXRhIHsKLSAgICAgIGV4ZWN1dGlvbkRhdGEuYWRkVG9BbnRCdWlsZGVyKGFudCwgJ3Jlc291cmNlcycpCi0gICAgfQotCi0gICAgcGxhdGZvcm1UYXJnZXREaXIgPSB0YXJnZXRfamF2YThfZGlyCi0gICAgaWYgKHRlc3Q3QWRqdXN0SmFjb2NvUmVwb3J0KSB7Ci0gICAgICBwbGF0Zm9ybVRhcmdldERpciA9IHRhcmdldF9qYXZhN19kaXIKLSAgICB9Ci0KLSAgICBzdHJ1Y3R1cmUobmFtZTogcHJvamVjdC5uYW1lKSB7Ci0gICAgICBncm91cChuYW1lOiAiRWRnZW50IEFQSSIpIHsKLSAgICAgICAgY2xhc3NmaWxlcyB7Ci0gICAgICAgICAgZmlsZXNldChkaXI6ICIkcGxhdGZvcm1UYXJnZXREaXIvbGliIiwgaW5jbHVkZXM6ICJlZGdlbnQuYXBpLiouamFyIikKLSAgICAgICAgfQotICAgICAgICBzb3VyY2VmaWxlcyB7Ci0gICAgICAgICAgZmlsZXNldChkaXI6ICIuL2FwaS9mdW5jdGlvbi9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9hcGkvZXhlY3V0aW9uL3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgICAgZmlsZXNldChkaXI6ICIuL2FwaS9vcGxldC9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9hcGkvZ3JhcGgvc3JjL21haW4vamF2YSIsIGluY2x1ZGVzOiAiKiovKi5qYXZhIikKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vYXBpL3RvcG9sb2d5L3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGdyb3VwKG5hbWU6ICJFZGdlbnQgU1BJIikgewotICAgICAgICBjbGFzc2ZpbGVzIHsKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIiRwbGF0Zm9ybVRhcmdldERpci9saWIiLCBpbmNsdWRlczogImVkZ2VudC5zcGkuKi5qYXIiKQotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZWZpbGVzIHsKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vc3BpL2dyYXBoL3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgICAgZmlsZXNldChkaXI6ICIuL3NwaS90b3BvbG9neS9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBncm91cChuYW1lOiAiRWRnZW50IFJ1bnRpbWUiKSB7Ci0gICAgICAgIGNsYXNzZmlsZXMgewotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiJHBsYXRmb3JtVGFyZ2V0RGlyL2xpYiIsIGluY2x1ZGVzOiAiZWRnZW50LnJ1bnRpbWUuKi5qYXIiKQotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZWZpbGVzIHsKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vcnVudGltZS9ldGlhby9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9ydW50aW1lL2pteGNvbnRyb2wvc3JjL21haW4vamF2YSIsIGluY2x1ZGVzOiAiKiovKi5qYXZhIikKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZ3JvdXAobmFtZTogIkVkZ2VudCBVdGlsaXRpZXMiKSB7Ci0gICAgICAgIGNsYXNzZmlsZXMgewotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiJHBsYXRmb3JtVGFyZ2V0RGlyL3V0aWxzIiwgaW5jbHVkZXM6ICIqKi9lZGdlbnQudXRpbHMuKi5qYXIiKQotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZWZpbGVzIHsKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vdXRpbHMvbWV0cmljcy9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi91dGlscy9zdHJlYW1zY29wZS9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBncm91cChuYW1lOiAiRWRnZW50IENvbm5lY3RvcnMiKSB7Ci0gICAgICAgIGNsYXNzZmlsZXMgewotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiJHBsYXRmb3JtVGFyZ2V0RGlyL2Nvbm5lY3RvcnMiLCBpbmNsdWRlczogIioqL2VkZ2VudC5jb25uZWN0b3JzLiouamFyIikKLSAgICAgICAgfQotICAgICAgICBzb3VyY2VmaWxlcyB7Ci0gICAgICAgICAgZmlsZXNldChkaXI6ICIuL2Nvbm5lY3RvcnMvY29tbW9uL3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgICAgZmlsZXNldChkaXI6ICIuL2Nvbm5lY3RvcnMvY29tbWFuZC9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9jb25uZWN0b3JzL2Nzdi9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9jb25uZWN0b3JzL2ZpbGUvc3JjL21haW4vamF2YSIsIGluY2x1ZGVzOiAiKiovKi5qYXZhIikKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vY29ubmVjdG9ycy9pb3Qvc3JjL21haW4vamF2YSIsIGluY2x1ZGVzOiAiKiovKi5qYXZhIikKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vY29ubmVjdG9ycy9pb3RwL3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgICAgZmlsZXNldChkaXI6ICIuL2Nvbm5lY3RvcnMvamRiYy9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9jb25uZWN0b3JzL2thZmthL3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgICAgZmlsZXNldChkaXI6ICIuL2Nvbm5lY3RvcnMvbXF0dC9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9jb25uZWN0b3JzL2h0dHAvc3JjL21haW4vamF2YSIsIGluY2x1ZGVzOiAiKiovKi5qYXZhIikKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vY29ubmVjdG9ycy93c2NsaWVudC9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9jb25uZWN0b3JzL3dzY2xpZW50LWphdmF4LndlYnNvY2tldC9zcmMvbWFpbi9qYXZhIiwgaW5jbHVkZXM6ICIqKi8qLmphdmEiKQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBncm91cChuYW1lOiAiRWRnZW50IFByb3ZpZGVycyIpIHsKLSAgICAgICAgY2xhc3NmaWxlcyB7Ci0gICAgICAgICAgZmlsZXNldChkaXI6ICIkcGxhdGZvcm1UYXJnZXREaXIvbGliIiwgaW5jbHVkZXM6ICJlZGdlbnQucHJvdmlkZXJzLiouamFyIikKLSAgICAgICAgfQotICAgICAgICBzb3VyY2VmaWxlcyB7Ci0gICAgICAgICAgZmlsZXNldChkaXI6ICIuL3Byb3ZpZGVycy9kaXJlY3Qvc3JjL21haW4vamF2YSIsIGluY2x1ZGVzOiAiKiovKi5qYXZhIikKLSAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vcHJvdmlkZXJzL2RldmVsb3BtZW50L3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghdGVzdDdBZGp1c3RKYWNvY29SZXBvcnQpIHsKLSAgICAgICAgZ3JvdXAobmFtZTogIkVkZ2VudCBBbmFseXRpY3MiKSB7Ci0gICAgICAgICAgY2xhc3NmaWxlcyB7Ci0gICAgICAgICAgICBmaWxlc2V0KGRpcjogIiRwbGF0Zm9ybVRhcmdldERpci9hbmFseXRpY3MiLCBpbmNsdWRlczogIioqL2VkZ2VudC5hbmFseXRpY3MuKi5qYXIiKQotICAgICAgICAgIH0KLSAgICAgICAgICBzb3VyY2VmaWxlcyB7Ci0gICAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vYW5hbHl0aWNzL21hdGgzL3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vYW5hbHl0aWNzL3NlbnNvcnMvc3JjL21haW4vamF2YSIsIGluY2x1ZGVzOiAiKiovKi5qYXZhIikKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ3JvdXAobmFtZTogIkVkZ2VudCBDb25zb2xlIikgewotICAgICAgICAgIGNsYXNzZmlsZXMgewotICAgICAgICAgICAgZmlsZXNldChkaXI6ICIkcGxhdGZvcm1UYXJnZXREaXIvY29uc29sZSIsIGluY2x1ZGVzOiAiKiovZWRnZW50LmNvbnNvbGUuKi5qYXIiKQotICAgICAgICAgIH0KLSAgICAgICAgICBzb3VyY2VmaWxlcyB7Ci0gICAgICAgICAgICBmaWxlc2V0KGRpcjogIi4vY29uc29sZS9zZXJ2ZXIvc3JjL21haW4vamF2YSIsIGluY2x1ZGVzOiAiKiovKi5qYXZhIikKLSAgICAgICAgICAgIGZpbGVzZXQoZGlyOiAiLi9jb25zb2xlL3NlcnZsZXRzL3NyYy9tYWluL2phdmEiLCBpbmNsdWRlczogIioqLyouamF2YSIpCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGh0bWwoZGVzdGRpcjogIiR7dGFyZ2V0X3JlcG9ydF9kaXJ9L2NvdmVyYWdlLyIpCi0gICAgeG1sKGRlc3RmaWxlOiAiJHt0YXJnZXRfcmVwb3J0X2Rpcn0vY292ZXJhZ2UvamFjb2NvLXNlc3Npb25zLnhtbCIpCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2dyYWRsZS9qYXZhZG9jLmdyYWRsZSBiL2dyYWRsZS9qYXZhZG9jLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViZmZmMy4uMDAwMDAwMAotLS0gYS9ncmFkbGUvamF2YWRvYy5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotdGFzayBhZ2dyZWdhdGVKYXZhZG9jKHR5cGU6IEphdmFkb2MpIHsKLSAgZGVzY3JpcHRpb24gPSAnQ3JlYXRlIGFsbCBqYXZhZG9jIGludG8gdGFyZ2V0X2Rpci9kb2NzL2phdmFkb2MnCi0gIGRlc3RpbmF0aW9uRGlyIGZpbGUodGFyZ2V0X2phdmFkb2NfZGlyKQotICBvcHRpb25zLmFkZFN0cmluZ09wdGlvbignWGRvY2xpbnQ6bm9uZScsICctcXVpZXQnKQotICBjb25maWd1cmUob3B0aW9ucykgewotICAgIGF1dGhvciA9IHRydWUKLSAgICB2ZXJzaW9uID0gdHJ1ZQotICAgIHVzZSA9IHRydWUKLSAgICBkb2NUaXRsZSAiQXBhY2hlIEVkZ2VudCAoaW5jdWJhdGluZykgdiR7YnVpbGRfdmVyc2lvbn0iCi0gICAgZm9vdGVyICc8YSBocmVmPSJodHRwOi8vZWRnZW50LmluY3ViYXRvci5hcGFjaGUub3JnIj5BcGFjaGUgRWRnZW50IChpbmN1YmF0aW5nKTwvYT4nCi0gICAgYm90dG9tICJDb3B5cmlnaHQgJiMxNjk7ICR7Q09QWVJJR0hUX1lFQVJ9IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZCAtICR7Y29tbWl0aGFzaH0tJHtEU1RBTVB9LSR7VFNUQU1QfSIKLSAgICBvdmVydmlldyAiZWRnZW50X292ZXJ2aWV3Lmh0bWwiCi0gICAgd2luZG93VGl0bGUgIkVkZ2VudCB2JHtidWlsZF92ZXJzaW9ufSIKLQotICAgIGdyb3VwKCJFZGdlbnQgUHJvdmlkZXJzIiwgIm9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy4qIikKLSAgICBncm91cCgiRWRnZW50IEFQSSIsICJvcmcuYXBhY2hlLmVkZ2VudC5leGVjdXRpb24iLCAib3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24iLCAib3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kiLCAib3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuanNvbiIsICJvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5tYmVhbnMiLCAib3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kucGx1bWJpbmciLCAib3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuc2VydmljZXMiLCAib3JnLmFwYWNoZS5lZGdlbnQuZXhlY3V0aW9uLioiKQotICAgIGdyb3VwKCJFZGdlbnQgQW5hbHl0aWNzIiwgIm9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy4qIikKLSAgICBncm91cCgiRWRnZW50IFV0aWxpdGllcyIsICJvcmcuYXBhY2hlLmVkZ2VudC5tZXRyaWNzIiwgIm9yZy5hcGFjaGUuZWRnZW50Lm1ldHJpY3MuKiIsICJvcmcuYXBhY2hlLmVkZ2VudC5zdHJlYW1zY29wZSIsICJvcmcuYXBhY2hlLmVkZ2VudC5zdHJlYW1zY29wZS4qIikKLSAgICBncm91cCgiRWRnZW50IENvbm5lY3RvcnMiLCAib3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy4qIikKLSAgICBncm91cCgiRWRnZW50IFNhbXBsZXMiLCAib3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy4qIikKLSAgICBncm91cCgiRWRnZW50IExvdy1MZXZlbCBBUEkiLCAib3JnLmFwYWNoZS5lZGdlbnQuZ3JhcGgiLCAib3JnLmFwYWNoZS5lZGdlbnQuZ3JhcGguKiIsICJvcmcuYXBhY2hlLmVkZ2VudC5vcGxldCIsICJvcmcuYXBhY2hlLmVkZ2VudC5vcGxldC4qIiwgIm9yZy5hcGFjaGUuZWRnZW50LndpbmRvdyIpCi0gICAgZ3JvdXAoIkVkZ2VudCBTUEkiLCAib3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuc3BpIiwgIm9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LnNwaS4qIikKLSAgfQotICBzb3VyY2Ugc3VicHJvamVjdHMuY29sbGVjdCB7IHByb2plY3QgLT4gcHJvamVjdC5zb3VyY2VTZXRzLm1haW4uYWxsSmF2YSB9Ci0gIGV4Y2x1ZGUgIioqL2VkZ2VudC9jb25uZWN0b3JzLyoqL3J1bnRpbWUiCi0gIGV4Y2x1ZGUgIioqL2VkZ2VudC9jb25zb2xlIgotICBleGNsdWRlICIqKi9lZGdlbnQvc2FtcGxlcy9zY2VuYXJpb3MvaW90cC9yYW5nZS9zZW5zb3IiCi0gIGV4Y2x1ZGUgIioqL2FuZHJvaWQvKioiCi0gIGNsYXNzcGF0aCA9IGZpbGVzKGZpbHRlcmVkU3VicHJvamVjdHMuY29sbGVjdCB7IGl0Lmphci5hcmNoaXZlUGF0aCB9KQotICAKLSAgLy8gZG9jLWZpbGVzIGFyZW4ndCBwaWNrZWQgdXAgYXV0b21hdGljYWxseSBzbyBnZXQgdGhlbSBub3cuCi0gIGRvTGFzdCB7Ci0gICAgY29weSB7Ci0gICAgICBmcm9tIHN1YnByb2plY3RzLmNvbGxlY3QgeyBwcm9qZWN0IC0+IHByb2plY3Quc291cmNlU2V0cy5tYWluLmphdmEuc3JjRGlycyB9Ci0gICAgICBpbmNsdWRlICcqKi9kb2MtZmlsZXMvKionCi0gICAgICBpbmNsdWRlRW1wdHlEaXJzID0gZmFsc2UKLSAgICAgIGludG8gdGFyZ2V0X2phdmFkb2NfZGlyCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9ncmFkbGUvb3RoZXIuZ3JhZGxlIGIvZ3JhZGxlL290aGVyLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0YmFjZi4uMDAwMDAwMAotLS0gYS9ncmFkbGUvb3RoZXIuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLWV4dC51bnN1cHBvcnRlZEphdmE3VGVzdFByb2plY3RzID0gWyAgLy8gd2h5IG5vdCBvbiBhbGwgb2YgdGhlc2U/IChtYXRjaCBhbnRfdGVzdDcucnVuLCBzZWUgSkFWQV9TVVBQT1JULm1kKQotICAvLyBwcm9qZWN0cyB3aXRoIG5vIHRlc3RzIHdpbGwgYmUgYXV0b21hdGljYWxseSBhdm9pZGVkIGZvciBqYXZhNyB0ZXN0cwotICAvLyBvdGhlcndpc2UgdGhvc2UgdGhhdCBhcmUgbm90IHlldCBzdXBwb3J0ZWQgZm9yIGphdmE3IChub3QgaW4gYW50X3Rlc3Q3LntzZXR1cCxydW59KSBtdXN0IGJlIGFkZGVkIGhlcmUKLSAgJzphcGk6Z3JhcGgnLCAgICAgICAvLyBubyBydW5uYWJsZSB0ZXN0cwotICAnOmFuYWx5dGljczptYXRoMycsCi0gICc6YW5hbHl0aWNzOnNlbnNvcnMnLAotICAnOmNvbm5lY3RvcnM6Y29tbWFuZCcsCi0gICc6Y29ubmVjdG9yczpjc3YnLAotICAnOmNvbm5lY3RvcnM6ZmlsZScsCi0gICc6Y29ubmVjdG9yczpqZGJjJywKLSAgJzpjb25uZWN0b3JzOm1xdHQnLAotICAnOmNvbm5lY3RvcnM6a2Fma2EnLAotICAnOmNvbm5lY3RvcnM6c2VyaWFsJywKLSAgJzpjb25uZWN0b3JzOndzY2xpZW50JywKLSAgJzpjb25uZWN0b3JzOndzY2xpZW50LWphdmF4LndlYnNvY2tldCcsCi0gICc6Y29ubmVjdG9yczpqYXZheC53ZWJzb2NrZXQtY2xpZW50JywKLSAgJzpjb25uZWN0b3JzOmVkZ2VudC5qYXZheC53ZWJzb2NrZXQnLAotICAnOmNvbm5lY3RvcnM6amF2YXgud2Vic29ja2V0LXNlcnZlcicsCi0gICc6Y29uc29sZTpzZXJ2ZXInLAotICAnOmNvbnNvbGU6c2VydmxldHMnLAotICAnOnByb3ZpZGVyczpkZXZlbG9wbWVudCcsCi0gICc6dXRpbHM6c3RyZWFtc2NvcGUnLAotICAnOnRlc3Q6ZnZ0aW90JywKLSAgJzp0ZXN0OnN2dCcsCi1dCi0KLWV4dC5wcm9qZWN0c1dpdGhQcmVBcGFjaGVDb250cmlicyA9IFsKLSAgJzphbmFseXRpY3M6bWF0aDMnLCAnOmFuYWx5dGljczpzZW5zb3JzJywKLSAgJzphbmRyb2lkOnRvcG9sb2d5JywgJzphbmRyb2lkOmhhcmR3YXJlJywKLSAgJzphcGk6ZnVuY3Rpb24nLCAnOmFwaTpleGVjdXRpb24nLCAnOmFwaTp3aW5kb3cnLCAnOmFwaTpvcGxldCcsCi0gICc6YXBpOmdyYXBoJywgJzphcGk6dG9wb2xvZ3knLAotICAnOmNvbm5lY3RvcnM6Y29tbW9uJywgJzpjb25uZWN0b3JzOmlvdCcsICc6Y29ubmVjdG9yczpzZXJpYWwnLAotICAnOmNvbm5lY3RvcnM6ZmlsZScsICc6Y29ubmVjdG9yczpodHRwJywgJzpjb25uZWN0b3JzOmlvdHAnLAotICAnOmNvbm5lY3RvcnM6amRiYycsICc6Y29ubmVjdG9yczprYWZrYScsICc6Y29ubmVjdG9yczptcXR0JywKLSAgJzpjb25uZWN0b3JzOmVkZ2VudC5qYXZheC53ZWJzb2NrZXQnLAotICAnOmNvbm5lY3RvcnM6amF2YXgud2Vic29ja2V0LWNsaWVudCcsICc6Y29ubmVjdG9yczpqYXZheC53ZWJzb2NrZXQtc2VydmVyJywKLSAgJzpjb25uZWN0b3JzOndzY2xpZW50JywgJzpjb25uZWN0b3JzOndzY2xpZW50LWphdmF4LndlYnNvY2tldCcsCi0gICc6Y29uc29sZTpzZXJ2ZXInLCAnOmNvbnNvbGU6c2VydmxldHMnLAotICAnOnByb3ZpZGVyczpkaXJlY3QnLCAnOnByb3ZpZGVyczpkZXZlbG9wbWVudCcsCi0gICc6cnVudGltZTpldGlhbycsICc6cnVudGltZTpqbXhjb250cm9sJywgJzpydW50aW1lOmpzb25jb250cm9sJywKLSAgJzpzYW1wbGVzOnV0aWxzJywgJzpzYW1wbGVzOmFwcHMnLCAnOnNhbXBsZXM6dG9wb2xvZ3knLCAnOnNhbXBsZXM6Y29ubmVjdG9ycycsCi0gICc6c2FtcGxlczpjb25zb2xlJywKLSAgJzpzcGk6Z3JhcGgnLCAnOnNwaTp0b3BvbG9neScsCi0gICc6dGVzdDpzdnQnLAotICAnOnV0aWxzOm1ldHJpY3MnLAotXQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3JhdC5ncmFkbGUgYi9ncmFkbGUvcmF0LmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlODk5OS4uMDAwMDAwMAotLS0gYS9ncmFkbGUvcmF0LmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3NhbXphCi0KLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS5QbHVnaW4KLWltcG9ydCBvcmcuZ3JhZGxlLmFwaS5Qcm9qZWN0Ci1pbXBvcnQgb3JnLmdyYWRsZS5hcGkuVGFzawotaW1wb3J0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnByb2plY3QuSXNvbGF0ZWRBbnRCdWlsZGVyCi0KLWFwcGx5IHBsdWdpbjogUmF0UGx1Z2luCi0KLWNsYXNzIFJhdFRhc2sgZXh0ZW5kcyBEZWZhdWx0VGFzayB7Ci0gIEBJbnB1dAotICBMaXN0PFN0cmluZz4gZXhjbHVkZXMKLQotICBkZWYgcmVwb3J0UGF0aCA9ICdidWlsZC9yYXQnCi0gIGRlZiBzdHlsZXNoZWV0ID0gJ2dyYWRsZS9yZXNvdXJjZXMvcmF0LW91dHB1dC10by1odG1sLnhzbCcKLSAgZGVmIHhtbFJlcG9ydCA9IHJlcG9ydFBhdGggKyAnL3JhdC1yZXBvcnQueG1sJwotICBkZWYgaHRtbFJlcG9ydCA9IHJlcG9ydFBhdGggKyAnL3JhdC1yZXBvcnQuaHRtbCcKLSAgZGVmIHRleHRSZXBvcnQgPSByZXBvcnRQYXRoICsgJy9yYXQtcmVwb3J0LnR4dCcKLQotICBkZWYgZ2VuZXJhdGVUZXh0UmVwb3J0KEZpbGUgcmVwb3J0RGlyKSB7Ci0gICAgZGVmIGFudEJ1aWxkZXIgPSBzZXJ2aWNlcy5nZXQoSXNvbGF0ZWRBbnRCdWlsZGVyKQotICAgIGRlZiByYXRDbGFzc3BhdGggPSBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLnJhdAotICAgIGFudEJ1aWxkZXIud2l0aENsYXNzcGF0aChyYXRDbGFzc3BhdGgpLmV4ZWN1dGUgewotICAgICAgYW50LnRhc2tkZWYocmVzb3VyY2U6ICdvcmcvYXBhY2hlL3JhdC9hbnR0YXNrcy9hbnRsaWIueG1sJykKLSAgICAgIGFudC5yZXBvcnQoZm9ybWF0OiAncGxhaW4nLCByZXBvcnRGaWxlOiB0ZXh0UmVwb3J0KSB7Ci0gICAgICAgIGZpbGVzZXQoZGlyOiAiLiIpIHsKLSAgICAgICAgICBwYXR0ZXJuc2V0IHsKLSAgICAgICAgICAgIGV4Y2x1ZGVzLmVhY2ggewotICAgICAgICAgICAgICBleGNsdWRlKG5hbWU6IGl0KQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGRlZiBnZW5lcmF0ZVhtbFJlcG9ydChGaWxlIHJlcG9ydERpcikgewotICAgIGRlZiBhbnRCdWlsZGVyID0gc2VydmljZXMuZ2V0KElzb2xhdGVkQW50QnVpbGRlcikKLSAgICBkZWYgcmF0Q2xhc3NwYXRoID0gcHJvamVjdC5jb25maWd1cmF0aW9ucy5yYXQKLSAgICBhbnRCdWlsZGVyLndpdGhDbGFzc3BhdGgocmF0Q2xhc3NwYXRoKS5leGVjdXRlIHsKLSAgICAgIGFudC50YXNrZGVmKHJlc291cmNlOiAnb3JnL2FwYWNoZS9yYXQvYW50dGFza3MvYW50bGliLnhtbCcpCi0gICAgICBhbnQucmVwb3J0KGZvcm1hdDogJ3htbCcsIHJlcG9ydEZpbGU6IHhtbFJlcG9ydCkgewotICAgICAgICBmaWxlc2V0KGRpcjogIi4iKSB7Ci0gICAgICAgICAgcGF0dGVybnNldCB7Ci0gICAgICAgICAgICBleGNsdWRlcy5lYWNoIHsKLSAgICAgICAgICAgICAgZXhjbHVkZShuYW1lOiBpdCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBkZWYgcHJpbnRVbmtub3duRmlsZXMoKSB7Ci0gICAgZGVmIHJhdFhtbCA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZSh4bWxSZXBvcnQpCi0gICAgZGVmIHVua25vd25MaWNlbnNlcyA9IDAKLSAgICByYXRYbWwucmVzb3VyY2UuZWFjaCB7IHJlc291cmNlIC0+Ci0gICAgICBpZiAocmVzb3VyY2UuJ2xpY2Vuc2UtYXBwcm92YWwnLkBuYW1lWzBdID09ICJmYWxzZSIpIHsKLSAgICAgICAgcHJpbnRsbignVW5rbm93biBsaWNlbnNlOiAnICsgcmVzb3VyY2UuQG5hbWUpCi0gICAgICAgIHVua25vd25MaWNlbnNlcysrCi0gICAgICB9Ci0gICAgfQotICAgIGlmICh1bmtub3duTGljZW5zZXMgPiAwKSB7Ci0gICAgICB0aHJvdyBuZXcgR3JhZGxlRXhjZXB0aW9uKCJGb3VuZCAiICsgdW5rbm93bkxpY2Vuc2VzICsgIiBmaWxlcyB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBsaWNlbnNlcy4iKQotICAgIH0KLSAgfQotCi0gIGRlZiBnZW5lcmF0ZUh0bWxSZXBvcnQoKSB7Ci0gICAgZGVmIGFudEJ1aWxkZXIgPSBzZXJ2aWNlcy5nZXQoSXNvbGF0ZWRBbnRCdWlsZGVyKQotICAgIGRlZiByYXRDbGFzc3BhdGggPSBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLnJhdAotICAgIGFudEJ1aWxkZXIud2l0aENsYXNzcGF0aChyYXRDbGFzc3BhdGgpLmV4ZWN1dGUgewotICAgICAgYW50LnhzbHQoCi0gICAgICAgICAgaW46IHhtbFJlcG9ydCwKLSAgICAgICAgICBzdHlsZTogc3R5bGVzaGVldCwKLSAgICAgICAgICBvdXQ6IGh0bWxSZXBvcnQsCi0gICAgICAgICAgY2xhc3NwYXRoOiByYXRDbGFzc3BhdGgpCi0gICAgfQotICAgIHByaW50bG4oJ1JhdCByZXBvcnQ6ICcgKyBodG1sUmVwb3J0KQotICB9Ci0KLSAgQFRhc2tBY3Rpb24KLSAgZGVmIHJhdCgpIHsKLSAgICBGaWxlIHJlcG9ydERpciA9IG5ldyBGaWxlKHJlcG9ydFBhdGgpCi0gICAgaWYgKCFyZXBvcnREaXIuZXhpc3RzKCkpIHsKLSAgICAgIHJlcG9ydERpci5ta2RpcnMoKQotICAgIH0KLSAgICBnZW5lcmF0ZVhtbFJlcG9ydChyZXBvcnREaXIpCi0gICAgZ2VuZXJhdGVIdG1sUmVwb3J0KCkKLSAgICBnZW5lcmF0ZVRleHRSZXBvcnQoKQotICAgIHByaW50VW5rbm93bkZpbGVzKCkKLSAgfQotfQotCi1jbGFzcyBSYXRQbHVnaW4gaW1wbGVtZW50cyBQbHVnaW48UHJvamVjdD4gewotICB2b2lkIGFwcGx5KFByb2plY3QgcHJvamVjdCkgewotICAgIGNvbmZpZ3VyZURlcGVuZGVuY2llcyhwcm9qZWN0KQotICAgIHByb2plY3QucGx1Z2lucy5hcHBseShKYXZhQmFzZVBsdWdpbik7Ci0gICAgVGFzayByYXRUYXNrID0gcHJvamVjdC50YXNrKCJyYXQiLAotICAgICAgICB0eXBlOiBSYXRUYXNrLAotICAgICAgICBncm91cDogJ0J1aWxkJywKLSAgICAgICAgZGVzY3JpcHRpb246ICdSdW5zIEFwYWNoZSBSYXQgY2hlY2tzLicpCi0gICAgcHJvamVjdC50YXNrc1tKYXZhQmFzZVBsdWdpbi5DSEVDS19UQVNLX05BTUVdLmRlcGVuZHNPbiByYXRUYXNrCi0gIH0KLQotICB2b2lkIGNvbmZpZ3VyZURlcGVuZGVuY2llcyhmaW5hbCBQcm9qZWN0IHByb2plY3QpIHsKLSAgICBwcm9qZWN0LmNvbmZpZ3VyYXRpb25zIHsKLSAgICAgIHJhdAotICAgIH0KLSAgICBwcm9qZWN0LnJlcG9zaXRvcmllcyB7Ci0gICAgICBtYXZlbkNlbnRyYWwoKQotICAgIH0KLSAgICBwcm9qZWN0LmRlcGVuZGVuY2llcyB7Ci0gICAgICByYXQgJ29yZy5hcGFjaGUucmF0OmFwYWNoZS1yYXQtdGFza3M6MC4xMicKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmFkbGUvcmVzb3VyY2VzL3JhdC1vdXRwdXQtdG8taHRtbC54c2wgYi9ncmFkbGUvcmVzb3VyY2VzL3JhdC1vdXRwdXQtdG8taHRtbC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MWVjM2UuLjAwMDAwMDAKLS0tIGEvZ3JhZGxlL3Jlc291cmNlcy9yYXQtb3V0cHV0LXRvLWh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLTx4c2w6dHJhbnNmb3JtIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIyLjAiPgotCi08IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgotCi08IS0tIFRoaXMgc3R5bGUgc2hlZXQgY29udmVydHMgYW55IHJhdC1yZXBvcnQueG1sIGZpbGUuICAtLT4KLQotPCEtLSBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3NhbXphIC0tPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQotICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLSAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAmbHQ7IS0tCi1ib2R5IHttYXJnaW4tdG9wOiAwcHg7Zm9udC1zaXplOiAwLjhlbTtiYWNrZ3JvdW5kLWNvbG9yOiAjRjlGN0VEO30KLQotaDEge2NvbG9yOnJlZDt9Ci1oMiB7Y29sb3I6Ymx1ZTt9Ci1oMyB7Y29sb3I6Z3JlZW47fQotaDQge2NvbG9yOm9yYW5nZTt9Ci0KLS8qIFRhYmxlIERlc2lnbiAqLwotCi10YWJsZSx0cix0ZCB7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDtib3JkZXI6MXB4IHNvbGlkICMwMDA7fQotY2FwdGlvbiB7Y29sb3I6Ymx1ZTt0ZXh0LWFsaWduOmxlZnQ7fQotLm5vdGVzLCAuYmluYXJpZXMsIC5hcmNoaXZlcywgLnN0YW5kYXJkcyB7d2lkdGg6MjUlO30KLS5ub3RlcyB7YmFja2dyb3VuZDojRDdFREVFO30KLS5iaW5hcmllcyB7YmFja2dyb3VuZDojRDBGMkY0O30KLS5hcmNoaXZlcyB7YmFja2dyb3VuZDojQUJFN0U5O30KLS5zdGFuZGFyZHMge2JhY2tncm91bmQ6I0EwRjBGNDt9Ci0ubGljZW5jZWQsIC5nZW5lcmF0ZWQge3dpZHRoOjUwJTt9Ci0ubGljZW5jZWQge2JhY2tncm91bmQ6I0M2RUJERDt9Ci0uZ2VuZXJhdGVkIHtiYWNrZ3JvdW5kOiNBQkU5RDI7fQotLmphdmFfbm90ZSB7YmFja2dyb3VuZDojRDZFQkM2O30KLS5nZW5lcmF0ZWRfbm90ZSB7YmFja2dyb3VuZDojQzlFN0E5O30KLS51bmtub3duIHt3aWR0aDoxMDAlO2JhY2tncm91bmQ6I0U5MjAyMDt9Ci0udW5rbm93bi16ZXJvIHtjb2xvcjojMDBDQzAwO30KLS5jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjAgYXV0bzt9Ci0tLSZndDsKLSAgICAgPC9zdHlsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhdGVkIi8+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icmF0LXJlcG9ydCI+Ci0KLSAgPGgxPlJhdCBSZXBvcnQ8L2gxPgotICA8cD5UaGlzIEhUTUwgdmVyc2lvbiAoeWVzLCBpdCBpcyEpIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBSQVQgeG1sIHJlcG9ydHMgdXNpbmcgU2F4b245Qi4gQWxsIHRoZSBvdXRwdXRzIHJlcXVpcmVkIGFyZSBkaXNwbGF5ZWQgYmVsb3csIHNpbWlsYXIgdG8gdGhlIC50eHQgdmVyc2lvbi4KLSAgICAgICAgICAgVGhpcyBpcyBvYnZpb3VzbHkgYSB3b3JrIGluIHByb2dyZXNzOyBhbmQgYSBwcmV0dGllciwgZWFzaWVyIHRvIHJlYWQgYW5kIG1hbmFnZSB2ZXJzaW9uIHdpbGwgYmUgYXZhaWxhYmxlIHNvb248L3A+Ci08ZGl2IGNsYXNzPSJjZW50ZXIiPgotPHRhYmxlIGlkPSJyYXQtcmVwb3J0cyBzdW1tYXJ5IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iQSBzbmFwc2hvdCBzdW1tYXJ5IG9mIHRoaXMgcmF0IHJlcG9ydCI+Ci08Y2FwdGlvbj4KLVRhYmxlIDE6IEEgc25hcHNob3Qgc3VtbWFyeSBvZiB0aGlzIHJhdCByZXBvcnQuCi08L2NhcHRpb24+Ci0gIDx0cj4KLSAgICA8dGQgY29sc3Bhbj0iMSIgY2xhc3M9Im5vdGVzIj5Ob3RlczogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KGRlc2NlbmRhbnQ6OnR5cGVbYXR0cmlidXRlOjpuYW1lPSZxdW90O25vdGljZSZxdW90O10pIi8+PC90ZD4KLSAgICA8dGQgY29sc3Bhbj0iMSIgY2xhc3M9ImJpbmFyaWVzIj5CaW5hcmllczogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KGRlc2NlbmRhbnQ6OnR5cGVbYXR0cmlidXRlOjpuYW1lPSZxdW90O2JpbmFyeSZxdW90O10pIi8+PC90ZD4KLSAgICA8dGQgY29sc3Bhbj0iMSIgY2xhc3M9ImFyY2hpdmVzIj5BcmNoaXZlczogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KGRlc2NlbmRhbnQ6OnR5cGVbYXR0cmlidXRlOjpuYW1lPSZxdW90O2FyY2hpdmUmcXVvdDtdKSIvPjwvdGQ+Ci0gICAgPHRkIGNvbHNwYW49IjEiIGNsYXNzPSJzdGFuZGFyZHMiPlN0YW5kYXJkczogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KGRlc2NlbmRhbnQ6OnR5cGVbYXR0cmlidXRlOjpuYW1lPSZxdW90O3N0YW5kYXJkJnF1b3Q7XSkiLz48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJsaWNlbmNlZCI+QXBhY2hlIExpY2Vuc2VkOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoZGVzY2VuZGFudDo6aGVhZGVyLXR5cGVbYXR0cmlidXRlOjpuYW1lPSZxdW90O0FMICAgJnF1b3Q7XSkiLz48L3RkPgotICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iZ2VuZXJhdGVkIj5HZW5lcmF0ZWQgRG9jdW1lbnRzOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoZGVzY2VuZGFudDo6aGVhZGVyLXR5cGVbYXR0cmlidXRlOjpuYW1lPSZxdW90O0dFTiAgJnF1b3Q7XSkiLz48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJqYXZhX25vdGUiPk5vdGU6IEphdmFEb2NzIGFyZSBnZW5lcmF0ZWQgYW5kIHNvIGxpY2Vuc2UgaGVhZGVyIGlzIG9wdGlvbmFsPC90ZD4KLSAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImdlbmVyYXRlZF9ub3RlIj5Ob3RlOiBHZW5lcmF0ZWQgZmlsZXMgZG8gbm90IHJlcXVpcmUgbGljZW5zZSBoZWFkZXJzPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotPHhzbDpjaG9vc2U+Ci0gIDx4c2w6d2hlbiB0ZXN0PSJjb3VudChkZXNjZW5kYW50OjpoZWFkZXItdHlwZVthdHRyaWJ1dGU6Om5hbWU9JnF1b3Q7Pz8/Pz8mcXVvdDtdKSAmZ3Q7IDAiPgotICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0idW5rbm93biI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KGRlc2NlbmRhbnQ6OmhlYWRlci10eXBlW2F0dHJpYnV0ZTo6bmFtZT0mcXVvdDs/Pz8/PyZxdW90O10pIi8+IFVua25vd24gTGljZW5zZXMgLSBvciBmaWxlcyB3aXRob3V0IGEgbGljZW5zZS48L3RkPgotICA8L3hzbDp3aGVuPgotICA8eHNsOm90aGVyd2lzZT4KLSAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9InVua25vd24temVybyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KGRlc2NlbmRhbnQ6OmhlYWRlci10eXBlW2F0dHJpYnV0ZTo6bmFtZT0mcXVvdDs/Pz8/PyZxdW90O10pIi8+IFVua25vd24gTGljZW5zZXMgLSBvciBmaWxlcyB3aXRob3V0IGEgbGljZW5zZS48L3RkPgotICA8L3hzbDpvdGhlcndpc2U+Ci08L3hzbDpjaG9vc2U+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08aHIvPgotICA8aDM+VW5hcHByb3ZlZCBMaWNlbnNlczo8L2gzPgotCi0gIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJkZXNjZW5kYW50OjpyZXNvdXJjZVtsaWNlbnNlLWFwcHJvdmFsL0BuYW1lPSZxdW90O2ZhbHNlJnF1b3Q7XSI+Ci0gIDx4c2w6dGV4dD4gIDwveHNsOnRleHQ+Ci0gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjxici8+Ci0gIDx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDpmb3ItZWFjaD4KLTxoci8+Ci0KLTxoMz5BcmNoaXZlczo8L2gzPgotCi08eHNsOmZvci1lYWNoIHNlbGVjdD0iZGVzY2VuZGFudDo6cmVzb3VyY2VbdHlwZS9AbmFtZT0mcXVvdDthcmNoaXZlJnF1b3Q7XSI+Ci0gKyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSA8YnIvPgotIDwveHNsOmZvci1lYWNoPgotIDxoci8+Ci0KLSA8cD4KLSAgIEZpbGVzIHdpdGggQXBhY2hlIExpY2Vuc2UgaGVhZGVycyB3aWxsIGJlIG1hcmtlZCBBTDxici8+Ci0gICBCaW5hcnkgZmlsZXMgKHdoaWNoIGRvIG5vdCByZXF1aXJlIEFMIGhlYWRlcnMpIHdpbGwgYmUgbWFya2VkIEI8YnIvPgotICBDb21wcmVzc2VkIGFyY2hpdmVzIHdpbGwgYmUgbWFya2VkIEE8YnIvPgotICBOb3RpY2VzLCBsaWNlbnNlcyBldGMgd2lsbCBiZSBtYXJrZWQgTjxici8+Ci0gIDwvcD4KLQotIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJkZXNjZW5kYW50OjpyZXNvdXJjZSI+Ci0gIDx4c2w6Y2hvb3NlPgotICAgPHhzbDp3aGVuIHRlc3Q9ImxpY2Vuc2UtYXBwcm92YWwvQG5hbWU9JnF1b3Q7ZmFsc2UmcXVvdDsiPiE8L3hzbDp3aGVuPgotICAgPHhzbDpvdGhlcndpc2U+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PjwveHNsOm90aGVyd2lzZT4KLSA8L3hzbDpjaG9vc2U+Ci0gPHhzbDpjaG9vc2U+Ci0gICA8eHNsOndoZW4gdGVzdD0idHlwZS9AbmFtZT0mcXVvdDtub3RpY2UmcXVvdDsiPk4gICA8L3hzbDp3aGVuPgotICAgPHhzbDp3aGVuIHRlc3Q9InR5cGUvQG5hbWU9JnF1b3Q7YXJjaGl2ZSZxdW90OyI+QSAgIDwveHNsOndoZW4+Ci0gICA8eHNsOndoZW4gdGVzdD0idHlwZS9AbmFtZT0mcXVvdDtiaW5hcnkmcXVvdDsiPkIgICA8L3hzbDp3aGVuPgotICAgPHhzbDp3aGVuIHRlc3Q9InR5cGUvQG5hbWU9JnF1b3Q7c3RhbmRhcmQmcXVvdDsiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJoZWFkZXItdHlwZS9AbmFtZSIvPjwveHNsOndoZW4+Ci0gICA8eHNsOm90aGVyd2lzZT4hISEhITwveHNsOm90aGVyd2lzZT4KLSA8L3hzbDpjaG9vc2U+Ci0gPHhzbDp0ZXh0PiAgICAgIDwveHNsOnRleHQ+Ci0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PGJyLz4KLSA8eHNsOnRleHQ+Ci0gPC94c2w6dGV4dD4KLSA8L3hzbDpmb3ItZWFjaD4KLSA8aHIvPgotCi0gPGgzPlByaW50aW5nIGhlYWRlcnMgZm9yIGZpbGVzIHdpdGhvdXQgQUwgaGVhZGVyLi4uPC9oMz4KLQotIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJkZXNjZW5kYW50OjpyZXNvdXJjZVtoZWFkZXItdHlwZS9AbmFtZT0mcXVvdDs/Pz8/PyZxdW90O10iPgotCi0gICA8aDQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oND4KLSAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImhlYWRlci1zYW1wbGUiLz4KLSAgPGhyLz4KLTwveHNsOmZvci1lYWNoPgotPGJyLz4KLQotIDwhLS0gPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNvdXJjZSIvPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaGVhZGVyLXNhbXBsZSIvPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaGVhZGVyLXR5cGUiLz4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImxpY2Vuc2UtZmFtaWx5Ii8+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJsaWNlbnNlLWFwcHJvdmFsIi8+Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0eXBlIi8+IC0tPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icmVzb3VyY2UiPgotICA8ZGl2PgotICAgIDxoMz5SZXNvdXJjZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L2Rpdj4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJoZWFkZXItc2FtcGxlIj4KLSAgPHhzbDppZiB0ZXN0PSJub3JtYWxpemUtc3BhY2UoLikgIT0gJyciPgotICA8aDQ+Rmlyc3QgZmV3IGxpbmVzIG9mIG5vbi1jb21wbGlhbnQgZmlsZTwvaDQ+Ci0gICAgPHA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgotICAgIDwvcD4KLSAgICA8L3hzbDppZj4KLSAgICA8aDQ+T3RoZXIgSW5mbzo8L2g0PgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImhlYWRlci10eXBlIj4KLSAgSGVhZGVyIFR5cGU6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICA8YnIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpY2Vuc2UtZmFtaWx5Ij4KLSAgTGljZW5zZSBGYW1pbHk6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICA8YnIvPgotPC94c2w6dGVtcGxhdGU+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpY2Vuc2UtYXBwcm92YWwiPgotICBMaWNlbnNlIEFwcHJvdmFsOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgPGJyLz4KLTwveHNsOnRlbXBsYXRlPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJ0eXBlIj4KLSAgVHlwZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gIDxici8+Ci08L3hzbDp0ZW1wbGF0ZT4KLQotPHhzbDp0ZW1wbGF0ZSBuYW1lPSJnZW5lcmF0ZWQiPgotPC94c2w6dGVtcGxhdGU+Ci08L3hzbDp0cmFuc2Zvcm0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JhZGxlL3dyYXBwZXIuZ3JhZGxlIGIvZ3JhZGxlL3dyYXBwZXIuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTdhOGY4Li4wMDAwMDAwCi0tLSBhL2dyYWRsZS93cmFwcGVyLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWRlZmF1bHRUYXNrcyAnd3JhcHBlcicKLQotdGFzayB3cmFwcGVyKHR5cGU6IFdyYXBwZXIpIHsKLSAgICBkZXNjcmlwdGlvbiA9ICJJbml0aWFsaXplIHRoZSBncmFkbGUgd3JhcHBlci4gT3ZlcndyaXRlcyBleGlzdGluZyB3cmFwcGVyIGZpbGVzLiIKLSAgICBqYXJGaWxlID0gIiR7cHJvamVjdC5wcm9qZWN0RGlyfS8uZ3JhZGxlLXdyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIgotICAgIAotICAgIGdyYWRsZVZlcnNpb24gPSBwcm9qZWN0LmdyYWRsZVZlcnNpb24KLSAgICAvLyB1Z2guLi4gbXVzdCBtYW51YWxseSBzZXQgaW4gZ2VuZXJhdGVkIGdyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKLSAgICAvLyBkaXN0cmlidXRpb25TaGEyNTZTdW0gPSBwcm9qZWN0LmdyYWRsZURpc3RyaWJ1dGlvblNoYTI1NlN1bQotICAgIAotICAgIGRvTGFzdCB7Ci0gICAgICBpZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgiZ3JhZGxlRGlzdHJpYnV0aW9uU2hhMjU2U3VtIikpIHsKLSAgICAgICAgRmlsZSB3cmFwcGVyUHJvcHMgPSBmaWxlKHByb3BlcnRpZXNGaWxlKQotICAgICAgICB3cmFwcGVyUHJvcHMuYXBwZW5kKCJkaXN0cmlidXRpb25TaGEyNTZTdW09JHtwcm9qZWN0LmdyYWRsZURpc3RyaWJ1dGlvblNoYTI1NlN1bX1cbiIpOwotICAgICAgfQotICAgIH0KLSAgICBkb0xhc3QgewotICAgICAgcHJpbnRsbiAiVGhlIGdyYWRsZSB3cmFwcGVyIGlzIG5vdyBpbml0aWFsaXplZC4iICsKLSAgICAgICAgICAgICJcblVzZSAuL2dyYWRsZXcgZm9yIHN1YnNlcXVlbnQgYnVpbGQgb3BlcmF0aW9ucy4iCi0gICAgfQotfQotCi1ncmFkbGUudGFza0dyYXBoLndoZW5SZWFkeSB7dGFza0dyYXBoIC0+Ci0gIGlmICghdGFza0dyYXBoLmhhc1Rhc2sod3JhcHBlcikpIHsKLSAgICBpZiAoR3JhZGxlVmVyc2lvbi5jdXJyZW50KCkgPCBHcmFkbGVWZXJzaW9uLnZlcnNpb24oZ3JhZGxlVmVyc2lvbikpIHsKLSAgICAgIHRocm93IG5ldyBHcmFkbGVFeGNlcHRpb24oJ1J1bm5pbmcgd2l0aCB1bnN1cHBvcnRlZCBHcmFkbGUgVmVyc2lvbiAoJyArIEdyYWRsZVZlcnNpb24uY3VycmVudCgpICsgJykuJyArCi0gICAgICAgICAgICAgICdcblVzZSBHcmFkbGUgV3JhcHBlciBvciB3aXRoIEdyYWRsZSB2ZXJzaW9uID49ICcgKyBncmFkbGVWZXJzaW9uICsKLSAgICAgICAgICAgICAgJ1xuUnVuIFwnZ3JhZGxlXCcgKGRlZmF1bHQgdGFzaykgdG8gaW5pdGlhbGl6ZSB0aGUgd3JhcHBlci4nKQotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9ncmFkbGV3IGIvZ3JhZGxldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYThhYzliOS4uMDAwMDAwMAotLS0gYS9ncmFkbGV3CisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IGJhc2gKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotIyMgIEdyYWRsZSBzdGFydCB1cCBzY3JpcHQgZm9yIFVOKlgKLSMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBBdHRlbXB0IHRvIHNldCBBUFBfSE9NRQotIyBSZXNvbHZlIGxpbmtzOiAkMCBtYXkgYmUgYSBsaW5rCi1QUkc9IiQwIgotIyBOZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzLgotd2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCi0gICAgbHM9YGxzIC1sZCAiJFBSRyJgCi0gICAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAotICAgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICAgIFBSRz0iJGxpbmsiCi0gICAgZWxzZQotICAgICAgICBQUkc9YGRpcm5hbWUgIiRQUkciYCIvJGxpbmsiCi0gICAgZmkKLWRvbmUKLVNBVkVEPSJgcHdkYCIKLWNkICJgZGlybmFtZSBcIiRQUkdcImAvIiA+L2Rldi9udWxsCi1BUFBfSE9NRT0iYHB3ZCAtUGAiCi1jZCAiJFNBVkVEIiA+L2Rldi9udWxsCi0KLUFQUF9OQU1FPSJHcmFkbGUiCi1BUFBfQkFTRV9OQU1FPWBiYXNlbmFtZSAiJDAiYAotCi0jIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0LgotREVGQVVMVF9KVk1fT1BUUz0iIgotCi0jIFVzZSB0aGUgbWF4aW11bSBhdmFpbGFibGUsIG9yIHNldCBNQVhfRkQgIT0gLTEgdG8gdXNlIHRoYXQgdmFsdWUuCi1NQVhfRkQ9Im1heGltdW0iCi0KLXdhcm4gKCApIHsKLSAgICBlY2hvICIkKiIKLX0KLQotZGllICggKSB7Ci0gICAgZWNobwotICAgIGVjaG8gIiQqIgotICAgIGVjaG8KLSAgICBleGl0IDEKLX0KLQotIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KLWN5Z3dpbj1mYWxzZQotbXN5cz1mYWxzZQotZGFyd2luPWZhbHNlCi1ub25zdG9wPWZhbHNlCi1jYXNlICJgdW5hbWVgIiBpbgotICBDWUdXSU4qICkKLSAgICBjeWd3aW49dHJ1ZQotICAgIDs7Ci0gIERhcndpbiogKQotICAgIGRhcndpbj10cnVlCi0gICAgOzsKLSAgTUlOR1cqICkKLSAgICBtc3lzPXRydWUKLSAgICA7OwotICBOT05TVE9QKiApCi0gICAgbm9uc3RvcD10cnVlCi0gICAgOzsKLWVzYWMKLQotQ0xBU1NQQVRIPSRBUFBfSE9NRS8uZ3JhZGxlLXdyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCi0KLSMgRGV0ZXJtaW5lIHRoZSBKYXZhIGNvbW1hbmQgdG8gdXNlIHRvIHN0YXJ0IHRoZSBKVk0uCi1pZiBbIC1uICIkSkFWQV9IT01FIiBdIDsgdGhlbgotICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuCi0gICAgICAgICMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXMKLSAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIKLSAgICBlbHNlCi0gICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvYmluL2phdmEiCi0gICAgZmkKLSAgICBpZiBbICEgLXggIiRKQVZBQ01EIiBdIDsgdGhlbgotICAgICAgICBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAkSkFWQV9IT01FCi0KLVBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQotbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iCi0gICAgZmkKLWVsc2UKLSAgICBKQVZBQ01EPSJqYXZhIgotICAgIHdoaWNoIGphdmEgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguCi0KLVBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQotbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iCi1maQotCi0jIEluY3JlYXNlIHRoZSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvcnMgaWYgd2UgY2FuLgotaWYgWyAiJGN5Z3dpbiIgPSAiZmFsc2UiIC1hICIkZGFyd2luIiA9ICJmYWxzZSIgLWEgIiRub25zdG9wIiA9ICJmYWxzZSIgXSA7IHRoZW4KLSAgICBNQVhfRkRfTElNSVQ9YHVsaW1pdCAtSCAtbmAKLSAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCi0gICAgICAgIGlmIFsgIiRNQVhfRkQiID0gIm1heGltdW0iIC1vICIkTUFYX0ZEIiA9ICJtYXgiIF0gOyB0aGVuCi0gICAgICAgICAgICBNQVhfRkQ9IiRNQVhfRkRfTElNSVQiCi0gICAgICAgIGZpCi0gICAgICAgIHVsaW1pdCAtbiAkTUFYX0ZECi0gICAgICAgIGlmIFsgJD8gLW5lIDAgXSA7IHRoZW4KLSAgICAgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBzZXQgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkQiCi0gICAgICAgIGZpCi0gICAgZWxzZQotICAgICAgICB3YXJuICJDb3VsZCBub3QgcXVlcnkgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkRfTElNSVQiCi0gICAgZmkKLWZpCi0KLSMgRm9yIERhcndpbiwgYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSBob3cgdGhlIGFwcGxpY2F0aW9uIGFwcGVhcnMgaW4gdGhlIGRvY2sKLWlmICRkYXJ3aW47IHRoZW4KLSAgICBHUkFETEVfT1BUUz0iJEdSQURMRV9PUFRTIFwiLVhkb2NrOm5hbWU9JEFQUF9OQU1FXCIgXCItWGRvY2s6aWNvbj0kQVBQX0hPTUUvbWVkaWEvZ3JhZGxlLmljbnNcIiIKLWZpCi0KLSMgRm9yIEN5Z3dpbiwgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKLWlmICRjeWd3aW4gOyB0aGVuCi0gICAgQVBQX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRBUFBfSE9NRSJgCi0gICAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQ0xBU1NQQVRIImAKLSAgICBKQVZBQ01EPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFDTUQiYAotCi0gICAgIyBXZSBidWlsZCB0aGUgcGF0dGVybiBmb3IgYXJndW1lbnRzIHRvIGJlIGNvbnZlcnRlZCB2aWEgY3lncGF0aAotICAgIFJPT1RESVJTUkFXPWBmaW5kIC1MIC8gLW1heGRlcHRoIDEgLW1pbmRlcHRoIDEgLXR5cGUgZCAyPi9kZXYvbnVsbGAKLSAgICBTRVA9IiIKLSAgICBmb3IgZGlyIGluICRST09URElSU1JBVyA7IGRvCi0gICAgICAgIFJPT1RESVJTPSIkUk9PVERJUlMkU0VQJGRpciIKLSAgICAgICAgU0VQPSJ8IgotICAgIGRvbmUKLSAgICBPVVJDWUdQQVRURVJOPSIoXigkUk9PVERJUlMpKSIKLSAgICAjIEFkZCBhIHVzZXItZGVmaW5lZCBwYXR0ZXJuIHRvIHRoZSBjeWdwYXRoIGFyZ3VtZW50cwotICAgIGlmIFsgIiRHUkFETEVfQ1lHUEFUVEVSTiIgIT0gIiIgXSA7IHRoZW4KLSAgICAgICAgT1VSQ1lHUEFUVEVSTj0iJE9VUkNZR1BBVFRFUk58KCRHUkFETEVfQ1lHUEFUVEVSTikiCi0gICAgZmkKLSAgICAjIE5vdyBjb252ZXJ0IHRoZSBhcmd1bWVudHMgLSBrbHVkZ2UgdG8gbGltaXQgb3Vyc2VsdmVzIHRvIC9iaW4vc2gKLSAgICBpPTAKLSAgICBmb3IgYXJnIGluICIkQCIgOyBkbwotICAgICAgICBDSEVDSz1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIiRPVVJDWUdQQVRURVJOIiAtYAotICAgICAgICBDSEVDSzI9YGVjaG8gIiRhcmcifGVncmVwIC1jICJeLSJgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIERldGVybWluZSBpZiBhbiBvcHRpb24KLQotICAgICAgICBpZiBbICRDSEVDSyAtbmUgMCBdICYmIFsgJENIRUNLMiAtZXEgMCBdIDsgdGhlbiAgICAgICAgICAgICAgICAgICAgIyMjIEFkZGVkIGEgY29uZGl0aW9uCi0gICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9YGN5Z3BhdGggLS1wYXRoIC0taWdub3JlIC0tbWl4ZWQgIiRhcmciYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9IlwiJGFyZ1wiIgotICAgICAgICBmaQotICAgICAgICBpPSQoKGkrMSkpCi0gICAgZG9uZQotICAgIGNhc2UgJGkgaW4KLSAgICAgICAgKDApIHNldCAtLSA7OwotICAgICAgICAoMSkgc2V0IC0tICIkYXJnczAiIDs7Ci0gICAgICAgICgyKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgOzsKLSAgICAgICAgKDMpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiA7OwotICAgICAgICAoNCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiIDs7Ci0gICAgICAgICg1KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgOzsKLSAgICAgICAgKDYpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiA7OwotICAgICAgICAoNykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiIDs7Ci0gICAgICAgICg4KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgOzsKLSAgICAgICAgKDkpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiAiJGFyZ3M4IiA7OwotICAgIGVzYWMKLWZpCi0KLSMgU3BsaXQgdXAgdGhlIEpWTV9PUFRTIEFuZCBHUkFETEVfT1BUUyB2YWx1ZXMgaW50byBhbiBhcnJheSwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKLWZ1bmN0aW9uIHNwbGl0SnZtT3B0cygpIHsKLSAgICBKVk1fT1BUUz0oIiRAIikKLX0KLWV2YWwgc3BsaXRKdm1PcHRzICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTCi1KVk1fT1BUU1skeyNKVk1fT1BUU1sqXX1dPSItRG9yZy5ncmFkbGUuYXBwbmFtZT0kQVBQX0JBU0VfTkFNRSIKLQotZXhlYyAiJEpBVkFDTUQiICIke0pWTV9PUFRTW0BdfSIgLWNsYXNzcGF0aCAiJENMQVNTUEFUSCIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICIkQCIKZGlmZiAtLWdpdCBhL2dyYWRsZXcuYmF0IGIvZ3JhZGxldy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTE1NjkuLjAwMDAwMDAKLS0tIGEvZ3JhZGxldy5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1AaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZg0KLUByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1AcmVtDQotQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzDQotQHJlbQ0KLUByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1AcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwNCi1pZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbA0KLQ0KLXNldCBESVJOQU1FPSV+ZHAwDQotaWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lg0KLXNldCBBUFBfQkFTRV9OQU1FPSV+bjANCi1zZXQgQVBQX0hPTUU9JURJUk5BTUUlDQotDQotQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4NCi1zZXQgREVGQVVMVF9KVk1fT1BUUz0NCi0NCi1AcmVtIEZpbmQgamF2YS5leGUNCi1pZiBkZWZpbmVkIEpBVkFfSE9NRSBnb3RvIGZpbmRKYXZhRnJvbUphdmFIb21lDQotDQotc2V0IEpBVkFfRVhFPWphdmEuZXhlDQotJUpBVkFfRVhFJSAtdmVyc2lvbiA+TlVMIDI+JjENCi1pZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0DQotDQotZWNoby4NCi1lY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILg0KLWVjaG8uDQotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUNCi1lY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQotDQotZ290byBmYWlsDQotDQotOmZpbmRKYXZhRnJvbUphdmFIb21lDQotc2V0IEpBVkFfSE9NRT0lSkFWQV9IT01FOiI9JQ0KLXNldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUNCi0NCi1pZiBleGlzdCAiJUpBVkFfRVhFJSIgZ290byBpbml0DQotDQotZWNoby4NCi1lY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAlSkFWQV9IT01FJQ0KLWVjaG8uDQotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUNCi1lY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQotDQotZ290byBmYWlsDQotDQotOmluaXQNCi1AcmVtIEdldCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBoYW5kbGluZyBXaW5kb3dzIHZhcmlhbnRzDQotDQotaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MNCi1pZiAiJUBldmFsWzIrMl0iID09ICI0IiBnb3RvIDROVF9hcmdzDQotDQotOndpbjl4TUVfYXJncw0KLUByZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuDQotc2V0IENNRF9MSU5FX0FSR1M9DQotc2V0IF9TS0lQPTINCi0NCi06d2luOXhNRV9hcmdzX3NsdXJwDQotaWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUNCi0NCi1zZXQgQ01EX0xJTkVfQVJHUz0lKg0KLWdvdG8gZXhlY3V0ZQ0KLQ0KLTo0TlRfYXJncw0KLUByZW0gR2V0IGFyZ3VtZW50cyBmcm9tIHRoZSA0TlQgU2hlbGwgZnJvbSBKUCBTb2Z0d2FyZQ0KLXNldCBDTURfTElORV9BUkdTPSUkDQotDQotOmV4ZWN1dGUNCi1AcmVtIFNldHVwIHRoZSBjb21tYW5kIGxpbmUNCi0NCi1zZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcLmdyYWRsZS13cmFwcGVyXGdyYWRsZS13cmFwcGVyLmphcg0KLQ0KLUByZW0gRXhlY3V0ZSBHcmFkbGUNCi0iJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUNCi0NCi06ZW5kDQotQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsDQotaWYgIiVFUlJPUkxFVkVMJSI9PSIwIiBnb3RvIG1haW5FbmQNCi0NCi06ZmFpbA0KLXJlbSBTZXQgdmFyaWFibGUgR1JBRExFX0VYSVRfQ09OU09MRSBpZiB5b3UgbmVlZCB0aGUgX3NjcmlwdF8gcmV0dXJuIGNvZGUgaW5zdGVhZCBvZg0KLXJlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQ0KLWlmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxDQotZXhpdCAvYiAxDQotDQotOm1haW5FbmQNCi1pZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbA0KLQ0KLTpvbWVnYQ0KZGlmZiAtLWdpdCBhL2pxYXNzaXN0YW50L3N0cnVjdHVyYWwtcnVsZXMueG1sIGIvanFhc3Npc3RhbnQvc3RydWN0dXJhbC1ydWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwOGY3MwotLS0gL2Rldi9udWxsCisrKyBiL2pxYXNzaXN0YW50L3N0cnVjdHVyYWwtcnVsZXMueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPGpxYTpqcWFzc2lzdGFudC1ydWxlcyB4bWxuczpqcWE9Imh0dHA6Ly93d3cuYnVzY2htYWlzLmNvbS9qcWFzc2lzdGFudC9jb3JlL2FuYWx5c2lzL3J1bGVzL3NjaGVtYS92MS4wIj4KKworICA8Y29uc3RyYWludCBpZD0ic3RydWN0dXJhbC1ydWxlczpkZXBlbmRlbmN5LWdyb3VwaWQtbWF0Y2hlcy1hcnRpZmFjdC1ncm91cGlkIj4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGdyb3VwSWQgb2YgZXZlcnkgRWRnZW50IGRlcGVuZGVuY3kgbXVzdCBtYXRjaCB0aGUgZ3JvdXBJZCBvZiB0aGUgYXJ0aWZhY3QuPC9kZXNjcmlwdGlvbj4KKyAgICA8Y3lwaGVyPjwhW0NEQVRBWworICAgICAgICAgICAgTUFUQ0gKKyAgICAgICAgICAgICAgICAobTpNYXZlbjpQb206WG1sKS1bREVTQ1JJQkVTXS0+KGE6TWF2ZW46QXJ0aWZhY3QpCisgICAgICAgICAgICBXSEVSRQorICAgICAgICAgICAgICAgIGEuZ3JvdXAgPSAib3JnLmFwYWNoZS5lZGdlbnQuamF2YTciCisgICAgICAgICAgICBSRVRVUk4gbQorICAgICAgICBdXT48L2N5cGhlcj4KKyAgPC9jb25zdHJhaW50PgorCisgIDxncm91cCBpZD0iZGVmYXVsdCI+CisgICAgPGluY2x1ZGVDb25zdHJhaW50IHJlZklkPSJzdHJ1Y3R1cmFsLXJ1bGVzOmRlcGVuZGVuY3ktZ3JvdXBpZC1tYXRjaGVzLWFydGlmYWN0LWdyb3VwaWQiIC8+CisgIDwvZ3JvdXA+CisKKzwvanFhOmpxYXNzaXN0YW50LXJ1bGVzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtY29kZWMtMS4xMC5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWNvZGVjLTEuMTAuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI1MjQ4Li4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtY29kZWMtMS4xMC5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWNvZGVjLTEuMTAuTk9USUNFIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1jb2RlYy0xLjEwLk5PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjMDk4Yy4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWNvZGVjLTEuMTAuTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQXBhY2hlIENvbW1vbnMgQ29kZWMNCi1Db3B5cmlnaHQgMjAwMi0yMDE0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLXNyYy90ZXN0L29yZy9hcGFjaGUvY29tbW9ucy9jb2RlYy9sYW5ndWFnZS9Eb3VibGVNZXRhcGhvbmVUZXN0LmphdmENCi1jb250YWlucyB0ZXN0IGRhdGEgZnJvbSBodHRwOi8vYXNwZWxsLm5ldC90ZXN0L29yaWcvYmF0Y2gwLnRhYi4NCi1Db3B5cmlnaHQgKEMpIDIwMDIgS2V2aW4gQXRraW5zb24gKGtldmluYUBnbnUub3JnKQ0KLQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGUgY29udGVudCBvZiBwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZS5ibSBoYXMgYmVlbiB0cmFuc2xhdGVkDQotZnJvbSB0aGUgb3JpZ2luYWwgcGhwIHNvdXJjZSBjb2RlIGF2YWlsYWJsZSBhdCBodHRwOi8vc3RldmVtb3JzZS5vcmcvcGhvbmV0aWNpbmZvLmh0bQ0KLXdpdGggcGVybWlzc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBhdXRob3JzLg0KLU9yaWdpbmFsIHNvdXJjZSBjb3B5cmlnaHQ6DQotQ29weXJpZ2h0IChjKSAyMDA4IEFsZXhhbmRlciBCZWlkZXIgJiBTdGVwaGVuIFAuIE1vcnNlLg0KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtY29kZWMtMS45LkFMLTIuMCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtY29kZWMtMS45LkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNTI0OC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWNvZGVjLTEuOS5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWNvZGVjLTEuOS5OT1RJQ0UgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWNvZGVjLTEuOS5OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2Y3OGEuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1jb2RlYy0xLjkuTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgQ29tbW9ucyBDb2RlYw0KLUNvcHlyaWdodCAyMDAyLTIwMTMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdA0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jb21tb25zL2NvZGVjL2xhbmd1YWdlL0RvdWJsZU1ldGFwaG9uZVRlc3QuamF2YQ0KLWNvbnRhaW5zIHRlc3QgZGF0YSBmcm9tIGh0dHA6Ly9hc3BlbGwubmV0L3Rlc3Qvb3JpZy9iYXRjaDAudGFiLg0KLUNvcHlyaWdodCAoQykgMjAwMiBLZXZpbiBBdGtpbnNvbiAoa2V2aW5hQGdudS5vcmcpDQpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1sYW5nMy0zLjQuTk9USUNFIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1sYW5nMy0zLjQuTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTIwMjNhLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbGFuZzMtMy40Lk5PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotQXBhY2hlIENvbW1vbnMgTGFuZwotQ29weXJpZ2h0IDIwMDEtMjAxNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGZyb20gdGhlIFNwcmluZyBGcmFtZXdvcmssCi11bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4wIChzZWU6IFN0cmluZ1V0aWxzLmNvbnRhaW5zV2hpdGVzcGFjZSgpKQpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1sb2dnaW5nLTEuMi5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWxvZ2dpbmctMS4yLkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWxvZ2dpbmctMS4yLkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1sb2dnaW5nLTEuMi5OT1RJQ0UgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWxvZ2dpbmctMS4yLk5PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2YmQwMy4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLWxvZ2dpbmctMS4yLk5PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQXBhY2hlIENvbW1vbnMgTG9nZ2luZwotQ29weXJpZ2h0IDIwMDMtMjAxNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1tYXRoMy0zLjQuMS5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLW1hdGgzLTMuNC4xLkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3YjQ5YS4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLW1hdGgzLTMuNC4xLkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi1BcGFjaGUgQ29tbW9ucyBNYXRoIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgY29kZSBwcm92aWRlZCB0byB0aGUgQVNGIHVuZGVyIHRoZQotQXBhY2hlIExpY2Vuc2UgMi4wOgotCi0gLSBUaGUgaW52ZXJzZSBlcnJvciBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgRXJmIGNsYXNzIGlzIGJhc2VkIG9uIENVREEKLSAgIGNvZGUgZGV2ZWxvcGVkIGJ5IE1pa2UgR2lsZXMsIE94Zm9yZC1NYW4gSW5zdGl0dXRlIG9mIFF1YW50aXRhdGl2ZSBGaW5hbmNlLAotICAgYW5kIHB1Ymxpc2hlZCBpbiBHUFUgQ29tcHV0aW5nIEdlbXMsIHZvbHVtZSAyLCAyMDEwIChncmFudCByZWNlaXZlZCBvbgotICAgTWFyY2ggMjN0aCAyMDEzKQotIC0gVGhlIExpbmVhckNvbnN0cmFpbnQsIExpbmVhck9iamVjdGl2ZUZ1bmN0aW9uLCBMaW5lYXJPcHRpbWl6ZXIsCi0gICBSZWxhdGlvblNoaXAsIFNpbXBsZXhTb2x2ZXIgYW5kIFNpbXBsZXhUYWJsZWF1IGNsYXNzZXMgaW4gcGFja2FnZQotICAgb3JnLmFwYWNoZS5jb21tb25zLm1hdGgzLm9wdGltaXphdGlvbi5saW5lYXIgaW5jbHVkZSBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLSAgIEJlbmphbWluIE1jQ2FubiAoaHR0cDovL3d3dy5iZW5tY2Nhbm4uY29tKSBhbmQgZGlzdHJpYnV0ZWQgd2l0aAotICAgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuIChncmFudCByZWNlaXZlZCBvbgotICAgTWFyY2ggMTZ0aCAyMDA5KQotIC0gVGhlIGNsYXNzICJvcmcuYXBhY2hlLmNvbW1vbnMubWF0aDMuZXhjZXB0aW9uLnV0aWwuTG9jYWxpemVkRm9ybWF0c1Rlc3QiIHdoaWNoCi0gICBpcyBhbiBhZGFwdGVkIHZlcnNpb24gb2YgIk9yZWtpdE1lc3NhZ2VzVGVzdCIgdGVzdCBjbGFzcyBmb3IgdGhlIE9yZWtpdCBsaWJyYXJ5Ci0gLSBUaGUgIm9yZy5hcGFjaGUuY29tbW9ucy5tYXRoMy5hbmFseXNpcy5pbnRlcnBvbGF0aW9uLkhlcm1pdGVJbnRlcnBvbGF0b3IiCi0gICBoYXMgYmVlbiBpbXBvcnRlZCBmcm9tIHRoZSBPcmVraXQgc3BhY2UgZmxpZ2h0IGR5bmFtaWNzIGxpYnJhcnkuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAKLQotCi1BUEFDSEUgQ09NTU9OUyBNQVRIIERFUklWQVRJVkUgV09SS1M6IAotCi1UaGUgQXBhY2hlIGNvbW1vbnMtbWF0aCBsaWJyYXJ5IGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMKLXdob3NlIGltcGxlbWVudGF0aW9uIGlzIGRlcml2ZWQgZnJvbSBvcmlnaW5hbCBzb3VyY2VzIHdyaXR0ZW4KLWluIEMgb3IgRm9ydHJhbi4gIExpY2Vuc2UgdGVybXMgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZXMKLWFyZSByZXByb2R1Y2VkIGJlbG93LgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Gb3IgdGhlIGxtZGVyLCBsbXBhciBhbmQgcXJzb2x2IEZvcnRyYW4gcm91dGluZSBmcm9tIG1pbnBhY2sgYW5kIHRyYW5zbGF0ZWQgaW4KLXRoZSBMZXZlbmJlcmdNYXJxdWFyZHRPcHRpbWl6ZXIgY2xhc3MgaW4gcGFja2FnZQotb3JnLmFwYWNoZS5jb21tb25zLm1hdGgzLm9wdGltaXphdGlvbi5nZW5lcmFsIAotT3JpZ2luYWwgc291cmNlIGNvcHlyaWdodCBhbmQgbGljZW5zZSBzdGF0ZW1lbnQ6Ci0KLU1pbnBhY2sgQ29weXJpZ2h0IE5vdGljZSAoMTk5OSkgVW5pdmVyc2l0eSBvZiBDaGljYWdvLiAgQWxsIHJpZ2h0cyByZXNlcnZlZAotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi13aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQotZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQotY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLWRpc2NsYWltZXIuCi0KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLWNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi1kaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKLXByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUKLXJlZGlzdHJpYnV0aW9uLCBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nCi1hY2tub3dsZWRnbWVudDoKLQotICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gICBVbml2ZXJzaXR5IG9mIENoaWNhZ28sIGFzIE9wZXJhdG9yIG9mIEFyZ29ubmUgTmF0aW9uYWwKLSAgIExhYm9yYXRvcnkuCi0KLUFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlCi1pdHNlbGYsIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cwotbm9ybWFsbHkgYXBwZWFyLgotCi00LiBXQVJSQU5UWSBESVNDTEFJTUVSLiBUSEUgU09GVFdBUkUgSVMgU1VQUExJRUQgIkFTIElTIgotV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORC4gVEhFIENPUFlSSUdIVCBIT0xERVIsIFRIRQotVU5JVEVEIFNUQVRFUywgVEhFIFVOSVRFRCBTVEFURVMgREVQQVJUTUVOVCBPRiBFTkVSR1ksIEFORAotVEhFSVIgRU1QTE9ZRUVTOiAoMSkgRElTQ0xBSU0gQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIElNUExJRUQgV0FSUkFOVElFUwotT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUKLU9SIE5PTi1JTkZSSU5HRU1FTlQsICgyKSBETyBOT1QgQVNTVU1FIEFOWSBMRUdBTCBMSUFCSUxJVFkKLU9SIFJFU1BPTlNJQklMSVRZIEZPUiBUSEUgQUNDVVJBQ1ksIENPTVBMRVRFTkVTUywgT1IKLVVTRUZVTE5FU1MgT0YgVEhFIFNPRlRXQVJFLCAoMykgRE8gTk9UIFJFUFJFU0VOVCBUSEFUIFVTRSBPRgotVEhFIFNPRlRXQVJFIFdPVUxEIE5PVCBJTkZSSU5HRSBQUklWQVRFTFkgT1dORUQgUklHSFRTLCAoNCkKLURPIE5PVCBXQVJSQU5UIFRIQVQgVEhFIFNPRlRXQVJFIFdJTEwgRlVOQ1RJT04KLVVOSU5URVJSVVBURUQsIFRIQVQgSVQgSVMgRVJST1ItRlJFRSBPUiBUSEFUIEFOWSBFUlJPUlMgV0lMTAotQkUgQ09SUkVDVEVELgotCi01LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4gSU4gTk8gRVZFTlQgV0lMTCBUSEUgQ09QWVJJR0hUCi1IT0xERVIsIFRIRSBVTklURUQgU1RBVEVTLCBUSEUgVU5JVEVEIFNUQVRFUyBERVBBUlRNRU5UIE9GCi1FTkVSR1ksIE9SIFRIRUlSIEVNUExPWUVFUzogQkUgTElBQkxFIEZPUiBBTlkgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBDT05TRVFVRU5USUFMLCBTUEVDSUFMIE9SIFBVTklUSVZFIERBTUFHRVMgT0YKLUFOWSBLSU5EIE9SIE5BVFVSRSwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GCi1QUk9GSVRTIE9SIExPU1MgT0YgREFUQSwgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUiwgV0hFVEhFUgotU1VDSCBMSUFCSUxJVFkgSVMgQVNTRVJURUQgT04gVEhFIEJBU0lTIE9GIENPTlRSQUNULCBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgU1RSSUNUIExJQUJJTElUWSksIE9SIE9USEVSV0lTRSwKLUVWRU4gSUYgQU5ZIE9GIFNBSUQgUEFSVElFUyBIQVMgQkVFTiBXQVJORUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIExPU1MgT1IgREFNQUdFUy4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ29weXJpZ2h0IGFuZCBsaWNlbnNlIHN0YXRlbWVudCBmb3IgdGhlIG9kZXggRm9ydHJhbiByb3V0aW5lIGRldmVsb3BlZCBieQotRS4gSGFpcmVyIGFuZCBHLiBXYW5uZXIgYW5kIHRyYW5zbGF0ZWQgaW4gR3JhZ2dCdWxpcnNjaFN0b2VySW50ZWdyYXRvciBjbGFzcwotaW4gcGFja2FnZSBvcmcuYXBhY2hlLmNvbW1vbnMubWF0aDMub2RlLm5vbnN0aWZmOgotCi0KLUNvcHlyaWdodCAoYykgMjAwNCwgRXJuc3QgSGFpcmVyCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgCi1tZXQ6Ci0KLS0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi1ub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLS0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi1ub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIAotZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgCi1JUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgCi1UTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgCi1QQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIAotQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCAKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiAKLVBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyAKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Db3B5cmlnaHQgYW5kIGxpY2Vuc2Ugc3RhdGVtZW50IGZvciB0aGUgb3JpZ2luYWwgTWVyc2VubmUgdHdpc3RlciBDCi1yb3V0aW5lcyB0cmFuc2xhdGVkIGluIE1lcnNlbm5lVHdpc3RlciBjbGFzcyBpbiBwYWNrYWdlIAotb3JnLmFwYWNoZS5jb21tb25zLm1hdGgzLnJhbmRvbToKLQotICAgQ29weXJpZ2h0IChDKSAxOTk3IC0gMjAwMiwgTWFrb3RvIE1hdHN1bW90byBhbmQgVGFrdWppIE5pc2hpbXVyYSwKLSAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAgIGFyZSBtZXQ6Ci0KLSAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotICAgICAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAotICAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCi0gICAgICAgIHBlcm1pc3Npb24uCi0KLSAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLSAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi0gICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBpbml0aWFsIGNvZGUgZm9yIHNodWZmbGluZyBhbiBhcnJheSAob3JpZ2luYWxseSBpbiBjbGFzcwotIm9yZy5hcGFjaGUuY29tbW9ucy5tYXRoMy5yYW5kb20uUmFuZG9tRGF0YUdlbmVyYXRvciIsIG5vdyByZXBsYWNlZCBieQotYSBtZXRob2QgaW4gY2xhc3MgIm9yZy5hcGFjaGUuY29tbW9ucy5tYXRoMy51dGlsLk1hdGhBcnJheXMiKSB3YXMKLWluc3BpcmVkIGZyb20gdGhlIGFsZ29yaXRobSBkZXNjcmlwdGlvbiBwcm92aWRlZCBpbgotIkFsZ29yaXRobXMiLCBieSBJYW4gQ3JhdyBhbmQgSm9obiBQdWxoYW0gKFVuaXZlcnNpdHkgb2YgQWJlcmRlZW4gMTk5OSkuCi1UaGUgdGV4dGJvb2sgKGNvbnRhaW5pbmcgYSBwcm9vZiB0aGF0IHRoZSBzaHVmZmxlIGlzIHVuaWZvcm1seSByYW5kb20pIGlzCi1hdmFpbGFibGUgaGVyZToKLSAgaHR0cDovL2NpdGVzZWVyeC5pc3QucHN1LmVkdS92aWV3ZG9jL2Rvd25sb2FkOz9kb2k9MTAuMS4xLjE3My4xODk4JnJlcD1yZXAxJnR5cGU9cGRmCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUxpY2Vuc2Ugc3RhdGVtZW50IGZvciB0aGUgZGlyZWN0aW9uIG51bWJlcnMgaW4gdGhlIHJlc291cmNlIGZpbGVzIGZvciBTb2JvbCBzZXF1ZW5jZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MaWNlbmNlIHBlcnRhaW5pbmcgdG8gc29ib2wuY2MgYW5kIHRoZSBhY2NvbXBhbnlpbmcgc2V0cyBvZiBkaXJlY3Rpb24gbnVtYmVycwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA4LCBGcmFuY2VzIFkuIEt1byBhbmQgU3RlcGhlbiBKb2UKLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiB0aGUKLSAgICAgIFVuaXZlcnNpdHkgb2YgTmV3IFNvdXRoIFdhbGVzIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBXYWlrYXRvCi0gICAgICBhbmQgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQotRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi1ESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi1PTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgaW5pdGlhbCBjb21taXQgb2YgcGFja2FnZSAib3JnLmFwYWNoZS5jb21tb25zLm1hdGgzLm1sLm5ldXJhbG5ldCIgaXMKLWFuIGFkYXB0ZWQgdmVyc2lvbiBvZiBjb2RlIGRldmVsb3BlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgRGF0YSBQcm9jZXNzaW5nCi1hbmQgQW5hbHlzaXMgQ29uc29ydGl1bSAoRFBBQykgb2YgdGhlICJHYWlhIiBwcm9qZWN0IG9mIHRoZSBFdXJvcGVhbiBTcGFjZQotQWdlbmN5IChFU0EpLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgaW5pdGlhbCBjb21taXQgb2YgdGhlIGNsYXNzICJvcmcuYXBhY2hlLmNvbW1vbnMubWF0aDMuc3BlY2lhbC5CZXNzZWxKIiBpcwotYW4gYWRhcHRlZCB2ZXJzaW9uIG9mIGNvZGUgdHJhbnNsYXRlZCBmcm9tIHRoZSBuZXRsaWIgRm9ydHJhbiBwcm9ncmFtLCByamJlc2wKLWh0dHA6Ly93d3cubmV0bGliLm9yZy9zcGVjZnVuL3JqYmVzbCBieSBSLkouIENvZHkgYXQgQXJnb25uZSBOYXRpb25hbAotTGFib3JhdG9yeSAoVVNBKS4gIFRoZXJlIGlzIG5vIGxpY2Vuc2Ugb3IgY29weXJpZ2h0IHN0YXRlbWVudCBpbmNsdWRlZCB3aXRoIHRoZQotb3JpZ2luYWwgRm9ydHJhbiBzb3VyY2VzLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLVRoZSBCcmFja2V0RmluZGVyIChwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5tYXRoMy5vcHRpbWl6YXRpb24udW5pdmFyaWF0ZSkKLWFuZCBQb3dlbGxPcHRpbWl6ZXIgKHBhY2thZ2Ugb3JnLmFwYWNoZS5jb21tb25zLm1hdGgzLm9wdGltaXphdGlvbi5nZW5lcmFsKQotY2xhc3NlcyBhcmUgYmFzZWQgb24gdGhlIFB5dGhvbiBjb2RlIGluIG1vZHVsZSAib3B0aW1pemUucHkiICh2ZXJzaW9uIDAuNSkKLWRldmVsb3BlZCBieSBUcmF2aXMgRS4gT2xpcGhhbnQgZm9yIHRoZSBTY2lQeSBsaWJyYXJ5IChodHRwOi8vd3d3LnNjaXB5Lm9yZy8pCi1Db3B5cmlnaHQgwqkgMjAwMy0yMDA5IFNjaVB5IERldmVsb3BlcnMuCi0KLVNjaVB5IGxpY2Vuc2UKLUNvcHlyaWdodCDCqSAyMDAxLCAyMDAyIEVudGhvdWdodCwgSW5jLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotQ29weXJpZ2h0IMKpIDIwMDMtMjAxMyBTY2lQeSBEZXZlbG9wZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQotICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRW50aG91Z2h0IG5vciB0aGUgbmFtZXMgb2YgdGhlIFNjaVB5IERldmVsb3BlcnMgbWF5Ci0gICAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMg4oCcQVMgSVPigJ0gQU5EIEFOWQotRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi1ESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi1PTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLW1hdGgzLTMuNC4xLk5PVElDRSBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbWF0aDMtMy40LjEuTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc5MWU0Li4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbWF0aDMtMy40LjEuTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgQ29tbW9ucyBNYXRoCi1Db3B5cmlnaHQgMjAwMS0yMDE1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGZvciBPcmVraXQgYnkKLUNTIFN5c3TDqG1lcyBkJ0luZm9ybWF0aW9uIChodHRwOi8vd3d3LmMtcy5mci8pCi1Db3B5cmlnaHQgMjAxMC0yMDEyIENTIFN5c3TDqG1lcyBkJ0luZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLW5ldC0zLjMuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1uZXQtMy4zLkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNTI0OC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9jb21tb25zLW5ldC0zLjMuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCi0NCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQotDQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQotDQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1uZXQtMy4zLk5PVElDRSBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2NvbW1vbnMtbmV0LTMuMy5OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGVkNDMuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1uZXQtMy4zLk5PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQXBhY2hlIENvbW1vbnMgTmV0DQotQ29weXJpZ2h0IDIwMDEtMjAxMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0DQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9nc29uLTIuMi40LkFMLTIuMCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2dzb24tMi4yLjQuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJlYWVkLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2dzb24tMi4yLjQuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLUdvb2dsZSBHc29uDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgMjAwOC0yMDExIEdvb2dsZSBJbmMuDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvZ3Nvbi0yLjYuMS5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9nc29uLTIuNi4xLkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9nc29uLTIuNi4xLkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNsaWVudC00LjUuMS5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY2xpZW50LTQuNS4xLkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY2xpZW50LTQuNS4xLkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNsaWVudC00LjUuMS5OT1RJQ0UgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY2xpZW50LTQuNS4xLk5PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1ZDRlNi4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY2xpZW50LTQuNS4xLk5PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi1BcGFjaGUgSHR0cENsaWVudAotQ29weXJpZ2h0IDE5OTktMjAxNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY29yZS00LjQuMy5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY29yZS00LjQuMy5BTC0yLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTQyODUuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNvcmUtNC40LjMuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9qZWN0IGNvbnRhaW5zIGFubm90YXRpb25zIGluIHRoZSBwYWNrYWdlIG9yZy5hcGFjaGUuaHR0cC5hbm5vdGF0aW9uCi13aGljaCBhcmUgZGVyaXZlZCBmcm9tIEpDSVAtQU5OT1RBVElPTlMKLUNvcHlyaWdodCAoYykgMjAwNSBCcmlhbiBHb2V0eiBhbmQgVGltIFBlaWVybHMuCi1TZWUgaHR0cDovL3d3dy5qY2lwLm5ldCBhbmQgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTGljZW5zZQotKGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNSkKLUZ1bGwgdGV4dDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41L2xlZ2FsY29kZQotCi1MaWNlbnNlCi0KLVRIRSBXT1JLIChBUyBERUZJTkVEIEJFTE9XKSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDUkVBVElWRSBDT01NT05TIFBVQkxJQyBMSUNFTlNFICgiQ0NQTCIgT1IgIkxJQ0VOU0UiKS4gVEhFIFdPUksgSVMgUFJPVEVDVEVEIEJZIENPUFlSSUdIVCBBTkQvT1IgT1RIRVIgQVBQTElDQUJMRSBMQVcuIEFOWSBVU0UgT0YgVEhFIFdPUksgT1RIRVIgVEhBTiBBUyBBVVRIT1JJWkVEIFVOREVSIFRISVMgTElDRU5TRSBPUiBDT1BZUklHSFQgTEFXIElTIFBST0hJQklURUQuCi0KLUJZIEVYRVJDSVNJTkcgQU5ZIFJJR0hUUyBUTyBUSEUgV09SSyBQUk9WSURFRCBIRVJFLCBZT1UgQUNDRVBUIEFORCBBR1JFRSBUTyBCRSBCT1VORCBCWSBUSEUgVEVSTVMgT0YgVEhJUyBMSUNFTlNFLiBUSEUgTElDRU5TT1IgR1JBTlRTIFlPVSBUSEUgUklHSFRTIENPTlRBSU5FRCBIRVJFIElOIENPTlNJREVSQVRJT04gT0YgWU9VUiBBQ0NFUFRBTkNFIE9GIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMuCi0KLTEuIERlZmluaXRpb25zCi0KLSAgICAiQ29sbGVjdGl2ZSBXb3JrIiBtZWFucyBhIHdvcmssIHN1Y2ggYXMgYSBwZXJpb2RpY2FsIGlzc3VlLCBhbnRob2xvZ3kgb3IgZW5jeWNsb3BlZGlhLCBpbiB3aGljaCB0aGUgV29yayBpbiBpdHMgZW50aXJldHkgaW4gdW5tb2RpZmllZCBmb3JtLCBhbG9uZyB3aXRoIGEgbnVtYmVyIG9mIG90aGVyIGNvbnRyaWJ1dGlvbnMsIGNvbnN0aXR1dGluZyBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQgd29ya3MgaW4gdGhlbXNlbHZlcywgYXJlIGFzc2VtYmxlZCBpbnRvIGEgY29sbGVjdGl2ZSB3aG9sZS4gQSB3b3JrIHRoYXQgY29uc3RpdHV0ZXMgYSBDb2xsZWN0aXZlIFdvcmsgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBhIERlcml2YXRpdmUgV29yayAoYXMgZGVmaW5lZCBiZWxvdykgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIExpY2Vuc2UuCi0gICAgIkRlcml2YXRpdmUgV29yayIgbWVhbnMgYSB3b3JrIGJhc2VkIHVwb24gdGhlIFdvcmsgb3IgdXBvbiB0aGUgV29yayBhbmQgb3RoZXIgcHJlLWV4aXN0aW5nIHdvcmtzLCBzdWNoIGFzIGEgdHJhbnNsYXRpb24sIG11c2ljYWwgYXJyYW5nZW1lbnQsIGRyYW1hdGl6YXRpb24sIGZpY3Rpb25hbGl6YXRpb24sIG1vdGlvbiBwaWN0dXJlIHZlcnNpb24sIHNvdW5kIHJlY29yZGluZywgYXJ0IHJlcHJvZHVjdGlvbiwgYWJyaWRnbWVudCwgY29uZGVuc2F0aW9uLCBvciBhbnkgb3RoZXIgZm9ybSBpbiB3aGljaCB0aGUgV29yayBtYXkgYmUgcmVjYXN0LCB0cmFuc2Zvcm1lZCwgb3IgYWRhcHRlZCwgZXhjZXB0IHRoYXQgYSB3b3JrIHRoYXQgY29uc3RpdHV0ZXMgYSBDb2xsZWN0aXZlIFdvcmsgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBhIERlcml2YXRpdmUgV29yayBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBMaWNlbnNlLiBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCwgd2hlcmUgdGhlIFdvcmsgaXMgYSBtdXNpY2FsIGNvbXBvc2l0aW9uIG9yIHNvdW5kIHJlY29yZGluZywgdGhlIHN5bmNocm9uaXphdGlvbiBvZiB0aGUgV29yayBpbiB0aW1lZC1yZWxhdGlvbiB3aXRoIGEgbW92aW5nIGltYWdlICgic3luY2hpbmciKSB3aWxsIGJlIGNvbnNpZGVyZWQgYSBEZXJpdmF0aXZlIFdvcmsgZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgTGljZW5zZS4KLSAgICAiTGljZW5zb3IiIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IG9mZmVycyB0aGUgV29yayB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotICAgICJPcmlnaW5hbCBBdXRob3IiIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSB3aG8gY3JlYXRlZCB0aGUgV29yay4KLSAgICAiV29yayIgbWVhbnMgdGhlIGNvcHlyaWdodGFibGUgd29yayBvZiBhdXRob3JzaGlwIG9mZmVyZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLSAgICAiWW91IiBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2hvIGhhcyBub3QgcHJldmlvdXNseSB2aW9sYXRlZCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggcmVzcGVjdCB0byB0aGUgV29yaywgb3Igd2hvIGhhcyByZWNlaXZlZCBleHByZXNzIHBlcm1pc3Npb24gZnJvbSB0aGUgTGljZW5zb3IgdG8gZXhlcmNpc2UgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBkZXNwaXRlIGEgcHJldmlvdXMgdmlvbGF0aW9uLgotCi0yLiBGYWlyIFVzZSBSaWdodHMuIE5vdGhpbmcgaW4gdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIHJlZHVjZSwgbGltaXQsIG9yIHJlc3RyaWN0IGFueSByaWdodHMgYXJpc2luZyBmcm9tIGZhaXIgdXNlLCBmaXJzdCBzYWxlIG9yIG90aGVyIGxpbWl0YXRpb25zIG9uIHRoZSBleGNsdXNpdmUgcmlnaHRzIG9mIHRoZSBjb3B5cmlnaHQgb3duZXIgdW5kZXIgY29weXJpZ2h0IGxhdyBvciBvdGhlciBhcHBsaWNhYmxlIGxhd3MuCi0KLTMuIExpY2Vuc2UgR3JhbnQuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgTGljZW5zb3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSwgcGVycGV0dWFsIChmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhcHBsaWNhYmxlIGNvcHlyaWdodCkgbGljZW5zZSB0byBleGVyY2lzZSB0aGUgcmlnaHRzIGluIHRoZSBXb3JrIGFzIHN0YXRlZCBiZWxvdzoKLQotICAgIHRvIHJlcHJvZHVjZSB0aGUgV29yaywgdG8gaW5jb3Jwb3JhdGUgdGhlIFdvcmsgaW50byBvbmUgb3IgbW9yZSBDb2xsZWN0aXZlIFdvcmtzLCBhbmQgdG8gcmVwcm9kdWNlIHRoZSBXb3JrIGFzIGluY29ycG9yYXRlZCBpbiB0aGUgQ29sbGVjdGl2ZSBXb3JrczsKLSAgICB0byBjcmVhdGUgYW5kIHJlcHJvZHVjZSBEZXJpdmF0aXZlIFdvcmtzOwotICAgIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9yIHBob25vcmVjb3JkcyBvZiwgZGlzcGxheSBwdWJsaWNseSwgcGVyZm9ybSBwdWJsaWNseSwgYW5kIHBlcmZvcm0gcHVibGljbHkgYnkgbWVhbnMgb2YgYSBkaWdpdGFsIGF1ZGlvIHRyYW5zbWlzc2lvbiB0aGUgV29yayBpbmNsdWRpbmcgYXMgaW5jb3Jwb3JhdGVkIGluIENvbGxlY3RpdmUgV29ya3M7Ci0gICAgdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb3IgcGhvbm9yZWNvcmRzIG9mLCBkaXNwbGF5IHB1YmxpY2x5LCBwZXJmb3JtIHB1YmxpY2x5LCBhbmQgcGVyZm9ybSBwdWJsaWNseSBieSBtZWFucyBvZiBhIGRpZ2l0YWwgYXVkaW8gdHJhbnNtaXNzaW9uIERlcml2YXRpdmUgV29ya3MuCi0KLSAgICBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCwgd2hlcmUgdGhlIHdvcmsgaXMgYSBtdXNpY2FsIGNvbXBvc2l0aW9uOgotICAgICAgICBQZXJmb3JtYW5jZSBSb3lhbHRpZXMgVW5kZXIgQmxhbmtldCBMaWNlbnNlcy4gTGljZW5zb3Igd2FpdmVzIHRoZSBleGNsdXNpdmUgcmlnaHQgdG8gY29sbGVjdCwgd2hldGhlciBpbmRpdmlkdWFsbHkgb3IgdmlhIGEgcGVyZm9ybWFuY2UgcmlnaHRzIHNvY2lldHkgKGUuZy4gQVNDQVAsIEJNSSwgU0VTQUMpLCByb3lhbHRpZXMgZm9yIHRoZSBwdWJsaWMgcGVyZm9ybWFuY2Ugb3IgcHVibGljIGRpZ2l0YWwgcGVyZm9ybWFuY2UgKGUuZy4gd2ViY2FzdCkgb2YgdGhlIFdvcmsuCi0gICAgICAgIE1lY2hhbmljYWwgUmlnaHRzIGFuZCBTdGF0dXRvcnkgUm95YWx0aWVzLiBMaWNlbnNvciB3YWl2ZXMgdGhlIGV4Y2x1c2l2ZSByaWdodCB0byBjb2xsZWN0LCB3aGV0aGVyIGluZGl2aWR1YWxseSBvciB2aWEgYSBtdXNpYyByaWdodHMgYWdlbmN5IG9yIGRlc2lnbmF0ZWQgYWdlbnQgKGUuZy4gSGFycnkgRm94IEFnZW5jeSksIHJveWFsdGllcyBmb3IgYW55IHBob25vcmVjb3JkIFlvdSBjcmVhdGUgZnJvbSB0aGUgV29yayAoImNvdmVyIHZlcnNpb24iKSBhbmQgZGlzdHJpYnV0ZSwgc3ViamVjdCB0byB0aGUgY29tcHVsc29yeSBsaWNlbnNlIGNyZWF0ZWQgYnkgMTcgVVNDIFNlY3Rpb24gMTE1IG9mIHRoZSBVUyBDb3B5cmlnaHQgQWN0IChvciB0aGUgZXF1aXZhbGVudCBpbiBvdGhlciBqdXJpc2RpY3Rpb25zKS4KLSAgICBXZWJjYXN0aW5nIFJpZ2h0cyBhbmQgU3RhdHV0b3J5IFJveWFsdGllcy4gRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQsIHdoZXJlIHRoZSBXb3JrIGlzIGEgc291bmQgcmVjb3JkaW5nLCBMaWNlbnNvciB3YWl2ZXMgdGhlIGV4Y2x1c2l2ZSByaWdodCB0byBjb2xsZWN0LCB3aGV0aGVyIGluZGl2aWR1YWxseSBvciB2aWEgYSBwZXJmb3JtYW5jZS1yaWdodHMgc29jaWV0eSAoZS5nLiBTb3VuZEV4Y2hhbmdlKSwgcm95YWx0aWVzIGZvciB0aGUgcHVibGljIGRpZ2l0YWwgcGVyZm9ybWFuY2UgKGUuZy4gd2ViY2FzdCkgb2YgdGhlIFdvcmssIHN1YmplY3QgdG8gdGhlIGNvbXB1bHNvcnkgbGljZW5zZSBjcmVhdGVkIGJ5IDE3IFVTQyBTZWN0aW9uIDExNCBvZiB0aGUgVVMgQ29weXJpZ2h0IEFjdCAob3IgdGhlIGVxdWl2YWxlbnQgaW4gb3RoZXIganVyaXNkaWN0aW9ucykuCi0KLVRoZSBhYm92ZSByaWdodHMgbWF5IGJlIGV4ZXJjaXNlZCBpbiBhbGwgbWVkaWEgYW5kIGZvcm1hdHMgd2hldGhlciBub3cga25vd24gb3IgaGVyZWFmdGVyIGRldmlzZWQuIFRoZSBhYm92ZSByaWdodHMgaW5jbHVkZSB0aGUgcmlnaHQgdG8gbWFrZSBzdWNoIG1vZGlmaWNhdGlvbnMgYXMgYXJlIHRlY2huaWNhbGx5IG5lY2Vzc2FyeSB0byBleGVyY2lzZSB0aGUgcmlnaHRzIGluIG90aGVyIG1lZGlhIGFuZCBmb3JtYXRzLiBBbGwgcmlnaHRzIG5vdCBleHByZXNzbHkgZ3JhbnRlZCBieSBMaWNlbnNvciBhcmUgaGVyZWJ5IHJlc2VydmVkLgotCi00LiBSZXN0cmljdGlvbnMuVGhlIGxpY2Vuc2UgZ3JhbnRlZCBpbiBTZWN0aW9uIDMgYWJvdmUgaXMgZXhwcmVzc2x5IG1hZGUgc3ViamVjdCB0byBhbmQgbGltaXRlZCBieSB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgIFlvdSBtYXkgZGlzdHJpYnV0ZSwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgb3IgcHVibGljbHkgZGlnaXRhbGx5IHBlcmZvcm0gdGhlIFdvcmsgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBhbmQgWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YsIG9yIHRoZSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgZm9yLCB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9yIHBob25vcmVjb3JkIG9mIHRoZSBXb3JrIFlvdSBkaXN0cmlidXRlLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBvciBwdWJsaWNseSBkaWdpdGFsbHkgcGVyZm9ybS4gWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiB0aGUgV29yayB0aGF0IGFsdGVyIG9yIHJlc3RyaWN0IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIuIFlvdSBtYXkgbm90IHN1YmxpY2Vuc2UgdGhlIFdvcmsuIFlvdSBtdXN0IGtlZXAgaW50YWN0IGFsbCBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLiBZb3UgbWF5IG5vdCBkaXN0cmlidXRlLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBvciBwdWJsaWNseSBkaWdpdGFsbHkgcGVyZm9ybSB0aGUgV29yayB3aXRoIGFueSB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRoYXQgY29udHJvbCBhY2Nlc3Mgb3IgdXNlIG9mIHRoZSBXb3JrIGluIGEgbWFubmVyIGluY29uc2lzdGVudCB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiBUaGUgYWJvdmUgYXBwbGllcyB0byB0aGUgV29yayBhcyBpbmNvcnBvcmF0ZWQgaW4gYSBDb2xsZWN0aXZlIFdvcmssIGJ1dCB0aGlzIGRvZXMgbm90IHJlcXVpcmUgdGhlIENvbGxlY3RpdmUgV29yayBhcGFydCBmcm9tIHRoZSBXb3JrIGl0c2VsZiB0byBiZSBtYWRlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gSWYgWW91IGNyZWF0ZSBhIENvbGxlY3RpdmUgV29yaywgdXBvbiBub3RpY2UgZnJvbSBhbnkgTGljZW5zb3IgWW91IG11c3QsIHRvIHRoZSBleHRlbnQgcHJhY3RpY2FibGUsIHJlbW92ZSBmcm9tIHRoZSBDb2xsZWN0aXZlIFdvcmsgYW55IGNyZWRpdCBhcyByZXF1aXJlZCBieSBjbGF1c2UgNChiKSwgYXMgcmVxdWVzdGVkLiBJZiBZb3UgY3JlYXRlIGEgRGVyaXZhdGl2ZSBXb3JrLCB1cG9uIG5vdGljZSBmcm9tIGFueSBMaWNlbnNvciBZb3UgbXVzdCwgdG8gdGhlIGV4dGVudCBwcmFjdGljYWJsZSwgcmVtb3ZlIGZyb20gdGhlIERlcml2YXRpdmUgV29yayBhbnkgY3JlZGl0IGFzIHJlcXVpcmVkIGJ5IGNsYXVzZSA0KGIpLCBhcyByZXF1ZXN0ZWQuCi0gICAgSWYgeW91IGRpc3RyaWJ1dGUsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIG9yIHB1YmxpY2x5IGRpZ2l0YWxseSBwZXJmb3JtIHRoZSBXb3JrIG9yIGFueSBEZXJpdmF0aXZlIFdvcmtzIG9yIENvbGxlY3RpdmUgV29ya3MsIFlvdSBtdXN0IGtlZXAgaW50YWN0IGFsbCBjb3B5cmlnaHQgbm90aWNlcyBmb3IgdGhlIFdvcmsgYW5kIHByb3ZpZGUsIHJlYXNvbmFibGUgdG8gdGhlIG1lZGl1bSBvciBtZWFucyBZb3UgYXJlIHV0aWxpemluZzogKGkpIHRoZSBuYW1lIG9mIHRoZSBPcmlnaW5hbCBBdXRob3IgKG9yIHBzZXVkb255bSwgaWYgYXBwbGljYWJsZSkgaWYgc3VwcGxpZWQsIGFuZC9vciAoaWkpIGlmIHRoZSBPcmlnaW5hbCBBdXRob3IgYW5kL29yIExpY2Vuc29yIGRlc2lnbmF0ZSBhbm90aGVyIHBhcnR5IG9yIHBhcnRpZXMgKGUuZy4gYSBzcG9uc29yIGluc3RpdHV0ZSwgcHVibGlzaGluZyBlbnRpdHksIGpvdXJuYWwpIGZvciBhdHRyaWJ1dGlvbiBpbiBMaWNlbnNvcidzIGNvcHlyaWdodCBub3RpY2UsIHRlcm1zIG9mIHNlcnZpY2Ugb3IgYnkgb3RoZXIgcmVhc29uYWJsZSBtZWFucywgdGhlIG5hbWUgb2Ygc3VjaCBwYXJ0eSBvciBwYXJ0aWVzOyB0aGUgdGl0bGUgb2YgdGhlIFdvcmsgaWYgc3VwcGxpZWQ7IHRvIHRoZSBleHRlbnQgcmVhc29uYWJseSBwcmFjdGljYWJsZSwgdGhlIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgaWYgYW55LCB0aGF0IExpY2Vuc29yIHNwZWNpZmllcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIFdvcmssIHVubGVzcyBzdWNoIFVSSSBkb2VzIG5vdCByZWZlciB0byB0aGUgY29weXJpZ2h0IG5vdGljZSBvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBXb3JrOyBhbmQgaW4gdGhlIGNhc2Ugb2YgYSBEZXJpdmF0aXZlIFdvcmssIGEgY3JlZGl0IGlkZW50aWZ5aW5nIHRoZSB1c2Ugb2YgdGhlIFdvcmsgaW4gdGhlIERlcml2YXRpdmUgV29yayAoZS5nLiwgIkZyZW5jaCB0cmFuc2xhdGlvbiBvZiB0aGUgV29yayBieSBPcmlnaW5hbCBBdXRob3IsIiBvciAiU2NyZWVucGxheSBiYXNlZCBvbiBvcmlnaW5hbCBXb3JrIGJ5IE9yaWdpbmFsIEF1dGhvciIpLiBTdWNoIGNyZWRpdCBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gYW55IHJlYXNvbmFibGUgbWFubmVyOyBwcm92aWRlZCwgaG93ZXZlciwgdGhhdCBpbiB0aGUgY2FzZSBvZiBhIERlcml2YXRpdmUgV29yayBvciBDb2xsZWN0aXZlIFdvcmssIGF0IGEgbWluaW11bSBzdWNoIGNyZWRpdCB3aWxsIGFwcGVhciB3aGVyZSBhbnkgb3RoZXIgY29tcGFyYWJsZSBhdXRob3JzaGlwIGNyZWRpdCBhcHBlYXJzIGFuZCBpbiBhIG1hbm5lciBhdCBsZWFzdCBhcyBwcm9taW5lbnQgYXMgc3VjaCBvdGhlciBjb21wYXJhYmxlIGF1dGhvcnNoaXAgY3JlZGl0LgotCi01LiBSZXByZXNlbnRhdGlvbnMsIFdhcnJhbnRpZXMgYW5kIERpc2NsYWltZXIKLQotVU5MRVNTIE9USEVSV0lTRSBNVVRVQUxMWSBBR1JFRUQgVE8gQlkgVEhFIFBBUlRJRVMgSU4gV1JJVElORywgTElDRU5TT1IgT0ZGRVJTIFRIRSBXT1JLIEFTLUlTIEFORCBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUyBPRiBBTlkgS0lORCBDT05DRVJOSU5HIFRIRSBXT1JLLCBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlkgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRJQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTk9OSU5GUklOR0VNRU5ULCBPUiBUSEUgQUJTRU5DRSBPRiBMQVRFTlQgT1IgT1RIRVIgREVGRUNUUywgQUNDVVJBQ1ksIE9SIFRIRSBQUkVTRU5DRSBPRiBBQlNFTkNFIE9GIEVSUk9SUywgV0hFVEhFUiBPUiBOT1QgRElTQ09WRVJBQkxFLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT0YgSU1QTElFRCBXQVJSQU5USUVTLCBTTyBTVUNIIEVYQ0xVU0lPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KLQotNi4gTGltaXRhdGlvbiBvbiBMaWFiaWxpdHkuIEVYQ0VQVCBUTyBUSEUgRVhURU5UIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXLCBJTiBOTyBFVkVOVCBXSUxMIExJQ0VOU09SIEJFIExJQUJMRSBUTyBZT1UgT04gQU5ZIExFR0FMIFRIRU9SWSBGT1IgQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIENPTlNFUVVFTlRJQUwsIFBVTklUSVZFIE9SIEVYRU1QTEFSWSBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRISVMgTElDRU5TRSBPUiBUSEUgVVNFIE9GIFRIRSBXT1JLLCBFVkVOIElGIExJQ0VOU09SIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotNy4gVGVybWluYXRpb24KLQotICAgIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IHVwb24gYW55IGJyZWFjaCBieSBZb3Ugb2YgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gSW5kaXZpZHVhbHMgb3IgZW50aXRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgRGVyaXZhdGl2ZSBXb3JrcyBvciBDb2xsZWN0aXZlIFdvcmtzIGZyb20gWW91IHVuZGVyIHRoaXMgTGljZW5zZSwgaG93ZXZlciwgd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHByb3ZpZGVkIHN1Y2ggaW5kaXZpZHVhbHMgb3IgZW50aXRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZSB3aXRoIHRob3NlIGxpY2Vuc2VzLiBTZWN0aW9ucyAxLCAyLCA1LCA2LCA3LCBhbmQgOCB3aWxsIHN1cnZpdmUgYW55IHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4KLSAgICBTdWJqZWN0IHRvIHRoZSBhYm92ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgdGhlIGxpY2Vuc2UgZ3JhbnRlZCBoZXJlIGlzIHBlcnBldHVhbCAoZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXBwbGljYWJsZSBjb3B5cmlnaHQgaW4gdGhlIFdvcmspLiBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBMaWNlbnNvciByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcmVsZWFzZSB0aGUgV29yayB1bmRlciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBvciB0byBzdG9wIGRpc3RyaWJ1dGluZyB0aGUgV29yayBhdCBhbnkgdGltZTsgcHJvdmlkZWQsIGhvd2V2ZXIgdGhhdCBhbnkgc3VjaCBlbGVjdGlvbiB3aWxsIG5vdCBzZXJ2ZSB0byB3aXRoZHJhdyB0aGlzIExpY2Vuc2UgKG9yIGFueSBvdGhlciBsaWNlbnNlIHRoYXQgaGFzIGJlZW4sIG9yIGlzIHJlcXVpcmVkIHRvIGJlLCBncmFudGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UpLCBhbmQgdGhpcyBMaWNlbnNlIHdpbGwgY29udGludWUgaW4gZnVsbCBmb3JjZSBhbmQgZWZmZWN0IHVubGVzcyB0ZXJtaW5hdGVkIGFzIHN0YXRlZCBhYm92ZS4KLQotOC4gTWlzY2VsbGFuZW91cwotCi0gICAgRWFjaCB0aW1lIFlvdSBkaXN0cmlidXRlIG9yIHB1YmxpY2x5IGRpZ2l0YWxseSBwZXJmb3JtIHRoZSBXb3JrIG9yIGEgQ29sbGVjdGl2ZSBXb3JrLCB0aGUgTGljZW5zb3Igb2ZmZXJzIHRvIHRoZSByZWNpcGllbnQgYSBsaWNlbnNlIHRvIHRoZSBXb3JrIG9uIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIGFzIHRoZSBsaWNlbnNlIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZS4KLSAgICBFYWNoIHRpbWUgWW91IGRpc3RyaWJ1dGUgb3IgcHVibGljbHkgZGlnaXRhbGx5IHBlcmZvcm0gYSBEZXJpdmF0aXZlIFdvcmssIExpY2Vuc29yIG9mZmVycyB0byB0aGUgcmVjaXBpZW50IGEgbGljZW5zZSB0byB0aGUgb3JpZ2luYWwgV29yayBvbiB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBhcyB0aGUgbGljZW5zZSBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UuCi0gICAgSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIHRvIHRoaXMgYWdyZWVtZW50LCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotICAgIE5vIHRlcm0gb3IgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgd2FpdmVkIGFuZCBubyBicmVhY2ggY29uc2VudGVkIHRvIHVubGVzcyBzdWNoIHdhaXZlciBvciBjb25zZW50IHNoYWxsIGJlIGluIHdyaXRpbmcgYW5kIHNpZ25lZCBieSB0aGUgcGFydHkgdG8gYmUgY2hhcmdlZCB3aXRoIHN1Y2ggd2FpdmVyIG9yIGNvbnNlbnQuCi0gICAgVGhpcyBMaWNlbnNlIGNvbnN0aXR1dGVzIHRoZSBlbnRpcmUgYWdyZWVtZW50IGJldHdlZW4gdGhlIHBhcnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBXb3JrIGxpY2Vuc2VkIGhlcmUuIFRoZXJlIGFyZSBubyB1bmRlcnN0YW5kaW5ncywgYWdyZWVtZW50cyBvciByZXByZXNlbnRhdGlvbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBXb3JrIG5vdCBzcGVjaWZpZWQgaGVyZS4gTGljZW5zb3Igc2hhbGwgbm90IGJlIGJvdW5kIGJ5IGFueSBhZGRpdGlvbmFsIHByb3Zpc2lvbnMgdGhhdCBtYXkgYXBwZWFyIGluIGFueSBjb21tdW5pY2F0aW9uIGZyb20gWW91LiBUaGlzIExpY2Vuc2UgbWF5IG5vdCBiZSBtb2RpZmllZCB3aXRob3V0IHRoZSBtdXR1YWwgd3JpdHRlbiBhZ3JlZW1lbnQgb2YgdGhlIExpY2Vuc29yIGFuZCBZb3UuCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY29yZS00LjQuMy5OT1RJQ0UgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9odHRwY29yZS00LjQuMy5OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmRiNTMuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNvcmUtNC40LjMuTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCi1BcGFjaGUgSHR0cENvcmUKLUNvcHlyaWdodCAyMDA1LTIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQotVGhpcyBwcm9qZWN0IGNvbnRhaW5zIGFubm90YXRpb25zIGRlcml2ZWQgZnJvbSBKQ0lQLUFOTk9UQVRJT05TCi1Db3B5cmlnaHQgKGMpIDIwMDUgQnJpYW4gR29ldHogYW5kIFRpbSBQZWllcmxzLiBTZWUgaHR0cDovL3d3dy5qY2lwLm5ldApkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNvcmUtNC40LjQuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNvcmUtNC40LjQuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGU0Mjg1Li4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2h0dHBjb3JlLTQuNC40LkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvamVjdCBjb250YWlucyBhbm5vdGF0aW9ucyBpbiB0aGUgcGFja2FnZSBvcmcuYXBhY2hlLmh0dHAuYW5ub3RhdGlvbgotd2hpY2ggYXJlIGRlcml2ZWQgZnJvbSBKQ0lQLUFOTk9UQVRJT05TCi1Db3B5cmlnaHQgKGMpIDIwMDUgQnJpYW4gR29ldHogYW5kIFRpbSBQZWllcmxzLgotU2VlIGh0dHA6Ly93d3cuamNpcC5uZXQgYW5kIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIExpY2Vuc2UKLShodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUpCi1GdWxsIHRleHQ6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS9sZWdhbGNvZGUKLQotTGljZW5zZQotCi1USEUgV09SSyAoQVMgREVGSU5FRCBCRUxPVykgSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ1JFQVRJVkUgQ09NTU9OUyBQVUJMSUMgTElDRU5TRSAoIkNDUEwiIE9SICJMSUNFTlNFIikuIFRIRSBXT1JLIElTIFBST1RFQ1RFRCBCWSBDT1BZUklHSFQgQU5EL09SIE9USEVSIEFQUExJQ0FCTEUgTEFXLiBBTlkgVVNFIE9GIFRIRSBXT1JLIE9USEVSIFRIQU4gQVMgQVVUSE9SSVpFRCBVTkRFUiBUSElTIExJQ0VOU0UgT1IgQ09QWVJJR0hUIExBVyBJUyBQUk9ISUJJVEVELgotCi1CWSBFWEVSQ0lTSU5HIEFOWSBSSUdIVFMgVE8gVEhFIFdPUksgUFJPVklERUQgSEVSRSwgWU9VIEFDQ0VQVCBBTkQgQUdSRUUgVE8gQkUgQk9VTkQgQlkgVEhFIFRFUk1TIE9GIFRISVMgTElDRU5TRS4gVEhFIExJQ0VOU09SIEdSQU5UUyBZT1UgVEhFIFJJR0hUUyBDT05UQUlORUQgSEVSRSBJTiBDT05TSURFUkFUSU9OIE9GIFlPVVIgQUNDRVBUQU5DRSBPRiBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TLgotCi0xLiBEZWZpbml0aW9ucwotCi0gICAgIkNvbGxlY3RpdmUgV29yayIgbWVhbnMgYSB3b3JrLCBzdWNoIGFzIGEgcGVyaW9kaWNhbCBpc3N1ZSwgYW50aG9sb2d5IG9yIGVuY3ljbG9wZWRpYSwgaW4gd2hpY2ggdGhlIFdvcmsgaW4gaXRzIGVudGlyZXR5IGluIHVubW9kaWZpZWQgZm9ybSwgYWxvbmcgd2l0aCBhIG51bWJlciBvZiBvdGhlciBjb250cmlidXRpb25zLCBjb25zdGl0dXRpbmcgc2VwYXJhdGUgYW5kIGluZGVwZW5kZW50IHdvcmtzIGluIHRoZW1zZWx2ZXMsIGFyZSBhc3NlbWJsZWQgaW50byBhIGNvbGxlY3RpdmUgd2hvbGUuIEEgd29yayB0aGF0IGNvbnN0aXR1dGVzIGEgQ29sbGVjdGl2ZSBXb3JrIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYSBEZXJpdmF0aXZlIFdvcmsgKGFzIGRlZmluZWQgYmVsb3cpIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBMaWNlbnNlLgotICAgICJEZXJpdmF0aXZlIFdvcmsiIG1lYW5zIGEgd29yayBiYXNlZCB1cG9uIHRoZSBXb3JrIG9yIHVwb24gdGhlIFdvcmsgYW5kIG90aGVyIHByZS1leGlzdGluZyB3b3Jrcywgc3VjaCBhcyBhIHRyYW5zbGF0aW9uLCBtdXNpY2FsIGFycmFuZ2VtZW50LCBkcmFtYXRpemF0aW9uLCBmaWN0aW9uYWxpemF0aW9uLCBtb3Rpb24gcGljdHVyZSB2ZXJzaW9uLCBzb3VuZCByZWNvcmRpbmcsIGFydCByZXByb2R1Y3Rpb24sIGFicmlkZ21lbnQsIGNvbmRlbnNhdGlvbiwgb3IgYW55IG90aGVyIGZvcm0gaW4gd2hpY2ggdGhlIFdvcmsgbWF5IGJlIHJlY2FzdCwgdHJhbnNmb3JtZWQsIG9yIGFkYXB0ZWQsIGV4Y2VwdCB0aGF0IGEgd29yayB0aGF0IGNvbnN0aXR1dGVzIGEgQ29sbGVjdGl2ZSBXb3JrIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYSBEZXJpdmF0aXZlIFdvcmsgZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgTGljZW5zZS4gRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQsIHdoZXJlIHRoZSBXb3JrIGlzIGEgbXVzaWNhbCBjb21wb3NpdGlvbiBvciBzb3VuZCByZWNvcmRpbmcsIHRoZSBzeW5jaHJvbml6YXRpb24gb2YgdGhlIFdvcmsgaW4gdGltZWQtcmVsYXRpb24gd2l0aCBhIG1vdmluZyBpbWFnZSAoInN5bmNoaW5nIikgd2lsbCBiZSBjb25zaWRlcmVkIGEgRGVyaXZhdGl2ZSBXb3JrIGZvciB0aGUgcHVycG9zZSBvZiB0aGlzIExpY2Vuc2UuCi0gICAgIkxpY2Vuc29yIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBvZmZlcnMgdGhlIFdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLSAgICAiT3JpZ2luYWwgQXV0aG9yIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgd2hvIGNyZWF0ZWQgdGhlIFdvcmsuCi0gICAgIldvcmsiIG1lYW5zIHRoZSBjb3B5cmlnaHRhYmxlIHdvcmsgb2YgYXV0aG9yc2hpcCBvZmZlcmVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0gICAgIllvdSIgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIHdobyBoYXMgbm90IHByZXZpb3VzbHkgdmlvbGF0ZWQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8gdGhlIFdvcmssIG9yIHdobyBoYXMgcmVjZWl2ZWQgZXhwcmVzcyBwZXJtaXNzaW9uIGZyb20gdGhlIExpY2Vuc29yIHRvIGV4ZXJjaXNlIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgZGVzcGl0ZSBhIHByZXZpb3VzIHZpb2xhdGlvbi4KLQotMi4gRmFpciBVc2UgUmlnaHRzLiBOb3RoaW5nIGluIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byByZWR1Y2UsIGxpbWl0LCBvciByZXN0cmljdCBhbnkgcmlnaHRzIGFyaXNpbmcgZnJvbSBmYWlyIHVzZSwgZmlyc3Qgc2FsZSBvciBvdGhlciBsaW1pdGF0aW9ucyBvbiB0aGUgZXhjbHVzaXZlIHJpZ2h0cyBvZiB0aGUgY29weXJpZ2h0IG93bmVyIHVuZGVyIGNvcHlyaWdodCBsYXcgb3Igb3RoZXIgYXBwbGljYWJsZSBsYXdzLgotCi0zLiBMaWNlbnNlIEdyYW50LiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCAoZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXBwbGljYWJsZSBjb3B5cmlnaHQpIGxpY2Vuc2UgdG8gZXhlcmNpc2UgdGhlIHJpZ2h0cyBpbiB0aGUgV29yayBhcyBzdGF0ZWQgYmVsb3c6Ci0KLSAgICB0byByZXByb2R1Y2UgdGhlIFdvcmssIHRvIGluY29ycG9yYXRlIHRoZSBXb3JrIGludG8gb25lIG9yIG1vcmUgQ29sbGVjdGl2ZSBXb3JrcywgYW5kIHRvIHJlcHJvZHVjZSB0aGUgV29yayBhcyBpbmNvcnBvcmF0ZWQgaW4gdGhlIENvbGxlY3RpdmUgV29ya3M7Ci0gICAgdG8gY3JlYXRlIGFuZCByZXByb2R1Y2UgRGVyaXZhdGl2ZSBXb3JrczsKLSAgICB0byBkaXN0cmlidXRlIGNvcGllcyBvciBwaG9ub3JlY29yZHMgb2YsIGRpc3BsYXkgcHVibGljbHksIHBlcmZvcm0gcHVibGljbHksIGFuZCBwZXJmb3JtIHB1YmxpY2x5IGJ5IG1lYW5zIG9mIGEgZGlnaXRhbCBhdWRpbyB0cmFuc21pc3Npb24gdGhlIFdvcmsgaW5jbHVkaW5nIGFzIGluY29ycG9yYXRlZCBpbiBDb2xsZWN0aXZlIFdvcmtzOwotICAgIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9yIHBob25vcmVjb3JkcyBvZiwgZGlzcGxheSBwdWJsaWNseSwgcGVyZm9ybSBwdWJsaWNseSwgYW5kIHBlcmZvcm0gcHVibGljbHkgYnkgbWVhbnMgb2YgYSBkaWdpdGFsIGF1ZGlvIHRyYW5zbWlzc2lvbiBEZXJpdmF0aXZlIFdvcmtzLgotCi0gICAgRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQsIHdoZXJlIHRoZSB3b3JrIGlzIGEgbXVzaWNhbCBjb21wb3NpdGlvbjoKLSAgICAgICAgUGVyZm9ybWFuY2UgUm95YWx0aWVzIFVuZGVyIEJsYW5rZXQgTGljZW5zZXMuIExpY2Vuc29yIHdhaXZlcyB0aGUgZXhjbHVzaXZlIHJpZ2h0IHRvIGNvbGxlY3QsIHdoZXRoZXIgaW5kaXZpZHVhbGx5IG9yIHZpYSBhIHBlcmZvcm1hbmNlIHJpZ2h0cyBzb2NpZXR5IChlLmcuIEFTQ0FQLCBCTUksIFNFU0FDKSwgcm95YWx0aWVzIGZvciB0aGUgcHVibGljIHBlcmZvcm1hbmNlIG9yIHB1YmxpYyBkaWdpdGFsIHBlcmZvcm1hbmNlIChlLmcuIHdlYmNhc3QpIG9mIHRoZSBXb3JrLgotICAgICAgICBNZWNoYW5pY2FsIFJpZ2h0cyBhbmQgU3RhdHV0b3J5IFJveWFsdGllcy4gTGljZW5zb3Igd2FpdmVzIHRoZSBleGNsdXNpdmUgcmlnaHQgdG8gY29sbGVjdCwgd2hldGhlciBpbmRpdmlkdWFsbHkgb3IgdmlhIGEgbXVzaWMgcmlnaHRzIGFnZW5jeSBvciBkZXNpZ25hdGVkIGFnZW50IChlLmcuIEhhcnJ5IEZveCBBZ2VuY3kpLCByb3lhbHRpZXMgZm9yIGFueSBwaG9ub3JlY29yZCBZb3UgY3JlYXRlIGZyb20gdGhlIFdvcmsgKCJjb3ZlciB2ZXJzaW9uIikgYW5kIGRpc3RyaWJ1dGUsIHN1YmplY3QgdG8gdGhlIGNvbXB1bHNvcnkgbGljZW5zZSBjcmVhdGVkIGJ5IDE3IFVTQyBTZWN0aW9uIDExNSBvZiB0aGUgVVMgQ29weXJpZ2h0IEFjdCAob3IgdGhlIGVxdWl2YWxlbnQgaW4gb3RoZXIganVyaXNkaWN0aW9ucykuCi0gICAgV2ViY2FzdGluZyBSaWdodHMgYW5kIFN0YXR1dG9yeSBSb3lhbHRpZXMuIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0LCB3aGVyZSB0aGUgV29yayBpcyBhIHNvdW5kIHJlY29yZGluZywgTGljZW5zb3Igd2FpdmVzIHRoZSBleGNsdXNpdmUgcmlnaHQgdG8gY29sbGVjdCwgd2hldGhlciBpbmRpdmlkdWFsbHkgb3IgdmlhIGEgcGVyZm9ybWFuY2UtcmlnaHRzIHNvY2lldHkgKGUuZy4gU291bmRFeGNoYW5nZSksIHJveWFsdGllcyBmb3IgdGhlIHB1YmxpYyBkaWdpdGFsIHBlcmZvcm1hbmNlIChlLmcuIHdlYmNhc3QpIG9mIHRoZSBXb3JrLCBzdWJqZWN0IHRvIHRoZSBjb21wdWxzb3J5IGxpY2Vuc2UgY3JlYXRlZCBieSAxNyBVU0MgU2VjdGlvbiAxMTQgb2YgdGhlIFVTIENvcHlyaWdodCBBY3QgKG9yIHRoZSBlcXVpdmFsZW50IGluIG90aGVyIGp1cmlzZGljdGlvbnMpLgotCi1UaGUgYWJvdmUgcmlnaHRzIG1heSBiZSBleGVyY2lzZWQgaW4gYWxsIG1lZGlhIGFuZCBmb3JtYXRzIHdoZXRoZXIgbm93IGtub3duIG9yIGhlcmVhZnRlciBkZXZpc2VkLiBUaGUgYWJvdmUgcmlnaHRzIGluY2x1ZGUgdGhlIHJpZ2h0IHRvIG1ha2Ugc3VjaCBtb2RpZmljYXRpb25zIGFzIGFyZSB0ZWNobmljYWxseSBuZWNlc3NhcnkgdG8gZXhlcmNpc2UgdGhlIHJpZ2h0cyBpbiBvdGhlciBtZWRpYSBhbmQgZm9ybWF0cy4gQWxsIHJpZ2h0cyBub3QgZXhwcmVzc2x5IGdyYW50ZWQgYnkgTGljZW5zb3IgYXJlIGhlcmVieSByZXNlcnZlZC4KLQotNC4gUmVzdHJpY3Rpb25zLlRoZSBsaWNlbnNlIGdyYW50ZWQgaW4gU2VjdGlvbiAzIGFib3ZlIGlzIGV4cHJlc3NseSBtYWRlIHN1YmplY3QgdG8gYW5kIGxpbWl0ZWQgYnkgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgICBZb3UgbWF5IGRpc3RyaWJ1dGUsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIG9yIHB1YmxpY2x5IGRpZ2l0YWxseSBwZXJmb3JtIHRoZSBXb3JrIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgYW5kIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mLCBvciB0aGUgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIGZvciwgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvciBwaG9ub3JlY29yZCBvZiB0aGUgV29yayBZb3UgZGlzdHJpYnV0ZSwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgb3IgcHVibGljbHkgZGlnaXRhbGx5IHBlcmZvcm0uIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gdGhlIFdvcmsgdGhhdCBhbHRlciBvciByZXN0cmljdCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyLiBZb3UgbWF5IG5vdCBzdWJsaWNlbnNlIHRoZSBXb3JrLiBZb3UgbXVzdCBrZWVwIGludGFjdCBhbGwgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4gWW91IG1heSBub3QgZGlzdHJpYnV0ZSwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgb3IgcHVibGljbHkgZGlnaXRhbGx5IHBlcmZvcm0gdGhlIFdvcmsgd2l0aCBhbnkgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0aGF0IGNvbnRyb2wgYWNjZXNzIG9yIHVzZSBvZiB0aGUgV29yayBpbiBhIG1hbm5lciBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudC4gVGhlIGFib3ZlIGFwcGxpZXMgdG8gdGhlIFdvcmsgYXMgaW5jb3Jwb3JhdGVkIGluIGEgQ29sbGVjdGl2ZSBXb3JrLCBidXQgdGhpcyBkb2VzIG5vdCByZXF1aXJlIHRoZSBDb2xsZWN0aXZlIFdvcmsgYXBhcnQgZnJvbSB0aGUgV29yayBpdHNlbGYgdG8gYmUgbWFkZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIElmIFlvdSBjcmVhdGUgYSBDb2xsZWN0aXZlIFdvcmssIHVwb24gbm90aWNlIGZyb20gYW55IExpY2Vuc29yIFlvdSBtdXN0LCB0byB0aGUgZXh0ZW50IHByYWN0aWNhYmxlLCByZW1vdmUgZnJvbSB0aGUgQ29sbGVjdGl2ZSBXb3JrIGFueSBjcmVkaXQgYXMgcmVxdWlyZWQgYnkgY2xhdXNlIDQoYiksIGFzIHJlcXVlc3RlZC4gSWYgWW91IGNyZWF0ZSBhIERlcml2YXRpdmUgV29yaywgdXBvbiBub3RpY2UgZnJvbSBhbnkgTGljZW5zb3IgWW91IG11c3QsIHRvIHRoZSBleHRlbnQgcHJhY3RpY2FibGUsIHJlbW92ZSBmcm9tIHRoZSBEZXJpdmF0aXZlIFdvcmsgYW55IGNyZWRpdCBhcyByZXF1aXJlZCBieSBjbGF1c2UgNChiKSwgYXMgcmVxdWVzdGVkLgotICAgIElmIHlvdSBkaXN0cmlidXRlLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBvciBwdWJsaWNseSBkaWdpdGFsbHkgcGVyZm9ybSB0aGUgV29yayBvciBhbnkgRGVyaXZhdGl2ZSBXb3JrcyBvciBDb2xsZWN0aXZlIFdvcmtzLCBZb3UgbXVzdCBrZWVwIGludGFjdCBhbGwgY29weXJpZ2h0IG5vdGljZXMgZm9yIHRoZSBXb3JrIGFuZCBwcm92aWRlLCByZWFzb25hYmxlIHRvIHRoZSBtZWRpdW0gb3IgbWVhbnMgWW91IGFyZSB1dGlsaXppbmc6IChpKSB0aGUgbmFtZSBvZiB0aGUgT3JpZ2luYWwgQXV0aG9yIChvciBwc2V1ZG9ueW0sIGlmIGFwcGxpY2FibGUpIGlmIHN1cHBsaWVkLCBhbmQvb3IgKGlpKSBpZiB0aGUgT3JpZ2luYWwgQXV0aG9yIGFuZC9vciBMaWNlbnNvciBkZXNpZ25hdGUgYW5vdGhlciBwYXJ0eSBvciBwYXJ0aWVzIChlLmcuIGEgc3BvbnNvciBpbnN0aXR1dGUsIHB1Ymxpc2hpbmcgZW50aXR5LCBqb3VybmFsKSBmb3IgYXR0cmlidXRpb24gaW4gTGljZW5zb3IncyBjb3B5cmlnaHQgbm90aWNlLCB0ZXJtcyBvZiBzZXJ2aWNlIG9yIGJ5IG90aGVyIHJlYXNvbmFibGUgbWVhbnMsIHRoZSBuYW1lIG9mIHN1Y2ggcGFydHkgb3IgcGFydGllczsgdGhlIHRpdGxlIG9mIHRoZSBXb3JrIGlmIHN1cHBsaWVkOyB0byB0aGUgZXh0ZW50IHJlYXNvbmFibHkgcHJhY3RpY2FibGUsIHRoZSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIGlmIGFueSwgdGhhdCBMaWNlbnNvciBzcGVjaWZpZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBXb3JrLCB1bmxlc3Mgc3VjaCBVUkkgZG9lcyBub3QgcmVmZXIgdG8gdGhlIGNvcHlyaWdodCBub3RpY2Ugb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgV29yazsgYW5kIGluIHRoZSBjYXNlIG9mIGEgRGVyaXZhdGl2ZSBXb3JrLCBhIGNyZWRpdCBpZGVudGlmeWluZyB0aGUgdXNlIG9mIHRoZSBXb3JrIGluIHRoZSBEZXJpdmF0aXZlIFdvcmsgKGUuZy4sICJGcmVuY2ggdHJhbnNsYXRpb24gb2YgdGhlIFdvcmsgYnkgT3JpZ2luYWwgQXV0aG9yLCIgb3IgIlNjcmVlbnBsYXkgYmFzZWQgb24gb3JpZ2luYWwgV29yayBieSBPcmlnaW5hbCBBdXRob3IiKS4gU3VjaCBjcmVkaXQgbWF5IGJlIGltcGxlbWVudGVkIGluIGFueSByZWFzb25hYmxlIG1hbm5lcjsgcHJvdmlkZWQsIGhvd2V2ZXIsIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYSBEZXJpdmF0aXZlIFdvcmsgb3IgQ29sbGVjdGl2ZSBXb3JrLCBhdCBhIG1pbmltdW0gc3VjaCBjcmVkaXQgd2lsbCBhcHBlYXIgd2hlcmUgYW55IG90aGVyIGNvbXBhcmFibGUgYXV0aG9yc2hpcCBjcmVkaXQgYXBwZWFycyBhbmQgaW4gYSBtYW5uZXIgYXQgbGVhc3QgYXMgcHJvbWluZW50IGFzIHN1Y2ggb3RoZXIgY29tcGFyYWJsZSBhdXRob3JzaGlwIGNyZWRpdC4KLQotNS4gUmVwcmVzZW50YXRpb25zLCBXYXJyYW50aWVzIGFuZCBEaXNjbGFpbWVyCi0KLVVOTEVTUyBPVEhFUldJU0UgTVVUVUFMTFkgQUdSRUVEIFRPIEJZIFRIRSBQQVJUSUVTIElOIFdSSVRJTkcsIExJQ0VOU09SIE9GRkVSUyBUSEUgV09SSyBBUy1JUyBBTkQgTUFLRVMgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgQ09OQ0VSTklORyBUSEUgV09SSywgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5USUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE5PTklORlJJTkdFTUVOVCwgT1IgVEhFIEFCU0VOQ0UgT0YgTEFURU5UIE9SIE9USEVSIERFRkVDVFMsIEFDQ1VSQUNZLCBPUiBUSEUgUFJFU0VOQ0UgT0YgQUJTRU5DRSBPRiBFUlJPUlMsIFdIRVRIRVIgT1IgTk9UIERJU0NPVkVSQUJMRS4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9GIElNUExJRUQgV0FSUkFOVElFUywgU08gU1VDSCBFWENMVVNJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0KLTYuIExpbWl0YXRpb24gb24gTGlhYmlsaXR5LiBFWENFUFQgVE8gVEhFIEVYVEVOVCBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVywgSU4gTk8gRVZFTlQgV0lMTCBMSUNFTlNPUiBCRSBMSUFCTEUgVE8gWU9VIE9OIEFOWSBMRUdBTCBUSEVPUlkgRk9SIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBDT05TRVFVRU5USUFMLCBQVU5JVElWRSBPUiBFWEVNUExBUlkgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSElTIExJQ0VOU0UgT1IgVEhFIFVTRSBPRiBUSEUgV09SSywgRVZFTiBJRiBMSUNFTlNPUiBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLTcuIFRlcm1pbmF0aW9uCi0KLSAgICBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSB1cG9uIGFueSBicmVhY2ggYnkgWW91IG9mIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIEluZGl2aWR1YWxzIG9yIGVudGl0aWVzIHdobyBoYXZlIHJlY2VpdmVkIERlcml2YXRpdmUgV29ya3Mgb3IgQ29sbGVjdGl2ZSBXb3JrcyBmcm9tIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UsIGhvd2V2ZXIsIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBwcm92aWRlZCBzdWNoIGluZGl2aWR1YWxzIG9yIGVudGl0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2Ugd2l0aCB0aG9zZSBsaWNlbnNlcy4gU2VjdGlvbnMgMSwgMiwgNSwgNiwgNywgYW5kIDggd2lsbCBzdXJ2aXZlIGFueSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuCi0gICAgU3ViamVjdCB0byB0aGUgYWJvdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMsIHRoZSBsaWNlbnNlIGdyYW50ZWQgaGVyZSBpcyBwZXJwZXR1YWwgKGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFwcGxpY2FibGUgY29weXJpZ2h0IGluIHRoZSBXb3JrKS4gTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgTGljZW5zb3IgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHJlbGVhc2UgdGhlIFdvcmsgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgb3IgdG8gc3RvcCBkaXN0cmlidXRpbmcgdGhlIFdvcmsgYXQgYW55IHRpbWU7IHByb3ZpZGVkLCBob3dldmVyIHRoYXQgYW55IHN1Y2ggZWxlY3Rpb24gd2lsbCBub3Qgc2VydmUgdG8gd2l0aGRyYXcgdGhpcyBMaWNlbnNlIChvciBhbnkgb3RoZXIgbGljZW5zZSB0aGF0IGhhcyBiZWVuLCBvciBpcyByZXF1aXJlZCB0byBiZSwgZ3JhbnRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlKSwgYW5kIHRoaXMgTGljZW5zZSB3aWxsIGNvbnRpbnVlIGluIGZ1bGwgZm9yY2UgYW5kIGVmZmVjdCB1bmxlc3MgdGVybWluYXRlZCBhcyBzdGF0ZWQgYWJvdmUuCi0KLTguIE1pc2NlbGxhbmVvdXMKLQotICAgIEVhY2ggdGltZSBZb3UgZGlzdHJpYnV0ZSBvciBwdWJsaWNseSBkaWdpdGFsbHkgcGVyZm9ybSB0aGUgV29yayBvciBhIENvbGxlY3RpdmUgV29yaywgdGhlIExpY2Vuc29yIG9mZmVycyB0byB0aGUgcmVjaXBpZW50IGEgbGljZW5zZSB0byB0aGUgV29yayBvbiB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBhcyB0aGUgbGljZW5zZSBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UuCi0gICAgRWFjaCB0aW1lIFlvdSBkaXN0cmlidXRlIG9yIHB1YmxpY2x5IGRpZ2l0YWxseSBwZXJmb3JtIGEgRGVyaXZhdGl2ZSBXb3JrLCBMaWNlbnNvciBvZmZlcnMgdG8gdGhlIHJlY2lwaWVudCBhIGxpY2Vuc2UgdG8gdGhlIG9yaWdpbmFsIFdvcmsgb24gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgYXMgdGhlIGxpY2Vuc2UgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlLgotICAgIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyB0byB0aGlzIGFncmVlbWVudCwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KLSAgICBObyB0ZXJtIG9yIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIHdhaXZlZCBhbmQgbm8gYnJlYWNoIGNvbnNlbnRlZCB0byB1bmxlc3Mgc3VjaCB3YWl2ZXIgb3IgY29uc2VudCBzaGFsbCBiZSBpbiB3cml0aW5nIGFuZCBzaWduZWQgYnkgdGhlIHBhcnR5IHRvIGJlIGNoYXJnZWQgd2l0aCBzdWNoIHdhaXZlciBvciBjb25zZW50LgotICAgIFRoaXMgTGljZW5zZSBjb25zdGl0dXRlcyB0aGUgZW50aXJlIGFncmVlbWVudCBiZXR3ZWVuIHRoZSBwYXJ0aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgV29yayBsaWNlbnNlZCBoZXJlLiBUaGVyZSBhcmUgbm8gdW5kZXJzdGFuZGluZ3MsIGFncmVlbWVudHMgb3IgcmVwcmVzZW50YXRpb25zIHdpdGggcmVzcGVjdCB0byB0aGUgV29yayBub3Qgc3BlY2lmaWVkIGhlcmUuIExpY2Vuc29yIHNoYWxsIG5vdCBiZSBib3VuZCBieSBhbnkgYWRkaXRpb25hbCBwcm92aXNpb25zIHRoYXQgbWF5IGFwcGVhciBpbiBhbnkgY29tbXVuaWNhdGlvbiBmcm9tIFlvdS4gVGhpcyBMaWNlbnNlIG1heSBub3QgYmUgbW9kaWZpZWQgd2l0aG91dCB0aGUgbXV0dWFsIHdyaXR0ZW4gYWdyZWVtZW50IG9mIHRoZSBMaWNlbnNvciBhbmQgWW91LgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNvcmUtNC40LjQuTk9USUNFIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvaHR0cGNvcmUtNC40LjQuTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZkYjUzLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2h0dHBjb3JlLTQuNC40Lk5PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQotQXBhY2hlIEh0dHBDb3JlCi1Db3B5cmlnaHQgMjAwNS0yMDE1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0KLVRoaXMgcHJvamVjdCBjb250YWlucyBhbm5vdGF0aW9ucyBkZXJpdmVkIGZyb20gSkNJUC1BTk5PVEFUSU9OUwotQ29weXJpZ2h0IChjKSAyMDA1IEJyaWFuIEdvZXR6IGFuZCBUaW0gUGVpZXJscy4gU2VlIGh0dHA6Ly93d3cuamNpcC5uZXQKZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2phdmF4LXdlYnNvY2tldC1jbGllbnQtaW1wbC05LjMuNi5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qYXZheC13ZWJzb2NrZXQtY2xpZW50LWltcGwtOS4zLjYuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTNiNDhkLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2phdmF4LXdlYnNvY2tldC1jbGllbnQtaW1wbC05LjMuNi5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MTkgTWF5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFRoZSBDb250ZW50IGlzIGR1YWwgbGljZW5zZWQgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykgYXMgd2VsbCBhcyB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgVmVyc2lvbiAyLjAuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LiAgQSBjb3B5IG9mIHRoZSBBU0wgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbDwvYT4uICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08cD48Yj5qZXR0eS11dGlsPC9iPiBhcnRpZmFjdCBvbmx5Ojxici8+PGJyLz5UaGUgVW5peENyeXB0LmphdmEgY29kZSBpbXBsZW1lbnRzIHRoZSBvbmUgd2F5IGNyeXB0b2dyYXBoeSB1c2VkIGJ5Ci1Vbml4IHN5c3RlbXMgZm9yIHNpbXBsZSBwYXNzd29yZCBwcm90ZWN0aW9uLiAgQ29weXJpZ2h0IDE5OTYgQWtpIFlvc2hpZGEsCi1tb2RpZmllZCBBcHJpbCAyMDAxICBieSBJcmlzIFZhbiBkZW4gQnJvZWtlLCBEYW5pZWwgRGV2aWxsZS4KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgVW5peENyeXB0Ci1mb3Igbm9uLWNvbW1lcmNpYWwgb3IgY29tbWVyY2lhbCBwdXJwb3NlcyBhbmQgd2l0aG91dCBmZWUgaXMKLWdyYW50ZWQgcHJvdmlkZWQgdGhhdCB0aGUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qYXZheC5zZXJ2bGV0LWFwaS0zLjEuMC5DRERMLTEuMCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2phdmF4LnNlcnZsZXQtYXBpLTMuMS4wLkNEREwtMS4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGNjYzkzLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2phdmF4LnNlcnZsZXQtYXBpLTMuMS4wLkNEREwtMS4wCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wCi0KLTEuIERlZmluaXRpb25zLgotCi0gICAxLjEuIENvbnRyaWJ1dG9yLiBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLQotICAgMS4yLiBDb250cmlidXRvciBWZXJzaW9uLiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0gICAxLjMuIENvdmVyZWQgU29mdHdhcmUuIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotICAgMS40LiBFeGVjdXRhYmxlLiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLgotCi0gICAxLjUuIEluaXRpYWwgRGV2ZWxvcGVyLiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICAxLjYuIExhcmdlciBXb3JrLiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBTb2Z0d2FyZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgMS43LiBMaWNlbnNlLiBtZWFucyB0aGlzIGRvY3VtZW50LgotCi0gICAxLjguIExpY2Vuc2FibGUuIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgotCi0gICAxLjkuIE1vZGlmaWNhdGlvbnMuIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKLQotICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvcgotCi0gICAgICAgIEMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAxLjEwLiBPcmlnaW5hbCBTb2Z0d2FyZS4gbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICAxLjExLiBQYXRlbnQgQ2xhaW1zLiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KLQotICAgMS4xMi4gU291cmNlIENvZGUuIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgotCi0gICAxLjEzLiBZb3UuIChvciAuWW91ci4pIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgLllvdS4gaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIC5jb250cm9sLiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotMi4gTGljZW5zZSBHcmFudHMuCi0KLSAgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgotCi0gICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotCi0gICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLCBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLQotICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KLQotICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgotCi0gICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KLQotICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotCi0gICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4gdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotCi0gICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEpIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuCi0KLSAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgotCi0gICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvciBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAoMikgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuCi0KLTMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KLQotICAgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0gICAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi0gICAgICAzLjIuIE1vZGlmaWNhdGlvbnMuCi0gICAgICBUaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuCi0gICAgICBZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZyBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgotCi0gICAgICAzLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi0gICAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzLiByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgotCi0gICAgICAzLjUuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotICAgICAgWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnQucyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLSAgICAgIDMuNi4gTGFyZ2VyIFdvcmtzLgotICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCi0KLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi0gICAgICA0LjEuIE5ldyBWZXJzaW9ucy4KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0gICAgICBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZCBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgotCi0gICAgICA0LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotICAgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEpIHJlbmFtZSB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycyBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0KLTUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLSAgIENPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIC5BUyBJUy4gQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCi0KLTYuIFRFUk1JTkFUSU9OLgotCi0gICAgICA2LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi0KLSAgICAgIDYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzIHJlZmVycmVkIHRvIGFzIC5QYXJ0aWNpcGFudC4pIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZSBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlciB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoIFBhcnRpY2lwYW50LgotCi0gICAgICA2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotCi03LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KLQotICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFkuUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgotCi04LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotCi0gICBUaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhIC5jb21tZXJjaWFsIGl0ZW0sLiBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgLmNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUuIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4gPyAyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCAuY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uLiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotOS4gTUlTQ0VMTEFORU9VUy4KLQotICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaCBqdXJpc2RpY3Rpb24ucyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzLiBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgotCi0xMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi0gICBOT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotCi0gICBUaGUgY29kZSByZWxlYXNlZCB1bmRlciB0aGUgQ0RETCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSAoZXhjbHVkaW5nIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zKS4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mIENhbGlmb3JuaWEgYW5kIHRoZSBzdGF0ZSBjb3VydHMgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLgotCi0KLVRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0KLUNvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1QcmVhbWJsZQotCi1UaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiBUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KLQotV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi1UbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyIGdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLVdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ugd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLUZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0gcHJvcHJpZXRhcnkuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLVRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBmb2xsb3cuCi0KLQotVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLTAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gVGhlICJQcm9ncmFtIiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4gKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiBUaGUgYWN0IG9mIHJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4gV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLTEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiBJZiBpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLCBhbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZSBzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuIEJ1dCB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlIGVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0IHlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0byBleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IgY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbSB3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91ciBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90IGNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLTQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi01LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3Qgc2lnbmVkIGl0LiBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiBUaGVzZSBhY3Rpb25zIGFyZSBwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kIGFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcgdGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLTYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4gWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLgotCi03LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50IGluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3Igb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdCBleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4gdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55IHBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55IHN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzIGltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gTWFueSBwZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQgc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZyB0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8gYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLTguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluIGNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi05LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBJZiB0aGUgUHJvZ3JhbSBzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLTEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUgcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi1OTyBXQVJSQU5UWQotCi0xMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SIFJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi1FTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotCi1Ib3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdCBwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0IGZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgotCi1UbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gSXQgaXMgc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkgY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgIE9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLgotCi0gICBDb3B5cmlnaHQgKEMpCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCi0gICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUgcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5IGJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZSBtb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91ciBzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbSBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICAgc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk4OQotICAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlIGxpYnJhcnkuIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgotCi0KLSJDTEFTU1BBVEgiIEVYQ0VQVElPTiBUTyBUSEUgR1BMIFZFUlNJT04gMgotCi1DZXJ0YWluIHNvdXJjZSBmaWxlcyBkaXN0cmlidXRlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBWZXJzaW9uIDIsIGJ1dCBvbmx5IHdoZXJlIFN1biBoYXMgZXhwcmVzc2x5IGluY2x1ZGVkIGluIHRoZSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlJ3MgaGVhZGVyIHRoZSB3b3JkcwotCi0iU3VuIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgTGljZW5zZSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIKLQotTGlua2luZyB0aGlzIGxpYnJhcnkgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMgbWFraW5nIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuIFRodXMsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KLQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcyB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlc2UgaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudCBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4/IEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4/IElmIHlvdSBtb2RpZnkgdGhpcyBsaWJyYXJ5LCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uPyBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8gc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qYXZheC53ZWJzb2NrZXQtYXBpLTEuMC5DRERMLTEuMSBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2phdmF4LndlYnNvY2tldC1hcGktMS4wLkNEREwtMS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGMxMDdjLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2phdmF4LndlYnNvY2tldC1hcGktMS4wLkNEREwtMS4xCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpVmVyc2lvbiAxLjEKLQotMS4gRGVmaW5pdGlvbnMuCi0KLTEuMS4g4oCcQ29udHJpYnV0b3LigJ0gbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0xLjIuIOKAnENvbnRyaWJ1dG9yIFZlcnNpb27igJ0gbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLTEuMy4g4oCcQ292ZXJlZCBTb2Z0d2FyZeKAnSBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0xLjQuIOKAnEV4ZWN1dGFibGXigJ0gbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4KLTEuNS4g4oCcSW5pdGlhbCBEZXZlbG9wZXLigJ0gbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgTGljZW5zZS4KLTEuNi4g4oCcTGFyZ2VyIFdvcmvigJ0gbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0xLjcuIOKAnExpY2Vuc2XigJ0gbWVhbnMgdGhpcyBkb2N1bWVudC4KLTEuOC4g4oCcTGljZW5zYWJsZeKAnSBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KLTEuOS4g4oCcTW9kaWZpY2F0aW9uc+KAnSBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzoKLUEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKLUIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yCi1DLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLTEuMTAuIOKAnE9yaWdpbmFsIFNvZnR3YXJl4oCdIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KLTEuMTEuIOKAnFBhdGVudCBDbGFpbXPigJ0gbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCi0xLjEyLiDigJxTb3VyY2UgQ29kZeKAnSBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KLTEuMTMuIOKAnFlvdeKAnSAob3Ig4oCcWW91cuKAnSkgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCDigJxZb3XigJ0gaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIOKAnGNvbnRyb2zigJ0gbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0yLiBMaWNlbnNlIEdyYW50cy4KLQotMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgotMi4yLiBDb250cmlidXRvciBHcmFudC4KLUNvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKSBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSB0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMykgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KLTMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KLQotMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi1BbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotMy4yLiBNb2RpZmljYXRpb25zLgotVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KLTMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLVlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0zLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi1Zb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgotMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLVlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgotMy42LiBMYXJnZXIgV29ya3MuCi1Zb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4KLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi00LjEuIE5ldyBWZXJzaW9ucy4KLU9yYWNsZSBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbiBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuCi00LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi1Zb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZCBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgotNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KLVdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZCB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgotNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KLQotQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4g4oCcQVMgSVPigJ0gQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCi0KLTYuIFRFUk1JTkFUSU9OLgotCi02LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi02LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyDigJxQYXJ0aWNpcGFudOKAnSkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCi02LjMuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIGFnYWluc3QgUGFydGljaXBhbnQgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzIGJ5IGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8gdGhlIGluaXRpYXRpb24gb2YgcGF0ZW50IGluZnJpbmdlbWVudCBsaXRpZ2F0aW9uLCB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcyBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiBzaGFsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvciB2YWx1ZSBvZiBhbnkgcGF5bWVudCBvciBsaWNlbnNlLgotNi40LiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMiBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLTcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotCi1VTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgotCi04LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotCi1UaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhIOKAnGNvbW1lcmNpYWwgaXRlbSzigJ0gYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4gNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIOKAnGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmXigJ0gKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDCpyAyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCDigJxjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb27igJ0gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTkuIE1JU0NFTExBTkVPVVMuCi0KLVRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gganVyaXNkaWN0aW9uJ3MgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KLQotMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCi0KLUFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KLQotTk9USUNFIFBVUlNVQU5UIFRPIFNFQ1RJT04gOSBPRiBUSEUgQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkKLQotVGhlIGNvZGUgcmVsZWFzZWQgdW5kZXIgdGhlIENEREwgc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEgKGV4Y2x1ZGluZyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucykuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIEZlZGVyYWwgQ291cnRzIG9mIHRoZSBOb3J0aGVybiBEaXN0cmljdCBvZiBDYWxpZm9ybmlhIGFuZCB0aGUgc3RhdGUgY291cnRzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCB3aXRoIHZlbnVlIGx5aW5nIGluIFNhbnRhIENsYXJhIENvdW50eSwgQ2FsaWZvcm5pYS4KLQotCi0KLVRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi1Db3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi01OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLW9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1QcmVhbWJsZQotCi1UaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiBUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KLQotV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi1UbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyIGdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCi0KLVdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ugd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLUZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0gcHJvcHJpZXRhcnkuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLVRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBmb2xsb3cuCi0KLVRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0wLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFRoZSAiUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIgbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gVGhlIGFjdCBvZiBydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0xLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLTIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi1iKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4gd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55IHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLWMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gSWYgaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwgYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluIHRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2Ugc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiBCdXQgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZSBlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdCB5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8gZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0gd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLTMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1hKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLWIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi1jKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgotCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi00LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90IHNpZ25lZCBpdC4gSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZCBhbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nIHRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi02LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4KLQotNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudCBpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLCBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yIG90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QgZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gSWYgeW91IGNhbm5vdCBkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueSBwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueSBzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuIE1hbnkgcGVvcGxlIGhhdmUgbWFkZSBnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0IHN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcgdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90IGltcG9zZSB0aGF0IGNob2ljZS4KLQotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi04LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbiBjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0xMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlIHByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotTk8gV0FSUkFOVFkKLQotMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLTEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUiBSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLUhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwotCi1JZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0IHBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQgZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLVRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiBJdCBpcyBzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotT25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuCi1Db3B5cmlnaHQgKEMpIDx5ZWFyPiA8bmFtZSBvZiBhdXRob3I+Ci1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLUdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvciBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heSBiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUgbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIgc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LiBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLVlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0gYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi1zaWduYXR1cmUgb2YgVHkgQ29vbiwgMSBBcHJpbCAxOTg5Ci1UeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlIGxpYnJhcnkuIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgotCi0iQ0xBU1NQQVRIIiBFWENFUFRJT04gVE8gVEhFIEdQTCBWRVJTSU9OIDIKLQotQ2VydGFpbiBzb3VyY2UgZmlsZXMgZGlzdHJpYnV0ZWQgYnkgT3JhY2xlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBWZXJzaW9uIDIsIGJ1dCBvbmx5IHdoZXJlIE9yYWNsZSBoYXMgZXhwcmVzc2x5IGluY2x1ZGVkIGluIHRoZSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlJ3MgaGVhZGVyIHRoZSB3b3JkcyAiT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgTGljZW5zZSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIgCi0KLUxpbmtpbmcgdGhpcyBsaWJyYXJ5IHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZyBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiAgVGh1cywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLiAKLQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcyB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlc2UgaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudCBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4gIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIElmIHlvdSBtb2RpZnkgdGhpcyBsaWJyYXJ5LCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8gc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCi0KLQotCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1odHRwLTkuMy42LkFMLTIuMCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LWh0dHAtOS4zLjYuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTNiNDhkLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LWh0dHAtOS4zLjYuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjE5IE1heSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBUaGUgQ29udGVudCBpcyBkdWFsIGxpY2Vuc2VkIGFuZCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspIGFzIHdlbGwgYXMgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIFZlcnNpb24gMi4wLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4gIEEgY29weSBvZiB0aGUgQVNMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LiAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPHA+PGI+amV0dHktdXRpbDwvYj4gYXJ0aWZhY3Qgb25seTo8YnIvPjxici8+VGhlIFVuaXhDcnlwdC5qYXZhIGNvZGUgaW1wbGVtZW50cyB0aGUgb25lIHdheSBjcnlwdG9ncmFwaHkgdXNlZCBieQotVW5peCBzeXN0ZW1zIGZvciBzaW1wbGUgcGFzc3dvcmQgcHJvdGVjdGlvbi4gIENvcHlyaWdodCAxOTk2IEFraSBZb3NoaWRhLAotbW9kaWZpZWQgQXByaWwgMjAwMSAgYnkgSXJpcyBWYW4gZGVuIEJyb2VrZSwgRGFuaWVsIERldmlsbGUuCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIFVuaXhDcnlwdAotZm9yIG5vbi1jb21tZXJjaWFsIG9yIGNvbW1lcmNpYWwgcHVycG9zZXMgYW5kIHdpdGhvdXQgZmVlIGlzCi1ncmFudGVkIHByb3ZpZGVkIHRoYXQgdGhlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktaW8tOS4zLjYuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktaW8tOS4zLjYuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTNiNDhkLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LWlvLTkuMy42LkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4xOSBNYXksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVGhlIENvbnRlbnQgaXMgZHVhbCBsaWNlbnNlZCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KSBhcyB3ZWxsIGFzIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSBWZXJzaW9uIDIuMC4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uICBBIGNvcHkgb2YgdGhlIEFTTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi4gIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxwPjxiPmpldHR5LXV0aWw8L2I+IGFydGlmYWN0IG9ubHk6PGJyLz48YnIvPlRoZSBVbml4Q3J5cHQuamF2YSBjb2RlIGltcGxlbWVudHMgdGhlIG9uZSB3YXkgY3J5cHRvZ3JhcGh5IHVzZWQgYnkKLVVuaXggc3lzdGVtcyBmb3Igc2ltcGxlIHBhc3N3b3JkIHByb3RlY3Rpb24uICBDb3B5cmlnaHQgMTk5NiBBa2kgWW9zaGlkYSwKLW1vZGlmaWVkIEFwcmlsIDIwMDEgIGJ5IElyaXMgVmFuIGRlbiBCcm9la2UsIERhbmllbCBEZXZpbGxlLgotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSBVbml4Q3J5cHQKLWZvciBub24tY29tbWVyY2lhbCBvciBjb21tZXJjaWFsIHB1cnBvc2VzIGFuZCB3aXRob3V0IGZlZSBpcwotZ3JhbnRlZCBwcm92aWRlZCB0aGF0IHRoZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LXNlY3VyaXR5LTkuMy42LkFMLTIuMCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LXNlY3VyaXR5LTkuMy42LkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzYjQ4ZC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1zZWN1cml0eS05LjMuNi5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MTkgTWF5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFRoZSBDb250ZW50IGlzIGR1YWwgbGljZW5zZWQgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykgYXMgd2VsbCBhcyB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgVmVyc2lvbiAyLjAuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LiAgQSBjb3B5IG9mIHRoZSBBU0wgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbDwvYT4uICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08cD48Yj5qZXR0eS11dGlsPC9iPiBhcnRpZmFjdCBvbmx5Ojxici8+PGJyLz5UaGUgVW5peENyeXB0LmphdmEgY29kZSBpbXBsZW1lbnRzIHRoZSBvbmUgd2F5IGNyeXB0b2dyYXBoeSB1c2VkIGJ5Ci1Vbml4IHN5c3RlbXMgZm9yIHNpbXBsZSBwYXNzd29yZCBwcm90ZWN0aW9uLiAgQ29weXJpZ2h0IDE5OTYgQWtpIFlvc2hpZGEsCi1tb2RpZmllZCBBcHJpbCAyMDAxICBieSBJcmlzIFZhbiBkZW4gQnJvZWtlLCBEYW5pZWwgRGV2aWxsZS4KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgVW5peENyeXB0Ci1mb3Igbm9uLWNvbW1lcmNpYWwgb3IgY29tbWVyY2lhbCBwdXJwb3NlcyBhbmQgd2l0aG91dCBmZWUgaXMKLWdyYW50ZWQgcHJvdmlkZWQgdGhhdCB0aGUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1zZXJ2ZXItOS4zLjYuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktc2VydmVyLTkuMy42LkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzYjQ4ZC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1zZXJ2ZXItOS4zLjYuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjE5IE1heSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBUaGUgQ29udGVudCBpcyBkdWFsIGxpY2Vuc2VkIGFuZCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspIGFzIHdlbGwgYXMgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIFZlcnNpb24gMi4wLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4gIEEgY29weSBvZiB0aGUgQVNMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LiAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPHA+PGI+amV0dHktdXRpbDwvYj4gYXJ0aWZhY3Qgb25seTo8YnIvPjxici8+VGhlIFVuaXhDcnlwdC5qYXZhIGNvZGUgaW1wbGVtZW50cyB0aGUgb25lIHdheSBjcnlwdG9ncmFwaHkgdXNlZCBieQotVW5peCBzeXN0ZW1zIGZvciBzaW1wbGUgcGFzc3dvcmQgcHJvdGVjdGlvbi4gIENvcHlyaWdodCAxOTk2IEFraSBZb3NoaWRhLAotbW9kaWZpZWQgQXByaWwgMjAwMSAgYnkgSXJpcyBWYW4gZGVuIEJyb2VrZSwgRGFuaWVsIERldmlsbGUuCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIFVuaXhDcnlwdAotZm9yIG5vbi1jb21tZXJjaWFsIG9yIGNvbW1lcmNpYWwgcHVycG9zZXMgYW5kIHdpdGhvdXQgZmVlIGlzCi1ncmFudGVkIHByb3ZpZGVkIHRoYXQgdGhlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktc2VydmxldC05LjMuNi5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1zZXJ2bGV0LTkuMy42LkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzYjQ4ZC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS1zZXJ2bGV0LTkuMy42LkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4xOSBNYXksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVGhlIENvbnRlbnQgaXMgZHVhbCBsaWNlbnNlZCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KSBhcyB3ZWxsIGFzIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSBWZXJzaW9uIDIuMC4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uICBBIGNvcHkgb2YgdGhlIEFTTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi4gIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxwPjxiPmpldHR5LXV0aWw8L2I+IGFydGlmYWN0IG9ubHk6PGJyLz48YnIvPlRoZSBVbml4Q3J5cHQuamF2YSBjb2RlIGltcGxlbWVudHMgdGhlIG9uZSB3YXkgY3J5cHRvZ3JhcGh5IHVzZWQgYnkKLVVuaXggc3lzdGVtcyBmb3Igc2ltcGxlIHBhc3N3b3JkIHByb3RlY3Rpb24uICBDb3B5cmlnaHQgMTk5NiBBa2kgWW9zaGlkYSwKLW1vZGlmaWVkIEFwcmlsIDIwMDEgIGJ5IElyaXMgVmFuIGRlbiBCcm9la2UsIERhbmllbCBEZXZpbGxlLgotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSBVbml4Q3J5cHQKLWZvciBub24tY29tbWVyY2lhbCBvciBjb21tZXJjaWFsIHB1cnBvc2VzIGFuZCB3aXRob3V0IGZlZSBpcwotZ3JhbnRlZCBwcm92aWRlZCB0aGF0IHRoZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LXV0aWwtOS4zLjYuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktdXRpbC05LjMuNi5BTC0yLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2I0OGQuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktdXRpbC05LjMuNi5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MTkgTWF5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFRoZSBDb250ZW50IGlzIGR1YWwgbGljZW5zZWQgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykgYXMgd2VsbCBhcyB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgVmVyc2lvbiAyLjAuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LiAgQSBjb3B5IG9mIHRoZSBBU0wgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbDwvYT4uICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08cD48Yj5qZXR0eS11dGlsPC9iPiBhcnRpZmFjdCBvbmx5Ojxici8+PGJyLz5UaGUgVW5peENyeXB0LmphdmEgY29kZSBpbXBsZW1lbnRzIHRoZSBvbmUgd2F5IGNyeXB0b2dyYXBoeSB1c2VkIGJ5Ci1Vbml4IHN5c3RlbXMgZm9yIHNpbXBsZSBwYXNzd29yZCBwcm90ZWN0aW9uLiAgQ29weXJpZ2h0IDE5OTYgQWtpIFlvc2hpZGEsCi1tb2RpZmllZCBBcHJpbCAyMDAxICBieSBJcmlzIFZhbiBkZW4gQnJvZWtlLCBEYW5pZWwgRGV2aWxsZS4KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgVW5peENyeXB0Ci1mb3Igbm9uLWNvbW1lcmNpYWwgb3IgY29tbWVyY2lhbCBwdXJwb3NlcyBhbmQgd2l0aG91dCBmZWUgaXMKLWdyYW50ZWQgcHJvdmlkZWQgdGhhdCB0aGUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS13ZWJhcHAtOS4zLjYuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHktd2ViYXBwLTkuMy42LkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzYjQ4ZC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qZXR0eS13ZWJhcHAtOS4zLjYuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjE5IE1heSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBUaGUgQ29udGVudCBpcyBkdWFsIGxpY2Vuc2VkIGFuZCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspIGFzIHdlbGwgYXMgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIFZlcnNpb24gMi4wLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4gIEEgY29weSBvZiB0aGUgQVNMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LiAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPHA+PGI+amV0dHktdXRpbDwvYj4gYXJ0aWZhY3Qgb25seTo8YnIvPjxici8+VGhlIFVuaXhDcnlwdC5qYXZhIGNvZGUgaW1wbGVtZW50cyB0aGUgb25lIHdheSBjcnlwdG9ncmFwaHkgdXNlZCBieQotVW5peCBzeXN0ZW1zIGZvciBzaW1wbGUgcGFzc3dvcmQgcHJvdGVjdGlvbi4gIENvcHlyaWdodCAxOTk2IEFraSBZb3NoaWRhLAotbW9kaWZpZWQgQXByaWwgMjAwMSAgYnkgSXJpcyBWYW4gZGVuIEJyb2VrZSwgRGFuaWVsIERldmlsbGUuCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIFVuaXhDcnlwdAotZm9yIG5vbi1jb21tZXJjaWFsIG9yIGNvbW1lcmNpYWwgcHVycG9zZXMgYW5kIHdpdGhvdXQgZmVlIGlzCi1ncmFudGVkIHByb3ZpZGVkIHRoYXQgdGhlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHkteG1sLTkuMy42LkFMLTIuMCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pldHR5LXhtbC05LjMuNi5BTC0yLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2I0OGQuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamV0dHkteG1sLTkuMy42LkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4xOSBNYXksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVGhlIENvbnRlbnQgaXMgZHVhbCBsaWNlbnNlZCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KSBhcyB3ZWxsIGFzIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSBWZXJzaW9uIDIuMC4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uICBBIGNvcHkgb2YgdGhlIEFTTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi4gIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxwPjxiPmpldHR5LXV0aWw8L2I+IGFydGlmYWN0IG9ubHk6PGJyLz48YnIvPlRoZSBVbml4Q3J5cHQuamF2YSBjb2RlIGltcGxlbWVudHMgdGhlIG9uZSB3YXkgY3J5cHRvZ3JhcGh5IHVzZWQgYnkKLVVuaXggc3lzdGVtcyBmb3Igc2ltcGxlIHBhc3N3b3JkIHByb3RlY3Rpb24uICBDb3B5cmlnaHQgMTk5NiBBa2kgWW9zaGlkYSwKLW1vZGlmaWVkIEFwcmlsIDIwMDEgIGJ5IElyaXMgVmFuIGRlbiBCcm9la2UsIERhbmllbCBEZXZpbGxlLgotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSBVbml4Q3J5cHQKLWZvciBub24tY29tbWVyY2lhbCBvciBjb21tZXJjaWFsIHB1cnBvc2VzIGFuZCB3aXRob3V0IGZlZSBpcwotZ3JhbnRlZCBwcm92aWRlZCB0aGF0IHRoZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pvZGEtdGltZS0yLjkuMi5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qb2RhLXRpbWUtMi45LjIuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI1MjQ4Li4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2pvZGEtdGltZS0yLjkuMi5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qb2RhLXRpbWUtMi45LjIuTk9USUNFIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvam9kYS10aW1lLTIuOS4yLk5PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5NTgzNC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qb2RhLXRpbWUtMi45LjIuTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLT0gTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDRkIG9mIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCA9DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5DQotSm9kYS5vcmcgKGh0dHA6Ly93d3cuam9kYS5vcmcvKS4NCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9rYWZrYS1jbGllbnRzLTAuOC4yLjIuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uva2Fma2EtY2xpZW50cy0wLjguMi4yLkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9rYWZrYS1jbGllbnRzLTAuOC4yLjIuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9rYWZrYS1jbGllbnRzLTAuOC4yLjIuTk9USUNFIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uva2Fma2EtY2xpZW50cy0wLjguMi4yLk5PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2NTZkMy4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9rYWZrYS1jbGllbnRzLTAuOC4yLjIuTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1BcGFjaGUgS2Fma2EKLUNvcHlyaWdodCAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2thZmthXzIuMTAtMC44LjIuMi5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9rYWZrYV8yLjEwLTAuOC4yLjIuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2thZmthXzIuMTAtMC44LjIuMi5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2thZmthXzIuMTAtMC44LjIuMi5OT1RJQ0UgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9rYWZrYV8yLjEwLTAuOC4yLjIuTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzY1NmQzLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2thZmthXzIuMTAtMC44LjIuMi5OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUFwYWNoZSBLYWZrYQotQ29weXJpZ2h0IDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbG9nNGotMS4yLjE2LkFMLTIuMCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2xvZzRqLTEuMi4xNi5BTC0yLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzllNTIuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbG9nNGotMS4yLjE2LkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCAxOTk5LTIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9sb2c0ai0xLjIuMTYuTk9USUNFIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbG9nNGotMS4yLjE2Lk5PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3NTczMi4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9sb2c0ai0xLjIuMTYuTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1BcGFjaGUgbG9nNGoKLUNvcHlyaWdodCAyMDA3IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2xvZzRqLTEuMi4xNy5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9sb2c0ai0xLjIuMTcuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5ZTUyLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2xvZzRqLTEuMi4xNy5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgMTk5OS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbG9nNGotMS4yLjE3Lk5PVElDRSBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL2xvZzRqLTEuMi4xNy5OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzU3MzIuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbG9nNGotMS4yLjE3Lk5PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQXBhY2hlIGxvZzRqCi1Db3B5cmlnaHQgMjAwNyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9tZXRyaWNzLWNvcmUtMi4yLjAuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbWV0cmljcy1jb3JlLTIuMi4wLkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiYTQwNC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9tZXRyaWNzLWNvcmUtMi4yLjAuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IDIwMTAtMjAxMiBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbWV0cmljcy1jb3JlLTIuMi4wLk5PVElDRSBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21ldHJpY3MtY29yZS0yLjIuMC5OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNzY5OTQuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbWV0cmljcy1jb3JlLTIuMi4wLk5PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1ldHJpY3MKLUNvcHlyaWdodCAyMDEwLTIwMTIgQ29kYSBIYWxlIGFuZCBZYW1tZXIsIEluYy4KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgY29kZSBkZXJpdmVkIGZyb20gdGhlIEpTUi0xNjYgcHJvamVjdCAoVGhyZWFkTG9jYWxSYW5kb20pLCB3aGljaCB3YXMgcmVsZWFzZWQKLXdpdGggdGhlIGZvbGxvd2luZyBjb21tZW50czoKLQotICAgIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgotICAgIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAotICAgIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21ldHJpY3MtY29yZS0zLjEuMi5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9tZXRyaWNzLWNvcmUtMy4xLjIuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGJhNDA0Li4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21ldHJpY3MtY29yZS0zLjEuMi5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgMjAxMC0yMDEyIENvZGEgSGFsZSBhbmQgWWFtbWVyLCBJbmMuCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9tZXRyaWNzLWNvcmUtMy4xLjIuTk9USUNFIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbWV0cmljcy1jb3JlLTMuMS4yLk5PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlODNkZS4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9tZXRyaWNzLWNvcmUtMy4xLjIuTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWV0cmljcwotQ29weXJpZ2h0IDIwMTAtMjAxMyBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvZGEgSGFsZSBhbmQgWWFtbWVyLCBJbmMuCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgSlNSLTE2NiBwcm9qZWN0IChUaHJlYWRMb2NhbFJhbmRvbSwgU3RyaXBlZDY0LAotTG9uZ0FkZGVyKSwgd2hpY2ggd2FzIHJlbGVhc2VkIHdpdGggdGhlIGZvbGxvd2luZyBjb21tZW50czoKLQotICAgIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgotICAgIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAotICAgIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21xdHR2My0xLjEuMC5FREwtMS4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbXF0dHYzLTEuMS4wLkVETC0xLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTVhNDQuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvbXF0dHYzLTEuMS4wLkVETC0xLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjxlbT5EZWNlbWJlciA5LCAyMDEzPC9lbT48L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCJDb250ZW50IikuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wICgiRURMIikuCi1BIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgCi08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+IAotYW5kIGEgY29weSBvZiB0aGUgRURMIGlzIGF2YWlsYWJsZSBhdCAKLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwPC9hPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvc2NhbGEtMi4xMC40LkJTRCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3NjYWxhLTIuMTAuNC5CU0QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYWVkZWYuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvc2NhbGEtMi4xMC40LkJTRAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVNjYWxhIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBbQlNEIDMtQ2xhdXNlIExpY2Vuc2VdKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UpLgotCi0jIyBTY2FsYSBMaWNlbnNlCi0KLUNvcHlyaWdodCAoYykgMjAwMi0yMDEzIEVQRkwKLQotQ29weXJpZ2h0IChjKSAyMDExLTIwMTMgVHlwZXNhZmUsIEluYy4KLQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKLWFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRVBGTCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi1DT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLVBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSMgT3RoZXIgTGljZW5zZXMKLQotVGhpcyBzb2Z0d2FyZSBpbmNsdWRlcyBwcm9qZWN0cyB3aXRoIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMsCi13aGljaCBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGUgYGxpY2Vuc2VzL2AgZGlyZWN0b3J5OgotCi0jIyMgW0FwYWNoZSBMaWNlbnNlXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCkKLVRoaXMgbGljZW5zZSBpcyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGhpcmQtcGFydHkgbGlicmFyaWVzOgotICAqIGphbnNpCi0KLSMjIyBbQlNEIExpY2Vuc2VdKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQotVGhpcyBsaWNlbnNlIGlzIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0aGlyZC1wYXJ0eSBsaWJyYXJpZXM6Ci0gICogamxpbmUKLQotIyMjIFtCU0QgMy1DbGF1c2UgTGljZW5zZV0oaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZSkKLVRoaXMgbGljZW5zZSBpcyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGhpcmQtcGFydHkgbGlicmFyaWVzOgotICAqIGFzbQotCi0jIyMgW01JVCBMaWNlbnNlXShodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkKLVRoaXMgbGljZW5zZSBpcyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGhpcmQtcGFydHkgbGlicmFyaWVzOgotICAqIGpxdWVyeQotICAqIGpxdWVyeS11aQotICAqIGpxdWVyeS1sYXlvdXQKLSAgKiBzaXp6bGUKLSAgKiB0b29scyB0b29sdGlwCi0KLSMjIyBQdWJsaWMgRG9tYWluCi1UaGUgZm9sbG93aW5nIGxpYnJhcmllcyBhcmUgZnJlZWx5IGF2YWlsYWJsZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKLSAgKiBmb3Jram9pbgotCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9zbGY0ajEuNy4xMi5NSVQgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9zbGY0ajEuNy4xMi5NSVQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NmQ1NTYuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvc2xmNGoxLjcuMTIuTUlUCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIENvcHlyaWdodCAoYykgMjAwNC0yMDEzIFFPUy5jaAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlICBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gYSAgY29weSAgb2YgdGhpcyAgc29mdHdhcmUgIGFuZCAgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAgKHRoZQotICJTb2Z0d2FyZSIpLCB0byAgZGVhbCBpbiAgdGhlIFNvZnR3YXJlIHdpdGhvdXQgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSB3aXRob3V0IGxpbWl0YXRpb24gIHRoZSByaWdodHMgdG8gIHVzZSwgY29weSwgbW9kaWZ5LCAgbWVyZ2UsIHB1Ymxpc2gsCi0gZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICBjb3BpZXMgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCB0bwotIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlICBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gCi0gVGhlICBhYm92ZSAgY29weXJpZ2h0ICBub3RpY2UgIGFuZCAgdGhpcyBwZXJtaXNzaW9uICBub3RpY2UgIHNoYWxsICBiZQotIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIAotIFRIRSAgU09GVFdBUkUgSVMgIFBST1ZJREVEICAiQVMgIElTIiwgV0lUSE9VVCAgV0FSUkFOVFkgIE9GIEFOWSAgS0lORCwKLSBFWFBSRVNTIE9SICBJTVBMSUVELCBJTkNMVURJTkcgIEJVVCBOT1QgTElNSVRFRCAgVE8gVEhFICBXQVJSQU5USUVTIE9GCi0gTUVSQ0hBTlRBQklMSVRZLCAgICBGSVRORVNTICAgIEZPUiAgICBBICAgUEFSVElDVUxBUiAgICBQVVJQT1NFICAgIEFORAotIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS93YXRzb24taW90LTAuMi4yLkVQTC0xLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS93YXRzb24taW90LTAuMi4yLkVQTC0xLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMzI4NDMuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvd2F0c29uLWlvdC0wLjIuMi5FUEwtMS4wCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMAotCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMKLUxJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTQotQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KLQotMS4gREVGSU5JVElPTlMKLQotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6Ci0KLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCi1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6Ci0gICAgaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCi0gICBpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOwotCi0gICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlCi0gICBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJwotICAgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yCi0gICBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdAotICAgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZgotICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24KLSAgIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCi0KLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KLQotIkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlCi1uZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbgotY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KLQotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCi1BZ3JlZW1lbnQuCi0KLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsCi1pbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KLQotMi4gR1JBTlQgT0YgUklHSFRTCi0gIGEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLSAgICAgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8KLSAgICAgcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5Ci0gICAgIHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLAotICAgICBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLgotICBiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi0gICAgIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyCi0gICAgIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZQotICAgICB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kCi0gICAgIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mCi0gICAgIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzCi0gICAgIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoCi0gICAgIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZQotICAgICBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uCi0gICAgIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCi0gIGMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcwotICAgICB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkKLSAgICAgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyCi0gICAgIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvcgotICAgICBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlcgotICAgICBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3IKLSAgICAgb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQKLSAgICAgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZQotICAgICBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEKLSAgICAgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLSAgICAgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlCi0gICAgIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCi0gIGQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQKLSAgICAgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQKLSAgICAgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCi0KLTMuIFJFUVVJUkVNRU5UUwotCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyCi1pdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgotCi0gIGEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLSAgYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgotICAgICAgaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzCi0gICAgICAgICBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IKLSAgICAgICAgIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKLSAgICAgICAgIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKLSAgICAgaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yCi0gICAgICAgICBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQKLSAgICAgICAgIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0gICAgaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUKLSAgICAgICAgIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCi0gICAgIGl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaAotICAgICAgICAgQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZQotICAgICAgICAgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKLQotICBhKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKLSAgYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCi0gICAgIENvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCi0gICAgIHdpdGhpbiB0aGUgUHJvZ3JhbS4KLQotRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLAotaWYKLWFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlCi1vcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCi0KLUNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGgKLXJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcwotaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8KLWluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lcgotd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLAotaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaAotQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeQotZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywKLWRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZAotb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQKLUNvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcwotb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLWluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDoKLWEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZAotYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKLW5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdAotaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZgotdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMKLXdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUKLXN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIKLUNvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgotCi01LiBOTyBXQVJSQU5UWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgotSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKLU5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaAotUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZwotYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUKLXJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvCi1vciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZgotb3BlcmF0aW9ucy4KLQotNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkKLUNPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04KLUxPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCi1FWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCi1PRiBTVUNIIERBTUFHRVMuCi0KLTcuIEdFTkVSQUwKLQotSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUKLXJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZQotcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudAotbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi1jcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZgotKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkKLWluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkCi11bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8KLWNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcwotbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZgotc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwKLVJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcwotcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLWFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUKLWFuZCBzdXJ2aXZlLgotCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbgotb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZQotbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8KLXB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8KLXRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzCi1BZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZQotRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsCi1iZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCi1BZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkKLXN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yCi1saWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwKLXdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZQotUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZQotaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcwotQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyCi1hZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbgotYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3dlYnNvY2tldC1hcGktOS4zLjYuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvd2Vic29ja2V0LWFwaS05LjMuNi5BTC0yLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2I0OGQuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvd2Vic29ja2V0LWFwaS05LjMuNi5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MTkgTWF5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFRoZSBDb250ZW50IGlzIGR1YWwgbGljZW5zZWQgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykgYXMgd2VsbCBhcyB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgVmVyc2lvbiAyLjAuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LiAgQSBjb3B5IG9mIHRoZSBBU0wgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbDwvYT4uICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08cD48Yj5qZXR0eS11dGlsPC9iPiBhcnRpZmFjdCBvbmx5Ojxici8+PGJyLz5UaGUgVW5peENyeXB0LmphdmEgY29kZSBpbXBsZW1lbnRzIHRoZSBvbmUgd2F5IGNyeXB0b2dyYXBoeSB1c2VkIGJ5Ci1Vbml4IHN5c3RlbXMgZm9yIHNpbXBsZSBwYXNzd29yZCBwcm90ZWN0aW9uLiAgQ29weXJpZ2h0IDE5OTYgQWtpIFlvc2hpZGEsCi1tb2RpZmllZCBBcHJpbCAyMDAxICBieSBJcmlzIFZhbiBkZW4gQnJvZWtlLCBEYW5pZWwgRGV2aWxsZS4KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgVW5peENyeXB0Ci1mb3Igbm9uLWNvbW1lcmNpYWwgb3IgY29tbWVyY2lhbCBwdXJwb3NlcyBhbmQgd2l0aG91dCBmZWUgaXMKLWdyYW50ZWQgcHJvdmlkZWQgdGhhdCB0aGUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS93ZWJzb2NrZXQtY2xpZW50LTkuMy42LkFMLTIuMCBiL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3dlYnNvY2tldC1jbGllbnQtOS4zLjYuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTNiNDhkLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3dlYnNvY2tldC1jbGllbnQtOS4zLjYuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjE5IE1heSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBUaGUgQ29udGVudCBpcyBkdWFsIGxpY2Vuc2VkIGFuZCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspIGFzIHdlbGwgYXMgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIFZlcnNpb24gMi4wLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4gIEEgY29weSBvZiB0aGUgQVNMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LiAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPHA+PGI+amV0dHktdXRpbDwvYj4gYXJ0aWZhY3Qgb25seTo8YnIvPjxici8+VGhlIFVuaXhDcnlwdC5qYXZhIGNvZGUgaW1wbGVtZW50cyB0aGUgb25lIHdheSBjcnlwdG9ncmFwaHkgdXNlZCBieQotVW5peCBzeXN0ZW1zIGZvciBzaW1wbGUgcGFzc3dvcmQgcHJvdGVjdGlvbi4gIENvcHlyaWdodCAxOTk2IEFraSBZb3NoaWRhLAotbW9kaWZpZWQgQXByaWwgMjAwMSAgYnkgSXJpcyBWYW4gZGVuIEJyb2VrZSwgRGFuaWVsIERldmlsbGUuCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIFVuaXhDcnlwdAotZm9yIG5vbi1jb21tZXJjaWFsIG9yIGNvbW1lcmNpYWwgcHVycG9zZXMgYW5kIHdpdGhvdXQgZmVlIGlzCi1ncmFudGVkIHByb3ZpZGVkIHRoYXQgdGhlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvd2Vic29ja2V0LWNvbW1vbi05LjMuNi5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS93ZWJzb2NrZXQtY29tbW9uLTkuMy42LkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzYjQ4ZC4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS93ZWJzb2NrZXQtY29tbW9uLTkuMy42LkFMLTIuMAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4xOSBNYXksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVGhlIENvbnRlbnQgaXMgZHVhbCBsaWNlbnNlZCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KSBhcyB3ZWxsIGFzIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSBWZXJzaW9uIDIuMC4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uICBBIGNvcHkgb2YgdGhlIEFTTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi4gIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxwPjxiPmpldHR5LXV0aWw8L2I+IGFydGlmYWN0IG9ubHk6PGJyLz48YnIvPlRoZSBVbml4Q3J5cHQuamF2YSBjb2RlIGltcGxlbWVudHMgdGhlIG9uZSB3YXkgY3J5cHRvZ3JhcGh5IHVzZWQgYnkKLVVuaXggc3lzdGVtcyBmb3Igc2ltcGxlIHBhc3N3b3JkIHByb3RlY3Rpb24uICBDb3B5cmlnaHQgMTk5NiBBa2kgWW9zaGlkYSwKLW1vZGlmaWVkIEFwcmlsIDIwMDEgIGJ5IElyaXMgVmFuIGRlbiBCcm9la2UsIERhbmllbCBEZXZpbGxlLgotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSBVbml4Q3J5cHQKLWZvciBub24tY29tbWVyY2lhbCBvciBjb21tZXJjaWFsIHB1cnBvc2VzIGFuZCB3aXRob3V0IGZlZSBpcwotZ3JhbnRlZCBwcm92aWRlZCB0aGF0IHRoZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3prY2xpZW50LTAuMy5BTC0yLjAgYi9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS96a2NsaWVudC0wLjMuQUwtMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTU0MDMxLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL3prY2xpZW50LTAuMy5BTC0yLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgMjAwOSBTdGVmYW4gR3Jvc2NodXBmCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS96b29rZWVwZXItMy40LjYuQUwtMi4wIGIvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvem9va2VlcGVyLTMuNC42LkFMLTIuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9iaW5hcnktcmVsZWFzZS96b29rZWVwZXItMy40LjYuQUwtMi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWNlbnNlcy9kMy1sZWdlbmQuTUlUIGIvbGljZW5zZXMvZDMtbGVnZW5kLk1JVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkZTg3OS4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9kMy1sZWdlbmQuTUlUCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotY29uc29sZS9zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvZDMubGVnZW5kLmpzCi1MaWNlbnNlIHR5cGU6IE1JVAotCi0gIENvcHlyaWdodCAoYykgMjAxMiB6aWdneS5qb25zc29uLm55Y0BnbWFpbC5jb20KLQotICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAgCi0gIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCi0gIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICAKLSAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0gIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0gIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvZDMtc2Fua2V5LkJTRCBiL2xpY2Vuc2VzL2QzLXNhbmtleS5CU0QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODJhYTAuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvZDMtc2Fua2V5LkJTRAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWNvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L3NhbmtleV9lZGdlbnQuanMKLUxpY2Vuc2UgdHlwZTogQlNEIDMtQ2xhdXNlIGxpY2Vuc2UKLQotICBDb3B5cmlnaHQgMjAxNSwgTWlrZSBCb3N0b2NrCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKLSAgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCi0gICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvZDMuQlNEIGIvbGljZW5zZXMvZDMuQlNECmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzUwOGVmLi4wMDAwMDAwCi0tLSBhL2xpY2Vuc2VzL2QzLkJTRAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWNvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2QzLm1pbi5qcwotTGljZW5zZSB0eXBlOiBCU0QgMy1DbGF1c2UgbGljZW5zZQotCi0gIENvcHlyaWdodCAyMDEwLTIwMTYgTWlrZSBCb3N0b2NrCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKLSAgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi0gICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCi0gICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAgICB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotICBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLSAgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvanF1ZXJ5LXVpLk1JVCBiL2xpY2Vuc2VzL2pxdWVyeS11aS5NSVQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOGYxMzAuLjAwMDAwMDAKLS0tIGEvbGljZW5zZXMvanF1ZXJ5LXVpLk1JVAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLWNvbnNvbGUvc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tCi1MaWNlbnNlIHR5cGU6IE1JVAotCi0gIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLCBodHRwczovL2pxdWVyeS5vcmcvCi0gIAotICBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICBpbmRpdmlkdWFscy4gRm9yIGV4YWN0IGNvbnRyaWJ1dGlvbiBoaXN0b3J5LCBzZWUgIHRoZSByZXZpc2lvbiBoaXN0b3J5Ci0gIGF2YWlsYWJsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotCi0gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICAKLSAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKLSAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gIAotICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0gIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLSAgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLSAgV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9saWNlbnNlcy9qcXVlcnkuTUlUIGIvbGljZW5zZXMvanF1ZXJ5Lk1JVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4OTU2Zi4uMDAwMDAwMAotLS0gYS9saWNlbnNlcy9qcXVlcnkuTUlUCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2V4dGVybmFsL2pxdWVyeS9qcXVlcnkuanM6Ci1MaWNlbnNlIHR5cGU6IE1JVAotCi1Db3B5cmlnaHQgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCi1odHRwOi8vanF1ZXJ5LmNvbS8KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi1hIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLXdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLWRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi10aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCi1pbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi1FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi1OT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi1MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi1PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLVdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvbXZudyBiL212bncKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTNkOTg2MAotLS0gL2Rldi9udWxsCisrKyBiL212bncKQEAgLTAsMCArMSwyNjggQEAKKyMhL2Jpbi9zaAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYXZlbjIgU3RhcnQgVXAgQmF0Y2ggc2NyaXB0CisjCisjIFJlcXVpcmVkIEVOViB2YXJzOgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBKQVZBX0hPTUUgLSBsb2NhdGlvbiBvZiBhIEpESyBob21lIGRpcgorIworIyBPcHRpb25hbCBFTlYgdmFycworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyAgIE0yX0hPTUUgLSBsb2NhdGlvbiBvZiBtYXZlbjIncyBpbnN0YWxsZWQgaG9tZSBkaXIKKyMgICBNQVZFTl9PUFRTIC0gcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIEphdmEgVk0gd2hlbiBydW5uaW5nIE1hdmVuCisjICAgICBlLmcuIHRvIGRlYnVnIE1hdmVuIGl0c2VsZiwgdXNlCisjICAgICAgIHNldCBNQVZFTl9PUFRTPS1YZGVidWcgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9ODAwMAorIyAgIE1BVkVOX1NLSVBfUkMgLSBmbGFnIHRvIGRpc2FibGUgbG9hZGluZyBvZiBtYXZlbnJjIGZpbGVzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaWYgWyAteiAiJE1BVkVOX1NLSVBfUkMiIF0gOyB0aGVuCisKKyAgaWYgWyAtZiAvZXRjL21hdmVucmMgXSA7IHRoZW4KKyAgICAuIC9ldGMvbWF2ZW5yYworICBmaQorCisgIGlmIFsgLWYgIiRIT01FLy5tYXZlbnJjIiBdIDsgdGhlbgorICAgIC4gIiRIT01FLy5tYXZlbnJjIgorICBmaQorCitmaQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQuICAkdmFyIF9tdXN0XyBiZSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuCitjeWd3aW49ZmFsc2U7CitkYXJ3aW49ZmFsc2U7CittaW5ndz1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KKyAgQ1lHV0lOKikgY3lnd2luPXRydWUgOzsKKyAgTUlOR1cqKSBtaW5ndz10cnVlOzsKKyAgRGFyd2luKikgZGFyd2luPXRydWUKKyAgICAjIFVzZSAvdXNyL2xpYmV4ZWMvamF2YV9ob21lIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byAvTGlicmFyeS9KYXZhL0hvbWUKKyAgICAjIFNlZSBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9tYWMvcWEvcWExMTcwL19pbmRleC5odG1sCisgICAgaWYgWyAteiAiJEpBVkFfSE9NRSIgXTsgdGhlbgorICAgICAgaWYgWyAteCAiL3Vzci9saWJleGVjL2phdmFfaG9tZSIgXTsgdGhlbgorICAgICAgICBleHBvcnQgSkFWQV9IT01FPSJgL3Vzci9saWJleGVjL2phdmFfaG9tZWAiCisgICAgICBlbHNlCisgICAgICAgIGV4cG9ydCBKQVZBX0hPTUU9Ii9MaWJyYXJ5L0phdmEvSG9tZSIKKyAgICAgIGZpCisgICAgZmkKKyAgICA7OworZXNhYworCitpZiBbIC16ICIkSkFWQV9IT01FIiBdIDsgdGhlbgorICBpZiBbIC1yIC9ldGMvZ2VudG9vLXJlbGVhc2UgXSA7IHRoZW4KKyAgICBKQVZBX0hPTUU9YGphdmEtY29uZmlnIC0tanJlLWhvbWVgCisgIGZpCitmaQorCitpZiBbIC16ICIkTTJfSE9NRSIgXSA7IHRoZW4KKyAgIyMgcmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIGxpbmsgdG8gbWF2ZW4ncyBob21lCisgIFBSRz0iJDAiCisKKyAgIyBuZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzCisgIHdoaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICBQUkc9ImBkaXJuYW1lICIkUFJHImAvJGxpbmsiCisgICAgZmkKKyAgZG9uZQorCisgIHNhdmVkZGlyPWBwd2RgCisKKyAgTTJfSE9NRT1gZGlybmFtZSAiJFBSRyJgLy4uCisKKyAgIyBtYWtlIGl0IGZ1bGx5IHF1YWxpZmllZAorICBNMl9IT01FPWBjZCAiJE0yX0hPTUUiICYmIHB3ZGAKKworICBjZCAiJHNhdmVkZGlyIgorICAjIGVjaG8gVXNpbmcgbTIgYXQgJE0yX0hPTUUKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgWyAtbiAiJE0yX0hPTUUiIF0gJiYKKyAgICBNMl9IT01FPWBjeWdwYXRoIC0tdW5peCAiJE0yX0hPTUUiYAorICBbIC1uICIkSkFWQV9IT01FIiBdICYmCisgICAgSkFWQV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFfSE9NRSJgCisgIFsgLW4gIiRDTEFTU1BBVEgiIF0gJiYKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCitmaQorCisjIEZvciBNaW5ndywgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJG1pbmd3IDsgdGhlbgorICBbIC1uICIkTTJfSE9NRSIgXSAmJgorICAgIE0yX0hPTUU9ImAoY2QgIiRNMl9IT01FIjsgcHdkKWAiCisgIFsgLW4gIiRKQVZBX0hPTUUiIF0gJiYKKyAgICBKQVZBX0hPTUU9ImAoY2QgIiRKQVZBX0hPTUUiOyBwd2QpYCIKKyAgIyBUT0RPIGNsYXNzcGF0aD8KK2ZpCisKK2lmIFsgLXogIiRKQVZBX0hPTUUiIF07IHRoZW4KKyAgamF2YUV4ZWN1dGFibGU9ImB3aGljaCBqYXZhY2AiCisgIGlmIFsgLW4gIiRqYXZhRXhlY3V0YWJsZSIgXSAmJiAhIFsgImBleHByIFwiJGphdmFFeGVjdXRhYmxlXCIgOiAnXChbXiBdKlwpJ2AiID0gIm5vIiBdOyB0aGVuCisgICAgIyByZWFkbGluaygxKSBpcyBub3QgYXZhaWxhYmxlIGFzIHN0YW5kYXJkIG9uIFNvbGFyaXMgMTAuCisgICAgcmVhZExpbms9YHdoaWNoIHJlYWRsaW5rYAorICAgIGlmIFsgISBgZXhwciAiJHJlYWRMaW5rIiA6ICdcKFteIF0qXCknYCA9ICJubyIgXTsgdGhlbgorICAgICAgaWYgJGRhcndpbiA7IHRoZW4KKyAgICAgICAgamF2YUhvbWU9ImBkaXJuYW1lIFwiJGphdmFFeGVjdXRhYmxlXCJgIgorICAgICAgICBqYXZhRXhlY3V0YWJsZT0iYGNkIFwiJGphdmFIb21lXCIgJiYgcHdkIC1QYC9qYXZhYyIKKyAgICAgIGVsc2UKKyAgICAgICAgamF2YUV4ZWN1dGFibGU9ImByZWFkbGluayAtZiBcIiRqYXZhRXhlY3V0YWJsZVwiYCIKKyAgICAgIGZpCisgICAgICBqYXZhSG9tZT0iYGRpcm5hbWUgXCIkamF2YUV4ZWN1dGFibGVcImAiCisgICAgICBqYXZhSG9tZT1gZXhwciAiJGphdmFIb21lIiA6ICdcKC4qXCkvYmluJ2AKKyAgICAgIEpBVkFfSE9NRT0iJGphdmFIb21lIgorICAgICAgZXhwb3J0IEpBVkFfSE9NRQorICAgIGZpCisgIGZpCitmaQorCitpZiBbIC16ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgaWYgWyAtbiAiJEpBVkFfSE9NRSIgIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXMKKyAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCisgICAgZWxzZQorICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICBlbHNlCisgICAgSkFWQUNNRD0iYHdoaWNoIGphdmFgIgorICBmaQorZmkKKworaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgZWNobyAiRXJyb3I6IEpBVkFfSE9NRSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkuIiA+JjIKKyAgZWNobyAiICBXZSBjYW5ub3QgZXhlY3V0ZSAkSkFWQUNNRCIgPiYyCisgIGV4aXQgMQorZmkKKworaWYgWyAteiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KKyAgZWNobyAiV2FybmluZzogSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuIgorZmkKKworQ0xBU1NXT1JMRFNfTEFVTkNIRVI9b3JnLmNvZGVoYXVzLnBsZXh1cy5jbGFzc3dvcmxkcy5sYXVuY2hlci5MYXVuY2hlcgorCisjIHRyYXZlcnNlcyBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJvY2VzcyB3b3JrIGRpcmVjdG9yeSB0byBmaWxlc3lzdGVtIHJvb3QKKyMgZmlyc3QgZGlyZWN0b3J5IHdpdGggLm12biBzdWJkaXJlY3RvcnkgaXMgY29uc2lkZXJlZCBwcm9qZWN0IGJhc2UgZGlyZWN0b3J5CitmaW5kX21hdmVuX2Jhc2VkaXIoKSB7CisKKyAgaWYgWyAteiAiJDEiIF0KKyAgdGhlbgorICAgIGVjaG8gIlBhdGggbm90IHNwZWNpZmllZCB0byBmaW5kX21hdmVuX2Jhc2VkaXIiCisgICAgcmV0dXJuIDEKKyAgZmkKKworICBiYXNlZGlyPSIkMSIKKyAgd2Rpcj0iJDEiCisgIHdoaWxlIFsgIiR3ZGlyIiAhPSAnLycgXSA7IGRvCisgICAgaWYgWyAtZCAiJHdkaXIiLy5tdm4gXSA7IHRoZW4KKyAgICAgIGJhc2VkaXI9JHdkaXIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgICAjIHdvcmthcm91bmQgZm9yIEpCRUFQLTg5MzcgKG9uIFNvbGFyaXMgMTAvU3BhcmMpCisgICAgaWYgWyAtZCAiJHt3ZGlyfSIgXTsgdGhlbgorICAgICAgd2Rpcj1gY2QgIiR3ZGlyLy4uIjsgcHdkYAorICAgIGZpCisgICAgIyBlbmQgb2Ygd29ya2Fyb3VuZAorICBkb25lCisgIGVjaG8gIiR7YmFzZWRpcn0iCit9CisKKyMgY29uY2F0ZW5hdGVzIGFsbCBsaW5lcyBvZiBhIGZpbGUKK2NvbmNhdF9saW5lcygpIHsKKyAgaWYgWyAtZiAiJDEiIF07IHRoZW4KKyAgICBlY2hvICIkKHRyIC1zICdcbicgJyAnIDwgIiQxIikiCisgIGZpCit9CisKK0JBU0VfRElSPWBmaW5kX21hdmVuX2Jhc2VkaXIgIiQocHdkKSJgCitpZiBbIC16ICIkQkFTRV9ESVIiIF07IHRoZW4KKyAgZXhpdCAxOworZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEV4dGVuc2lvbiB0byBhbGxvdyBhdXRvbWF0aWNhbGx5IGRvd25sb2FkaW5nIHRoZSBtYXZlbi13cmFwcGVyLmphciBmcm9tIE1hdmVuLWNlbnRyYWwKKyMgVGhpcyBhbGxvd3MgdXNpbmcgdGhlIG1hdmVuIHdyYXBwZXIgaW4gcHJvamVjdHMgdGhhdCBwcm9oaWJpdCBjaGVja2luZyBpbiBiaW5hcnkgZGF0YS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgWyAtciAiJEJBU0VfRElSLy5tdm4vd3JhcHBlci9tYXZlbi13cmFwcGVyLmphciIgXTsgdGhlbgorICAgIGVjaG8gIkZvdW5kIC5tdm4vd3JhcHBlci9tYXZlbi13cmFwcGVyLmphciIKK2Vsc2UKKyAgICBlY2hvICJDb3VsZG4ndCBmaW5kIC5tdm4vd3JhcHBlci9tYXZlbi13cmFwcGVyLmphciwgZG93bmxvYWRpbmcgaXQgLi4uIgorCisgICAgamFyVXJsPSJodHRwczovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIvaW8vdGFrYXJpL21hdmVuLXdyYXBwZXIvMC4yLjEvbWF2ZW4td3JhcHBlci0wLjIuMS5qYXIiCisgICAgd2hpbGUgSUZTPSI9IiByZWFkIGtleSB2YWx1ZTsgZG8KKyAgICAgIGNhc2UgIiRrZXkiIGluICh3cmFwcGVyVXJsKSBqYXJVcmw9IiR2YWx1ZSI7IGJyZWFrIDs7CisgICAgICBlc2FjCisgICAgZG9uZSA8ICIkQkFTRV9ESVIvLm12bi93cmFwcGVyL21hdmVuLXdyYXBwZXIucHJvcGVydGllcyIKKyAgICBlY2hvICJEb3dubG9hZGluZyBmcm9tOiAkamFyVXJsIgorCisgICAgaWYgY29tbWFuZCAtdiB3Z2V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGVjaG8gIkZvdW5kIHdnZXQgLi4uIHVzaW5nIHdnZXQiCisgICAgICAgIHdnZXQgLU8gIiRCQVNFX0RJUi8ubXZuL3dyYXBwZXIvbWF2ZW4td3JhcHBlci5qYXIiICIkamFyVXJsIgorICAgIGVsaWYgY29tbWFuZCAtdiBjdXJsID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGVjaG8gIkZvdW5kIGN1cmwgLi4uIHVzaW5nIGN1cmwiCisgICAgICAgIGN1cmwgLW8gIiRCQVNFX0RJUi8ubXZuL3dyYXBwZXIvbWF2ZW4td3JhcHBlci5qYXIiICIkamFyVXJsIgorICAgIGVsc2UKKyAgICAgICAgZWNobyAiRmFsbGluZyBiYWNrIHRvIHVzaW5nIEphdmEgdG8gZG93bmxvYWQiCisgICAgICAgIGphdmFDbGFzcz0iJEJBU0VfRElSLy5tdm4vd3JhcHBlci9NYXZlbldyYXBwZXJEb3dubG9hZGVyLmphdmEiCisgICAgICAgIGlmIFsgLWUgIiRqYXZhQ2xhc3MiIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgISAtZSAiJEJBU0VfRElSLy5tdm4vd3JhcHBlci9NYXZlbldyYXBwZXJEb3dubG9hZGVyLmNsYXNzIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiIC0gQ29tcGlsaW5nIE1hdmVuV3JhcHBlckRvd25sb2FkZXIuamF2YSAuLi4iCisgICAgICAgICAgICAgICAgIyBDb21waWxpbmcgdGhlIEphdmEgY2xhc3MKKyAgICAgICAgICAgICAgICAoIiRKQVZBX0hPTUUvYmluL2phdmFjIiAiJGphdmFDbGFzcyIpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgaWYgWyAtZSAiJEJBU0VfRElSLy5tdm4vd3JhcHBlci9NYXZlbldyYXBwZXJEb3dubG9hZGVyLmNsYXNzIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgIyBSdW5uaW5nIHRoZSBkb3dubG9hZGVyCisgICAgICAgICAgICAgICAgZWNobyAiIC0gUnVubmluZyBNYXZlbldyYXBwZXJEb3dubG9hZGVyLmphdmEgLi4uIgorICAgICAgICAgICAgICAgICgiJEpBVkFfSE9NRS9iaW4vamF2YSIgLWNwIC5tdm4vd3JhcHBlciBNYXZlbldyYXBwZXJEb3dubG9hZGVyICIkTUFWRU5fUFJPSkVDVEJBU0VESVIiKQorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBmaQorZmkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBFbmQgb2YgZXh0ZW5zaW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZXhwb3J0IE1BVkVOX1BST0pFQ1RCQVNFRElSPSR7TUFWRU5fQkFTRURJUjotIiRCQVNFX0RJUiJ9CitlY2hvICRNQVZFTl9QUk9KRUNUQkFTRURJUgorTUFWRU5fT1BUUz0iJChjb25jYXRfbGluZXMgIiRNQVZFTl9QUk9KRUNUQkFTRURJUi8ubXZuL2p2bS5jb25maWciKSAkTUFWRU5fT1BUUyIKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbjsgdGhlbgorICBbIC1uICIkTTJfSE9NRSIgXSAmJgorICAgIE0yX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJE0yX0hPTUUiYAorICBbIC1uICIkSkFWQV9IT01FIiBdICYmCisgICAgSkFWQV9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRKQVZBX0hPTUUiYAorICBbIC1uICIkQ0xBU1NQQVRIIiBdICYmCisgICAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRDTEFTU1BBVEgiYAorICBbIC1uICIkTUFWRU5fUFJPSkVDVEJBU0VESVIiIF0gJiYKKyAgICBNQVZFTl9QUk9KRUNUQkFTRURJUj1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkTUFWRU5fUFJPSkVDVEJBU0VESVIiYAorZmkKKworV1JBUFBFUl9MQVVOQ0hFUj1vcmcuYXBhY2hlLm1hdmVuLndyYXBwZXIuTWF2ZW5XcmFwcGVyTWFpbgorCitleGVjICIkSkFWQUNNRCIgXAorICAkTUFWRU5fT1BUUyBcCisgIC1jbGFzc3BhdGggIiRNQVZFTl9QUk9KRUNUQkFTRURJUi8ubXZuL3dyYXBwZXIvbWF2ZW4td3JhcHBlci5qYXIiIFwKKyAgIi1EbWF2ZW4uaG9tZT0ke00yX0hPTUV9IiAiLURtYXZlbi5tdWx0aU1vZHVsZVByb2plY3REaXJlY3Rvcnk9JHtNQVZFTl9QUk9KRUNUQkFTRURJUn0iIFwKKyAgJHtXUkFQUEVSX0xBVU5DSEVSfSAkTUFWRU5fQ09ORklHICIkQCIKZGlmZiAtLWdpdCBhL212bncuY21kIGIvbXZudy5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4ZmIwNgotLS0gL2Rldi9udWxsCisrKyBiL212bncuY21kCkBAIC0wLDAgKzEsMTU5IEBACitAUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0BSRU0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorQFJFTSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK0BSRU0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK0BSRU0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorQFJFTSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCitAUkVNICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK0BSRU0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQFJFTQorQFJFTSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0BSRU0KK0BSRU0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorQFJFTSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorQFJFTSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0BSRU0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitAUkVNIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK0BSRU0gdW5kZXIgdGhlIExpY2Vuc2UuCitAUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQFJFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAUkVNIE1hdmVuMiBTdGFydCBVcCBCYXRjaCBzY3JpcHQKK0BSRU0KK0BSRU0gUmVxdWlyZWQgRU5WIHZhcnM6CitAUkVNIEpBVkFfSE9NRSAtIGxvY2F0aW9uIG9mIGEgSkRLIGhvbWUgZGlyCitAUkVNCitAUkVNIE9wdGlvbmFsIEVOViB2YXJzCitAUkVNIE0yX0hPTUUgLSBsb2NhdGlvbiBvZiBtYXZlbjIncyBpbnN0YWxsZWQgaG9tZSBkaXIKK0BSRU0gTUFWRU5fQkFUQ0hfRUNITyAtIHNldCB0byAnb24nIHRvIGVuYWJsZSB0aGUgZWNob2luZyBvZiB0aGUgYmF0Y2ggY29tbWFuZHMKK0BSRU0gTUFWRU5fQkFUQ0hfUEFVU0UgLSBzZXQgdG8gJ29uJyB0byB3YWl0IGZvciBhIGtleSBzdHJva2UgYmVmb3JlIGVuZGluZworQFJFTSBNQVZFTl9PUFRTIC0gcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIEphdmEgVk0gd2hlbiBydW5uaW5nIE1hdmVuCitAUkVNICAgICBlLmcuIHRvIGRlYnVnIE1hdmVuIGl0c2VsZiwgdXNlCitAUkVNIHNldCBNQVZFTl9PUFRTPS1YZGVidWcgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9ODAwMAorQFJFTSBNQVZFTl9TS0lQX1JDIC0gZmxhZyB0byBkaXNhYmxlIGxvYWRpbmcgb2YgbWF2ZW5yYyBmaWxlcworQFJFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0BSRU0gQmVnaW4gYWxsIFJFTSBsaW5lcyB3aXRoICdAJyBpbiBjYXNlIE1BVkVOX0JBVENIX0VDSE8gaXMgJ29uJworQGVjaG8gb2ZmCitAUkVNIGVuYWJsZSBlY2hvaW5nIG15IHNldHRpbmcgTUFWRU5fQkFUQ0hfRUNITyB0byAnb24nCitAaWYgIiVNQVZFTl9CQVRDSF9FQ0hPJSIgPT0gIm9uIiAgZWNobyAlTUFWRU5fQkFUQ0hfRUNITyUKKworQFJFTSBzZXQgJUhPTUUlIHRvIGVxdWl2YWxlbnQgb2YgJEhPTUUKK2lmICIlSE9NRSUiID09ICIiIChzZXQgIkhPTUU9JUhPTUVEUklWRSUlSE9NRVBBVEglIikKKworQFJFTSBFeGVjdXRlIGEgdXNlciBkZWZpbmVkIHNjcmlwdCBiZWZvcmUgdGhpcyBvbmUKK2lmIG5vdCAiJU1BVkVOX1NLSVBfUkMlIiA9PSAiIiBnb3RvIHNraXBSY1ByZQorQFJFTSBjaGVjayBmb3IgcHJlIHNjcmlwdCwgb25jZSB3aXRoIGxlZ2FjeSAuYmF0IGVuZGluZyBhbmQgb25jZSB3aXRoIC5jbWQgZW5kaW5nCitpZiBleGlzdCAiJUhPTUUlXG1hdmVucmNfcHJlLmJhdCIgY2FsbCAiJUhPTUUlXG1hdmVucmNfcHJlLmJhdCIKK2lmIGV4aXN0ICIlSE9NRSVcbWF2ZW5yY19wcmUuY21kIiBjYWxsICIlSE9NRSVcbWF2ZW5yY19wcmUuY21kIgorOnNraXBSY1ByZQorCitAc2V0bG9jYWwKKworc2V0IEVSUk9SX0NPREU9MAorCitAUkVNIFRvIGlzb2xhdGUgaW50ZXJuYWwgdmFyaWFibGVzIGZyb20gcG9zc2libGUgcG9zdCBzY3JpcHRzLCB3ZSB1c2UgYW5vdGhlciBzZXRsb2NhbAorQHNldGxvY2FsCisKK0BSRU0gPT09PSBTVEFSVCBWQUxJREFUSU9OID09PT0KK2lmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gT2tKSG9tZQorCitlY2hvLgorZWNobyBFcnJvcjogSkFWQV9IT01FIG5vdCBmb3VuZCBpbiB5b3VyIGVudmlyb25tZW50LiA+JjIKK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlID4mMgorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiA+JjIKK2VjaG8uCitnb3RvIGVycm9yCisKKzpPa0pIb21lCitpZiBleGlzdCAiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiBnb3RvIGluaXQKKworZWNoby4KK2VjaG8gRXJyb3I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3RvcnkuID4mMgorZWNobyBKQVZBX0hPTUUgPSAiJUpBVkFfSE9NRSUiID4mMgorZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUgPiYyCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uID4mMgorZWNoby4KK2dvdG8gZXJyb3IKKworQFJFTSA9PT09IEVORCBWQUxJREFUSU9OID09PT0KKworOmluaXQKKworQFJFTSBGaW5kIHRoZSBwcm9qZWN0IGJhc2UgZGlyLCBpLmUuIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgZm9sZGVyICIubXZuIi4KK0BSRU0gRmFsbGJhY2sgdG8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZiBub3QgZm91bmQuCisKK3NldCBNQVZFTl9QUk9KRUNUQkFTRURJUj0lTUFWRU5fQkFTRURJUiUKK0lGIE5PVCAiJU1BVkVOX1BST0pFQ1RCQVNFRElSJSI9PSIiIGdvdG8gZW5kRGV0ZWN0QmFzZURpcgorCitzZXQgRVhFQ19ESVI9JUNEJQorc2V0IFdESVI9JUVYRUNfRElSJQorOmZpbmRCYXNlRGlyCitJRiBFWElTVCAiJVdESVIlIlwubXZuIGdvdG8gYmFzZURpckZvdW5kCitjZCAuLgorSUYgIiVXRElSJSI9PSIlQ0QlIiBnb3RvIGJhc2VEaXJOb3RGb3VuZAorc2V0IFdESVI9JUNEJQorZ290byBmaW5kQmFzZURpcgorCis6YmFzZURpckZvdW5kCitzZXQgTUFWRU5fUFJPSkVDVEJBU0VESVI9JVdESVIlCitjZCAiJUVYRUNfRElSJSIKK2dvdG8gZW5kRGV0ZWN0QmFzZURpcgorCis6YmFzZURpck5vdEZvdW5kCitzZXQgTUFWRU5fUFJPSkVDVEJBU0VESVI9JUVYRUNfRElSJQorY2QgIiVFWEVDX0RJUiUiCisKKzplbmREZXRlY3RCYXNlRGlyCisKK0lGIE5PVCBFWElTVCAiJU1BVkVOX1BST0pFQ1RCQVNFRElSJVwubXZuXGp2bS5jb25maWciIGdvdG8gZW5kUmVhZEFkZGl0aW9uYWxDb25maWcKKworQHNldGxvY2FsIEVuYWJsZUV4dGVuc2lvbnMgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorZm9yIC9GICJ1c2ViYWNrcSBkZWxpbXM9IiAlJWEgaW4gKCIlTUFWRU5fUFJPSkVDVEJBU0VESVIlXC5tdm5canZtLmNvbmZpZyIpIGRvIHNldCBKVk1fQ09ORklHX01BVkVOX1BST1BTPSFKVk1fQ09ORklHX01BVkVOX1BST1BTISAlJWEKK0BlbmRsb2NhbCAmIHNldCBKVk1fQ09ORklHX01BVkVOX1BST1BTPSVKVk1fQ09ORklHX01BVkVOX1BST1BTJQorCis6ZW5kUmVhZEFkZGl0aW9uYWxDb25maWcKKworU0VUIE1BVkVOX0pBVkFfRVhFPSIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiCitzZXQgV1JBUFBFUl9KQVI9IiVNQVZFTl9QUk9KRUNUQkFTRURJUiVcLm12blx3cmFwcGVyXG1hdmVuLXdyYXBwZXIuamFyIgorc2V0IFdSQVBQRVJfTEFVTkNIRVI9b3JnLmFwYWNoZS5tYXZlbi53cmFwcGVyLk1hdmVuV3JhcHBlck1haW4KKworc2V0IERPV05MT0FEX1VSTD0iaHR0cHM6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yL2lvL3Rha2FyaS9tYXZlbi13cmFwcGVyLzAuMi4xL21hdmVuLXdyYXBwZXItMC4yLjEuamFyIgorRk9SIC9GICJ0b2tlbnM9MSwyIGRlbGltcz09IiAlJUEgSU4gKCVNQVZFTl9QUk9KRUNUQkFTRURJUiVcLm12blx3cmFwcGVyXG1hdmVuLXdyYXBwZXIucHJvcGVydGllcykgRE8gKAorCUlGICIlJUEiPT0id3JhcHBlclVybCIgU0VUIERPV05MT0FEX1VSTD0lJUIgCispCisKK0BSRU0gRXh0ZW5zaW9uIHRvIGFsbG93IGF1dG9tYXRpY2FsbHkgZG93bmxvYWRpbmcgdGhlIG1hdmVuLXdyYXBwZXIuamFyIGZyb20gTWF2ZW4tY2VudHJhbAorQFJFTSBUaGlzIGFsbG93cyB1c2luZyB0aGUgbWF2ZW4gd3JhcHBlciBpbiBwcm9qZWN0cyB0aGF0IHByb2hpYml0IGNoZWNraW5nIGluIGJpbmFyeSBkYXRhLgoraWYgZXhpc3QgJVdSQVBQRVJfSkFSJSAoCisgICAgZWNobyBGb3VuZCAlV1JBUFBFUl9KQVIlCispIGVsc2UgKAorICAgIGVjaG8gQ291bGRuJ3QgZmluZCAlV1JBUFBFUl9KQVIlLCBkb3dubG9hZGluZyBpdCAuLi4KKwllY2hvIERvd25sb2FkaW5nIGZyb206ICVET1dOTE9BRF9VUkwlCisgICAgcG93ZXJzaGVsbCAtQ29tbWFuZCAiKE5ldy1PYmplY3QgTmV0LldlYkNsaWVudCkuRG93bmxvYWRGaWxlKCclRE9XTkxPQURfVVJMJScsICclV1JBUFBFUl9KQVIlJykiCisgICAgZWNobyBGaW5pc2hlZCBkb3dubG9hZGluZyAlV1JBUFBFUl9KQVIlCispCitAUkVNIEVuZCBvZiBleHRlbnNpb24KKworJU1BVkVOX0pBVkFfRVhFJSAlSlZNX0NPTkZJR19NQVZFTl9QUk9QUyUgJU1BVkVOX09QVFMlICVNQVZFTl9ERUJVR19PUFRTJSAtY2xhc3NwYXRoICVXUkFQUEVSX0pBUiUgIi1EbWF2ZW4ubXVsdGlNb2R1bGVQcm9qZWN0RGlyZWN0b3J5PSVNQVZFTl9QUk9KRUNUQkFTRURJUiUiICVXUkFQUEVSX0xBVU5DSEVSJSAlTUFWRU5fQ09ORklHJSAlKgoraWYgRVJST1JMRVZFTCAxIGdvdG8gZXJyb3IKK2dvdG8gZW5kCisKKzplcnJvcgorc2V0IEVSUk9SX0NPREU9MQorCis6ZW5kCitAZW5kbG9jYWwgJiBzZXQgRVJST1JfQ09ERT0lRVJST1JfQ09ERSUKKworaWYgbm90ICIlTUFWRU5fU0tJUF9SQyUiID09ICIiIGdvdG8gc2tpcFJjUG9zdAorQFJFTSBjaGVjayBmb3IgcG9zdCBzY3JpcHQsIG9uY2Ugd2l0aCBsZWdhY3kgLmJhdCBlbmRpbmcgYW5kIG9uY2Ugd2l0aCAuY21kIGVuZGluZworaWYgZXhpc3QgIiVIT01FJVxtYXZlbnJjX3Bvc3QuYmF0IiBjYWxsICIlSE9NRSVcbWF2ZW5yY19wb3N0LmJhdCIKK2lmIGV4aXN0ICIlSE9NRSVcbWF2ZW5yY19wb3N0LmNtZCIgY2FsbCAiJUhPTUUlXG1hdmVucmNfcG9zdC5jbWQiCis6c2tpcFJjUG9zdAorCitAUkVNIHBhdXNlIHRoZSBzY3JpcHQgaWYgTUFWRU5fQkFUQ0hfUEFVU0UgaXMgc2V0IHRvICdvbicKK2lmICIlTUFWRU5fQkFUQ0hfUEFVU0UlIiA9PSAib24iIHBhdXNlCisKK2lmICIlTUFWRU5fVEVSTUlOQVRFX0NNRCUiID09ICJvbiIgZXhpdCAlRVJST1JfQ09ERSUKKworZXhpdCAvQiAlRVJST1JfQ09ERSUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2FuZHJvaWQvYnVpbGQuZ3JhZGxlIGIvcGxhdGZvcm0vYW5kcm9pZC9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1N2I0NGQuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vYW5kcm9pZC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotZGVmYXVsdFRhc2tzICdhZGRBbmRyb2lkVGFyZ2V0RGlyJwotCi0vLyBBdm9pZCBjcmVhdGluZy9zdGFnaW5nIGFuIGVtcHR5IGphciAodGhpcyBpcyBhICdqYXZhJyBzdWJwcm9qZWN0KSAKLWphciB7Ci0gIGRlbGV0ZUFsbEFjdGlvbnMoKQotfQotCi0vLyBsZXQgdGhlIGV4aXN0aW5nIGFudCBzY3JpcHQgZG8gYWxsIG9mIHRoZSB3b3JrCi0KLWFudC5pbXBvcnRCdWlsZCgnYnVpbGQueG1sJykgeyBhbnRUYXJnZXROYW1lIC0+Ci0gICdhbnRfJyArIGFudFRhcmdldE5hbWUKLX0KLQotYW50LnByb3BlcnRpZXNbJ2VkZ2VudDgudGFyZ2V0J10gPSB0YXJnZXRfamF2YThfZGlyCi1hbnQucHJvcGVydGllc1snZWRnZW50Ny50YXJnZXQnXSA9IHRhcmdldF9qYXZhN19kaXIKLWFudC5wcm9wZXJ0aWVzWydlZGdlbnQuYW5kcm9pZC50YXJnZXQnXSA9IHRhcmdldF9hbmRyb2lkX2RpcgotCi1jbGVhbiB7Ci0gIGRlcGVuZHNPbiBhbnRfY2xlYW4KLX0KLQotdGFzayBhZGRBbmRyb2lkVGFyZ2V0RGlyIHsKLSAgZGVzY3JpcHRpb24gPSAiQXNzZW1ibGUgZGlzdHJpYnV0aW9uIGFydGlmYWN0cyBmb3IgYW5kcm9pZCAoZnJvbSBqYXZhNyBhcnRpZmFjdHMpIgotICBkZXBlbmRzT24gJzpwbGF0Zm9ybTpqYXZhNzphZGRKYXZhN1RhcmdldERpcicsIGNsZWFuLCBhbnRfYWxsCi0gIGFudF9hbGwubXVzdFJ1bkFmdGVyICc6cGxhdGZvcm06amF2YTc6YWRkSmF2YTdUYXJnZXREaXInCi0gIGFudF9hbGwubXVzdFJ1bkFmdGVyIGNsZWFuCi0gIAotICAvLyBUT0RPIHRoZSBmb2xsb3dpbmcgaXNuJ3QgY3V0dGluZyBpdCBmb3IgYWRkaW5nIHVwLXRvLWRhdGUgZm9yIHRoaXMgdGFzawotICAvLyBzbyBhcyB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IHJ1bm5pbmcgY2xlYW4sYW50X2FsbAotICAvLyAuLi4gd2VsbCB0aGluZ3MganVzdCBkb24ndCBxdWl0ZSB3b3JrIHRoZSB3YXkgSSBob3BlZC4KLSAgLy8gQSB0YXNrJ3MgZGVwZW5kZW5jaWVzIGFyZSBydW4gYmVmb3JlIGEgdGFzayBpcyBjaGVja2VkIGZvciBVVEQKLSAgLy8gaW5wdXRzLmRpcih0YXJnZXRfamF2YTdfZGlyKQotICAvLyBvdXRwdXRzLmRpcih0YXJnZXRfYW5kcm9pZF9kaXIpCi19Ci0KLS8vIHVubGlrZSB0aGUgYWJvdmUsIHRoaXMgaGFzIHRoZSBiZW5lZml0KD8pIG9mIHByb2R1Y2luZyB0aGUgYW50IG91dHB1dCB0byBzdGRvdXQKLS8vIEJ1dCBpdCByZXF1aXJlcyAnYW50JyB0byBiZSBpbiB0aGUgcGF0aCBhbmQgZG9lc24ndCAoY2FuJ3Q/KSB1c2UKLS8vIHRoZSBhbnQgdGhhdCdzIGVtYmVkZGVkIHdpdGggZ3JhZGxlIGhtbS4uLgotLy8KLS8vdGFzayBhbmRyb2lkWFhYKHR5cGU6IEV4ZWMpIHsKLS8vICBkZXNjcmlwdGlvbiA9ICJBc3NlbWJsZSBkaXN0cmlidXRpb24gYXJ0aWZhY3RzIGZvciBhbmRyb2lkIChmcm9tIGphdmE3IGFydGlmYWN0cykiCi0vLyAgZGVwZW5kc09uIDpwbGF0Zm9ybTpqYXZhNzpqYXZhNwotLy8gIHdvcmtpbmdEaXIgJ3BsYXRmb3JtL2FuZHJvaWQnCi0vLyAgY29tbWFuZExpbmUgJ2FudCcsICdjbGVhbicsICdhbGwnLAotLy8gICAgICctRGVkZ2VudDgudGFyZ2V0PS4uLy4uL2J1aWxkL2Rpc3RyaWJ1dGlvbnMvamF2YTgnLAotLy8gICAgICctRGVkZ2VudDcudGFyZ2V0PS4uLy4uL2J1aWxkL2Rpc3RyaWJ1dGlvbnMvamF2YTcnLAotLy8gICAgICctRGVkZ2VudC5hbmRyb2lkLnRhcmdldD0uLi8uLi9idWlsZC9kaXN0cmlidXRpb25zL2FuZHJvaWQnCi0vL30KLQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vYW5kcm9pZC9idWlsZC54bWwgYi9wbGF0Zm9ybS9hbmRyb2lkL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyMzA4Zi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9hbmRyb2lkL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci08cHJvamVjdCBuYW1lPSJlZGdlbnQucGxhdGZvcm0uYW5kcm9pZCIgZGVmYXVsdD0iYWxsIgotICB4bWxuczpqYWNvY289ImFudGxpYjpvcmcuamFjb2NvLmFudCIKLSAgPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQ3JlYXRlIHRoZSBBbmRyb2lkIHNldCBvZiBqYXJzLgotICAgICAgICBDb3BpZXMgdGhlIEphdmEgNyBqYXJzIGV4Y2x1ZGluZyBhbnkgb25lcyBub3Qgc3VwcG9ydGVkIG9uIEFuZHJvaWQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotICA8cHJvcGVydHkgbmFtZT0iZWRnZW50IiBsb2NhdGlvbj0iLi4vLi4iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImVkZ2VudDgudGFyZ2V0IiBsb2NhdGlvbj0iJHtlZGdlbnR9L3RhcmdldC9qYXZhOCIvPgotICA8cHJvcGVydHkgbmFtZT0iZWRnZW50Ny50YXJnZXQiIGxvY2F0aW9uPSIke2VkZ2VudH0vdGFyZ2V0L2phdmE3Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlZGdlbnQuYW5kcm9pZC50YXJnZXQiIGxvY2F0aW9uPSIke2VkZ2VudH0vdGFyZ2V0L2FuZHJvaWQiLz4KLQotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDxta2RpciBkaXI9IiR7ZWRnZW50LmFuZHJvaWQudGFyZ2V0fSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iY29weUZyb203IgotICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgdGhlIEFuZHJvaWQgamFycyIKLSAgICAvPgotCi0gIDx0YXJnZXQgbmFtZT0iY29weUZyb203IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8Y29weSB0b2Rpcj0iJHtlZGdlbnQuYW5kcm9pZC50YXJnZXR9Ij4KLSAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZWRnZW50Ny50YXJnZXR9IgotICAgICAgICAgICBleGNsdWRlcz0ic2NyaXB0cy8qKiBsaWIvZWRnZW50LnJ1bnRpbWUuam14Y29udHJvbC5qYXIgbGliL2VkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuamFyIGNvbnNvbGUvKioiCi0gICAgICAgLz4KLQotICAgIDwvY29weT4KLSAgICA8IS0tIERlbGV0ZSB0aGUgQW5kcm9pZCBqYXJzIGZyb20gSmF2YSA4IGFuZCA3IC0tPgotICAgIDwhLS0gVGhleSBnZXQgYnVpbHQgdGhlcmUgYW5kIGFyZSBwcm9jZXNzZWQgdGhyb3VnaCB0aGUgcmV0cm9sYW1iZGEgLS0+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7ZWRnZW50OC50YXJnZXR9L2FuZHJvaWQiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtlZGdlbnQ3LnRhcmdldH0vYW5kcm9pZCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtlZGdlbnQuYW5kcm9pZC50YXJnZXR9Ii8+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9qYXZhNy8uZ2l0aWdub3JlIGIvcGxhdGZvcm0vamF2YTcvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiOWMwMi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9qYXZhNy8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0vY2xhc3Nlcy5pbi8KLS9jbGFzc2VzLm91dC8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2phdmE3L2J1aWxkLmdyYWRsZSBiL3BsYXRmb3JtL2phdmE3L2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1OTllMi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9qYXZhNy9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLWRlZmF1bHRUYXNrcyAnYWRkSmF2YTdUYXJnZXREaXInCi0KLWV4dC5yZXRyb2xhbWJkYVZlcnNpb24gPSAnMi4xLjAnCi1leHQucmV0cm9sYW1iZGFKYXJOYW1lID0gInJldHJvbGFtYmRhLSR7cmV0cm9sYW1iZGFWZXJzaW9ufS5qYXIiCi0KLWRlcGVuZGVuY2llcyB7Ci0gIC8vIFRPRE8gdHJ5IHRoZSByZXRyb2xhbWJkYSBncmFkbGUgcGx1Z2luIQotICBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsICJuZXQub3JmamFja2FsLnJldHJvbGFtYmRhOnJldHJvbGFtYmRhOiRyZXRyb2xhbWJkYVZlcnNpb24iCi19Ci0KLS8vIEF2b2lkIGNyZWF0aW5nL3N0YWdpbmcgYW4gZW1wdHkgamFyICh0aGlzIGlzIGEgJ2phdmEnIHN1YnByb2plY3QpIAotamFyIHsKLSAgZGVsZXRlQWxsQWN0aW9ucygpCi19Ci0KLS8vIGxldCB0aGUgZXhpc3RpbmcgYW50IHNjcmlwdCBkbyBzb21lIG9mIHRoZSB3b3JrCi0KLWFudC5pbXBvcnRCdWlsZCgnYnVpbGQueG1sJykgeyBhbnRUYXJnZXROYW1lIC0+Ci0gICdhbnRfJyArIGFudFRhcmdldE5hbWUKLX0KLQotYW50LnByb3BlcnRpZXNbJ2VkZ2VudCddID0gcm9vdFByb2plY3QucHJvamVjdERpcgotYW50LnByb3BlcnRpZXNbJ2VkZ2VudDgudGFyZ2V0J10gPSB0YXJnZXRfamF2YThfZGlyCi1hbnQucHJvcGVydGllc1snZWRnZW50Ny50YXJnZXQnXSA9IHRhcmdldF9qYXZhN19kaXIKLWFudC5wcm9wZXJ0aWVzWydleHQuZGlyJ10gPSB0YXJnZXRfamF2YThfZXh0X2RpcgotCi1jbGVhbiB7Ci0gIGRlcGVuZHNPbiBhbnRfY2xlYW4KLX0KLQotdGFzayBwcmVBbnRUYXNrIDw8IHsKLSAgLy8gcmVjb21wdXRlL3NldCBvdGhlciBpbnB1dHMgdG8gdGhlIGFudCB0YXNrcwotICBhbnQucGF0aChpZDogJ2VkZ2VudC5jbGFzc3BhdGgnKSB7Ci0gICAgZmlsZXNldChkaXI6IHRhcmdldF9qYXZhOF9leHRfZGlyKSB7Ci0gICAgICBleGNsdWRlKG5hbWU6ICcqKi9zbGY0ai1qZGsqLmphcicpCi0gICAgfQotICB9Ci0gIGFudC5wcm9wZXJ0aWVzLnFjcCA9IGFudC5yZWZlcmVuY2VzWydlZGdlbnQuY2xhc3NwYXRoJ10KLSAgCi0gIC8vIG1ha2UgcmV0cm9sYW1iZGEgYXZhaWxhYmxlIHRvIHRoZSBhbnQgdG9vbGluZwotICBjb3B5UHJvamVjdEV4dEphcnNGbjIgIiRleHRlcm5hbF9qYXJzX2Rpci90b29scyIKLSAgYW50LnByb3BlcnRpZXNbJ3JldHJvbGFtYmRhLmphciddID0gIiRleHRlcm5hbF9qYXJzX2Rpci90b29scy8kcmV0cm9sYW1iZGFKYXJOYW1lIgotICAKLSAgLy8gbWFrZSBhbmRyb2lkLmphciBhdmFpbGFibGUgdG8gdGhlIGFudCB0b29saW5nCi0gIGRlZiBod1Byb2ogPSBwcm9qZWN0KCc6YW5kcm9pZDpoYXJkd2FyZScpCi0gIGh3UHJvai5jb3B5UHJvamVjdEV4dEphcnNGbiAiJGV4dGVybmFsX2phcnNfZGlyIgotICBhbnQucHJvcGVydGllc1snYW5kcm9pZC5zZGsucGxhdGZvcm0uamFyJ10gPSAKLSAgICAiJGV4dGVybmFsX2phcnNfZGlyLyR7aHdQcm9qLnRhcmdldFJlbFByb2pFeHREaXJ9LyIgKyBta0phck5hbWVGcm9tU3BlYyhod1Byb2ouYW5kcm9pZEphclNwZWMpCi19Ci0KLWFudF9yZXRybzcuZG9GaXJzdCB7IAotICBwcmludGxuICJQZXJmb3JtaW5nIGEgbG9uZ2VyIHJ1bm5pbmcgYW50IHRhc2sgKGUuZy4sIH4zMHNlYzsgcnVuIHdpdGggLS1pbmZvIHRvIHNlZSBpdCBhbGwpLi4uIgotfQotCi10YXNrIGFkZEphdmE3VGFyZ2V0RGlyIHsKLSAgZGVzY3JpcHRpb24gPSAiQXNzZW1ibGUgZGlzdHJpYnV0aW9uIGFydGlmYWN0cyBmb3IgamF2YTcgKGZyb20gamF2YTggYXJ0aWZhY3RzIC0gcnVuIHdpdGggSkFWQV9IT01FPT1qYXZhOC1WTSkiCi0gIGRlcGVuZHNPbiAnOmFzc2VtYmxlJywgY2xlYW4sIHByZUFudFRhc2ssIGFudF9yZXRybzcKLSAgYW50X3JldHJvNy5tdXN0UnVuQWZ0ZXIgPSBbIGNsZWFuLCAnOmFzc2VtYmxlJywgcHJlQW50VGFzayBdCi19Ci0KLS8vIHVubGlrZSB0aGUgYWJvdmUsIHRoaXMgaGFzIHRoZSBiZW5lZml0KD8pIG9mIHByb2R1Y2luZyB0aGUgYW50IG91dHB1dCB0byBzdGRvdXQKLS8vIEJ1dCBpdCByZXF1aXJlcyAnYW50JyB0byBiZSBpbiB0aGUgcGF0aCBhbmQgZG9lc24ndCAoY2FuJ3Q/KSB1c2UKLS8vIHRoZSBhbnQgdGhhdCdzIGVtYmVkZGVkIHdpdGggZ3JhZGxlIGhtbS4uLgotLy8KLS8vdGFzayBqYXZhN1hYWCh0eXBlOiBFeGVjKSB7Ci0vLyAgZGVzY3JpcHRpb24gPSAiQXNzZW1ibGUgZGlzdHJpYnV0aW9uIGFydGlmYWN0cyBmb3IgamF2YTcgKGZyb20gamF2YTggYXJ0aWZhY3RzKSIKLS8vICBkZXBlbmRzT24gJzphc3NlbWJsZScKLS8vICB3b3JraW5nRGlyICdwbGF0Zm9ybS9qYXZhNycKLS8vICBjb21tYW5kTGluZSAnYW50JywgJ2NsZWFuJywgJ3JldHJvNycsCi0vLyAgICAgJy1EZWRnZW50OC50YXJnZXQ9Li4vLi4vYnVpbGQvZGlzdHJpYnV0aW9ucy9qYXZhOCcsCi0vLyAgICAgJy1EZWRnZW50Ny50YXJnZXQ9Li4vLi4vYnVpbGQvZGlzdHJpYnV0aW9ucy9qYXZhNycsCi0vLyAgICAgJy1EZXh0LmRpcj0uLi8uLi9idWlsZC9kaXN0cmlidXRpb25zL2phdmE4L2V4dCcsCi0vLyAgICAgJy1Ec2xmNGouZXh0LmRpcj0iIicsCi0vLyAgICAgJy1EZ3Nvbi5leHQuZGlyPSIiJywKLS8vICAgICAnLURtZXRyaWNzLmV4dC5kaXI9IiInCi0vL30KLQotLy8gTi5CLiBmb3IgamF2YTcgdGVzdGluZywgdXNlIHRoZSB0ZXN0N0NvbXBpbGUgYW5kIHRlc3Q3UnVuIHRhc2tzCi0vLwotLy8gPGVkZ2VudFJlcG8+L2dyYWRsZXcgOnBsYXRmb3JtOmphdmE3OnRlc3Q3Q29tcGlsZSAob3IganVzdCB0ZXN0N0NvbXBpbGUpIC0tIHJ1biB3aXRoIEpBVkFfSE9NRT09amF2YTgtVk0gdG8gY2hlY2sgdGhlIGphdmE3IGphcnMKLS8vIDxlZGdlbnRSZXBvPi9ncmFkbGV3IHRlc3Q3UnVuIChvciA8cHJvamVjdD46dGVzdDdSdW4gZm9yIGluZGl2aWR1YWwgcHJvamVjdCkgLS0gcnVuIHdpdGggSkFWQV9IT01FPT1qYXZhNy1WTSAoY2FuIHJ1biB3L2o4IHRvIHNtb2tldGVzdCB0aGUgcHJvY2VzcykuCi0KLXRhc2sgdmVyaWZ5SmF2YTdCdWlsdCB7Ci0gIGRlcGVuZHNPbiAnYW50X3ZlcmlmeS5qYXZhNy5idWlsdCcKLX0KLQotdGFzayBwcmVBbnRUZXN0N1NldHVwIHsKLSAgZGVzY3JpcHRpb24gPSAiU3RhZ2UgdGhlIGphdmE4IGJ1aWx0IHRlc3QgY2xhc3NlcyB3aGVyZSBhbnRfdGVzdDcuc2V0dXAgZXhwZWN0cyB0aGVtIgotICBkZXBlbmRzT24gZmlsdGVyZWRTdWJwcm9qZWN0cyouY29tcGlsZVRlc3RKYXZhLCBwcmVBbnRUYXNrCi0gIGRvTGFzdCB7Ci0gICAgcHJpbnRsbiAiTi5CLiB0ZXN0N0NvbXBpbGUgbXVzdCBiZSBydW4gYWZ0ZXIgdGhlICdyZWxlYXNlJyB0YXNrICh3aGljaCBjcmVhdGVzIHRoZSAnamF2YTcnIHRyZWUgaW4gdGhlIHRhcmdldGRpcikiCi0gICAgLy8gY29weSBqYXZhOCB0ZXN0IGNsYXNzZXMgd2hlcmUgYW50X3Rlc3Q3LnNldHVwIGV4cGVjdHMgdGhlbQotICAgIGZpbHRlcmVkU3VicHJvamVjdHMuZWFjaCB7IHByb2plY3QgLT4KLSAgICAgIGFudC5kZWxldGUoZGlyOiAiJHByb2plY3QucHJvamVjdERpci90ZXN0LmNsYXNzZXMiKQotICAgICAgY29weSB7Ci0gICAgICAgIGZyb20gcHJvamVjdC5zb3VyY2VTZXRzLnRlc3Qub3V0cHV0LmNsYXNzZXNEaXIKLSAgICAgICAgaW50byAiJHByb2plY3QucHJvamVjdERpci90ZXN0LmNsYXNzZXMiCi0gICAgICB9Ci0gICAgfQotICAgIC8vIHJlY29tcHV0ZS9zZXQgb3RoZXIgaW5wdXRzIHRvIHRoZSBhbnQgdGFza3MKLSAgICBhbnQucGF0aChpZDogJ3RjLmNsYXNzZXMnKSB7Ci0gICAgICBkaXJzZXQoZGlyOiByb290UHJvamVjdC5wcm9qZWN0RGlyKSB7Ci0gICAgICAgIGluY2x1ZGUobmFtZTogJyoqL3Rlc3QuY2xhc3NlcycpCi0gICAgICB9Ci0gICAgfQotICAgIGFudC5wcm9wZXJ0aWVzWyd0Y2NwJ10gPSBhbnQucmVmZXJlbmNlc1sndGMuY2xhc3NlcyddCi0gIH0KLX0KLQotdGFzayB0ZXN0N0NvbXBpbGUgewotICBkZXNjcmlwdGlvbiA9ICJDb21waWxlIHRoZSB0ZXN0IGNsYXNzZXMgZm9yIGphdmE3IChydW4gd2l0aCBKQVZBX0hPTUU9PWphdmE4LVZNKSIKLSAgZGVwZW5kc09uIHByZUFudFRlc3Q3U2V0dXAsICdhbnRfdGVzdDcuc2V0dXAnCi0gIHRhc2tzLmdldEJ5TmFtZSgnYW50X3Rlc3Q3LnNldHVwJykubXVzdFJ1bkFmdGVyIHByZUFudFRlc3Q3U2V0dXAKLSAgZG9MYXN0IHsKLSAgICAvLyBjb3B5IGFudF90ZXN0Ny5zZXR1cCBnZW5lcmF0ZWQgY2xhc3NlcyB0byB0aGVpciBwcm9qZWN0LmJ1aWxkRGlyL2NsYXNzZXMvamF2YTdUZXN0Ci0gICAgZmlsdGVyZWRTdWJwcm9qZWN0cy5lYWNoIHsgcHJvamVjdCAtPgotICAgICAgYW50LmRlbGV0ZShkaXI6IHByb2plY3QuajdUZXN0Q2xhc3Nlc0RpcikKLSAgICAgIGNvcHkgewotICAgICAgICBmcm9tICIkcHJvamVjdC5wcm9qZWN0RGlyL3Rlc3QuY2xhc3NlcyIKLSAgICAgICAgaW50byBwcm9qZWN0Lmo3VGVzdENsYXNzZXNEaXIKLSAgICAgIH0KLSAgICAgIGFudC5kZWxldGUoZGlyOiAiJHByb2plY3QucHJvamVjdERpci90ZXN0LmNsYXNzZXMiKQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vamF2YTcvYnVpbGQueG1sIGIvcGxhdGZvcm0vamF2YTcvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRkNDBiLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL2phdmE3L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotPHByb2plY3QgbmFtZT0iZWRnZW50LnBsYXRmb3JtLmphdmE3IiBkZWZhdWx0PSJhbGwiCi0gIHhtbG5zOmphY29jbz0iYW50bGliOm9yZy5qYWNvY28uYW50IgotICA+Ci0JPGRlc2NyaXB0aW9uPgotICAgICAgICBDcmVhdGUgSmF2YSA3IHZlcnNpb25zIG9mIHNlbGVjdGVkIGphcnMgaW4gamF2YTgKLSAgICAgICAgYnkgcnVubmluZyByZXRyb2xhbWJkYSBhZ2FpbnN0IHRoZW0uCi0gICAgPC9kZXNjcmlwdGlvbj4KLQotCTxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZWRnZW50IiBsb2NhdGlvbj0iLi4vLi4iLz4KLQk8cHJvcGVydHkgbmFtZT0iZWRnZW50OC50YXJnZXQiIGxvY2F0aW9uPSIke2VkZ2VudH0vdGFyZ2V0L2phdmE4Ii8+Ci0JPHByb3BlcnR5IG5hbWU9ImVkZ2VudDcudGFyZ2V0IiBsb2NhdGlvbj0iJHtlZGdlbnR9L3RhcmdldC9qYXZhNyIvPgotCi0JPHByb3BlcnR5IG5hbWU9ImlucHV0LmRpciIgbG9jYXRpb249ImNsYXNzZXMuaW4iLz4KLQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LmRpciIgbG9jYXRpb249ImNsYXNzZXMub3V0Ii8+Ci0JPHByb3BlcnR5IG5hbWU9ImV4dC5kaXIiIGxvY2F0aW9uPSIke2VkZ2VudH0vZXh0Ii8+Ci0JCi0gICAgPHByb3BlcnR5IG5hbWU9InNsZjRqLnZlcnNpb24iIHZhbHVlPSIxLjcuMTIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZ3Nvbi52ZXJzaW9uIiB2YWx1ZT0iMi4yLjQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWV0cmljcy52ZXJzaW9uIiB2YWx1ZT0iMy4xLjIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icmV0cm9sYW1iZGEudmVyc2lvbiIgdmFsdWU9IjIuMS4wIi8+Ci0KLQk8cHJvcGVydHkgbmFtZT0ic2xmNGouZXh0LmRpciIgdmFsdWU9InNsZjRqLSR7c2xmNGoudmVyc2lvbn0vIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imdzb24uZXh0LmRpciIgdmFsdWU9Imdvb2dsZS1nc29uLSR7Z3Nvbi52ZXJzaW9ufS8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWV0cmljcy5leHQuZGlyIiB2YWx1ZT0ibWV0cmljcy0ke21ldHJpY3MudmVyc2lvbn0vIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJldHJvbGFtYmRhLmphciIgbG9jYXRpb249ImV4dC9yZXRyb2xhbWJkYS0ke3JldHJvbGFtYmRhLnZlcnNpb259LmphciIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImFuZHJvaWQuc2RrLnBsYXRmb3JtLmphciIgdmFsdWU9IiIvPgotPCEtLQkKLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJhbmRyb2lkLnNkay5wbGF0Zm9ybS5qYXIiIHZhbHVlPSJlbnYuQU5EUk9JRF9TREtfUExBVEZPUk1fSkFSIj4KLSAgICAgIDxpc3NldCBwcm9wZXJ0eT0iZW52LkFORFJPSURfU0RLX1BMQVRGT1JNX0pBUiIgLz4KLSAgICA8L2NvbmRpdGlvbj4KLS0tPgotCi0JPHBhdGggaWQ9ImVkZ2VudC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZXh0LmRpcn0vJHtzbGY0ai5leHQuZGlyfXNsZjRqLWFwaS0ke3NsZjRqLnZlcnNpb259LmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZXh0LmRpcn0vJHtnc29uLmV4dC5kaXJ9Z3Nvbi0ke2dzb24udmVyc2lvbn0uamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtleHQuZGlyfS8ke21ldHJpY3MuZXh0LmRpcn1tZXRyaWNzLWNvcmUtJHttZXRyaWNzLnZlcnNpb259LmphciIvPgotCTwvcGF0aD4KLQk8cHJvcGVydHkgbmFtZT0icWNwIiByZWZpZD0iZWRnZW50LmNsYXNzcGF0aCIvPgotCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtlZGdlbnQ3LnRhcmdldH0iLz4KLQk8L3RhcmdldD4KLQotCTxtYWNyb2RlZiBuYW1lPSJyZXRybzciPgotCQk8YXR0cmlidXRlIG5hbWU9InFqYXIiLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJxZGlyIiBkZWZhdWx0PSJsaWIiIC8+Ci0JCTxzZXF1ZW50aWFsPgotCQkJPGRlbGV0ZSBkaXI9IiR7aW5wdXQuZGlyfSIvPgotCQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0LmRpcn0iLz4KLQotCQkJPG1rZGlyIGRpcj0iJHtpbnB1dC5kaXJ9Ii8+Ci0JCQk8bWtkaXIgZGlyPSIke291dHB1dC5kaXJ9Ii8+Ci0KLQkJCTx1bnppcCBkZXN0PSIke2lucHV0LmRpcn0iIHNyYz0iJHtlZGdlbnQ4LnRhcmdldH0vQHtxZGlyfS9Ae3FqYXJ9Ii8+Ci0KLQkJCTxleGVjIGV4ZWN1dGFibGU9ImphdmEiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLQkJCQk8YXJnIHZhbHVlPSItRHJldHJvbGFtYmRhLmlucHV0RGlyPSR7aW5wdXQuZGlyfSIvPgotCQkJCTxhcmcgdmFsdWU9Ii1EcmV0cm9sYW1iZGEuY2xhc3NwYXRoPSR7ZWRnZW50OC50YXJnZXR9L0B7cWRpcn0vQHtxamFyfToke3FjcH0iLz4KLQkJCQk8YXJnIHZhbHVlPSItRHJldHJvbGFtYmRhLm91dHB1dERpcj0ke291dHB1dC5kaXJ9Ii8+Ci0JCQkJPGFyZyB2YWx1ZT0iLURyZXRyb2xhbWJkYS5kZWZhdWx0TWV0aG9kcz1mYWxzZSIvPgotCQkJCTxhcmcgdmFsdWU9Ii1qYXIiLz4KLQkJCQk8YXJnIHZhbHVlPSIke3JldHJvbGFtYmRhLmphcn0iLz4KLQkJCTwvZXhlYz4KLQkJCTxta2RpciBkaXI9IiR7ZWRnZW50Ny50YXJnZXR9L0B7cWRpcn0iLz4KLQkJCTxqYXIgZGVzdGZpbGU9IiR7ZWRnZW50Ny50YXJnZXR9L0B7cWRpcn0vQHtxamFyfSIKLQkgIGZpbGVzb25seT0idHJ1ZSIKLQkgIG1hbmlmZXN0PSIke2lucHV0LmRpcn0vTUVUQS1JTkYvTUFOSUZFU1QuTUYiCi0JICA+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke291dHB1dC5kaXJ9Ii8+Ci0JCQk8L2phcj4KLQkJCQotICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7aW5wdXQuZGlyfSIvPgotICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7b3V0cHV0LmRpcn0iLz4KLQkJPC9zZXF1ZW50aWFsPgotCTwvbWFjcm9kZWY+Ci0KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iY2xlYW4iCi0gICAgZGVzY3JpcHRpb249IkNvbXBpbGUgRWRnZW50IGFuZCBwcm9kdWNlIEphdmEgNyBqYXJzIHVzaW5nIHJldHJvbGFtYmRhLiBNdXN0IGJlIHJ1biB3aXRoIGEgSmF2YSA4IHZpcnR1YWwgbWFjaGluZS4iCi0gICAgPgotCQk8YW50IGRpcj0iJHtlZGdlbnR9IiBpbmhlcml0QWxsPSJmYWxzZSI+Ci0JCQk8dGFyZ2V0IG5hbWU9ImNsZWFuIi8+Ci0JCQk8dGFyZ2V0IG5hbWU9ImFsbCIvPgotCQk8L2FudD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJyZXRybzciLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icmV0cm83IiA+Ci0JCTxhbnRjYWxsIHRhcmdldD0icmV0cm83LmVkZ2VudCIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJldHJvNy5lZGdlbnQuYW5kcm9pZCIvPgotCTwvdGFyZ2V0PgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgVGhpcyBjb250YWlucyB0aGUgc2V0IG9mIGphcnMgdGhhdCBhcmUgY29udmVydGVkCi0gICAgICAgIHRvIHdvcmsgb24gSmF2YSA3LgotCi0gICAgICAgIE1hdGNoaW5nIHRlc3RzIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0ZXN0Ny5zZXR1cAotICAgICAgICBhbmQgdGVzdDcucnVuCi0gICAgICAgIC0tPgotCTx0YXJnZXQgbmFtZT0icmV0cm83LmVkZ2VudCIgPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5hcGkuZnVuY3Rpb24uamFyIiAvPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5hcGkuZXhlY3V0aW9uLmphciIgLz4KLQkJPHJldHJvNyBxamFyPSJlZGdlbnQuYXBpLmdyYXBoLmphciIgLz4KLQkJPHJldHJvNyBxamFyPSJlZGdlbnQuYXBpLndpbmRvdy5qYXIiIC8+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LmFwaS5vcGxldC5qYXIiIC8+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LmFwaS50b3BvbG9neS5qYXIiIC8+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LnNwaS5ncmFwaC5qYXIiIC8+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LnNwaS50b3BvbG9neS5qYXIiIC8+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LnJ1bnRpbWUuZXRpYW8uamFyIiAvPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5ydW50aW1lLmFwcHNlcnZpY2UuamFyIiAvPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5ydW50aW1lLmpteGNvbnRyb2wuamFyIiAvPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5ydW50aW1lLmpzb25jb250cm9sLmphciIgLz4KLQkJPHJldHJvNyBxamFyPSJlZGdlbnQucnVudGltZS5qb2JyZWdpc3RyeS5qYXIiIC8+Ci0KLQkJPHJldHJvNyBxamFyPSJlZGdlbnQudXRpbHMubWV0cmljcy5qYXIiIHFkaXI9InV0aWxzL21ldHJpY3MvbGliIiAvPgotICAgICAgICA8IS0tIHV0aWxzL3N0cmVhbXNjb3BlIC0gd2h5IG5vdCBqYXZhNz8gLS0+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuamFyIiAvPgotICAgICAgICA8IS0tIHByb3ZpZGVycy9kZXZlbG9wbWVudCAtIHdoeSBub3QgamF2YTc/IC0tPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5jb25uZWN0b3JzLmNvbW1vbi5qYXIiICBxZGlyPSJjb25uZWN0b3JzL2NvbW1vbi9saWIiIC8+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LmNvbm5lY3RvcnMuaW90LmphciIgcWRpcj0iY29ubmVjdG9ycy9pb3QvbGliIiAvPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5jb25uZWN0b3JzLmlvdHAuamFyIiBxZGlyPSJjb25uZWN0b3JzL2lvdHAvbGliIiAvPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5jb25uZWN0b3JzLmh0dHAuamFyIiBxZGlyPSJjb25uZWN0b3JzL2h0dHAvbGliIiAvPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5jb25uZWN0b3JzLnB1YnN1Yi5qYXIiICBxZGlyPSJjb25uZWN0b3JzL3B1YnN1Yi9saWIiIC8+Ci0gICAgICAgIDwhLS0gY29ubmVjdG9ycy9jb21tYW5kIC0gd2h5IG5vdCBqYXZhNz8gLS0+Ci0gICAgICAgIDwhLS0gY29ubmVjdG9ycy9jc3YgLSB3aHkgbm90IGphdmE3PyAtLT4KLSAgICAgICAgPCEtLSBjb25uZWN0b3JzL2ZpbGUgLSB3aHkgbm90IGphdmE3PyAtLT4KLSAgICAgICAgPCEtLSBjb25uZWN0b3JzL2pkYmMgLSB3aHkgbm90IGphdmE3PyAtLT4KLSAgICAgICAgPCEtLSBjb25uZWN0b3JzL21xdHQgLSB3aHkgbm90IGphdmE3PyAtLT4KLSAgICAgICAgPCEtLSBjb25uZWN0b3JzL2thZmthIC0gd2h5IG5vdCBqYXZhNz8gLS0+Ci0gICAgICAgIDwhLS0gY29ubmVjdG9ycy93c2NsaWVudCAtIHdoeSBub3QgamF2YTc/IC0tPgotICAgICAgICA8IS0tIGNvbm5lY3RvcnMvamF2YXgud2Vic29ja2V0LWNsaWVudCAtIHdoeSBub3QgamF2YTc/IC0tPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5hcHBzLmlvdC5qYXIiICBxZGlyPSJhcHBzL2lvdC9saWIiIC8+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LmFwcHMucnVudGltZS5qYXIiICBxZGlyPSJhcHBzL3J1bnRpbWUvbGliIiAvPgotICAgICAgICA8IS0tIGFuYWx5dGljcy9tYXRoMyAtIHdoeSBub3QgamF2YTc/IC0tPgotCQk8cmV0cm83IHFqYXI9ImVkZ2VudC5wcm92aWRlcnMuaW90LmphciIgLz4KLQkJPHJldHJvNyBxamFyPSJlZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMuamFyIiBxZGlyPSJhbmFseXRpY3Mvc2Vuc29ycy9saWIiIC8+Ci0KLSAgICAgICAgICAgICAgICA8cmV0cm83IHFqYXI9ImVkZ2VudC5zYW1wbGVzLmFwcHMuamFyIiBxZGlyPSJzYW1wbGVzL2xpYiIgLz4KLSAgICAgICAgICAgICAgICA8cmV0cm83IHFqYXI9ImVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuamFyIiBxZGlyPSJzYW1wbGVzL2xpYiIgLz4KLSAgICAgICAgICAgICAgICA8cmV0cm83IHFqYXI9ImVkZ2VudC5zYW1wbGVzLmNvbnNvbGUuamFyIiBxZGlyPSJzYW1wbGVzL2xpYiIgLz4KLSAgICAgICAgICAgICAgICA8cmV0cm83IHFqYXI9ImVkZ2VudC5zYW1wbGVzLnNjZW5hcmlvcy5qYXIiIHFkaXI9InNhbXBsZXMvbGliIiAvPgotICAgICAgICAgICAgICAgIDxyZXRybzcgcWphcj0iZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuamFyIiBxZGlyPSJzYW1wbGVzL2xpYiIgLz4KLSAgICAgICAgICAgICAgICA8cmV0cm83IHFqYXI9ImVkZ2VudC5zYW1wbGVzLnV0aWxzLmphciIgcWRpcj0ic2FtcGxlcy9saWIiIC8+Ci0KLQkJPG1rZGlyIGRpcj0iJHtlZGdlbnQ3LnRhcmdldH0vZXh0Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2VkZ2VudDcudGFyZ2V0fS9leHQiPgotCQkJPGZpbGVzZXQgZGlyPSIke2VkZ2VudDgudGFyZ2V0fS9leHQiLz4KLQkJPC9jb3B5PgotCi0JCTxta2RpciBkaXI9IiR7ZWRnZW50Ny50YXJnZXR9L2Nvbm5lY3RvcnMvaW90cC9leHQiLz4KLQkJPGNvcHkgdG9kaXI9IiR7ZWRnZW50Ny50YXJnZXR9L2Nvbm5lY3RvcnMvaW90cC9leHQiPgotCQkJPGZpbGVzZXQgZGlyPSIke2VkZ2VudDgudGFyZ2V0fS9jb25uZWN0b3JzL2lvdHAvZXh0Ii8+Ci0JCTwvY29weT4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtlZGdlbnQ3LnRhcmdldH0vY29ubmVjdG9ycy9odHRwL2V4dCIvPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtlZGdlbnQ3LnRhcmdldH0vY29ubmVjdG9ycy9odHRwL2V4dCI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZWRnZW50OC50YXJnZXR9L2Nvbm5lY3RvcnMvaHR0cC9leHQiLz4KLSAgICAgICAgPC9jb3B5PgotCQk8IS0tIHdoeSBtcXR0L2V4dCB3aGVuIGNvbm5lY3RvcnMvbXF0dCBub3QgaW5jbHVkZWQgYWJvdmU/IC0tPgotCQk8bWtkaXIgZGlyPSIke2VkZ2VudDcudGFyZ2V0fS9jb25uZWN0b3JzL21xdHQvZXh0Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2VkZ2VudDcudGFyZ2V0fS9jb25uZWN0b3JzL21xdHQvZXh0Ij4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlZGdlbnQ4LnRhcmdldH0vY29ubmVjdG9ycy9tcXR0L2V4dCIvPgotCQk8L2NvcHk+Ci0gICAgICAgIDwhLS0gd2h5IG1hdGgzL2V4dCB3aGVuIGFuYWx5dGljcy9tYXRoMyBub3QgaW5jbHVkZWQgYWJvdmU/IC0tPgotCQk8bWtkaXIgZGlyPSIke2VkZ2VudDcudGFyZ2V0fS9hbmFseXRpY3MvbWF0aDMvZXh0Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2VkZ2VudDcudGFyZ2V0fS9hbmFseXRpY3MvbWF0aDMvZXh0Ij4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlZGdlbnQ4LnRhcmdldH0vYW5hbHl0aWNzL21hdGgzL2V4dCIvPgotCQk8L2NvcHk+Ci0KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InJldHJvNy5lZGdlbnQuYW5kcm9pZCIgaWY9ImFuZHJvaWQuc2RrLnBsYXRmb3JtLmphciI+Ci0JCTxyZXRybzcgcWphcj0iZWRnZW50LmFuZHJvaWQudG9wb2xvZ3kuamFyIiBxZGlyPSJhbmRyb2lkL3RvcG9sb2d5L2xpYiIgLz4KLQkJPHJldHJvNyBxamFyPSJlZGdlbnQuYW5kcm9pZC5oYXJkd2FyZS5qYXIiIHFkaXI9ImFuZHJvaWQvaGFyZHdhcmUvbGliIiAvPgotCTwvdGFyZ2V0PgotCi0JPHBhdGggaWQ9InRjLmNsYXNzcGF0aCI+Ci0JCTxkaXJzZXQgZGlyPSIke2VkZ2VudH0iPgotCQkJPGluY2x1ZGUgbmFtZT0iKiovdGVzdC5jbGFzc2VzIi8+Ci0JCTwvZGlyc2V0PgotCTwvcGF0aD4KLQk8cHJvcGVydHkgbmFtZT0idGNjcCIgcmVmaWQ9InRjLmNsYXNzcGF0aCIvPgotCi0JPG1hY3JvZGVmIG5hbWU9InJldHJvNy50ZXN0LnNldHVwIj4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJ0ZGlyIi8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0ibGRpciIgZGVmYXVsdD0ibGliIi8+Ci0JCTxzZXF1ZW50aWFsPgotCQkJPGVjaG8gbWVzc2FnZT0iVGVzdGluZyBTZXR1cDogQHt0ZGlyfSIvPgotCQkJPGRlbGV0ZSBkaXI9IiR7ZWRnZW50fS9Ae3RkaXJ9L3Rlc3Q3LmNsYXNzZXMiLz4KLQkJCTxta2RpciBkaXI9IiR7ZWRnZW50fS9Ae3RkaXJ9L3Rlc3Q3LmNsYXNzZXMiLz4KLQotICAgICAgICAgICAgPCEtLSA8ZWNobyBtZXNzYWdlPSIjIyMjIHFjcDcgJHtxY3A3fSIvPiAtLT4KLSAgICAgICAgICAgIDwhLS0gPGVjaG8gbWVzc2FnZT0iIyMjIyBxY3AgJHtxY3B9Ii8+IC0tPgotICAgICAgICAgICAgPCEtLSA8ZWNobyBtZXNzYWdlPSIjIyMjIHRjY3AgJHt0Y2NwfSIvPiAtLT4KLQkJCTxleGVjIGV4ZWN1dGFibGU9ImphdmEiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLQkJCQk8YXJnIHZhbHVlPSItRHJldHJvbGFtYmRhLmlucHV0RGlyPSR7ZWRnZW50fS9Ae3RkaXJ9L3Rlc3QuY2xhc3NlcyIvPgotCQkJCTxhcmcgdmFsdWU9Ii1EcmV0cm9sYW1iZGEuY2xhc3NwYXRoPSR7cWNwN306JHtxY3B9OiR7dGNjcH0iLz4KLQkJCQk8YXJnIHZhbHVlPSItRHJldHJvbGFtYmRhLm91dHB1dERpcj0ke2VkZ2VudH0vQHt0ZGlyfS90ZXN0Ny5jbGFzc2VzIi8+Ci0JCQkJPGFyZyB2YWx1ZT0iLURyZXRyb2xhbWJkYS5kZWZhdWx0TWV0aG9kcz10cnVlIi8+Ci0JCQkJPGFyZyB2YWx1ZT0iLWphciIvPgotICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7cmV0cm9sYW1iZGEuamFyfSIvPgotCQkJPC9leGVjPgotCQkJPGRlbGV0ZSBkaXI9IiR7ZWRnZW50fS9Ae3RkaXJ9L3Rlc3QuY2xhc3NlcyIvPgotCQkJPG1vdmUgICBmaWxlPSIke2VkZ2VudH0vQHt0ZGlyfS90ZXN0Ny5jbGFzc2VzIgotICAgICAgICAgICAgICB0b2ZpbGU9IiR7ZWRnZW50fS9Ae3RkaXJ9L3Rlc3QuY2xhc3NlcyIvPgotCQk8L3NlcXVlbnRpYWw+Ci0JPC9tYWNyb2RlZj4KLQotCTxtYWNyb2RlZiBuYW1lPSJyZXRybzcudGVzdC5ydW4iPgotCQk8YXR0cmlidXRlIG5hbWU9InRkaXIiLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJsZGlyIiBkZWZhdWx0PSJsaWIiLz4KLQkJPHNlcXVlbnRpYWw+Ci0JCQk8ZWNobyBtZXNzYWdlPSJUZXN0aW5nOiBAe3RkaXJ9Ii8+Ci0JCQk8YW50IGRpcj0iJHtlZGdlbnR9L0B7dGRpcn0iIHRhcmdldD0idGVzdC5ydW4iIGluaGVyaXRBbGw9ImZhbHNlIj4KLQkJCQk8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0iJHtlZGdlbnQ3LnRhcmdldH0vQHtsZGlyfSIvPgotCQkJCTxwcm9wZXJ0eSBuYW1lPSJlZGdlbnQubGliIiBsb2NhdGlvbj0iJHtlZGdlbnQ3LnRhcmdldH0vbGliIi8+Ci0JCQkJPHByb3BlcnR5IG5hbWU9ImVkZ2VudC51dGlscyIgbG9jYXRpb249IiR7ZWRnZW50Ny50YXJnZXR9L3V0aWxzIi8+Ci0JCQkJPHByb3BlcnR5IG5hbWU9ImVkZ2VudC5jb25uZWN0b3JzIiBsb2NhdGlvbj0iJHtlZGdlbnQ3LnRhcmdldH0vY29ubmVjdG9ycyIvPgotCQkJPC9hbnQ+Ci0JCTwvc2VxdWVudGlhbD4KLQk8L21hY3JvZGVmPgotCi0gICAgICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5LmphdmE3LmJ1aWx0Ij4KLSAgICAgICAgICAgPGZhaWwgbWVzc2FnZT0iSmF2YSA3IGphcnMgbm90IGJ1aWx0ISI+Ci0gICAgICAgICAgICAgPGNvbmRpdGlvbj4KLSAgICAgICAgICAgICAgIDxub3Q+Ci0gICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtlZGdlbnQ3LnRhcmdldH0vbGliIiB0eXBlPSJkaXIiLz4KLSAgICAgICAgICAgICAgIDwvbm90PgotICAgICAgICAgICAgIDwvY29uZGl0aW9uPgotICAgICAgICAgICA8L2ZhaWw+Ci0gICAgICAgIDwvdGFyZ2V0PgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNldCBvZiB0ZXN0cyB0aGF0IGFyZSBjb252ZXJ0ZWQKLSAgICAgICAgICAgIHRvIGJlIHVzZWQgd2l0aCBKYXZhIDcKLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gRW5zdXJlIHByZXZpb3VzIHNlcGFyYXRlIGJ1aWxkIHN0ZXBzIGJ1aWx0IHRoZSBKYXZhIDcgamFycyAtLT4KLQk8dGFyZ2V0IG5hbWU9InRlc3Q3LnNldHVwIiBkZXBlbmRzPSJ2ZXJpZnkuamF2YTcuYnVpbHQiCi0gICAgZGVzY3JpcHRpb249IlNldHVwICBFZGdlbnQgdGVzdHMgZm9yIHRoZSBKYXZhIDcuTXVzdCBiZSBydW4gd2l0aCBKYXZhIDggdG8gcnVuIHJldHJvbGFtYmRhLiIKLSAgICA+Ci0JCTxwYXRoIGlkPSJlZGdlbnQuamF2YTcuY2xhc3NwYXRoIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlZGdlbnQ3LnRhcmdldH0vbGliIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotCQkJPC9maWxlc2V0PgotCQkJPGZpbGVzZXQgZGlyPSIke2VkZ2VudDcudGFyZ2V0fS9jb25uZWN0b3JzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqL2xpYi8qLmphciIvPgotCQkJPC9maWxlc2V0PgotCQkJPGZpbGVzZXQgZGlyPSIke2VkZ2VudDcudGFyZ2V0fS91dGlscyI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKi9saWIvKi5qYXIiLz4KLQkJCTwvZmlsZXNldD4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlZGdlbnQ3LnRhcmdldH0vYW5hbHl0aWNzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqL2xpYi8qLmphciIvPgotCQkJPC9maWxlc2V0PgotCQk8L3BhdGg+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJxY3A3IiByZWZpZD0iZWRnZW50LmphdmE3LmNsYXNzcGF0aCIvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0iYXBpL2Z1bmN0aW9uIi8+Ci0JCTxyZXRybzcudGVzdC5zZXR1cCB0ZGlyPSJhcGkvZXhlY3V0aW9uIi8+Ci0JCTxyZXRybzcudGVzdC5zZXR1cCB0ZGlyPSJhcGkvZ3JhcGgiIC8+Ci0JCTxyZXRybzcudGVzdC5zZXR1cCB0ZGlyPSJhcGkvd2luZG93IiAvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0iYXBpL29wbGV0IiAvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0iYXBpL3RvcG9sb2d5IiAvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0ic3BpL2dyYXBoIiAvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0ic3BpL3RvcG9sb2d5IiAvPgotICAgICAgICA8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0icnVudGltZS9hcHBzZXJ2aWNlIiAvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0icnVudGltZS9ldGlhbyIgLz4KLQkJPHJldHJvNy50ZXN0LnNldHVwIHRkaXI9InJ1bnRpbWUvam14Y29udHJvbCIgLz4KLQkJPHJldHJvNy50ZXN0LnNldHVwIHRkaXI9InJ1bnRpbWUvanNvbmNvbnRyb2wiIC8+Ci0JCTxyZXRybzcudGVzdC5zZXR1cCB0ZGlyPSJydW50aW1lL2pvYnJlZ2lzdHJ5IiAvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0idXRpbHMvbWV0cmljcyIgIGxkaXI9InV0aWxzL21ldHJpY3MvbGliIi8+Ci0JCTxyZXRybzcudGVzdC5zZXR1cCB0ZGlyPSJwcm92aWRlcnMvZGlyZWN0IiAvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0iY29ubmVjdG9ycy9jb21tb24iIGxkaXI9ImNvbm5lY3RvcnMvY29tbW9uL2xpYiIvPgotICAgICAgICA8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0iY29ubmVjdG9ycy9pb3QiICBsZGlyPSJjb25uZWN0b3JzL2lvdC9saWIiLz4KLQkJPHJldHJvNy50ZXN0LnNldHVwIHRkaXI9ImNvbm5lY3RvcnMvaW90cCIgIGxkaXI9ImNvbm5lY3RvcnMvaW90cC9saWIiLz4KLQkJPHJldHJvNy50ZXN0LnNldHVwIHRkaXI9ImNvbm5lY3RvcnMvaHR0cCIgIGxkaXI9ImNvbm5lY3RvcnMvaHR0cC9saWIiLz4KLQkJPHJldHJvNy50ZXN0LnNldHVwIHRkaXI9ImNvbm5lY3RvcnMvcHVic3ViIiAgbGRpcj0iY29ubmVjdG9ycy9wdWJzdWIvbGliIi8+Ci0JCTxyZXRybzcudGVzdC5zZXR1cCB0ZGlyPSJhcHBzL2lvdCIgIGxkaXI9ImFwcHMvaW90L2xpYiIvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0iYXBwcy9ydW50aW1lIiAgbGRpcj0iYXBwcy9ydW50aW1lL2xpYiIvPgotCQk8cmV0cm83LnRlc3Quc2V0dXAgdGRpcj0iYW5hbHl0aWNzL3NlbnNvcnMiICBsZGlyPSJhbmFseXRpY3Mvc2Vuc29ycy9saWIiLz4KLQk8L3RhcmdldD4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBUaGlzIGlzIHRoZSBzZXQgb2YgdGVzdHMgdGhhdCBhcmUgY29udmVydGVkCi0gICAgICAgICAgICB0byBiZSB1c2VkIHdpdGggSmF2YSA3Ci0gICAgICAgIC0tPgotCTwhLS0gdGhpcyBtdXN0IGJlIHByZWNlZWRlZCBieSB0ZXN0Ny5zZXR1cCAocnVuIHdpdGggYSBKYXZhIDggdm0pIC0tPgotCTx0YXJnZXQgbmFtZT0idGVzdDcucnVuIiBkZXBlbmRzPSJ2ZXJpZnkuamF2YTcuYnVpbHQiCi0JICAgIGRlc2NyaXB0aW9uPSJSdW4gRWRnZW50IHRlc3RzIGZvciB0aGUgSmF2YSA3LiBTaG91bGQgYmUgcnVuIHdpdGggSkFWQV9IT01FIHBvaW50aW5nIHRvIGEgSmF2YSA3IHZpcnR1YWwgbWFjaGluZSwgdGhvdWdoIGNhbiBhbHNvIGJlIHJ1biB3aXRoIEphdmEgOCIKLQkgICAgPgotCQk8cmV0cm83LnRlc3QucnVuIHRkaXI9ImFwaS9mdW5jdGlvbiIvPgotCQk8cmV0cm83LnRlc3QucnVuIHRkaXI9ImFwaS9leGVjdXRpb24iLz4KLQkJPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJhcGkvZ3JhcGgiIC8+Ci0JCTxyZXRybzcudGVzdC5ydW4gdGRpcj0iYXBpL3dpbmRvdyIgLz4KLQkJPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJhcGkvb3BsZXQiIC8+Ci0JCTxyZXRybzcudGVzdC5ydW4gdGRpcj0iYXBpL3RvcG9sb2d5IiAvPgotCQk8cmV0cm83LnRlc3QucnVuIHRkaXI9InNwaS9ncmFwaCIgLz4KLQkJPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJzcGkvdG9wb2xvZ3kiIC8+Ci0gICAgICAgIDxyZXRybzcudGVzdC5ydW4gdGRpcj0icnVudGltZS9hcHBzZXJ2aWNlIiAvPgotCQk8cmV0cm83LnRlc3QucnVuIHRkaXI9InJ1bnRpbWUvZXRpYW8iIC8+Ci0JCTxyZXRybzcudGVzdC5ydW4gdGRpcj0icnVudGltZS9qbXhjb250cm9sIiAvPgotCQk8cmV0cm83LnRlc3QucnVuIHRkaXI9InJ1bnRpbWUvanNvbmNvbnRyb2wiIC8+Ci0JCTxyZXRybzcudGVzdC5ydW4gdGRpcj0icnVudGltZS9qb2JyZWdpc3RyeSIgLz4KLQkJPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJ1dGlscy9tZXRyaWNzIiAgbGRpcj0idXRpbHMvbWV0cmljcy9saWIiLz4KLQkJPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJwcm92aWRlcnMvZGlyZWN0IiAvPgotCQk8cmV0cm83LnRlc3QucnVuIHRkaXI9ImNvbm5lY3RvcnMvY29tbW9uIiBsZGlyPSJjb25uZWN0b3JzL2NvbW1vbi9saWIiLz4KLSAgICAgICAgPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJjb25uZWN0b3JzL2lvdCIgIGxkaXI9ImNvbm5lY3RvcnMvaW90L2xpYiIvPgotCQk8cmV0cm83LnRlc3QucnVuIHRkaXI9ImNvbm5lY3RvcnMvaW90cCIgIGxkaXI9ImNvbm5lY3RvcnMvaW90cC9saWIiLz4KLQkJPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJjb25uZWN0b3JzL2h0dHAiICBsZGlyPSJjb25uZWN0b3JzL2h0dHAvbGliIi8+Ci0JCTxyZXRybzcudGVzdC5ydW4gdGRpcj0iY29ubmVjdG9ycy9wdWJzdWIiICBsZGlyPSJjb25uZWN0b3JzL3B1YnN1Yi9saWIiLz4KLQkJPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJhcHBzL2lvdCIgIGxkaXI9ImFwcHMvaW90L2xpYiIvPgotCQk8cmV0cm83LnRlc3QucnVuIHRkaXI9ImFwcHMvcnVudGltZSIgIGxkaXI9ImFwcHMvcnVudGltZS9saWIiLz4KLQkJPHJldHJvNy50ZXN0LnJ1biB0ZGlyPSJhbmFseXRpY3Mvc2Vuc29ycyIgIGxkaXI9ImFuYWx5dGljcy9zZW5zb3JzL2xpYiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JCTxkZWxldGUgZGlyPSIke2lucHV0LmRpcn0iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0LmRpcn0iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZWRnZW50Ny50YXJnZXR9Ii8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2FuYWx5dGljcy9tYXRoMy9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvYW5hbHl0aWNzL21hdGgzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjY2UzYgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FuYWx5dGljcy9tYXRoMy9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljcy1tYXRoMzwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQW5hbHl0aWNzOiBNYXRoMzwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbWF0aDM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjQuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9hbmFseXRpY3MvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FuYWx5dGljcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTMyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hbmFseXRpY3MvcG9tLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtYW5kcm9pZDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljczwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQW5hbHl0aWNzPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+bWF0aDM8L21vZHVsZT4KKyAgICA8bW9kdWxlPnNlbnNvcnM8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9hbmFseXRpY3Mvc2Vuc29ycy9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvYW5hbHl0aWNzL3NlbnNvcnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzY2NTExCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvYW5hbHl0aWNzL3NlbnNvcnMvcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hbmFseXRpY3M8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hbmFseXRpY3Mtc2Vuc29yczwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQW5hbHl0aWNzOiBTZW5zb3JzPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvYW5kcm9pZC9oYXJkd2FyZS9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvYW5kcm9pZC9oYXJkd2FyZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODZhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hbmRyb2lkL2hhcmR3YXJlL3BvbS54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYW5kcm9pZDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuZHJvaWQtaGFyZHdhcmU8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IEFuZHJvaWQ6IEhhcmR3YXJlPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hbmRyb2lkPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC4xLjEuNDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9oYXJkd2FyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yU3RyZWFtcy5qYXZhIGIvcGxhdGZvcm1zL2FuZHJvaWQvYW5kcm9pZC9oYXJkd2FyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yU3RyZWFtcy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhbmRyb2lkL2hhcmR3YXJlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JTdHJlYW1zLmphdmEKcmVuYW1lIHRvIHBsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvaGFyZHdhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvclN0cmVhbXMuamF2YQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9oYXJkd2FyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuZHJvaWQvaGFyZHdhcmUvcnVudGltZS9TZW5zb3JDaGFuZ2VFdmVudHMuamF2YSBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvaGFyZHdhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL2hhcmR3YXJlL3J1bnRpbWUvU2Vuc29yQ2hhbmdlRXZlbnRzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFuZHJvaWQvaGFyZHdhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL2hhcmR3YXJlL3J1bnRpbWUvU2Vuc29yQ2hhbmdlRXZlbnRzLmphdmEKcmVuYW1lIHRvIHBsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvaGFyZHdhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL2hhcmR3YXJlL3J1bnRpbWUvU2Vuc29yQ2hhbmdlRXZlbnRzLmphdmEKZGlmZiAtLWdpdCBhL2FuZHJvaWQvaGFyZHdhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL2hhcmR3YXJlL3J1bnRpbWUvU2Vuc29yU291cmNlU2V0dXAuamF2YSBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvaGFyZHdhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL2hhcmR3YXJlL3J1bnRpbWUvU2Vuc29yU291cmNlU2V0dXAuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYW5kcm9pZC9oYXJkd2FyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuZHJvaWQvaGFyZHdhcmUvcnVudGltZS9TZW5zb3JTb3VyY2VTZXR1cC5qYXZhCnJlbmFtZSB0byBwbGF0Zm9ybXMvYW5kcm9pZC9hbmRyb2lkL2hhcmR3YXJlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5kcm9pZC9oYXJkd2FyZS9ydW50aW1lL1NlbnNvclNvdXJjZVNldHVwLmphdmEKZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTczNzUyCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvYW5kcm9pZC9wb20ueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3Jtcy1hbmRyb2lkPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYW5kcm9pZDwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQW5kcm9pZDwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmhhcmR3YXJlPC9tb2R1bGU+CisgICAgPG1vZHVsZT50b3BvbG9neTwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPCEtLSBDb252ZXJ0IHRoZSBKYXZhOCBjbGFzc2VzIHRvIEphdmE3IGNsYXNzZXMgLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5uZXQub3JmamFja2FsLnJldHJvbGFtYmRhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5yZXRyb2xhbWJkYS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNS4xPC92ZXJzaW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzLW1haW48L2dvYWw+CisgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3MtdGVzdDwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPCEtLSBJIHdhcyBnZXR0aW5nIHJhbmRvbSBmYWlsdXJlcyBpZiBub3QgcnVubmluZyByZXRyb2xhbWJkYSBpbiBhIHNlcGFyYXRlIHByb2Nlc3MgLS0+CisgICAgICAgICAgICAgIDxmb3JrPnRydWU8L2Zvcms+CisgICAgICAgICAgICAgIDxqYXZhOGhvbWU+JHtqYXZhOC5ob21lfTwvamF2YThob21lPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvdG9wb2xvZ3kvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvdG9wb2xvZ3kvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODkxZTlhCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvYW5kcm9pZC90b3BvbG9neS9wb20ueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuZHJvaWQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hbmRyb2lkLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBBbmRyb2lkOiBUb3BvbG9neTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktb3BsZXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hbmRyb2lkPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC4xLjEuNDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuZHJvaWQvb3BsZXQvUnVuT25VSVRocmVhZC5qYXZhIGIvcGxhdGZvcm1zL2FuZHJvaWQvYW5kcm9pZC90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuZHJvaWQvb3BsZXQvUnVuT25VSVRocmVhZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGFuZHJvaWQvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL29wbGV0L1J1bk9uVUlUaHJlYWQuamF2YQpyZW5hbWUgdG8gcGxhdGZvcm1zL2FuZHJvaWQvYW5kcm9pZC90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L2FuZHJvaWQvb3BsZXQvUnVuT25VSVRocmVhZC5qYXZhCmluZGV4IGE2ODgzNGQuLjg4YWM1Y2UgMTAwNjQ0Ci0tLSBhL2FuZHJvaWQvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL29wbGV0L1J1bk9uVUlUaHJlYWQuamF2YQorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hbmRyb2lkL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5kcm9pZC9vcGxldC9SdW5PblVJVGhyZWFkLmphdmEKQEAgLTMxLDcgKzMxLDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVCB2YWx1ZSkgeyAgICAgICAKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgVCB2YWx1ZSkgewogICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKCgpIC0+IGdldERlc3RpbmF0aW9uKCkuYWNjZXB0KHZhbHVlKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5kcm9pZC90b3BvbG9neS9BY3Rpdml0eVN0cmVhbXMuamF2YSBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FuZHJvaWQvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL3RvcG9sb2d5L0FjdGl2aXR5U3RyZWFtcy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIGFuZHJvaWQvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9hbmRyb2lkL3RvcG9sb2d5L0FjdGl2aXR5U3RyZWFtcy5qYXZhCnJlbmFtZSB0byBwbGF0Zm9ybXMvYW5kcm9pZC9hbmRyb2lkL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5kcm9pZC90b3BvbG9neS9BY3Rpdml0eVN0cmVhbXMuamF2YQppbmRleCA4NmJmNzQzLi4wMzk2YmNhIDEwMDY0NAotLS0gYS9hbmRyb2lkL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5kcm9pZC90b3BvbG9neS9BY3Rpdml0eVN0cmVhbXMuamF2YQorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hbmRyb2lkL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvYW5kcm9pZC90b3BvbG9neS9BY3Rpdml0eVN0cmVhbXMuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZC50b3BvbG9neTsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQub3BsZXQuUnVuT25VSVRocmVhZDsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5Db25zdW1lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5GdW5jdGlvbjsKQEAgLTI2LDYgKzI1LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LnBsdW1iaW5nLlBsdW1iaW5nU3RyZWFtczsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworCiAvKioKICAqIFN0cmVhbSB1dGlsaXRpZXMgZm9yIGFuIEFuZHJvaWQge0Bjb2RlIEFjdGl2aXR5fS4KICAqLwpAQCAtNDIsMTEgKzQzLDEyIEBACiAgICAgKiBAcGFyYW0gYWN0aXZpdHkgQWN0aXZpdHkKICAgICAqIEBwYXJhbSBzdHJlYW0gU3RyZWFtIHRvIGJlIHNpbmtlZC4KICAgICAqIEBwYXJhbSBzaW5rZXIgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgKiBAcmV0dXJuIHNpbmsgZWxlbWVudCByZXByZXNlbnRpbmcgdGVybWluYXRpb24gb2YgdGhpcyBzdHJlYW0uCiAgICAgKgotICAgICogQHNlZSBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtI3NpbmsoZWRnZW50LmZ1bmN0aW9uLkNvbnN1bWVyKQorICAgICogQHNlZSBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtI3Npbmsob3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24uQ29uc3VtZXIpCiAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUU2luayBzaW5rT25VSVRocmVhZChBY3Rpdml0eSBhY3Rpdml0eSwgVFN0cmVhbTxUPiBzdHJlYW0sIENvbnN1bWVyPFQ+IHNpbmtlcikgeyAKLSAgICAgICAgcmV0dXJuIHN0cmVhbS5waXBlKG5ldyBSdW5PblVJVGhyZWFkPD4oYWN0aXZpdHkpKS5zaW5rKHNpbmtlcik7CisgICAgcHVibGljIHN0YXRpYyA8VD4gVFNpbms8VD4gc2lua09uVUlUaHJlYWQoQWN0aXZpdHkgYWN0aXZpdHksIFRTdHJlYW08VD4gc3RyZWFtLCBDb25zdW1lcjxUPiBzaW5rZXIpIHsgCisgICAgICAgIHJldHVybiBzdHJlYW0ucGlwZShuZXcgUnVuT25VSVRocmVhZDxUPihhY3Rpdml0eSkpLnNpbmsoc2lua2VyKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC02NiwxMyArNjgsMTUgQEAKICAgICAqIEBwYXJhbSBtYXBwZXIgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIG9uIHRoZSBVSSB0aHJlYWQuCiAgICAgKiBAcGFyYW0gb3JkZXJlZCBUcnVlIGlmIHR1cGxlIG9yZGVyaW5nIG11c3QgYmUgbWFpbnRhaW5lZCBhZnRlciB0aGUKICAgICAqIGV4ZWN1dGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBGYWxzZSBpZiBvcmRlcmluZyBpcyBub3QgcmVxdWlyZWQuCisgICAgKiBAcmV0dXJuIFN0cmVhbSB0aGF0IHdpbGwgY29udGFpbiB0dXBsZXMgb2YgdHlwZSB7QGNvZGUgVX0gbWFwcGVkIGZyb20gdGhpcworICAgICogICAgICAgICBzdHJlYW0ncyB0dXBsZXMuCiAgICAgKgotICAgICogQHNlZSBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtI21hcChlZGdlbnQuZnVuY3Rpb24uRnVuY3Rpb24pCisgICAgKiBAc2VlIG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW0jbWFwKG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLkZ1bmN0aW9uKQogICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VCxVPiBUU3RyZWFtPFU+IG1hcE9uVUlUaHJlYWQoQWN0aXZpdHkgYWN0aXZpdHksIFRTdHJlYW08VD4gc3RyZWFtLCBGdW5jdGlvbjxULFU+IG1hcHBlciwgYm9vbGVhbiBvcmRlcmVkKSB7ICAKICAgICAgICAgCiAgICAgICAgIC8vIFN3aXRjaCB0byB0aGUgVUkgdGhyZWFkCi0gICAgICAgIHN0cmVhbSA9IHN0cmVhbS5waXBlKG5ldyBSdW5PblVJVGhyZWFkPD4oYWN0aXZpdHkpKTsKKyAgICAgICAgc3RyZWFtID0gc3RyZWFtLnBpcGUobmV3IFJ1bk9uVUlUaHJlYWQ8VD4oYWN0aXZpdHkpKTsKICAgICAgICAgCiAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIG1hcCBvbiB0aGUgVUkgdGhyZWFkCiAgICAgICAgIFRTdHJlYW08VT4gcmVzdWx0U3RyZWFtID0gc3RyZWFtLm1hcChtYXBwZXIpOwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL2V4ZWN1dGlvbi9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL2V4ZWN1dGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2JhODMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hcGkvZXhlY3V0aW9uL3BvbS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQVBJOiBFeGVjdXRpb248L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuZ3NvbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdzb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjguMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9hcGkvZnVuY3Rpb24vcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FwaS9mdW5jdGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMWU2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hcGkvZnVuY3Rpb24vcG9tLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IEFQSTogRnVuY3Rpb248L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL2dyYXBoL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hcGkvZ3JhcGgvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk0N2JiCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL2dyYXBoL3BvbS54bWwKQEAgLTAsMCArMSw3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWdyYXBoPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBBUEk6IEdyYXBoPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLW9wbGV0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL29wbGV0L3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hcGkvb3BsZXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y0ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL29wbGV0L3BvbS54bWwKQEAgLTAsMCArMSw4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLW9wbGV0PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBBUEk6IE9wbGV0PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZXhlY3V0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktd2luZG93PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hcGkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzZjYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL3BvbS54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGxhdGZvcm1zLWFuZHJvaWQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IEFQSTwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmV4ZWN1dGlvbjwvbW9kdWxlPgorICAgIDxtb2R1bGU+ZnVuY3Rpb248L21vZHVsZT4KKyAgICA8bW9kdWxlPmdyYXBoPC9tb2R1bGU+CisgICAgPG1vZHVsZT5vcGxldDwvbW9kdWxlPgorICAgIDxtb2R1bGU+dG9wb2xvZ3k8L21vZHVsZT4KKyAgICA8bW9kdWxlPndpbmRvdzwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2FwaS90b3BvbG9neS9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvYXBpL3RvcG9sb2d5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1NTNkNwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FwaS90b3BvbG9neS9wb20ueG1sCkBAIC0wLDAgKzEsODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQVBJOiBUb3BvbG9neTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1leGVjdXRpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWdyYXBoPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktb3BsZXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9hcGkvd2luZG93L3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hcGkvd2luZG93L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczOWVlNwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FwaS93aW5kb3cvcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktd2luZG93PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBBUEk6IFdpbmRvdzwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2FwcHMvaW90L3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hcHBzL2lvdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTdjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9hcHBzL2lvdC9wb20ueG1sCkBAIC0wLDAgKzEsODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzLWlvdDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQXBwczogSW9UPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXB1YnN1YjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2FwcHMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FwcHMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE3N2YxCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvYXBwcy9wb20ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3Jtcy1hbmRyb2lkPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBwczwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQXBwczwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmlvdDwvbW9kdWxlPgorICAgIDxtb2R1bGU+cnVudGltZTwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2FwcHMvcnVudGltZS9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvYXBwcy9ydW50aW1lL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0YzlkMwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL2FwcHMvcnVudGltZS9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IEFwcHM6IFJ1bnRpbWU8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qb2JyZWdpc3RyeTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvY29tbWFuZC9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9jb21tYW5kL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0OThiNwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvY29tbWFuZC9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNvbW1hbmQ8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IENvbm5lY3RvcnM6IENvbW1hbmQ8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2NvbW1vbi9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9jb21tb24vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE3ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9jb21tb24vcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IENvbm5lY3RvcnM6IENvbW1vbjwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvY3N2L3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2Nzdi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzA4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2Nzdi9wb20ueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNzdjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQ29ubmVjdG9yczogQ1NWPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi44LjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9maWxlL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2ZpbGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVkZDFmCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9maWxlL3BvbS54bWwKQEAgLTAsMCArMSw4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtZmlsZTwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQ29ubmVjdG9yczogRmlsZTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLW9wbGV0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9odHRwL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2h0dHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q5ZDcxCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9odHRwL3BvbS54bWwKQEAgLTAsMCArMSw4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaHR0cDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQ29ubmVjdG9yczogSFRUUDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5odHRwY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC41LjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmh0dHBjb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC40LjQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvaW90L3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2lvdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyN2NmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2lvdC9wb20ueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQ29ubmVjdG9yczogSW9UPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9pb3RwL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2lvdHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkxYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9pb3RwL3BvbS54bWwKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaW90cDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQ29ubmVjdG9yczogSW9UUDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5pYm0ubWVzc2FnaW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+d2F0c29uLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjAuMi4yPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2pkYmMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvamRiYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YWNjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2pkYmMvcG9tLnhtbApAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1qZGJjPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBDb25uZWN0b3JzOiBKREJDPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2thZmthL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL2thZmthL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyMGIyNQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMva2Fma2EvcG9tLnhtbApAQCAtMCwwICsxLDE2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMta2Fma2E8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IENvbm5lY3RvcnM6IEthZmthPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPCEtLQorICBUaGUgcG9tIGZvciBrYWZrYSBpbmNsdWRlcyBkZXBlbmRlbmNpZXMgdGhhdCBkb24ndCBtYWtlIHNlbnNlIGZvciB1cy4KKyAgSW4gYXQgbGVhc3Qgb25lIGNhc2Uga2Fma2EgZGVwZW5kZW5jaWVzIGluY2x1ZGUgYSBzbGY0aiAqaW1wbGVtZW50YXRpb24qIGphcgorICBhbmQgdGhhdCBjb25mbGljdHMgd2l0aCBvdXIgc2FtcGxlcycgYmluZGluZyB0byBhIHBhcnRpY3VsYXIKKyAgdmVyc2lvbiBvZiBzbGY0aiBpbXBsZW1lbnRhdGlvbi4KKyAgVGhpcyBhbGwgc2VlbXMgbGlrZSBmYWxsb3V0IGZyb20sIEkgYmVsaWV2ZSwgdGhlIGthZmthIGphcnMgY29udGFpbmluZworICB0aGUgY29kZSBmb3IgdGhlaXIgY2xpIHRvb2xzIHRvbywgYW5kIHBvc3NpYmx5IHRlc3RzLCB3aGljaCBuZWVkIHRoaW5ncyBsaWtlOgorICAgIHNsZjRqLWxvZzRqMTIsIHNuYXBweS1qYXZhLCBqbGluZSwgam9wdC1zaW1wbGUsIGp1bml0LTMuOC4xCisgIAorICBTbyBhdCBsZWFzdCBmb3Igbm93LCBhdm9pZCB0cmFuc2l0aXZlIGFuZCBqdXN0IG1hdGNoIG91ciBhbnQvZ3JhZGxlIGJhc2VkCisgIGNvbmZpZy4gIEluY2x1ZGUgb25seSB0aGUgZXhhY3QgZGVwZW5kZW5jaWVzIHRoYXQgb3VyIGthZmthCisgIGRlcGVuZGVuY3kgcmVxdWlyZXMgdG8gZnVuY3Rpb24gcHJvcGVybHkuCisgIC0tPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUua2Fma2E8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5rYWZrYV8yLjEwPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MC44LjIuMjwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIG5vdCB0cmFuc2l0aXZlIC0tPgorICAgICAgICAgIDxncm91cElkPio8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+KjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5rYWZrYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmthZmthLWNsaWVudHM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4wLjguMi4yPC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+IDwhLS0gbm90IHRyYW5zaXRpdmUgLS0+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjE2PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+IDwhLS0gbm90IHRyYW5zaXRpdmUgLS0+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20ueWFtbWVyLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIG5vdCB0cmFuc2l0aXZlIC0tPgorICAgICAgICAgIDxncm91cElkPio8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+KjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNjYWxhLWxhbmc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zY2FsYS1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4xMC40PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+IDwhLS0gbm90IHRyYW5zaXRpdmUgLS0+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uMTAxdGVjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+emtjbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4wLjM8L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBub3QgdHJhbnNpdGl2ZSAtLT4KKyAgICAgICAgICA8Z3JvdXBJZD4qPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPio8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuem9va2VlcGVyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+em9va2VlcGVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My40LjY8L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBub3QgdHJhbnNpdGl2ZSAtLT4KKyAgICAgICAgICA8Z3JvdXBJZD4qPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPio8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL21xdHQvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvbXF0dC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDIzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL21xdHQvcG9tLnhtbApAQCAtMCwwICsxLDg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1tcXR0PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBDb25uZWN0b3JzOiBNUVRUPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYWhvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFoby5jbGllbnQubXF0dHYzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjkxNjUwCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9wb20ueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3Jtcy1hbmRyb2lkPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQ29ubmVjdG9yczwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmNvbW1hbmQ8L21vZHVsZT4KKyAgICA8bW9kdWxlPmNvbW1vbjwvbW9kdWxlPgorICAgIDxtb2R1bGU+Y3N2PC9tb2R1bGU+CisgICAgPG1vZHVsZT5maWxlPC9tb2R1bGU+CisgICAgPG1vZHVsZT5odHRwPC9tb2R1bGU+CisgICAgPG1vZHVsZT5pb3Q8L21vZHVsZT4KKyAgICA8bW9kdWxlPmlvdHA8L21vZHVsZT4KKyAgICA8bW9kdWxlPmpkYmM8L21vZHVsZT4KKyAgICA8bW9kdWxlPmthZmthPC9tb2R1bGU+CisgICAgPG1vZHVsZT5tcXR0PC9tb2R1bGU+CisgICAgPG1vZHVsZT5wdWJzdWI8L21vZHVsZT4KKyAgICA8bW9kdWxlPnNlcmlhbDwvbW9kdWxlPgorICAgIDxtb2R1bGU+d2Vic29ja2V0PC9tb2R1bGU+CisgICAgPG1vZHVsZT53ZWJzb2NrZXQtYmFzZTwvbW9kdWxlPgorICAgIDxtb2R1bGU+d2Vic29ja2V0LWpldHR5PC9tb2R1bGU+CisgICAgPG1vZHVsZT53ZWJzb2NrZXQtbWlzYzwvbW9kdWxlPgorICAgIDxtb2R1bGU+d2Vic29ja2V0LXNlcnZlcjwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvcHVic3ViL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL3B1YnN1Yi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzE5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL3B1YnN1Yi9wb20ueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXB1YnN1YjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQ29ubmVjdG9yczogUHViU3ViPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL3NlcmlhbC9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9zZXJpYWwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU2ZGMyCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy9zZXJpYWwvcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1zZXJpYWw8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IENvbm5lY3RvcnM6IFNlcmlhbDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvd2Vic29ja2V0LWJhc2UvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvd2Vic29ja2V0LWJhc2UvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWNhMzYzCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy93ZWJzb2NrZXQtYmFzZS9wb20ueG1sCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1iYXNlPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBDb25uZWN0b3JzOiBXZWJzb2NrZXQ6IEJhc2U8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL3dlYnNvY2tldC1qZXR0eS9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy93ZWJzb2NrZXQtamV0dHkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI3M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy93ZWJzb2NrZXQtamV0dHkvcG9tLnhtbApAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQtamV0dHk8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IENvbm5lY3RvcnM6IFdlYnNvY2tldDogSmV0dHk8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1taXNjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHkud2Vic29ja2V0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF2YXgtd2Vic29ja2V0LWNsaWVudC1pbXBsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+OS4zLjYudjIwMTUxMTA2PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvd2Vic29ja2V0LW1pc2MvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Nvbm5lY3RvcnMvd2Vic29ja2V0LW1pc2MvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQwOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy93ZWJzb2NrZXQtbWlzYy9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1taXNjPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBDb25uZWN0b3JzOiBXZWJzb2NrZXQ6IE1pc2M8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+amF2YXgud2Vic29ja2V0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF2YXgud2Vic29ja2V0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy93ZWJzb2NrZXQtc2VydmVyL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL3dlYnNvY2tldC1zZXJ2ZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmIyMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy93ZWJzb2NrZXQtc2VydmVyL3BvbS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogQ29ubmVjdG9yczogV2Vic29ja2V0OiBTZXJ2ZXI8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5LndlYnNvY2tldDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmF4LXdlYnNvY2tldC1zZXJ2ZXItaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjkuMy42LnYyMDE1MTEwNjwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9jb25uZWN0b3JzL3dlYnNvY2tldC9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy93ZWJzb2NrZXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEwNzgzCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvY29ubmVjdG9ycy93ZWJzb2NrZXQvcG9tLnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQ8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IENvbm5lY3RvcnM6IFdlYnNvY2tldDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1taXNjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1iYXNlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+amF2YXgud2Vic29ja2V0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF2YXgud2Vic29ja2V0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9kaXN0cmlidXRpb24vcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Rpc3RyaWJ1dGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODM0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9kaXN0cmlidXRpb24vcG9tLnhtbApAQCAtMCwwICsxLDIxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtYW5kcm9pZDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWRpc3RyaWJ1dGlvbjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogRGlzdHJpYnV0aW9uPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibHkvZGlzdHJpYnV0aW9uLnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNyZWF0ZS1hcmNoaXZlPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8IS0tIFdlIGRvbid0IG5lZWQgYW55IGphcnMgYXMgb3V0cHV0IGluIHRoaXMgbW9kdWxlIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmRlZmF1bHQtamFyPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5ub25lPC9waGFzZT4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmRlZmF1bHQ8L2lkPgorICAgICAgICAgICAgPHBoYXNlPm5vbmU8L3BoYXNlPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8IS0tIFRoZSBnZW5lcmFsIHN0cmF0ZWd5IGhlcmUgaXMgdG8gb25seSBkZWNsYXJlICJ0b3AtbGV2ZWwiCisgICAgICAgICBFZGdlbnQgYXJ0aWZhY3RzLCBsaWtlIGFuIEVkZ2VudCBhcHBsaWNhdGlvbiBwb20gd291bGQsCisgICAgICAgICBhbmQgbGV0IHRob3NlIGFydGlmYWN0cyBwdWxsIGluIHRoZWlyIGRlcGVuZGVudAorICAgICAgICAgRWRnZW50IGFydGlmYWN0cywgZXRjLgorICAgICAgICAgU28gZGVjbGFyZSBQcm92aWRlcnMsIEFuYWx5dGljcywgVXRpbHMsIENvbm5lY3RvcnMuCisgICAgLS0+CisKKyAgICA8IS0tIFByb3ZpZGVycyAtLT4KKyAgICA8IS0tIE5vdCBvbiBhbmRyb2lkIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGV2ZWxvcG1lbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3ktLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gQW5kcm9pZCBwbGF0Zm9ybSBzcGVmaWNpYyAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYW5kcm9pZC1oYXJkd2FyZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYW5kcm9pZC10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gQW5hbHl0aWNzIC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hbmFseXRpY3MtbWF0aDM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljcy1zZW5zb3JzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLSBVdGlscyAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtbWV0cmljczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtc3RyZWFtc2NvcGU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8IS0tIENvbm5lY3RvcnMgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbWFuZDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY3N2PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWZpbGU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1pb3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaW90cDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1qZGJjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWthZmthPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLW1xdHQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtcHVic3ViPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXNlcmlhbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LWpldHR5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLSBJbmNsdWRlIGNvbnNvbGUtc2VydmxldHMud2FyIHRvIGVuYWJsZSBhIHVzZXIgdG8gcnVuCisgICAgICAgICBpdCBpbiB0aGVpciBvd24gU2VydmxldHMgZW5naW5lLgorICAgICAgICAgSXQncyBidW5kbGVkIGluIHRoZSBlZGdlbnQtY29uc29sZS1zZXJ2ZXIuamFyLgorICAgICAgICAgTm90ZSwgZWRnZW50LWNvbnNvbGUtc2VydmVyIGlzIHB1bGxlZCBpbiBhcyBhIGRlcGVuZGVuY3kKKyAgICAgICAgIG9mIHRoZSBkZXZlbG9wbWVudCBwcm92aWRlci4KKyAgICAtLT4KKyAgICA8IS0tIE5vdCBvbiBhbmRyb2lkIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25zb2xlLXNlcnZsZXRzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgPC9kZXBlbmRlbmN5LS0+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9kaXN0cmlidXRpb24vc3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9kaXN0cmlidXRpb24vc3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5N2Q1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL2Rpc3RyaWJ1dGlvbi9zcmMvYXNzZW1ibHkvZGlzdHJpYnV0aW9uLnhtbApAQCAtMCwwICsxLDkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjIiCisgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMi54c2QiPgorCisgIDxpZD5iaW48L2lkPgorCisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgICAgPGZvcm1hdD50YXIuYnoyPC9mb3JtYXQ+CisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorCisgIDxmaWxlU2V0cz4KKyAgICA8IS0tZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Lz4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+RElTQ0xBSU1FUjwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisKKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uLy4uLy4uL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlczwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWNlbnNlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgIDwvZmlsZVNldC0tPgorCisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GPC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPkRFUEVOREVOQ0lFUzwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Lz4KKyAgICA8L2ZpbGVTZXQ+CisKKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX08L2RpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+UkVBRE1FPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxvdXRwdXREaXJlY3RvcnkvPgorICAgIDwvZmlsZVNldD4KKworICAgIDwhLS1maWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zaXRlPC9kaXJlY3Rvcnk+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvY3M8L291dHB1dERpcmVjdG9yeT4KKyAgICA8L2ZpbGVTZXQtLT4KKyAgPC9maWxlU2V0cz4KKworICA8ZGVwZW5kZW5jeVNldHM+CisgICAgPCEtLSBBbnkgZWRnZW50IGxpYnMgLS0+CisgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYnM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5lZGdlbnQqPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5lZGdlbnQqOmVkZ2VudC1kaXN0cmlidXRpb248L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZGVwZW5kZW5jeVNldD4KKworICAgIDwhLS0gQWxsIG90aGVyIGxpYnMgYXJlIHRyZWF0ZWQgYXMgZXh0ZXJuYWwgbGlicyAtLT4KKyAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZXh0PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuZWRnZW50KjwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9kZXBlbmRlbmN5U2V0PgorICA8L2RlcGVuZGVuY3lTZXRzPgorCis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9SRUFETUUgYi9wbGF0Zm9ybXMvYW5kcm9pZC9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTFjN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvZGlzdHJpYnV0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9SRUFETUUKQEAgLTAsMCArMSwxMiBAQAorVGhpcyBidW5kbGUgaW5jbHVkZXMgYSBudW1iZXIgb2YgYXJ0aWZhY3RzIHdpdGggc2VwYXJhdGUKK2NvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiAgWW91ciB1c2Ugb2YgYW4gYXJ0aWZhY3QKK2lzIHN1YmplY3QgdG8gdGhhdCBhcnRpZmFjdOKAmXMgbGljZW5zaW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCitUaGUgQXBhY2hlIEVkZ2VudCBhcnRpZmFjdHMgKGV2ZXJ5dGhpbmcgaW4gbGliKSBhbGwgaGF2ZSB0aGUKK2xpY2Vuc2Ug4oCcQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjDigJ0uCisKK0VkZ2VudOKAmXMgZGVwZW5kZW50IGFydGlmYWN0cyBpbiDigJxleHTigJ0gaGF2ZSBhbGwgYmVlbiBldmFsdWF0ZWQKK3RvIGJlIGNvbXBhdGlibGUgd2l0aCBFZGdlbnTigJlzIGxpY2Vuc2UuCisKK0EgYnVuZGxlZCBhcnRpZmFjdCdzIGFkdmVydGlzZWQgbGljZW5zZSBpbmZvcm1hdGlvbiBtYXkgYmUKK2ZvdW5kIGluIHRoZSBERVBFTkRFTkNJRVMgZmlsZSBpbiB0aGlzIGJ1bmRsZS4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYWU5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9wb20ueG1sCkBAIC0wLDAgKzEsMTY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGxhdGZvcm1zPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGxhdGZvcm1zLWFuZHJvaWQ8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IFBsYXRmb3JtczogQW5kcm9pZDwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8IS0tIFJlYWwgbW9kdWxlcyAtLT4KKyAgICA8bW9kdWxlPmFuZHJvaWQ8L21vZHVsZT4KKworICAgIDwhLS0gUmVwYWNrZWQgbW9kdWxlcyAtLT4KKyAgICA8bW9kdWxlPmFuYWx5dGljczwvbW9kdWxlPgorICAgIDxtb2R1bGU+YXBpPC9tb2R1bGU+CisgICAgPG1vZHVsZT5hcHBzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5jb25uZWN0b3JzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5wcm92aWRlcnM8L21vZHVsZT4KKyAgICA8bW9kdWxlPnJ1bnRpbWU8L21vZHVsZT4KKyAgICA8bW9kdWxlPnNwaTwvbW9kdWxlPgorICAgIDxtb2R1bGU+dXRpbHM8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDwhLS0gQ2hlY2sgYXJ0aWZhY3RzIGFnYWluc3QgSmF2YTcgc2lnbmF0dXJlcyAtLT4KKyAgICAgIDwhLS0KKyAgICAgICAgICBMZXQgdGhlIHBsdWdpbiBydW4gaW4gdGhlIHByb2Nlc3MtdGVzdC1jbGFzc2VzIHNvIHdlIGltbWVkaWF0ZWx5IGtub3cgaWYKKyAgICAgICAgICB0ZXN0IHJ1biBwcm9ibGVtcyBjb3VsZCBiZSByZWxhdGVkIHRvIHVzaW5nIEFQSXMgdW5hdmFpbGFibGUgdG8gSmF2YTcuCisgICAgICAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hbmltYWwtc25pZmZlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMTU8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y2hlY2stamRrLXNpZ25hdHVyZXM8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtdGVzdC1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qby5zaWduYXR1cmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhMTg8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPCEtLSBXZSBkb24ndCBkbyB0ZXN0aW5nIG9uIEFuZHJvaWQgOy0pIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmRlZmF1bHQ8L2lkPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD50ZXN0LWphcjwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8IS0tCisgICAgICAgICAgVGhlIGFuZHJvaWQgcGxhdGZvcm0gZGVwZW5kcyBvbiB0aGUgbW9kdWxlcyBvZiB0aGUgamF2YTcgcGxhdGZvcm0sCisgICAgICAgICAgc28gd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBwcm9maWxlIGlzIGFjdGl2YXRlZCB0b28uCisgICAgICAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmVuZm9yY2UtamF2YTctcHJvZmlsZS1pcy1hY3RpdmF0ZWQ8L2lkPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8cnVsZXM+CisgICAgICAgICAgICAgICAgPHJlcXVpcmVQcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT5wbGF0Zm9ybS5qYXZhNzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICA8bWVzc2FnZT50aGUgJ3BsYXRmb3JtLWphdmE3JyBwcm9maWxlIG11c3QgYmUgYWN0aXZhdGVkITwvbWVzc2FnZT4KKyAgICAgICAgICAgICAgICA8L3JlcXVpcmVQcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9ydWxlcz4KKyAgICAgICAgICAgICAgPGZhaWw+dHJ1ZTwvZmFpbD4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorCisgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICA8cGx1Z2lucz4KKyAgICAgICAgPCEtLVRoaXMgcGx1Z2luJ3MgY29uZmlndXJhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIEVjbGlwc2UgbTJlIHNldHRpbmdzIG9ubHkuIEl0IGhhcyBubyBpbmZsdWVuY2Ugb24gdGhlIE1hdmVuIGJ1aWxkIGl0c2VsZi4tLT4KKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5tMmU8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bGlmZWN5Y2xlLW1hcHBpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8bGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgorICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bmV0Lm9yZmphY2thbC5yZXRyb2xhbWJkYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmV0cm9sYW1iZGEtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvblJhbmdlPlsyLjUuMSwpPC92ZXJzaW9uUmFuZ2U+CisgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzLW1haW48L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2Vzcy10ZXN0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICA8YWN0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aWdub3JlIC8+CisgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25zPgorICAgICAgICAgICAgPC9saWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+CisgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8L3BsdWdpbj4KKyAgICAgIDwvcGx1Z2lucz4KKyAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgCisgIDwvYnVpbGQ+CisKKyAgPCEtLSBBZGRpdGlvbmFsbHkgYnVpbGQgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gcGFja2FnZS4gLS0+CisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5kaXN0cmlidXRpb248L2lkPgorICAgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+ZGlzdHJpYnV0aW9uPC9tb2R1bGU+CisgICAgICA8L21vZHVsZXM+CisgICAgPC9wcm9maWxlPgorICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9wcm92aWRlcnMvZGlyZWN0L3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9wcm92aWRlcnMvZGlyZWN0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5NmFmYQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL3Byb3ZpZGVycy9kaXJlY3QvcG9tLnhtbApAQCAtMCwwICsxLDk5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBQcm92aWRlcnM6IERpcmVjdDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtc3BpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtYXBwc2VydmljZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1ldGlhbzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qc29uY29udHJvbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL3Byb3ZpZGVycy9pb3QvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL3Byb3ZpZGVycy9pb3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzI3YjM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvcHJvdmlkZXJzL2lvdC9wb20ueG1sCkBAIC0wLDAgKzEsMTAwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtaW90PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBQcm92aWRlcnM6IElvVDwvbmFtZT4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qc29uY29udHJvbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1hcHBzZXJ2aWNlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1wdWJzdWI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9wcm92aWRlcnMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL3Byb3ZpZGVycy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWYyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9wcm92aWRlcnMvcG9tLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtYW5kcm9pZDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVyczwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogUHJvdmlkZXJzPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+ZGlyZWN0PC9tb2R1bGU+CisgICAgPG1vZHVsZT5pb3Q8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9ydW50aW1lL2FwcHNlcnZpY2UvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL3J1bnRpbWUvYXBwc2VydmljZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTY0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9ydW50aW1lL2FwcHNlcnZpY2UvcG9tLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1hcHBzZXJ2aWNlPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBSdW50aW1lOiBBcHBTZXJ2aWNlPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZXhlY3V0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9ydW50aW1lL2V0aWFvL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9ydW50aW1lL2V0aWFvL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjYjAzYgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9hbmRyb2lkL3J1bnRpbWUvZXRpYW8vcG9tLnhtbApAQCAtMCwwICsxLDg0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1ldGlhbzwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogUnVudGltZTogRXRpYW88L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZXhlY3V0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL3J1bnRpbWUvam9icmVnaXN0cnkvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL3J1bnRpbWUvam9icmVnaXN0cnkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ4ODgwCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvcnVudGltZS9qb2JyZWdpc3RyeS9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWpvYnJlZ2lzdHJ5PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBSdW50aW1lOiBKb2JSZWdpc3RyeTwvbmFtZT4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvcnVudGltZS9qc29uY29udHJvbC9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvcnVudGltZS9qc29uY29udHJvbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZmUxODYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9ydW50aW1lL2pzb25jb250cm9sL3BvbS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtanNvbmNvbnRyb2w8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IFJ1bnRpbWU6IEpTT05Db250cm9sPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvcnVudGltZS9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvcnVudGltZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGY4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9ydW50aW1lL3BvbS54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGxhdGZvcm1zLWFuZHJvaWQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBSdW50aW1lczwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmFwcHNlcnZpY2U8L21vZHVsZT4KKyAgICA8bW9kdWxlPmV0aWFvPC9tb2R1bGU+CisgICAgPG1vZHVsZT5qb2JyZWdpc3RyeTwvbW9kdWxlPgorICAgIDxtb2R1bGU+anNvbmNvbnRyb2w8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9zcGkvZ3JhcGgvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL3NwaS9ncmFwaC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjVlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9zcGkvZ3JhcGgvcG9tLnhtbApAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IFNQSTogR3JhcGg8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZXhlY3V0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC9zcGkvcG9tLnhtbCBiL3BsYXRmb3Jtcy9hbmRyb2lkL3NwaS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjZiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC9zcGkvcG9tLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtYW5kcm9pZDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChBbmRyb2lkKTogU1BJPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+Z3JhcGg8L21vZHVsZT4KKyAgICA8bW9kdWxlPnRvcG9sb2d5PC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvc3BpL3RvcG9sb2d5L3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC9zcGkvdG9wb2xvZ3kvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzI2NjdiCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvc3BpL3RvcG9sb2d5L3BvbS54bWwKQEAgLTAsMCArMSw3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtc3BpPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtc3BpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBTUEk6IFRvcG9sb2d5PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2FuZHJvaWQvdXRpbHMvbWV0cmljcy9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvdXRpbHMvbWV0cmljcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYWUxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC91dGlscy9tZXRyaWNzL3BvbS54bWwKQEAgLTAsMCArMSw3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuYW5kcm9pZDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC11dGlscy1tZXRyaWNzPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBVdGlsczogTWV0cmljczwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9hbmRyb2lkL3V0aWxzL3BvbS54bWwgYi9wbGF0Zm9ybXMvYW5kcm9pZC91dGlscy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NmVlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvYW5kcm9pZC91dGlscy9wb20ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmFuZHJvaWQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3Jtcy1hbmRyb2lkPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHM8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoQW5kcm9pZCk6IFV0aWxzPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+bWV0cmljczwvbW9kdWxlPgorICAgIDxtb2R1bGU+c3RyZWFtc2NvcGU8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvYW5kcm9pZC91dGlscy9zdHJlYW1zY29wZS9wb20ueG1sIGIvcGxhdGZvcm1zL2FuZHJvaWQvdXRpbHMvc3RyZWFtc2NvcGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQxY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2FuZHJvaWQvdXRpbHMvc3RyZWFtc2NvcGUvcG9tLnhtbApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC11dGlsczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLXN0cmVhbXNjb3BlPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEFuZHJvaWQpOiBVdGlsczogU3RyZWFtc2NvcGU8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5hbmRyb2lkPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9hbmFseXRpY3MvbWF0aDMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9hbmFseXRpY3MvbWF0aDMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc1YjFlCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2FuYWx5dGljcy9tYXRoMy9wb20ueG1sCkBAIC0wLDAgKzEsMTE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYW5hbHl0aWNzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtYW5hbHl0aWNzLW1hdGgzPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IEFuYWx5dGljczogTWF0aDM8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbWF0aDM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjQuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9hbmFseXRpY3MvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9hbmFseXRpY3MvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTUzMGMwCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2FuYWx5dGljcy9wb20ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtamF2YTc8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hbmFseXRpY3M8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQW5hbHl0aWNzPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+bWF0aDM8L21vZHVsZT4KKyAgICA8bW9kdWxlPnNlbnNvcnM8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvYW5hbHl0aWNzL3NlbnNvcnMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9hbmFseXRpY3Mvc2Vuc29ycy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTA3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvYW5hbHl0aWNzL3NlbnNvcnMvcG9tLnhtbApAQCAtMCwwICsxLDExNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljcy1zZW5zb3JzPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IEFuYWx5dGljczogU2Vuc29yczwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2FwaS9leGVjdXRpb24vcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9hcGkvZXhlY3V0aW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0YTMwNQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9hcGkvZXhlY3V0aW9uL3BvbS54bWwKQEAgLTAsMCArMSw5OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1leGVjdXRpb248L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQVBJOiBFeGVjdXRpb248L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5nc29uPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuOC4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9hcGkvZnVuY3Rpb24vcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9hcGkvZnVuY3Rpb24vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Y1YTJmCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2FwaS9mdW5jdGlvbi9wb20ueG1sCkBAIC0wLDAgKzEsODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQVBJOiBGdW5jdGlvbjwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2FwaS9ncmFwaC9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L2FwaS9ncmFwaC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NjRlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvYXBpL2dyYXBoL3BvbS54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBBUEk6IEdyYXBoPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktb3BsZXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvYXBpL29wbGV0L3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvYXBpL29wbGV0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmNWNkYwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9hcGkvb3BsZXQvcG9tLnhtbApAQCAtMCwwICsxLDEwMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1vcGxldDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBBUEk6IE9wbGV0PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZXhlY3V0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXdpbmRvdzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9hcGkvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9hcGkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE1ZThkCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2FwaS9wb20ueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtamF2YTc8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQVBJPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+ZXhlY3V0aW9uPC9tb2R1bGU+CisgICAgPG1vZHVsZT5mdW5jdGlvbjwvbW9kdWxlPgorICAgIDxtb2R1bGU+Z3JhcGg8L21vZHVsZT4KKyAgICA8bW9kdWxlPm9wbGV0PC9tb2R1bGU+CisgICAgPG1vZHVsZT50b3BvbG9neTwvbW9kdWxlPgorICAgIDxtb2R1bGU+d2luZG93PC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2FwaS90b3BvbG9neS9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L2FwaS90b3BvbG9neS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMWZkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvYXBpL3RvcG9sb2d5L3BvbS54bWwKQEAgLTAsMCArMSwxNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQVBJOiBUb3BvbG9neTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgIE1ha2UgdGhlIGRlZmF1bHQgdGVzdC1qYXIgZXhjbHVkZSB0aGUgc2VydmljZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgIE9yIHNvbWUgdGVzdHMgd291bGQgc3VjY2VlZCB3aGVyZSB0aGV5IHNob3VsZCBmYWlsLgorICAgICAgICAgIC0tPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnRlc3QtamFyPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvc2VydmljZXMvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICBDcmVhdGUgYSBzZWNvbmQgdGVzdC1qYXIgdGhhdCBjb250YWlucyBvbmx5IHRoZSBkdW1teQorICAgICAgICAgICAgICBTZXJ2ZXIgYW5kIHRoZSBzZXJ2aWNlIGRlc2NyaXB0b3IgZm9yIHRoYXQuIFRoaXMgaXMgdXNlZAorICAgICAgICAgICAgICBieSBvdGhlciBtb2R1bGVzIHVuaXQtdGVzdHMuCisgICAgICAgICAgLS0+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5kdW1teS1zZXJ2ZXItamFyPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dGVzdC1qYXI8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3Qtc2VydmVyPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+Kiovc2VydmljZXMvKio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+TUVUQS1JTkYvc2VydmljZXMvKio8L2luY2x1ZGU+CisgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1vcGxldDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9hcGkvd2luZG93L3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvYXBpL3dpbmRvdy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZmQzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvYXBpL3dpbmRvdy9wb20ueG1sCkBAIC0wLDAgKzEsOTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktd2luZG93PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IEFQSTogV2luZG93PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvYXBwcy9pb3QvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9hcHBzL2lvdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NGFjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvYXBwcy9pb3QvcG9tLnhtbApAQCAtMCwwICsxLDEwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzLWlvdDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBBcHBzOiBJb1Q8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1pb3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXB1YnN1YjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9hcHBzL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvYXBwcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzJmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvYXBwcy9wb20ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtamF2YTc8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IEFwcHM8L25hbWU+CisKKyAgPG1vZHVsZXM+CisgICAgPG1vZHVsZT5pb3Q8L21vZHVsZT4KKyAgICA8bW9kdWxlPnJ1bnRpbWU8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvYXBwcy9ydW50aW1lL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvYXBwcy9ydW50aW1lL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0NjllNgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9hcHBzL3J1bnRpbWUvcG9tLnhtbApAQCAtMCwwICsxLDEwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQXBwczogUnVudGltZTwvbmFtZT4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWpvYnJlZ2lzdHJ5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qbXhjb250cm9sPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvY29tbWFuZC9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvY29tbWFuZC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWFkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9jb21tYW5kL3BvbS54bWwKQEAgLTAsMCArMSwxMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tYW5kPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IENvbm5lY3RvcnM6IENvbW1hbmQ8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9jb21tb24vcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL2NvbW1vbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYmU3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9jb21tb24vcG9tLnhtbApAQCAtMCwwICsxLDExNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBDb25uZWN0b3JzOiBDb21tb248L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvY3N2L3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9jc3YvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg2MGNjCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvY3N2L3BvbS54bWwKQEAgLTAsMCArMSwxMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jc3Y8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQ29ubmVjdG9yczogQ1NWPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5nc29uPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuOC4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvZmlsZS9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvZmlsZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjIxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9maWxlL3BvbS54bWwKQEAgLTAsMCArMSwxMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1maWxlPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IENvbm5lY3RvcnM6IEZpbGU8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1vcGxldDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9odHRwL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9odHRwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3NzZhNgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL2h0dHAvcG9tLnhtbApAQCAtMCwwICsxLDExNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWh0dHA8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQ29ubmVjdG9yczogSFRUUDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjUuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aHR0cGNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjQuNDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvaW90L3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9pb3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQwOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvaW90L3BvbS54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBDb25uZWN0b3JzOiBJb1Q8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9pb3RwL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9pb3RwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwZTJiZgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL2lvdHAvcG9tLnhtbApAQCAtMCwwICsxLDEwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdHA8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQ29ubmVjdG9yczogSW9UUDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1pb3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uaWJtLm1lc3NhZ2luZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPndhdHNvbi1pb3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4wLjIuMjwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvamRiYy9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvamRiYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ODg0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9qZGJjL3BvbS54bWwKQEAgLTAsMCArMSwxNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1qZGJjPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IENvbm5lY3RvcnM6IEpEQkM8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgU2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG1ha2Ugc3VyZSBhbnkgZGVyYnkgbG9nIGlzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICBpbnNpZGUgdGhlIHRhcmdldCBkaXJlY3RvcnkgYXMgd2VsbCBhcyBwYXNzIGluIGEgbG9jYXRpb24gZm9yCisgICAgICAgICAgICAgICAgY3JlYXRpbmcgdGhlIGRhdGFiYXNlLgorICAgICAgICAgIC0tPgorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICA8bmFtZT5qZGJjU3RyZWFtc1Rlc3QudG1wZGlyPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vamRiYy10ZXN0LXRtcDwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICA8bmFtZT5kZXJieS5zdHJlYW0uZXJyb3IuZmlsZTwvbmFtZT4KKyAgICAgICAgICAgICAgPHZhbHVlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcmJ5LmxvZzwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPCEtLSBodHRwczovL212bnJlcG9zaXRvcnkuY29tL2FydGlmYWN0L29yZy5hcGFjaGUuZGVyYnkvZGVyYnkgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmRlcmJ5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZGVyYnk8L2FydGlmYWN0SWQ+CisgICAgICA8IS0tICByZXF1aXJlcyBqYXZhODogPHZlcnNpb24+MTAuMTMuMS4xPC92ZXJzaW9uLS0+CisgICAgICA8dmVyc2lvbj4xMC4xMi4xLjE8L3ZlcnNpb24+IDwhLS0gbGF0ZXN0IEphdmEgNiBhbmQgSGlnaGVyIC0tPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL2thZmthL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9rYWZrYS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzUyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9rYWZrYS9wb20ueG1sCkBAIC0wLDAgKzEsMjExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMta2Fma2E8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQ29ubmVjdG9yczogS2Fma2E8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPCEtLQorICBUaGUgcG9tIGZvciBrYWZrYSBpbmNsdWRlcyBkZXBlbmRlbmNpZXMgdGhhdCBkb24ndCBtYWtlIHNlbnNlIGZvciB1cy4KKyAgSW4gYXQgbGVhc3Qgb25lIGNhc2Uga2Fma2EgZGVwZW5kZW5jaWVzIGluY2x1ZGUgYSBzbGY0aiAqaW1wbGVtZW50YXRpb24qIGphcgorICBhbmQgdGhhdCBjb25mbGljdHMgd2l0aCBvdXIgc2FtcGxlcycgYmluZGluZyB0byBhIHBhcnRpY3VsYXIKKyAgdmVyc2lvbiBvZiBzbGY0aiBpbXBsZW1lbnRhdGlvbi4KKyAgVGhpcyBhbGwgc2VlbXMgbGlrZSBmYWxsb3V0IGZyb20sIEkgYmVsaWV2ZSwgdGhlIGthZmthIGphcnMgY29udGFpbmluZworICB0aGUgY29kZSBmb3IgdGhlaXIgY2xpIHRvb2xzIHRvbywgYW5kIHBvc3NpYmx5IHRlc3RzLCB3aGljaCBuZWVkIHRoaW5ncyBsaWtlOgorICAgIHNsZjRqLWxvZzRqMTIsIHNuYXBweS1qYXZhLCBqbGluZSwgam9wdC1zaW1wbGUsIGp1bml0LTMuOC4xCisgIAorICBTbyBhdCBsZWFzdCBmb3Igbm93LCBhdm9pZCB0cmFuc2l0aXZlIGFuZCBqdXN0IG1hdGNoIG91ciBhbnQvZ3JhZGxlIGJhc2VkCisgIGNvbmZpZy4gIEluY2x1ZGUgb25seSB0aGUgZXhhY3QgZGVwZW5kZW5jaWVzIHRoYXQgb3VyIGthZmthCisgIGRlcGVuZGVuY3kgcmVxdWlyZXMgdG8gZnVuY3Rpb24gcHJvcGVybHkuCisgIC0tPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmthZmthPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+a2Fma2FfMi4xMDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjAuOC4yLjI8L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBub3QgdHJhbnNpdGl2ZSAtLT4KKyAgICAgICAgICA8Z3JvdXBJZD4qPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPio8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUua2Fma2E8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5rYWZrYS1jbGllbnRzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MC44LjIuMjwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIG5vdCB0cmFuc2l0aXZlIC0tPgorICAgICAgICAgIDxncm91cElkPio8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+KjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4xNjwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIG5vdCB0cmFuc2l0aXZlIC0tPgorICAgICAgICAgIDxncm91cElkPio8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+KjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLnlhbW1lci5tZXRyaWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWV0cmljcy1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4yLjA8L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBub3QgdHJhbnNpdGl2ZSAtLT4KKyAgICAgICAgICA8Z3JvdXBJZD4qPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPio8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zY2FsYS1sYW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2NhbGEtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMTAuNDwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIG5vdCB0cmFuc2l0aXZlIC0tPgorICAgICAgICAgIDxncm91cElkPio8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+KjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLjEwMXRlYzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnprY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MC4zPC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+IDwhLS0gbm90IHRyYW5zaXRpdmUgLS0+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnpvb2tlZXBlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnpvb2tlZXBlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuNC42PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+IDwhLS0gbm90IHRyYW5zaXRpdmUgLS0+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvbXF0dC9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvbXF0dC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjlhODMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9tcXR0L3BvbS54bWwKQEAgLTAsMCArMSwxNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1tcXR0PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IENvbm5lY3RvcnM6IE1RVFQ8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYWhvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFoby5jbGllbnQubXF0dHYzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuNDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlYWQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3BvbS54bWwKQEAgLTAsMCArMSw1NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3Jtcy1qYXZhNzwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQ29ubmVjdG9yczwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmNvbW1hbmQ8L21vZHVsZT4KKyAgICA8bW9kdWxlPmNvbW1vbjwvbW9kdWxlPgorICAgIDxtb2R1bGU+Y3N2PC9tb2R1bGU+CisgICAgPG1vZHVsZT5maWxlPC9tb2R1bGU+CisgICAgPG1vZHVsZT5odHRwPC9tb2R1bGU+CisgICAgPG1vZHVsZT5pb3Q8L21vZHVsZT4KKyAgICA8bW9kdWxlPmlvdHA8L21vZHVsZT4KKyAgICA8bW9kdWxlPmpkYmM8L21vZHVsZT4KKyAgICA8bW9kdWxlPmthZmthPC9tb2R1bGU+CisgICAgPG1vZHVsZT5tcXR0PC9tb2R1bGU+CisgICAgPG1vZHVsZT5wdWJzdWI8L21vZHVsZT4KKyAgICA8bW9kdWxlPnNlcmlhbDwvbW9kdWxlPgorICAgIDxtb2R1bGU+d2Vic29ja2V0PC9tb2R1bGU+CisgICAgPG1vZHVsZT53ZWJzb2NrZXQtYmFzZTwvbW9kdWxlPgorICAgIDwhLS0gRG93bmdyYWRlZCB0aGUgamV0dHkgdmVyc2lvbiB0byA5LjIuMjEudjIwMTcwMTIwIHRvIHN1cHBvcnQgSmF2YTcgLS0+CisgICAgPG1vZHVsZT53ZWJzb2NrZXQtamV0dHk8L21vZHVsZT4KKyAgICA8bW9kdWxlPndlYnNvY2tldC1taXNjPC9tb2R1bGU+CisgICAgPG1vZHVsZT53ZWJzb2NrZXQtc2VydmVyPC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvcHVic3ViL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9wdWJzdWIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzk3NjIyCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvcHVic3ViL3BvbS54bWwKQEAgLTAsMCArMSw5NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXB1YnN1YjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBDb25uZWN0b3JzOiBQdWJTdWI8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvc2VyaWFsL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy9zZXJpYWwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBjZjBkCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvc2VyaWFsL3BvbS54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXNlcmlhbDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBDb25uZWN0b3JzOiBTZXJpYWw8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3dlYnNvY2tldC1iYXNlL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy93ZWJzb2NrZXQtYmFzZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2U1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy93ZWJzb2NrZXQtYmFzZS9wb20ueG1sCkBAIC0wLDAgKzEsOTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQtYmFzZTwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBDb25uZWN0b3JzOiBXZWJzb2NrZXQ6IEJhc2U8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3dlYnNvY2tldC1qZXR0eS9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvd2Vic29ja2V0LWpldHR5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzOWVjNQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3dlYnNvY2tldC1qZXR0eS9wb20ueG1sCkBAIC0wLDAgKzEsMTA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LWpldHR5PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IENvbm5lY3RvcnM6IFdlYnNvY2tldDogSmV0dHk8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKixNRVRBLUlORi9tYXZlbi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGNsYXNzZXNEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3NlczwvY2xhc3Nlc0RpcmVjdG9yeT4KKyAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi9zZXJ2aWNlcy8qKjwvaW5jbHVkZT4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvZWRnZW50L2phdmF4L3dlYnNvY2tldC9pbXBsLyouY2xhc3M8L2luY2x1ZGU+CisgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1taXNjPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHkud2Vic29ja2V0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF2YXgtd2Vic29ja2V0LWNsaWVudC1pbXBsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+OS4zLjYudjIwMTUxMTA2PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3dlYnNvY2tldC1taXNjL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy93ZWJzb2NrZXQtbWlzYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2N2EyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy93ZWJzb2NrZXQtbWlzYy9wb20ueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQtbWlzYzwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBDb25uZWN0b3JzOiBXZWJzb2NrZXQ6IE1pc2M8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmphdmF4LndlYnNvY2tldDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmF4LndlYnNvY2tldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3dlYnNvY2tldC1zZXJ2ZXIvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3dlYnNvY2tldC1zZXJ2ZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDVmMzMwCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2Nvbm5lY3RvcnMvd2Vic29ja2V0LXNlcnZlci9wb20ueG1sCkBAIC0wLDAgKzEsOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQtc2VydmVyPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IENvbm5lY3RvcnM6IFdlYnNvY2tldDogU2VydmVyPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5LndlYnNvY2tldDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmF4LXdlYnNvY2tldC1zZXJ2ZXItaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjkuMy42LnYyMDE1MTEwNjwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy93ZWJzb2NrZXQvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9jb25uZWN0b3JzL3dlYnNvY2tldC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29ubmVjdG9ycy93ZWJzb2NrZXQvcG9tLnhtbApAQCAtMCwwICsxLDE2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBDb25uZWN0b3JzOiBXZWJzb2NrZXQ8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQtbWlzYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtd2Vic29ja2V0LWJhc2U8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qYXZheC53ZWJzb2NrZXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53ZWJzb2NrZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1odHRwPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eS53ZWJzb2NrZXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXZheC13ZWJzb2NrZXQtc2VydmVyLWltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9jb25zb2xlL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29uc29sZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjk0OTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29uc29sZS9wb20ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtamF2YTc8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25zb2xlPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IENvbnNvbGU8L25hbWU+CisKKyAgPG1vZHVsZXM+CisgICAgPG1vZHVsZT5zZXJ2ZXI8L21vZHVsZT4KKyAgICA8bW9kdWxlPnNlcnZsZXRzPC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmVyL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29uc29sZS9zZXJ2ZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWIxNzAyCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmVyL3BvbS54bWwKQEAgLTAsMCArMSwxOTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25zb2xlPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29uc29sZS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQ29uc29sZTogU2VydmVyPC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPHRhcmdldFBhdGg+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vPC90YXJnZXRQYXRoPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vLi4vLi4vLi4vc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL2xpY2Vuc2VzPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GL2xpY2Vuc2VzPC90YXJnZXRQYXRoPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgQ29weSB0aGUgc2VydmxldHMud2FyIGludG8gdGhlIGJ1aWxkIG91dHB1dCBzbyBpdCBpcyBlbWJlZGRlZCBhcworICAgICAgICAgICByZXNvdXJjZSBpbnRvIHRoZSBqYXIuCisgICAgICAgICAgLS0+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXdhcjwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbnNvbGUtc2VydmxldHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L3Jlc291cmNlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGRlc3RGaWxlTmFtZT5zZXJ2bGV0cy53YXI8L2Rlc3RGaWxlTmFtZT4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKioscmVzb3VyY2VzLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxyZXBvcnRpbmc+CisgICAgPHBsdWdpbnM+CisgICAgICA8IS0tIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uIHRoaXMgcmVwb3J0IGlzIGNhdXNpbmcgdHJvdWJsZSAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5qYWNvY288L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmphY29jby1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuNy45PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c2tpcD50cnVlPC9za2lwPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvcmVwb3J0aW5nPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHktaW88L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VjdXJpdHk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHktdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amV0dHkteG1sPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjcuMTI8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLQorICAgICAgICBUaGlzIGFydGlmYWN0IGlzIG5lZWRlZCBieSB0aGUgbWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW4KKyAgICAgICAgYnkgbWFya2luZyB0aGlzIGRlcGVuZGVuY3kgb3B0aW9uYWwsIGl0IGlzIG5vdCBpbmNsdWRlZAorICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIGFydGlmYWN0LCBidXQgTWF2ZW4gZW5zdXJlcyBpdCBpcyBidWlsdAorICAgICAgICBwcmlvciB0byB0aGlzIG1vZHVsZS4KKyAgICAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbnNvbGUtc2VydmxldHM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvY29uc29sZS9zZXJ2ZXIvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFIGIvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmVyL3NyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzRiNjkxCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmVyL3NyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRQpAQCAtMCwwICsxLDQxIEBACisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FQQUNIRSBFREdFTlQgU1VCQ09NUE9ORU5UUzoKKworVGhpcyBiaW5hcnkgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoIHNlcGFyYXRlCitjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gIFlvdXIgdXNlIG9mIHRoaXMgYmluYXJ5CitpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMAorRm9yIGRldGFpbHMsIHNlZSBNRVRBLUlORi9saWNlbnNlcy9hcGFjaGUtbGljZW5zZS12ZXJzaW9uLTIuMC50eHQKKworZ3NvbiAoY29tLmdvb2dsZS5jb2RlLmdzb246Z3NvbjoyLjIuNCkKK21ldHJpY3MtY29yZSAoaW8uZHJvcHdpemFyZC5tZXRyaWNzOm1ldHJpY3MtY29yZTozLjEuMikKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTGljZW5zZTogTUlUCisKK2pxdWVyeSAob3JnLndlYmphcnM6anF1ZXJ5OjEuMTEuMikKKyAgICBGb3IgZGV0YWlscywgc2VlIE1FVEEtSU5GL2xpY2Vuc2VzL2pxdWVyeS0xXzExXzItTUlULnR4dC4KKworanF1ZXJ5LXVpIChvcmcud2ViamFyczpqcXVlcnktdWk6MS4xMS40KQorICAgIEZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvanF1ZXJ5LXVpLTFfMTFfNC1NSVQudHh0LgorCitkMy5sZWdlbmQuanMgKGh0dHBzOi8vZ2lzdC5naXRodWJ1c2VyY29udGVudC5jb20vWkpPTlNTT04vMzkxODM2OS9yYXcvYmY5YmNlNmI2OGEzYjcwZjg3NDUwZjE1NTQzNmNhNGE4NGFmMWJhNC9kMy5sZWdlbmQuanMpCisgICAgRm9yIGRldGFpbHMsIHNlZSBNRVRBLUlORi9saWNlbnNlcy9kMy5sZWdlbmQtTUlULnR4dC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTGljZW5zZTogQlNEIDMtQ2xhdXNlCisKK2QzIChvcmcud2ViamFycy5ib3dlcjpkMzozLjMuOSkKKyAgICBGb3IgZGV0YWlscywgc2VlIE1FVEEtSU5GL2xpY2Vuc2VzL2QzLTNfM185LUJTRC50eHQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xpY2Vuc2U6IEJTRCAyLUNsYXVzZQorCitkMy1wbHVnaW5zLXNhbmtleSAob3JnLndlYmphcnMuYm93ZXI6ZDMtcGx1Z2lucy1zYW5rZXk6MS4xLjApCisgICAgRm9yIGRldGFpbHMsIHNlZSBNRVRBLUlORi9saWNlbnNlcy9kMy1wbHVnaW5zLXNhbmtleS0xXzFfMC1CU0QudHh0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9jb25zb2xlL3NlcnZlci9zcmMvbWFpbi9yZW1vdGUtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRSBiL3BsYXRmb3Jtcy9qYXZhNy9jb25zb2xlL3NlcnZlci9zcmMvbWFpbi9yZW1vdGUtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzllN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmVyL3NyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCkBAIC0wLDAgKzEsMjggQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGRldmVsb3BlZCBieSBJQk0gQ29ycC4KK0NvcHlyaWdodCBJQk0gQ29ycC4gMjAxNSwgMjAxNgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FQQUNIRSBFREdFTlQgU1VCQ09NUE9ORU5UUzoKKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aCBzZXBhcmF0ZQorY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuICBUaGUgZm9sbG93aW5nIG5vdGljZXMgYXBwbHkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21ldHJpY3MtY29yZSAoaW8uZHJvcHdpemFyZC5tZXRyaWNzOm1ldHJpY3MtY29yZTozLjEuMikKKworTWV0cmljcworQ29weXJpZ2h0IDIwMTAtMjAxMyBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IENvZGEgSGFsZSBhbmQgWWFtbWVyLCBJbmMuCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgSlNSLTE2NiBwcm9qZWN0IChUaHJlYWRMb2NhbFJhbmRvbSwKK1N0cmlwZWQ2NCwgTG9uZ0FkZGVyKSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWVudHM6CisKKyAgICAgICAgICBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAgICAgICAgICBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAgICAgICAgICBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9jb25zb2xlL3NlcnZsZXRzL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvY29uc29sZS9zZXJ2bGV0cy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDkyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29uc29sZS9zZXJ2bGV0cy9wb20ueG1sCkBAIC0wLDAgKzEsMTM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29uc29sZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbnNvbGUtc2VydmxldHM8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogQ29uc29sZTogU2VydmxldHM8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uLy4uLy4uLy4uL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlczwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259L01FVEEtSU5GL2xpY2Vuc2VzPC90YXJnZXRQYXRoPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm5ldC5vcmZqYWNrYWwucmV0cm9sYW1iZGE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnJldHJvbGFtYmRhLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi41LjE8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3MtbWFpbjwvZ29hbD4KKyAgICAgICAgICAgICAgPGdvYWw+cHJvY2Vzcy10ZXN0PC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8IS0tIEkgd2FzIGdldHRpbmcgcmFuZG9tIGZhaWx1cmVzIGlmIG5vdCBydW5uaW5nIHJldHJvbGFtYmRhIGluIGEgc2VwYXJhdGUgcHJvY2VzcyAtLT4KKyAgICAgICAgICAgICAgPGZvcms+dHJ1ZTwvZm9yaz4KKyAgICAgICAgICAgICAgPG1haW5JbnB1dERpcj4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259L1dFQi1JTkYvY2xhc3NlczwvbWFpbklucHV0RGlyPgorICAgICAgICAgICAgICA8bWFpbk91dHB1dERpcj4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259L1dFQi1JTkYvY2xhc3NlczwvbWFpbk91dHB1dERpcj4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtc3RyZWFtc2NvcGU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjEuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFIGIvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNzg5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi9yZW1vdGUtcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UKQEAgLTAsMCArMSw0MCBAQAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBUEFDSEUgRURHRU5UIFNVQkNPTVBPTkVOVFM6CisKK1RoaXMgYmluYXJ5IGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aCBzZXBhcmF0ZQorY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuICBZb3VyIHVzZSBvZiB0aGlzIGJpbmFyeQoraXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTGljZW5zZTogQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAKK0ZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvYXBhY2hlLWxpY2Vuc2UtdmVyc2lvbi0yLjAudHh0CisKK2dzb24gKGNvbS5nb29nbGUuY29kZS5nc29uOmdzb246Mi4yLjQpCittZXRyaWNzLWNvcmUgKGlvLmRyb3B3aXphcmQubWV0cmljczptZXRyaWNzLWNvcmU6My4xLjIpCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xpY2Vuc2U6IE1JVAorCitqcXVlcnkgKG9yZy53ZWJqYXJzOmpxdWVyeToxLjExLjIpCisgICAgRm9yIGRldGFpbHMsIHNlZSBNRVRBLUlORi9saWNlbnNlcy9qcXVlcnktMV8xMV8yLU1JVC50eHQuCisKK2pxdWVyeS11aSAob3JnLndlYmphcnM6anF1ZXJ5LXVpOjEuMTEuNCkKKyAgICBGb3IgZGV0YWlscywgc2VlIE1FVEEtSU5GL2xpY2Vuc2VzL2pxdWVyeS11aS0xXzExXzQtTUlULnR4dC4KKworZDMubGVnZW5kLmpzIChodHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1pKT05TU09OLzM5MTgzNjkvcmF3L2JmOWJjZTZiNjhhM2I3MGY4NzQ1MGYxNTU0MzZjYTRhODRhZjFiYTQvZDMubGVnZW5kLmpzKQorICAgIEZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvZDMubGVnZW5kLU1JVC50eHQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xpY2Vuc2U6IEJTRCAzLUNsYXVzZQorCitkMyAob3JnLndlYmphcnMuYm93ZXI6ZDM6My4zLjkpCisgICAgRm9yIGRldGFpbHMsIHNlZSBNRVRBLUlORi9saWNlbnNlcy9kMy0zXzNfOS1CU0QudHh0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMaWNlbnNlOiBCU0QgMi1DbGF1c2UKKworZDMtcGx1Z2lucy1zYW5rZXkgKG9yZy53ZWJqYXJzLmJvd2VyOmQzLXBsdWdpbnMtc2Fua2V5OjEuMS4wKQorICAgIEZvciBkZXRhaWxzLCBzZWUgTUVUQS1JTkYvbGljZW5zZXMvZDMtcGx1Z2lucy1zYW5rZXktMV8xXzAtQlNELnR4dC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UgYi9wbGF0Zm9ybXMvamF2YTcvY29uc29sZS9zZXJ2bGV0cy9zcmMvbWFpbi9yZW1vdGUtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzllN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2NvbnNvbGUvc2VydmxldHMvc3JjL21haW4vcmVtb3RlLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKQEAgLTAsMCArMSwyOCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZGV2ZWxvcGVkIGJ5IElCTSBDb3JwLgorQ29weXJpZ2h0IElCTSBDb3JwLiAyMDE1LCAyMDE2CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQVBBQ0hFIEVER0VOVCBTVUJDT01QT05FTlRTOgorCitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoIHNlcGFyYXRlCitjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gIFRoZSBmb2xsb3dpbmcgbm90aWNlcyBhcHBseS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWV0cmljcy1jb3JlIChpby5kcm9wd2l6YXJkLm1ldHJpY3M6bWV0cmljcy1jb3JlOjMuMS4yKQorCitNZXRyaWNzCitDb3B5cmlnaHQgMjAxMC0yMDEzIENvZGEgSGFsZSBhbmQgWWFtbWVyLCBJbmMuCisKK1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQ29kYSBIYWxlIGFuZCBZYW1tZXIsIEluYy4KKworVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBKU1ItMTY2IHByb2plY3QgKFRocmVhZExvY2FsUmFuZG9tLAorU3RyaXBlZDY0LCBMb25nQWRkZXIpIHdpdGggdGhlIGZvbGxvd2luZyBjb21tZW50czoKKworICAgICAgICAgIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICAgICAgICAgIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICAgICAgICAgIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Rpc3RyaWJ1dGlvbi9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L2Rpc3RyaWJ1dGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzQwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvZGlzdHJpYnV0aW9uL3BvbS54bWwKQEAgLTAsMCArMSwyMDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3Jtcy1qYXZhNzwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LWRpc3RyaWJ1dGlvbjwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBEaXN0cmlidXRpb248L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9kaXN0cmlidXRpb24ueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y3JlYXRlLWFyY2hpdmU8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDwhLS0gV2UgZG9uJ3QgbmVlZCBhbnkgamFycyBhcyBvdXRwdXQgaW4gdGhpcyBtb2R1bGUgLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1qYXI8L2lkPgorICAgICAgICAgICAgPHBoYXNlPm5vbmU8L3BoYXNlPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+bm9uZTwvcGhhc2U+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDwhLS0gVGhlIGdlbmVyYWwgc3RyYXRlZ3kgaGVyZSBpcyB0byBvbmx5IGRlY2xhcmUgInRvcC1sZXZlbCIKKyAgICAgICAgIEVkZ2VudCBhcnRpZmFjdHMsIGxpa2UgYW4gRWRnZW50IGFwcGxpY2F0aW9uIHBvbSB3b3VsZCwKKyAgICAgICAgIGFuZCBsZXQgdGhvc2UgYXJ0aWZhY3RzIHB1bGwgaW4gdGhlaXIgZGVwZW5kZW50CisgICAgICAgICBFZGdlbnQgYXJ0aWZhY3RzLCBldGMuCisgICAgICAgICBTbyBkZWNsYXJlIFByb3ZpZGVycywgQW5hbHl0aWNzLCBVdGlscywgQ29ubmVjdG9ycy4KKyAgICAtLT4KKworICAgIDwhLS0gUHJvdmlkZXJzIC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRldmVsb3BtZW50PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1pb3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8IS0tIEFuYWx5dGljcyAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljcy1tYXRoMzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFuYWx5dGljcy1zZW5zb3JzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLSBVdGlscyAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLW1ldHJpY3M8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC11dGlscy1zdHJlYW1zY29wZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gQ29ubmVjdG9ycyAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbWFuZDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1jc3Y8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWZpbGU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaW90cDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtamRiYzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMta2Fma2E8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLW1xdHQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXB1YnN1YjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtc2VyaWFsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy13ZWJzb2NrZXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXdlYnNvY2tldC1qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gSW5jbHVkZSBjb25zb2xlLXNlcnZsZXRzLndhciB0byBlbmFibGUgYSB1c2VyIHRvIHJ1bgorICAgICAgICAgaXQgaW4gdGhlaXIgb3duIFNlcnZsZXRzIGVuZ2luZS4KKyAgICAgICAgIEl0J3MgYnVuZGxlZCBpbiB0aGUgZWRnZW50LWNvbnNvbGUtc2VydmVyLmphci4KKyAgICAgICAgIE5vdGUsIGVkZ2VudC1jb25zb2xlLXNlcnZlciBpcyBwdWxsZWQgaW4gYXMgYSBkZXBlbmRlbmN5CisgICAgICAgICBvZiB0aGUgZGV2ZWxvcG1lbnQgcHJvdmlkZXIuCisgICAgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25zb2xlLXNlcnZsZXRzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L2Rpc3RyaWJ1dGlvbi9zcmMvYXNzZW1ibHkvZGlzdHJpYnV0aW9uLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9kaXN0cmlidXRpb24vc3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5N2Q1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9kaXN0cmlidXRpb24vc3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIgorICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjIueHNkIj4KKworICA8aWQ+YmluPC9pZD4KKworICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICAgIDxmb3JtYXQ+dGFyLmJ6MjwvZm9ybWF0PgorICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgIDwvZm9ybWF0cz4KKworICA8ZmlsZVNldHM+CisgICAgPCEtLWZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeS8+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPkRJU0NMQUlNRVI8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPk5PVElDRTwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorCisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS8uLi8uLi8uLi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXM8L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGljZW5zZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICA8L2ZpbGVTZXQtLT4KKworICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fS9NRVRBLUlORjwvZGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT5ERVBFTkRFTkNJRVM8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgICAgPG91dHB1dERpcmVjdG9yeS8+CisgICAgPC9maWxlU2V0PgorCisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9PC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPlJFQURNRTwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5Lz4KKyAgICA8L2ZpbGVTZXQ+CisKKyAgICA8IS0tZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZTwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2NzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgPC9maWxlU2V0LS0+CisgIDwvZmlsZVNldHM+CisKKyAgPGRlcGVuZGVuY3lTZXRzPgorICAgIDwhLS0gQW55IGVkZ2VudCBsaWJzIC0tPgorICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWJzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuZWRnZW50KjwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuZWRnZW50KjplZGdlbnQtZGlzdHJpYnV0aW9uPC9leGNsdWRlPgorICAgICAgPC9leGNsdWRlcz4KKyAgICA8L2RlcGVuZGVuY3lTZXQ+CisKKyAgICA8IS0tIEFsbCBvdGhlciBsaWJzIGFyZSB0cmVhdGVkIGFzIGV4dGVybmFsIGxpYnMgLS0+CisgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmV4dDwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmVkZ2VudCo8L2V4Y2x1ZGU+CisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgPC9kZXBlbmRlbmN5U2V0cz4KKworPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL1JFQURNRSBiL3BsYXRmb3Jtcy9qYXZhNy9kaXN0cmlidXRpb24vc3JjL21haW4vcmVzb3VyY2VzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTFjN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvUkVBRE1FCkBAIC0wLDAgKzEsMTIgQEAKK1RoaXMgYnVuZGxlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIGFydGlmYWN0cyB3aXRoIHNlcGFyYXRlCitjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gIFlvdXIgdXNlIG9mIGFuIGFydGlmYWN0CitpcyBzdWJqZWN0IHRvIHRoYXQgYXJ0aWZhY3TigJlzIGxpY2Vuc2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKworVGhlIEFwYWNoZSBFZGdlbnQgYXJ0aWZhY3RzIChldmVyeXRoaW5nIGluIGxpYikgYWxsIGhhdmUgdGhlCitsaWNlbnNlIOKAnEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4w4oCdLgorCitFZGdlbnTigJlzIGRlcGVuZGVudCBhcnRpZmFjdHMgaW4g4oCcZXh04oCdIGhhdmUgYWxsIGJlZW4gZXZhbHVhdGVkCit0byBiZSBjb21wYXRpYmxlIHdpdGggRWRnZW504oCZcyBsaWNlbnNlLgorCitBIGJ1bmRsZWQgYXJ0aWZhY3QncyBhZHZlcnRpc2VkIGxpY2Vuc2UgaW5mb3JtYXRpb24gbWF5IGJlCitmb3VuZCBpbiB0aGUgREVQRU5ERU5DSUVTIGZpbGUgaW4gdGhpcyBidW5kbGUuCmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvanFhc3Npc3RhbnQvc3RydWN0dXJhbC1ydWxlcy54bWwgYi9wbGF0Zm9ybXMvamF2YTcvanFhc3Npc3RhbnQvc3RydWN0dXJhbC1ydWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkMTViMQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9qcWFzc2lzdGFudC9zdHJ1Y3R1cmFsLXJ1bGVzLnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxqcWE6anFhc3Npc3RhbnQtcnVsZXMgeG1sbnM6anFhPSJodHRwOi8vd3d3LmJ1c2NobWFpcy5jb20vanFhc3Npc3RhbnQvY29yZS9hbmFseXNpcy9ydWxlcy9zY2hlbWEvdjEuMCIKKyAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmJ1c2NobWFpcy5jb20vanFhc3Npc3RhbnQvY29yZS9hbmFseXNpcy9ydWxlcy9zY2hlbWEvdjEuMCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYnVzY2htYWlzL2pxYXNzaXN0YW50LWV4YW1wbGVzL21hc3Rlci9jb3JlL2FuYWx5c2lzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94c2QvanFhc3Npc3RhbnQtcnVsZXMtMS4wLnhzZCI+CisKKyAgPGNvbnN0cmFpbnQgaWQ9InN0cnVjdHVyYWwtcnVsZXM6dW5wYWNrLW1hdGNoaW5nLWFydGlmYWN0cyI+CisgICAgPGRlc2NyaXB0aW9uPkFsbCBKYXZhIDcgbW9kdWxlcyBtdXN0IHVzZSB0aGUgbWF0Y2hpbmcgSmF2YSA4IG1vZHVsZXMgYXMgc291cmNlLjwvZGVzY3JpcHRpb24+CisgICAgPGN5cGhlcj48IVtDREFUQVsKKyAgICAgICAgICAgIE1BVENICisgICAgICAgICAgICAgICAgKG06TWF2ZW46UG9tOlhtbCktW0RFU0NSSUJFU10tPihhOk1hdmVuOkFydGlmYWN0KQorICAgICAgICAgICAgV0hFUkUKKyAgICAgICAgICAgICAgICBhLmdyb3VwID0gIm9yZy5hcGFjaGUuZWRnZW50LmphdmE3IgorICAgICAgICAgICAgUkVUVVJOIG0KKyAgICAgICAgXV0+PC9jeXBoZXI+CisgIDwvY29uc3RyYWludD4KKworICA8Y29uc3RyYWludCBpZD0ic3RydWN0dXJhbC1ydWxlczptYXRjaGluZy1kZXBlbmRlbmNpZXMiPgorICAgIDxkZXNjcmlwdGlvbj5BbGwgSmF2YSA3IG1vZHVsZXMgbXVzdCBoYXZlIHRoZSBzYW1lIGRlcGVuZGVuY2llcyBhcyB0aGUgbWF0Y2hpbmcgSmF2YSA4IG1vZHVsZXMuPC9kZXNjcmlwdGlvbj4KKyAgICA8Y3lwaGVyPjwhW0NEQVRBWworICAgICAgICAgICAgTUFUQ0gKKyAgICAgICAgICAgICAgICAodDpKdW5pdDQ6VGVzdDpDbGFzcykKKyAgICAgICAgICAgIFdIRVJFIE5PVAorICAgICAgICAgICAgICAgIHQubmFtZSA9fiAiLipUZXN0IgorICAgICAgICAgICAgUkVUVVJOCisgICAgICAgICAgICAgICAgdCBBUyBJbnZhbGlkVGVzdENsYXNzCisgICAgICAgIF1dPjwvY3lwaGVyPgorICA8L2NvbnN0cmFpbnQ+CisKKyAgPGdyb3VwIGlkPSJkZWZhdWx0Ij4KKyAgICA8aW5jbHVkZUNvbnN0cmFpbnQgcmVmSWQ9InN0cnVjdHVyYWwtcnVsZXM6dW5wYWNrLW1hdGNoaW5nLWFydGlmYWN0cyIgLz4KKyAgICA8aW5jbHVkZUNvbnN0cmFpbnQgcmVmSWQ9InN0cnVjdHVyYWwtcnVsZXM6bWF0Y2hpbmctZGVwZW5kZW5jaWVzIiAvPgorICA8L2dyb3VwPgorCis8L2pxYTpqcWFzc2lzdGFudC1ydWxlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTdjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvcG9tLnhtbApAQCAtMCwwICsxLDIyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3JtczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtamF2YTc8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogUGxhdGZvcm1zOiBKYXZhNzwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8IS0tIFRoZSA5LjIgdmVyc2lvbiBpcyB0aGUgbGFzdCB0byBzdXBwb3J0IEphdmE3IC0tPgorICAgIDxqZXR0eS52ZXJzaW9uPjkuMi4yMS52MjAxNzAxMjA8L2pldHR5LnZlcnNpb24+CisgIDwvcHJvcGVydGllcz4KKworICA8bW9kdWxlcz4KKyAgICA8IS0tIFJlYWwgbW9kdWxlcyAtLT4KKworICAgIDwhLS0gUmVwYWNrZWQgbW9kdWxlcyAtLT4KKyAgICA8bW9kdWxlPmFuYWx5dGljczwvbW9kdWxlPgorICAgIDxtb2R1bGU+YXBpPC9tb2R1bGU+CisgICAgPG1vZHVsZT5hcHBzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5jb25uZWN0b3JzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5jb25zb2xlPC9tb2R1bGU+CisgICAgPG1vZHVsZT5wcm92aWRlcnM8L21vZHVsZT4KKyAgICA8bW9kdWxlPnJ1bnRpbWU8L21vZHVsZT4KKyAgICA8bW9kdWxlPnNwaTwvbW9kdWxlPgorICAgIDxtb2R1bGU+dGVzdDwvbW9kdWxlPgorICAgIDxtb2R1bGU+dXRpbHM8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDwhLS0gQ29udmVydCB0aGUgSmF2YTggY2xhc3NlcyB0byBKYXZhNyBjbGFzc2VzIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+bmV0Lm9yZmphY2thbC5yZXRyb2xhbWJkYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cmV0cm9sYW1iZGEtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjUuMTwvdmVyc2lvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+cHJvY2Vzcy1tYWluPC9nb2FsPgorICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzLXRlc3Q8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwhLS0gSSB3YXMgZ2V0dGluZyByYW5kb20gZmFpbHVyZXMgaWYgbm90IHJ1bm5pbmcgcmV0cm9sYW1iZGEgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIC0tPgorICAgICAgICAgICAgICA8Zm9yaz50cnVlPC9mb3JrPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5jbGFzczwvaW5jbHVkZT4KKyAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgIDx0ZXN0Q2xhc3Nlc0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQudGVzdE91dHB1dERpcmVjdG9yeX08L3Rlc3RDbGFzc2VzRGlyZWN0b3J5PgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDwhLS0gQ2hlY2sgYXJ0aWZhY3RzIGFnYWluc3QgSmF2YTcgc2lnbmF0dXJlcyAtLT4KKyAgICAgIDwhLS0KKyAgICAgICAgICBMZXQgdGhlIHBsdWdpbiBydW4gaW4gdGhlIHByb2Nlc3MtdGVzdC1jbGFzc2VzIHNvIHdlIGltbWVkaWF0ZWx5IGtub3cgaWYKKyAgICAgICAgICB0ZXN0IHJ1biBwcm9ibGVtcyBjb3VsZCBiZSByZWxhdGVkIHRvIHVzaW5nIEFQSXMgdW5hdmFpbGFibGUgdG8gSmF2YTcuCisgICAgICAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hbmltYWwtc25pZmZlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMTU8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y2hlY2stamRrLXNpZ25hdHVyZXM8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtdGVzdC1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qby5zaWduYXR1cmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhMTc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4ncyBjb25maWd1cmF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgRWNsaXBzZSBtMmUgc2V0dGluZ3Mgb25seS4gSXQgaGFzIG5vIGluZmx1ZW5jZSBvbiB0aGUgTWF2ZW4gYnVpbGQgaXRzZWxmLi0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5tMmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bGlmZWN5Y2xlLW1hcHBpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxsaWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0Lm9yZmphY2thbC5yZXRyb2xhbWJkYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cm9sYW1iZGEtbWF2ZW4tcGx1Z2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvblJhbmdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyLjUuMSwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ZlcnNpb25SYW5nZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzLW1haW48L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2Vzcy10ZXN0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhY3Rpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWdub3JlIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L2xpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgPC9idWlsZD4KKworICA8cHJvZmlsZXM+CisgICAgPCEtLSBBZGRpdGlvbmFsbHkgYnVpbGQgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gcGFja2FnZS4gLS0+CisgICAgPHByb2ZpbGU+CisgICAgICA8aWQ+ZGlzdHJpYnV0aW9uPC9pZD4KKyAgICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmRpc3RyaWJ1dGlvbjwvbW9kdWxlPgorICAgICAgPC9tb2R1bGVzPgorICAgIDwvcHJvZmlsZT4KKyAgICA8IS0tIFN3aXRjaCBhbGwgZGVmYXVsdCBwbHVnaW5zIHRvIHVzZSBKYXZhNyBpbnN0ZWFkIG9mIEphdmE4IC0tPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPnRvb2xjaGFpbjwvaWQ+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi10b29sY2hhaW5zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPnRvb2xjaGFpbjwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8dG9vbGNoYWlucz4KKyAgICAgICAgICAgICAgICA8amRrPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS43PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPHZlbmRvcj5vcmFjbGU8L3ZlbmRvcj4KKyAgICAgICAgICAgICAgICA8L2pkaz4KKyAgICAgICAgICAgICAgPC90b29sY2hhaW5zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgVGhlIHJldHJvbGFtYmRhIHBsdWdpbiByZXF1aXJlcyBKYXZhIDggdG8gb3BlcmF0ZSwgYnV0IHdlIHNldCB0aGUgdG9vbGNoYWluCisgICAgICAgICAgICAgIHRvIEphdmEgNy4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gcHJvdmlkZSBhIHBhdGggdG8gdGhlIEphdmEgOCBob21lIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgVGhpcyBjaGVjayBlbnN1cmVzIHRoaXMgcHJvcGVydHkgaXMgc2V0IGFuZCBwcm92aWRlcyBhbiB1bmRlcnN0YW5kYWJsZSBlcnJvcgorICAgICAgICAgICAgICBtZXNzYWdlLgorICAgICAgICAgIC0tPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjQuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5lbmZvcmNlLXByb3BlcnR5PC9pZD4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICA8cnVsZXM+CisgICAgICAgICAgICAgICAgICAgIDxyZXF1aXJlUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PmphdmE4LmhvbWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPlRoZSByZXRyb2xhbWJkYS1tYXZlbi1wbHVnaW4gcmVxdWlyZXMgYSBwYXRoIHRvIEphdmEgOC4gWW91IG11c3Qgc2V0IGEgJ2phdmE4LmhvbWUnIHByb3BlcnR5ITwvbWVzc2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9yZXF1aXJlUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICA8L3J1bGVzPgorICAgICAgICAgICAgICAgICAgPGZhaWw+dHJ1ZTwvZmFpbD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5uZXQub3JmamFja2FsLnJldHJvbGFtYmRhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmV0cm9sYW1iZGEtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi41LjE8L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxqYXZhOGhvbWU+JHtqYXZhOC5ob21lfTwvamF2YThob21lPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvcHJvdmlkZXJzL2RldmVsb3BtZW50L3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvcHJvdmlkZXJzL2RldmVsb3BtZW50L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxM2UxYwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9wcm92aWRlcnMvZGV2ZWxvcG1lbnQvcG9tLnhtbApAQCAtMCwwICsxLDEyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVyczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kZXZlbG9wbWVudDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBQcm92aWRlcnM6IERldmVsb3BtZW50PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29uc29sZS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC11dGlscy1tZXRyaWNzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtc3RyZWFtc2NvcGU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWpteGNvbnRyb2w8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtc3RyZWFtc2NvcGU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9wcm92aWRlcnMvZGlyZWN0L3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvcHJvdmlkZXJzL2RpcmVjdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMGQ3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvcHJvdmlkZXJzL2RpcmVjdC9wb20ueG1sCkBAIC0wLDAgKzEsMTU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBQcm92aWRlcnM6IERpcmVjdDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LWFwcHNlcnZpY2UtamFyPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPmNvcHk8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC10ZXN0LWFwcHNlcnZpY2UtYXBwbGljYXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LXJlc291cmNlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGRlc3RGaWxlTmFtZT50ZXN0LWFwcHNlcnZpY2UtYXBwbGljYXRpb25zLmphcjwvZGVzdEZpbGVOYW1lPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtc3BpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtc3BpLWdyYXBoPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1hcHBzZXJ2aWNlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1ldGlhbzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtanNvbmNvbnRyb2w8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLW1ldHJpY3M8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC11dGlscy1tZXRyaWNzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9wcm92aWRlcnMvaW90L3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvcHJvdmlkZXJzL2lvdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDE2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvcHJvdmlkZXJzL2lvdC9wb20ueG1sCkBAIC0wLDAgKzEsMTE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWlvdDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBQcm92aWRlcnM6IElvVDwvbmFtZT4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qc29uY29udHJvbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtYXBwc2VydmljZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1wdWJzdWI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHMtcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9wcm92aWRlcnMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9wcm92aWRlcnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjAxMDYzCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L3Byb3ZpZGVycy9wb20ueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtamF2YTc8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnM8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogUHJvdmlkZXJzPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+ZGV2ZWxvcG1lbnQ8L21vZHVsZT4KKyAgICA8bW9kdWxlPmRpcmVjdDwvbW9kdWxlPgorICAgIDxtb2R1bGU+aW90PC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L3J1bnRpbWUvYXBwc2VydmljZS9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L3J1bnRpbWUvYXBwc2VydmljZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTA2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvcnVudGltZS9hcHBzZXJ2aWNlL3BvbS54bWwKQEAgLTAsMCArMSwxMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1hcHBzZXJ2aWNlPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IFJ1bnRpbWU6IEFwcFNlcnZpY2U8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gSnVzdCBuZWVkZWQgdG8gbWFrZSBzdXJlIGl0IGlzIHNjaGVkdWxlZCBiZWZvcmUgdGhpcyBtb2R1bGUgaW4gdGhlIHJlYWN0b3IgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC10ZXN0LWFwcHNlcnZpY2UtYXBwbGljYXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L3J1bnRpbWUvZXRpYW8vcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9ydW50aW1lL2V0aWFvL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0MWVhYwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9ydW50aW1lL2V0aWFvL3BvbS54bWwKQEAgLTAsMCArMSwxMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1ldGlhbzwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBSdW50aW1lOiBFdGlhbzwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWdyYXBoPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvcnVudGltZS9qbXhjb250cm9sL3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvcnVudGltZS9qbXhjb250cm9sL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlZTNlZAotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9ydW50aW1lL2pteGNvbnRyb2wvcG9tLnhtbApAQCAtMCwwICsxLDk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtam14Y29udHJvbDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBSdW50aW1lOiBKTVhDb250cm9sPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZXhlY3V0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWZ1bmN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L3J1bnRpbWUvam9icmVnaXN0cnkvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9ydW50aW1lL2pvYnJlZ2lzdHJ5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3Y2YzMwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy9ydW50aW1lL2pvYnJlZ2lzdHJ5L3BvbS54bWwKQEAgLTAsMCArMSw5NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWpvYnJlZ2lzdHJ5PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IFJ1bnRpbWU6IEpvYlJlZ2lzdHJ5PC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1leGVjdXRpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvcnVudGltZS9qc29uY29udHJvbC9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L3J1bnRpbWUvanNvbmNvbnRyb2wvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODVmMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L3J1bnRpbWUvanNvbmNvbnRyb2wvcG9tLnhtbApAQCAtMCwwICsxLDk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtanNvbmNvbnRyb2w8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogUnVudGltZTogSlNPTkNvbnRyb2w8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1leGVjdXRpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZnVuY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvcnVudGltZS9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L3J1bnRpbWUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWUyNDBmCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L3J1bnRpbWUvcG9tLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGxhdGZvcm1zLWphdmE3PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBSdW50aW1lPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+YXBwc2VydmljZTwvbW9kdWxlPgorICAgIDxtb2R1bGU+ZXRpYW88L21vZHVsZT4KKyAgICA8bW9kdWxlPmpteGNvbnRyb2w8L21vZHVsZT4KKyAgICA8bW9kdWxlPmpvYnJlZ2lzdHJ5PC9tb2R1bGU+CisgICAgPG1vZHVsZT5qc29uY29udHJvbDwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9zcGkvZ3JhcGgvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9zcGkvZ3JhcGgvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE2YzhjCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L3NwaS9ncmFwaC9wb20ueG1sCkBAIC0wLDAgKzEsOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogU1BJOiBHcmFwaDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy9zcGkvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy9zcGkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQxNWEwCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L3NwaS9wb20ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wbGF0Zm9ybXMtamF2YTc8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGk8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogU1BJPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+Z3JhcGg8L21vZHVsZT4KKyAgICA8bW9kdWxlPnRvcG9sb2d5PC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L3NwaS90b3BvbG9neS9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L3NwaS90b3BvbG9neS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2NmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvc3BpL3RvcG9sb2d5L3BvbS54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDcpOiBTUEk6IFRvcG9sb2d5PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi8uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvdGVzdC9hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L3Rlc3QvYXBwc2VydmljZS1hcHBsaWNhdGlvbnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUyZGFjCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L3Rlc3QvYXBwc2VydmljZS1hcHBsaWNhdGlvbnMvcG9tLnhtbApAQCAtMCwwICsxLDk5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdGVzdDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXRlc3QtYXBwc2VydmljZS1hcHBsaWNhdGlvbnM8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogVGVzdDogQXBwU2VydmljZSBBcHBsaWNhdGlvbnM8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qLE1FVEEtSU5GL21hdmVuLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8Y2xhc3Nlc0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9jbGFzc2VzRGlyZWN0b3J5PgorICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GL3NlcnZpY2VzLyoqPC9pbmNsdWRlPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS9lZGdlbnQvdGVzdC90b3BvbG9neS9zZXJ2aWNlcy8qLmNsYXNzPC9pbmNsdWRlPgorICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L3Rlc3QvZnZ0aW90L3BvbS54bWwgYi9wbGF0Zm9ybXMvamF2YTcvdGVzdC9mdnRpb3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTAwYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL2phdmE3L3Rlc3QvZnZ0aW90L3BvbS54bWwKQEAgLTAsMCArMSwxMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC10ZXN0PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtdGVzdC1mdnRpb3Q8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogVGVzdDogZnZ0aW90PC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS1hcHBzZXJ2aWNlLWphcjwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+cHJlLWludGVncmF0aW9uLXRlc3Q8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdGVzdC1hcHBzZXJ2aWNlLWFwcGxpY2F0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1yZXNvdXJjZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxkZXN0RmlsZU5hbWU+dGVzdC1hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy5qYXI8L2Rlc3RGaWxlTmFtZT4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtcHVic3ViPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qc29uY29udHJvbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L3Rlc3QvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy90ZXN0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4OGZkZQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy90ZXN0L3BvbS54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3Jtcy1qYXZhNzwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXRlc3Q8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogVGVzdDwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmFwcHNlcnZpY2UtYXBwbGljYXRpb25zPC9tb2R1bGU+CisgICAgPG1vZHVsZT5mdnRpb3Q8L21vZHVsZT4KKyAgICA8bW9kdWxlPnN2dDwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy90ZXN0L3N2dC9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L3Rlc3Qvc3Z0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjNDIwMwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy90ZXN0L3N2dC9wb20ueG1sCkBAIC0wLDAgKzEsMTA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdGVzdDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXRlc3Qtc3Z0PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IFRlc3Q6IFNWVDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vLi4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktdGVzdDwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj50ZXN0czwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29uc29sZS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC11dGlscy1tZXRyaWNzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRldmVsb3BtZW50PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL2phdmE3L3V0aWxzL21ldHJpY3MvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy91dGlscy9tZXRyaWNzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhOWNlOQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy91dGlscy9tZXRyaWNzL3BvbS54bWwKQEAgLTAsMCArMSwxMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC11dGlsczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLW1ldHJpY3M8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogVXRpbHM6IE1ldHJpY3M8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uLy4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+TUVUQS1JTkYvKio8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gVE9ETzogVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGJlY2F1c2Ugb2YgYSBkZXBlbmRlbmN5IHRvIFRvcG9sb2d5QWJzdHJhY3RUZXN0IC0+IFdvdWxkIHN1Z2dlc3QgdG8gbW92ZSB0ZXN0LXV0aWwgc3R1dHQgaW50byBhIGRlZGljYXRlZCB0ZXN0LXV0aWxzIGFydGlmYWN0IC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQuamF2YTc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybXMvamF2YTcvdXRpbHMvcG9tLnhtbCBiL3BsYXRmb3Jtcy9qYXZhNy91dGlscy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMmU0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybXMvamF2YTcvdXRpbHMvcG9tLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGxhdGZvcm1zLWphdmE3PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHM8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA3KTogVXRpbHM8L25hbWU+CisKKyAgPG1vZHVsZXM+CisgICAgPG1vZHVsZT5tZXRyaWNzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5zdHJlYW1zY29wZTwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsYXRmb3Jtcy9qYXZhNy91dGlscy9zdHJlYW1zY29wZS9wb20ueG1sIGIvcGxhdGZvcm1zL2phdmE3L3V0aWxzL3N0cmVhbXNjb3BlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0N2UwMAotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3Jtcy9qYXZhNy91dGlscy9zdHJlYW1zY29wZS9wb20ueG1sCkBAIC0wLDAgKzEsOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC11dGlsczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLXN0cmVhbXNjb3BlPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgNyk6IFV0aWxzOiBTdHJlYW1zY29wZTwvbmFtZT4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPk1FVEEtSU5GLyoqPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz5NRVRBLUlORi8qKjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudC5qYXZhNzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8IS0tIFRPRE86IFRoaXMgaXMgb25seSByZXF1aXJlZCBiZWNhdXNlIG9mIGEgZGVwZW5kZW5jeSB0byBUb3BvbG9neUFic3RyYWN0VGVzdCAtPiBXb3VsZCBzdWdnZXN0IHRvIG1vdmUgdGVzdC11dGlsIHN0dXR0IGludG8gYSBkZWRpY2F0ZWQgdGVzdC11dGlscyBhcnRpZmFjdCAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50LmphdmE3PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1zL3BvbS54bWwgYi9wbGF0Zm9ybXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmU5YjgyCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm1zL3BvbS54bWwKQEAgLTAsMCArMSw4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXBsYXRmb3JtczwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBQbGF0Zm9ybXM8L25hbWU+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS41PC92ZXJzaW9uPjwhLS0kTk8tTVZOLU1BTi1WRVIkLS0+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+cHJvY2Vzcy1yZXNvdXJjZS1idW5kbGVzPC9pZD4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KKyAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZTphcGFjaGUtamFyLXJlc291cmNlLWJ1bmRsZToxLjQ8L3Jlc291cmNlQnVuZGxlPgorICAgICAgICAgICAgICAgIDwhLS0gV2lsbCBnZW5lcmF0ZSBNRVRBLUlORi9ESVNDTEFJTUVSICAtLT4KKyAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5hcGFjaGUucmVzb3VyY2VzOmFwYWNoZS1pbmN1YmF0b3ItZGlzY2xhaW1lci1yZXNvdXJjZS1idW5kbGU6MS4yLVNOQVBTSE9UPC9yZXNvdXJjZUJ1bmRsZT4KKyAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8cHJvZmlsZXM+CisgICAgPHByb2ZpbGU+CisgICAgICA8aWQ+cGxhdGZvcm0tamF2YTc8L2lkPgorICAgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+amF2YTc8L21vZHVsZT4KKyAgICAgIDwvbW9kdWxlcz4KKyAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cGxhdGZvcm0uamF2YTc+dHJ1ZTwvcGxhdGZvcm0uamF2YTc+CisgICAgICA8L3Byb3BlcnRpZXM+CisgICAgPC9wcm9maWxlPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPnBsYXRmb3JtLWFuZHJvaWQ8L2lkPgorICAgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+YW5kcm9pZDwvbW9kdWxlPgorICAgICAgPC9tb2R1bGVzPgorICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwbGF0Zm9ybS5hbmRyb2lkPnRydWU8L3BsYXRmb3JtLmFuZHJvaWQ+CisgICAgICA8L3Byb3BlcnRpZXM+CisgICAgPC9wcm9maWxlPgorICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wb20ueG1sIGIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI2MTcyCi0tLSAvZGV2L251bGwKKysrIGIvcG9tLnhtbApAQCAtMCwwICsxLDkxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmFwYWNoZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xODwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmVkZ2VudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQ8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5UaGUgQXBhY2hlIEVkZ2VudCBQcm9qZWN0PC9kZXNjcmlwdGlvbj4KKworICA8IS0tIE5lZWRlZCBieSB0aGUgcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4gdG8gZ2VuZXJhdGUgdGhlIHByb2plY3QgdGltZS1zcGFuIGluIHRoZSBOT1RJQ0UgZmlsZXMgLS0+CisgIDxpbmNlcHRpb25ZZWFyPjIwMTY8L2luY2VwdGlvblllYXI+CisKKyAgPHNjbT4KKyAgICA8Y29ubmVjdGlvbj5zY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi9pbmN1YmF0b3ItZWRnZW50LmdpdDwvY29ubmVjdGlvbj4KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi9pbmN1YmF0b3ItZWRnZW50LmdpdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLWVkZ2VudDwvdXJsPgorICAgIDx0YWc+ZWRnZW50LTEuMi4wPC90YWc+CisgIDwvc2NtPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxqYXZhLnZlcnNpb24+MS44PC9qYXZhLnZlcnNpb24+CisgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPHByb2plY3QucmVwb3J0aW5nLm91dHB1dGVuY29kaW5nPlVURi04PC9wcm9qZWN0LnJlcG9ydGluZy5vdXRwdXRlbmNvZGluZz4KKyAgICA8bWF2ZW4udmVyc2lvbj4zLjMuMTwvbWF2ZW4udmVyc2lvbj4KKworICAgIDxqZXR0eS52ZXJzaW9uPjkuMy42LnYyMDE1MTEwNjwvamV0dHkudmVyc2lvbj4KKyAgICA8Z3Nvbi52ZXJzaW9uPjIuMi40PC9nc29uLnZlcnNpb24+CisgICAgPHNsZjRqLnZlcnNpb24+MS43LjEyPC9zbGY0ai52ZXJzaW9uPgorCisgICAgPCEtLSBVUkwgb2YgdGhlIEFTRiBTb25hclF1YmUgc2VydmVyIC0tPgorICAgIDxzb25hci5ob3N0LnVybD5odHRwczovL2J1aWxkcy5hcGFjaGUub3JnL2FuYWx5c2lzPC9zb25hci5ob3N0LnVybD4KKyAgICA8IS0tIEV4Y2x1ZGUgYWxsIGdlbmVyYXRlZCBjb2RlIC0tPgorICAgIDxzb25hci5leGNsdXNpb25zPmZpbGU6KiovZ2VuZXJhdGVkLXNvdXJjZXMvKio8L3NvbmFyLmV4Y2x1c2lvbnM+CisgICAgPCEtLSBUZWxsIHNvbmFyIHdoZXJlIHRoZSBjb3ZlcmFnZSByZXBvcnRzIGFyZSBsb2NhdGVkIC0tPgorICAgIDxzb25hci5qYWNvY28ucmVwb3J0UGF0aD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jb3ZlcmFnZS1yZXBvcnRzL2phY29jby11dC5leGVjPC9zb25hci5qYWNvY28ucmVwb3J0UGF0aD4KKyAgICA8c29uYXIuamFjb2NvLml0UmVwb3J0UGF0aD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jb3ZlcmFnZS1yZXBvcnRzL2phY29jby1pdC5leGVjPC9zb25hci5qYWNvY28uaXRSZXBvcnRQYXRoPgorCisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPnNyYy9tYWluL3JlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPCEtLSBPbmx5IGNvbmZpZ3VyZSB0aGUgc2l0ZSBkaXN0cmlidXRpb24gYXMgdGhlIHJlc3QgaXMgaGFuZGxlZCBieSB0aGUgYXBhY2hlIHBhcmVudCAtLT4KKyAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisgICAgPHNpdGU+CisgICAgICA8aWQ+YXBhY2hlLndlYnNpdGU8L2lkPgorICAgICAgPHVybD5zY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi9pbmN1YmF0b3ItZWRnZW50LmdpdDwvdXJsPgorICAgIDwvc2l0ZT4KKyAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorCisgIDxpc3N1ZU1hbmFnZW1lbnQ+CisgICAgPHN5c3RlbT5KaXJhPC9zeXN0ZW0+CisgICAgPHVybD5odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0VER0VOVDwvdXJsPgorICA8L2lzc3VlTWFuYWdlbWVudD4KKworICA8bWFpbGluZ0xpc3RzPgorICAgIDxtYWlsaW5nTGlzdD4KKyAgICAgIDxuYW1lPkFwYWNoZSBFZGdlbnQgRGV2ZWxvcGVyIExpc3Q8L25hbWU+CisgICAgICA8c3Vic2NyaWJlPmRldi1zdWJzY3JpYmVAZWRnZW50LmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KKyAgICAgIDx1bnN1YnNjcmliZT5kZXYtdW5zdWJzY3JpYmVAZWRnZW50LmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgorICAgICAgPHBvc3Q+ZGV2QGVkZ2VudC5hcGFjaGUub3JnPC9wb3N0PgorICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9lZGdlbnQtZGV2LzwvYXJjaGl2ZT4KKyAgICA8L21haWxpbmdMaXN0PgorICA8L21haWxpbmdMaXN0cz4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmFuYWx5dGljczwvbW9kdWxlPgorICAgIDxtb2R1bGU+YXBpPC9tb2R1bGU+CisgICAgPG1vZHVsZT5hcHBzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5jb25uZWN0b3JzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5jb25zb2xlPC9tb2R1bGU+CisgICAgPG1vZHVsZT5wcm92aWRlcnM8L21vZHVsZT4KKyAgICA8bW9kdWxlPnJ1bnRpbWU8L21vZHVsZT4KKyAgICA8IS0tIDxtb2R1bGU+c2FtcGxlczwvbW9kdWxlPiBpbnRlbnRpb25hbGx5IG9taXR0ZWQgLS0+CisgICAgPG1vZHVsZT5zcGk8L21vZHVsZT4KKyAgICA8bW9kdWxlPnRlc3Q8L21vZHVsZT4KKyAgICA8bW9kdWxlPnV0aWxzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5wbGF0Zm9ybXM8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgIDxwbHVnaW5zPgorICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPmNvbS5idXNjaG1haXMuanFhc3Npc3RhbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+anFhc3Npc3RhbnQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wPC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+My42LjE8L3ZlcnNpb24+CisgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgPHRhcmdldD4ke2phdmEudmVyc2lvbn08L3RhcmdldD4KKyAgICAgICAgICAgIDx0ZXN0U291cmNlPiR7amF2YS52ZXJzaW9ufTwvdGVzdFNvdXJjZT4KKyAgICAgICAgICAgIDx0ZXN0VGFyZ2V0PiR7amF2YS52ZXJzaW9ufTwvdGVzdFRhcmdldD4KKyAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+My4wLjI8L3ZlcnNpb24+CisgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDwhLS0gVHJ5IHRvIGdldCByaWQgb2Ygb3V0IG9mIGhlYXAgZXJyb3JzIG9uIHRyYXZpcy4gLS0+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWFyY2hpdmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICA8dmVyc2lvbj4zLjM8L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjIuNS4yPC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUucmF0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1yYXQtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjAuMTI8L3ZlcnNpb24+CisgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgTWFrZSByYXQgb3V0cHV0IHRoZSBmaWxlcyB3aXRoIG1pc3NpbmcgbGljZW5zZWQgZGlyZWN0bHkgaW50byB0aGUKKyAgICAgICAgICAgICAgICBidWlsZCBvdXRwdXQgKFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gbG9vayBpbnRvIHRoZSByYXQudHh0IHRvIGZpbmQKKyAgICAgICAgICAgICAgICBvdXQgd2hpY2ggb25lcykKKyAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPGNvbnNvbGVPdXRwdXQ+dHJ1ZTwvY29uc29sZU91dHB1dD4KKyAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLmRveGlhPC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kb3hpYS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICA8dmVyc2lvbj4xLjY8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjIuMTAuNDwvdmVyc2lvbj4KKyAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxmYWlsT25FcnJvcj5mYWxzZTwvZmFpbE9uRXJyb3I+CisgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPgorICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KKyAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICA8Z29hbD5qYXItbm8tZm9yazwvZ29hbD4KKyAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuc29uYXJzb3VyY2Uuc2Nhbm5lci5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5zb25hci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+My4zLjAuNjAzPC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8IS0tCisgICAgICAgICAgICAgIFRoaXMgaXMgYSBmYWtlIHBsdWdpbiB3aGljaCBpcyB1c2VkIHRvIHRlbGwgbTJlIChFY2xpcHNlKSBob3cKKyAgICAgICAgICAgICAgdG8gcHJvY2VzcyB0aGlzIG1hdmVuIHByb2plY3QuCisgICAgICAgIC0tPgorICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm0yZTwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5saWZlY3ljbGUtbWFwcGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KKyAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxsaWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+CisgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb24+CisgICAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvblJhbmdlPlsxLjAuMCwpPC92ZXJzaW9uUmFuZ2U+CisgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICA8YWN0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aWdub3JlIC8+CisgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb25SYW5nZT5bMS4wLjAsKTwvdmVyc2lvblJhbmdlPgorICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorICAgICAgICAgICAgICAgICAgPGFjdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGlnbm9yZSAvPgorICAgICAgICAgICAgICAgICAgPC9hY3Rpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb24+CisgICAgICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGVjb2RlLm1hdmVuLWRvd25sb2FkLXBsdWdpbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZG93bmxvYWQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvblJhbmdlPlsxLjAuMCwpPC92ZXJzaW9uUmFuZ2U+CisgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICA8Z29hbD53Z2V0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICA8YWN0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aWdub3JlIC8+CisgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25zPgorICAgICAgICAgICAgPC9saWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+CisgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8IS0tIEluamVjdCB0aGUgImluY3ViYXRpbmciIGludG8gdGhlIG91dHB1dCBmaWxlbmFtZQorICAgICAgICAgICBOLkIuIHRoaXMgZmluYWxOYW1lIGNvbmZpZyBzcGVjIGlzIGN1cnJlbnRseSBpZ25vcmVkL292ZXJyaWRkZW4KKyAgICAgICAgICAgYnkgdGhlICJhcGFjaGUtcmVsZWFzZSIgcHJvZmlsZSBiYXNlZCBjb25maWd1cmF0aW9uCisgICAgICAgICAgIGluIHRoaXMgcG9tLiBTZWUgdGhhdCBjb25maWcgZm9yIHRoZSBmaW5hbE5hbWUuCisgICAgICAgICAgIFJldGFpbiB0aGlzIGZvciBub3cgaW4gY2FzZSB3ZSBnZXQgdG8gdGhlIHBvaW50IHdoZXJlCisgICAgICAgICAgIHRoYXQgImFwYWNoZS1yZWxlYXNlIiBjb25maWcgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgICAgIC0tPgorICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+Mi41LjM8L3ZlcnNpb24+CisgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZmluYWxOYW1lPmFwYWNoZS1lZGdlbnQtJHtwcm9qZWN0LnZlcnNpb259LWluY3ViYXRpbmc8L2ZpbmFsTmFtZT4KKyAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+Mi4yMDwvdmVyc2lvbj4KKyAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjIuMjA8L3ZlcnNpb24+CisgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNpdGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjMuNjwvdmVyc2lvbj4KKyAgICAgICAgPC9wbHVnaW4+CisgICAgICA8L3BsdWdpbnM+CisgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorCisgICAgPHBsdWdpbnM+CisgICAgICA8IS0tIENoZWNrIGlmIGFsbCBzb3VyY2UgZmlsZXMgaGF2ZSB0aGUgcmVxdWlyZWQgYXBhY2hlIGxpY2Vuc2UgaGVhZGVycyAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUucmF0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hcGFjaGUtcmF0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5saWNlbnNlLWNoZWNrPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgPCEtLSBMaWNlbnNlIHRleHRzIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL2xpY2Vuc2VzLyoqPC9leGNsdWRlPgorCisgICAgICAgICAgICA8IS0tIEdpdCByZWxhdGVkIGZpbGVzIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+KiovLmdpdC8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPioqLy5naXRpZ25vcmU8L2V4Y2x1ZGU+CisKKyAgICAgICAgICAgIDwhLS0gTWF2ZW4gcmVsYXRlZCBmaWxlcyAtLT4KKyAgICAgICAgICAgIDxleGNsdWRlPioqL3RhcmdldC8qKjwvZXhjbHVkZT4KKworICAgICAgICAgICAgPCEtLSBFY2xpcHNlIHJlbGF0ZWQgZmlsZXMgLS0+CisgICAgICAgICAgICA8ZXhjbHVkZT4qKi8ucHJvamVjdDwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPioqLy5zZXR0aW5ncy8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPioqLy5jbGFzc3BhdGg8L2V4Y2x1ZGU+CisKKyAgICAgICAgICAgIDwhLS0gSW50ZWxsaUogcmVsYXRlZCBmaWxlcyAtLT4KKyAgICAgICAgICAgIDxleGNsdWRlPioqLy5pZGVhLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5pbWw8L2V4Y2x1ZGU+CisKKyAgICAgICAgICAgIDwhLS0gRG9jdW1lbnRhdGlvbiByZWxhdGVkIGZpbGVzIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+Lm1haWxtYXA8L2V4Y2x1ZGU+CisKKyAgICAgICAgICAgIDwhLS0gU3R1ZmYgbmVlZGVkIGJ5IHRoZSBKZW5raW5zIE11bHRpYnJhbmNoIFBpcGVsaW5lIGJ1aWxkIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+LnJlcG9zaXRvcnkvKio8L2V4Y2x1ZGU+CisKKyAgICAgICAgICAgIDwhLS0gT3RoZXIgZmlsZXMKKyAgICAgICAgICAgICAgICBUT0RPOiBTaG91bGQgYmUgZXhhbWluZWQKKyAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+Ki5wYXRjaDwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPioqLy5jYWNoZS8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPmJpbmFyeS1yZWxlYXNlL2FwYWNoZS1ub3RpY2U8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5iaW5hcnktcmVsZWFzZS9pYm0tY29udHJpYi1ub3RpY2U8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5saWNlbnNlcy9kMy1zYW5rZXkuQlNEPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+bGljZW5zZXMvZDMuQlNEPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+bGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvamF2YXguc2VydmxldC1hcGktMy4xLjAuQ0RETC0xLjA8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5saWNlbnNlcy9iaW5hcnktcmVsZWFzZS9qYXZheC53ZWJzb2NrZXQtYXBpLTEuMC5DRERMLTEuMTwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPmxpY2Vuc2VzL2JpbmFyeS1yZWxlYXNlL21xdHR2My0xLjEuMC5FREwtMS4wPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+bGljZW5zZXMvYmluYXJ5LXJlbGVhc2Uvd2F0c29uLWlvdC0wLjIuMi5FUEwtMS4wPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c2FtcGxlcy8qKjwvZXhjbHVkZT4gIDwhLS0gc2FtcGxlcyBhcmUgc2VwYXJhdGUgLS0+CisgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPmNvbS5idXNjaG1haXMuanFhc3Npc3RhbnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmpxYXNzaXN0YW50LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+c2NhbjwvZ29hbD4KKyAgICAgICAgICAgICAgPCEtLWdvYWw+YW5hbHl6ZTwvZ29hbC0tPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8IS0tZmFpbE9uU2V2ZXJpdHk+TUFKT1I8L2ZhaWxPblNldmVyaXR5LS0+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8IS0tCisgICAgICAgIFRoaXMgcGx1Z2luIGRvZXNuJ3QgcmVhbGx5IGRvIG11Y2gsIGl0IG1ha2VzIHN1cmUgdGhlIGphY29jbyBhZ2VudAorICAgICAgICBpcyBkb3dubG9hZGVkIGFuZCB0aGF0IHRoZSBwYXRoIHRvIHRoaXMgaXMgc2F2ZWQgaW4gYW4gZW52aXJvbm1lbnQKKyAgICAgICAgdmFyaWFibGUgc28gd2UgY2FuIGFjY2VzcyB0aGlzIGxhdGVyIG9uIGluIHRoZSBidWlsZC4KKyAgICAgIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmphY29jbzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amFjb2NvLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC43Ljk8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgUHJlcGFyZXMgdGhlIHByb3BlcnR5IHBvaW50aW5nIHRvIHRoZSBKYUNvQ28gcnVudGltZSBhZ2VudCB3aGljaAorICAgICAgICAgICAgICBpcyBwYXNzZWQgYXMgVk0gYXJndW1lbnQgd2hlbiBNYXZlbiB0aGUgU3VyZWZpcmUgcGx1Z2luIGlzIGV4ZWN1dGVkLgorICAgICAgICAgIC0tPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+cHJlLXVuaXQtdGVzdDwvaWQ+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnByZXBhcmUtYWdlbnQ8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgIFNldHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIHNldHRpbmdzCisgICAgICAgICAgICAgICAgICBmb3IgSmFDb0NvIHJ1bnRpbWUgYWdlbnQuCisgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICA8cHJvcGVydHlOYW1lPnN1cmVmaXJlQXJnTGluZTwvcHJvcGVydHlOYW1lPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgUHJlcGFyZXMgdGhlIHByb3BlcnR5IHBvaW50aW5nIHRvIHRoZSBKYUNvQ28gcnVudGltZSBhZ2VudCB3aGljaAorICAgICAgICAgICAgICBpcyBwYXNzZWQgYXMgVk0gYXJndW1lbnQgd2hlbiBNYXZlbiB0aGUgRmFpbHNhZmUgcGx1Z2luIGlzIGV4ZWN1dGVkLgorICAgICAgICAgIC0tPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+cHJlLWludGVncmF0aW9uLXRlc3Q8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+cHJlcGFyZS1hZ2VudDwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgY29udGFpbmluZyB0aGUgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgIGZvciBKYUNvQ28gcnVudGltZSBhZ2VudC4KKyAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgIDxwcm9wZXJ0eU5hbWU+ZmFpbHNhZmVBcmdMaW5lPC9wcm9wZXJ0eU5hbWU+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8IS0tCisgICAgICAgIE1ha2UgdGhlIHN1cmVmaXJlIGV4ZWN1dGUgYWxsIHVuaXQtdGVzdHMKKyAgICAgIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICBOb3RpY2UgdGhlIEAgaW5zdGVhZCBvZiB0aGUgJCBhcyBwcmVmaXg/IFRoYXQncyBsYXRlIGV2YWx1YXRpb24uCisgICAgICAgICAgLS0+CisgICAgICAgICAgPGFyZ0xpbmU+QHtzdXJlZmlyZUFyZ0xpbmV9PC9hcmdMaW5lPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPCEtLQorICAgICAgICBNYWtlIHRoZSBmYWlsc2FmZSBleGVjdXRlIGFsbCBpbnRlZ3JhdGlvbi10ZXN0cworICAgICAgLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+aW50ZWdyYXRpb24tdGVzdDwvZ29hbD4KKyAgICAgICAgICAgICAgPGdvYWw+dmVyaWZ5PC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgTm90aWNlIHRoZSBAIGluc3RlYWQgb2YgdGhlICQgYXMgcHJlZml4PyBUaGF0J3MgbGF0ZSBldmFsdWF0aW9uLgorICAgICAgICAgIC0tPgorICAgICAgICAgIDxhcmdMaW5lPkB7ZmFpbHNhZmVBcmdMaW5lfTwvYXJnTGluZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDwhLS0KKyAgICAgICAgRW5zdXJlIHRoZSB0ZXN0IGNsYXNzZXMgYXJlIGFsc28gcGFja2FnZWQgaW50byBhIHRlc3QtamFyLgorICAgICAgICBXZSBuZWVkIHRoaXMgZm9yIGdlbmVyYXRpbmcgdGhlIEphdmE3IGFuZCBBbmRyb2lkIG1vZHVsZXMuCisgICAgICAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+dGVzdC1qYXI8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPCEtLSBNYWtlIHN1cmUgdGhlIERJU0NMQUlNRVIgY29udGFpbnMgdGhlIGluY3ViYXRvciB2ZXJzaW9uIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS41PC92ZXJzaW9uPjwhLS0kTk8tTVZOLU1BTi1WRVIkLS0+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+cHJvY2Vzcy1yZXNvdXJjZS1idW5kbGVzPC9pZD4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KKyAgICAgICAgICAgICAgICA8IS0tIFdpbGwgZ2VuZXJhdGUgTUVUQS1JTkYve0RFUEVOREVOQ0lFUyxMSUNFTlNFLE5PVElDRX0gLS0+CisgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGU6YXBhY2hlLWphci1yZXNvdXJjZS1idW5kbGU6MS40PC9yZXNvdXJjZUJ1bmRsZT4KKyAgICAgICAgICAgICAgICA8IS0tIFdpbGwgZ2VuZXJhdGUgTUVUQS1JTkYvRElTQ0xBSU1FUiAgLS0+CisgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGU6YXBhY2hlLWluY3ViYXRvci1kaXNjbGFpbWVyLXJlc291cmNlLWJ1bmRsZToxLjE8L3Jlc291cmNlQnVuZGxlPgorICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KKyAgICAgICAgICAgICAgPCEtLSBDb250ZW50IGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYXBwZW5kZWQgdG8gZ2VuZXJhdGVkIHJlc291cmNlcyAtLT4KKyAgICAgICAgICAgICAgPGFwcGVuZGVkUmVzb3VyY2VzRGlyZWN0b3J5PiR7cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXJ9PC9hcHBlbmRlZFJlc291cmNlc0RpcmVjdG9yeT4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDwhLS0gQ29uZmlndXJlIHRoZSBTaXRlIGdlbmVyYXRpb24gLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNpdGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8IS0tIGdldCBlcnJvcnMgd2l0aCBzaXRlOnNpdGUgdGFzayB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0ICgzLjYpIHZlcnNpb24gLS0+CisgICAgICAgIDx2ZXJzaW9uPjMuNDwvdmVyc2lvbj48IS0tJE5PLU1WTi1NQU4tVkVSJC0tPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8Z2VuZXJhdGVSZXBvcnRzPnRydWU8L2dlbmVyYXRlUmVwb3J0cz4KKyAgICAgICAgICA8Z2VuZXJhdGVTaXRlbWFwPnRydWU8L2dlbmVyYXRlU2l0ZW1hcD4KKyAgICAgICAgICA8cmVsYXRpdml6ZURlY29yYXRpb25MaW5rcz5mYWxzZTwvcmVsYXRpdml6ZURlY29yYXRpb25MaW5rcz4KKyAgICAgICAgICA8bG9jYWxlcz5lbjwvbG9jYWxlcz4KKyAgICAgICAgICA8aW5wdXRFbmNvZGluZz4ke3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmd9PC9pbnB1dEVuY29kaW5nPgorICAgICAgICAgIDxvdXRwdXRFbmNvZGluZz4ke3Byb2plY3QucmVwb3J0aW5nLm91dHB1dGVuY29kaW5nfTwvb3V0cHV0RW5jb2Rpbmc+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICA8IS0tIEFsbCBkZXBlbmRlbmNpZXMgbmVlZGVkIGJ5IHRoZSByZWZsb3cgc2tpbiAtLT4KKyAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmx0LnZlbHlraXMubWF2ZW4uc2tpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yZWZsb3ctdmVsb2NpdHktdG9vbHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KKyAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnZlbG9jaXR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmVsb2NpdHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjc8L3ZlcnNpb24+CisgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmRveGlhLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjY8L3ZlcnNpb24+CisgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgIDwhLS0gYWRkIHN1cHBvcnQgZm9yIHNjbS9naXQgc2l0ZSBkZXBsb3ltZW50IC0tPgorICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi53YWdvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXNjbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTI8L3ZlcnNpb24+CisgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5zY208L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zY20tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS45LjU8L3ZlcnNpb24+CisgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5zY208L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zY20tbWFuYWdlci1wbGV4dXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjkuNTwvdmVyc2lvbj4KKyAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNjbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNjbS1wcm92aWRlci1naXRleGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjkuNTwvdmVyc2lvbj4KKyAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgPCEtLSBBZGQgc3VwcG9ydCBmb3IgYXNjaWlkb2N0b3IgLS0+CisgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXNjaWlkb2N0b3I8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hc2NpaWRvY3Rvci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjUuNTwvdmVyc2lvbj4KKyAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanJ1Ynk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qcnVieS1jb21wbGV0ZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjkuMS4xMC4wPC92ZXJzaW9uPgorICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hc2NpaWRvY3RvcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzY2lpZG9jdG9yajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS41PC92ZXJzaW9uPgorICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hc2NpaWRvY3RvcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzY2lpZG9jdG9yai1kaWFncmFtPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS41LjQ8L3ZlcnNpb24+CisgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8IS0tCisgICAgICAgIE1ha2UgdGhlIG1hdmVuLXNpdGUtcGx1Z2luIHN0YWdlIHRoZSBvdXRwdXQgaW4gdGhlICJhc2Ytc2l0ZSIgYnJhbmNoCisgICAgICAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2NtLXB1Ymxpc2gtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPnNjbS1wdWJsaXNoPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5zaXRlLWRlcGxveTwvcGhhc2U+CisgICAgICAgICAgICA8IS0tIGRlcGxveSBzaXRlIHdpdGggbWF2ZW4tc2NtLXB1Ymxpc2gtcGx1Z2luIC0tPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5wdWJsaXNoLXNjbTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPCEtLSBtb25vLW1vZHVsZSBkb2Vzbid0IHJlcXVpcmUgc2l0ZTpzdGFnZSAtLT4KKyAgICAgICAgICAgICAgPGNvbnRlbnQ+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZTwvY29udGVudD4KKyAgICAgICAgICAgICAgPCEtLSBicmFuY2ggd2hlcmUgdG8gZGVwbG95IC0tPgorICAgICAgICAgICAgICA8c2NtQnJhbmNoPmFzZi1zaXRlPC9zY21CcmFuY2g+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8IS0tCisgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBtYXRjaCBKYXZhIDggc2lnbmF0dXJlcworICAgICAgLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YW5pbWFsLXNuaWZmZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjE1PC92ZXJzaW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNoZWNrLWpkay1zaWduYXR1cmVzPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXRlc3QtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam8uc2lnbmF0dXJlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YTE4PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPHJlcG9ydGluZz4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPmNvbS5idXNjaG1haXMuanFhc3Npc3RhbnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmpxYXNzaXN0YW50LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PnJlcG9ydDwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPCEtLSBHZW5lcmF0ZXMgYSBjaGFuZ2Vsb2cgcmVwb3J0IGZyb20gR0lUIGNvbW1pdHMgLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoYW5nZWxvZy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPCEtLSBBdXRvbWF0aWNhbGx5IGxpbmsgSmlyYSBpc3N1ZXMgLS0+CisgICAgICAgICAgPGlzc3VlTGlua1VybD5odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlLyVJU1NVRSU8L2lzc3VlTGlua1VybD4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDwhLS0gR2VuZXJhdGVzIGEgcmVwb3J0IHdpdGggdGhlIGRldGFpbHMgb2YgdGhlIHVuaXQtIGFuZCBpbnRlZ3JhdGlvbnRlc3RzIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1yZXBvcnQtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjIwPC92ZXJzaW9uPgorICAgICAgICA8cmVwb3J0U2V0cz4KKyAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgIDxyZXBvcnQ+cmVwb3J0LW9ubHk8L3JlcG9ydD4KKyAgICAgICAgICAgICAgPHJlcG9ydD5mYWlsc2FmZS1yZXBvcnQtb25seTwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPCEtLSBHZW5lcmF0ZXMgYSByZXBvcnQgd2l0aCB0aGUgdGVzdCBjb3ZlcmFnZXMgLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuamFjb2NvPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qYWNvY28tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjcuOTwvdmVyc2lvbj4KKyAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PnJlcG9ydDwvcmVwb3J0PgorICAgICAgICAgICAgICA8cmVwb3J0PnJlcG9ydC1pbnRlZ3JhdGlvbjwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPCEtLSBHZW5lcmF0ZXMgYSByZXBvcnQgd2l0aCB0aGUgU29uYXJRdWJlIGFuYWx5c2lzIHJlcG9ydHMgLS0+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuc29uYXItcGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjE8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPCEtLSBHZW5lcmF0ZSB0aGUgSmF2YURvYyBBUEkgZG9jdW1lbnRhdGlvbiAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMC4wLU0xPC92ZXJzaW9uPjwhLS0gd2FzIDIuMTAuNCAtLT4KKyAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgIDxpZD5ub24tYWdncmVnYXRlPC9pZD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PmphdmFkb2Mtbm8tZm9yazwvcmVwb3J0PgorICAgICAgICAgICAgICA8cmVwb3J0PnRlc3QtamF2YWRvYy1uby1mb3JrPC9yZXBvcnQ+CisgICAgICAgICAgICA8L3JlcG9ydHM+CisgICAgICAgICAgPC9yZXBvcnRTZXQ+CisgICAgICAgICAgPCEtLSBHZW5lcmF0ZSBhbiBhZ2dyZWdhdGUgcmVwb3J0IG9ubHkgaW4gdGhlIHJvb3QgLS0+CisgICAgICAgICAgPCEtLSBEaXNhYmxlZCB0aGlzIGFzIHRoaXMgcnVucyBiZWZvcmUgdGhlIGJ1aWxkIG9mIHRoZSBtb2R1bGVzIGFuZCB0aGUgamF2YTcgYW5kIGFuZHJvaWQgbW9kdWxlcyBqYXZhZG9jcworICAgICAgICAgIHJlcXVpcmUgdGhlIGphdmE4IHZlcnNpb25zIGJlaW5nIGJ1aWx0IGZpcnN0IC0tPgorICAgICAgICAgIDwhLS1yZXBvcnRTZXQ+CisgICAgICAgICAgICA8aWQ+YWdncmVnYXRlPC9pZD4KKyAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PmFnZ3JlZ2F0ZTwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0LS0+CisgICAgICAgIDwvcmVwb3J0U2V0cz4KKyAgICAgICAgPCEtLSBobW0uLi4gY29uZmlndXJhdGlvbiBpcyBoYXZpbmcgbm8gZWZmZWN0IGZvciAnbXZuIGphdmFkb2M6YWdncmVnYXRlJworICAgICAgICAgIG9ubHkgZm9yICdtdm4gc2l0ZScKKyAgICAgICAgIC0tPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8d2luZG93dGl0bGU+JHtwcm9qZWN0Lm5hbWV9IChpbmN1YmF0aW5nKSB2JHtwcm9qZWN0LnZlcnNpb259IEFQSTwvd2luZG93dGl0bGU+CisgICAgICAgICAgPGRvY3RpdGxlPiR7cHJvamVjdC5uYW1lfSAoaW5jdWJhdGluZykgdiR7cHJvamVjdC52ZXJzaW9ufSBBUEk8L2RvY3RpdGxlPgorICAgICAgICAgIDxvdmVydmlldz4ke2Jhc2VkaXJ9L2VkZ2VudF9vdmVydmlldy5odG1sPC9vdmVydmlldz4KKyAgICAgICAgICA8IS0tIEV4Y2x1ZGUKKyAgICAgICAgICAgIG8uYS5lLnRlc3QuKiAgICAgICAgICAgICAgIGRvbid0IHdhbnQgc2hvd2luZyB1cCBpbiBPdGhlciBQYWNrYWdlcworICAgICAgICAgICAgby5hLmUub3BsZXQuY29yZS5tYmVhbnMgICAgdGhlcmUgYXJlIG5vIGNsYXNzZXMgYW5kIGl0IHNob3dzIHVwIGluIExvdy1MZXZlbCBQYWNrYWdlcworICAgICAgICAgICAgby5hLmUuY29ubmVjdG9ycy4qLnJ1bnRpbWUgaXQncyBpbXBsIG5vdCBBUEkKKyAgICAgICAgICAgICAgICBzaWdoLCBtYXZlbiBzZWVtcyB0byByZWFsbHkgb25seSBzdXBwb3J0ICcqJyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZC4KKyAgICAgICAgICAgICAgICAod2hhdCBhYm91dCAnKionID8pCisgICAgICAgICAgICAgICAgV2hlbiBpbiB0aGUgbWlkZGxlIGxpa2UgYWJvdmUgaXQncyBjYXVzaW5nIGFuIGVtcHR5LCBoZW5jZSBvbWl0dGVkLAorICAgICAgICAgICAgICAgIENvbm5lY3RvcnMgZ3JvdXAgKGl0J3MgbGlrZSBleGNsdWRpbmcgby5hLmUuY29ubmVjdG9ycy4qKQorICAgICAgICAgICAgICAgIGFuZCBvLmUuZS5ydW50aW1lLiogaXMgYmVpbmcgb21pdHRlZCBmcm9tIE90aGVyIFBhY2thZ2VzCisgICAgICAgICAgICAgICAgKGl0J3MgbGlrZSBleGNsdWRpbmcgKi5ydW50aW1lKS4KKyAgICAgICAgICAgICAgICBTbyB3ZSBoYXZlIHRvIGVudW1lcmF0ZSBlYWNoIGNvbm5lY3RvciBydW50aW1lIGV4Y2x1c2lvbi4KKyAgICAgICAgICAgIG8uYS5lLmphdmF4LndlYnNvY2tldCAgICAgIGl0J3MgaW1wbCBub3QgQVBJCisgICAgICAgICAgICBvLmEuZS5jb25zb2xlLiogICAgICAgICAgICBpdCdzIGltcGwgbm90IEFQSQorICAgICAgICAgICAgby5hLmUuYW5hbHl0aWNzLm1hdGgzLnV0aWxzLkphdmE3SGVscGVyICAgaXQncyBpbXBsIG5vdCBBUEkKKyAgICAgICAgICAgIG8uYS5lLmFuYWx5dGljcy5zZW5zb3JzLnV0aWxzLkphdmE3SGVscGVyIGl0J3MgaW1wbCBub3QgQVBJCisgICAgICAgICAgIC0tPgorICAgICAgICAgIDxleGNsdWRlUGFja2FnZU5hbWVzPgorICAgICAgICAgICAgb3JnLmFwYWNoZS5lZGdlbnQudGVzdC4qOm9yZy5hcGFjaGUuZWRnZW50Lm9wbGV0LmNvcmUubWJlYW5zOm9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuKjpvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMudXRpbHMuSmF2YTdIZWxwZXI6b3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMudXRpbHMuSmF2YTdIZWxwZXI6Ki5jb25uZWN0b3JzLmNvbW1hbmQucnVudGltZToqLmNvbm5lY3RvcnMuZmlsZS5ydW50aW1lOiouY29ubmVjdG9ycy5odHRwLnJ1bnRpbWU6Ki5jb25uZWN0b3JzLmlvdHAucnVudGltZToqLmNvbm5lY3RvcnMuamRiYy5ydW50aW1lOiouY29ubmVjdG9ycy5rYWZrYS5ydW50aW1lOiouY29ubmVjdG9ycy5tcXR0LnJ1bnRpbWU6Ki5jb25uZWN0b3JzLnJ1bnRpbWU6Ki5jb25uZWN0b3JzLndzY2xpZW50LmphdmF4LndlYnNvY2tldC5ydW50aW1lOm9yZy5hcGFjaGUuZWRnZW50LmphdmF4LndlYnNvY2tldAorICAgICAgICAgIDwvZXhjbHVkZVBhY2thZ2VOYW1lcz4KKyAgICAgICAgICA8Z3JvdXBzPgorICAgICAgICAgICAgPGdyb3VwPgorICAgICAgICAgICAgICA8dGl0bGU+RWRnZW50IFByb3ZpZGVyczwvdGl0bGU+CisgICAgICAgICAgICAgIDxwYWNrYWdlcz5vcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuKjwvcGFja2FnZXM+CisgICAgICAgICAgICA8L2dyb3VwPgorICAgICAgICAgICAgPGdyb3VwPgorICAgICAgICAgICAgICA8dGl0bGU+RWRnZW50IEFQSTwvdGl0bGU+CisgICAgICAgICAgICAgIDxwYWNrYWdlcz4KKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmVkZ2VudC5leGVjdXRpb246b3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb246b3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3k6b3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuanNvbjpvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5tYmVhbnM6b3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kucGx1bWJpbmc6b3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuc2VydmljZXM6b3JnLmFwYWNoZS5lZGdlbnQuZXhlY3V0aW9uLioKKyAgICAgICAgICAgICAgPC9wYWNrYWdlcz4KKyAgICAgICAgICAgIDwvZ3JvdXA+CisgICAgICAgICAgICA8Z3JvdXA+CisgICAgICAgICAgICAgIDx0aXRsZT5FZGdlbnQgQW5hbHl0aWNzPC90aXRsZT4KKyAgICAgICAgICAgICAgPHBhY2thZ2VzPm9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy4qPC9wYWNrYWdlcz4KKyAgICAgICAgICAgIDwvZ3JvdXA+CisgICAgICAgICAgICA8Z3JvdXA+CisgICAgICAgICAgICAgIDx0aXRsZT5FZGdlbnQgQ29ubmVjdG9yczwvdGl0bGU+CisgICAgICAgICAgICAgIDxwYWNrYWdlcz5vcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLio8L3BhY2thZ2VzPgorICAgICAgICAgICAgPC9ncm91cD4KKyAgICAgICAgICAgIDxncm91cD4KKyAgICAgICAgICAgICAgPHRpdGxlPkVkZ2VudCBVdGlsaXRpZXM8L3RpdGxlPgorICAgICAgICAgICAgICA8cGFja2FnZXM+CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5lZGdlbnQubWV0cmljczpvcmcuYXBhY2hlLmVkZ2VudC5tZXRyaWNzLio6b3JnLmFwYWNoZS5lZGdlbnQuc3RyZWFtc2NvcGU6b3JnLmFwYWNoZS5lZGdlbnQuc3RyZWFtc2NvcGUuKgorICAgICAgICAgICAgICA8L3BhY2thZ2VzPgorICAgICAgICAgICAgPC9ncm91cD4KKyAgICAgICAgICAgIDxncm91cD4KKyAgICAgICAgICAgICAgPHRpdGxlPkVkZ2VudCBUZXN0ZXI8L3RpdGxlPgorICAgICAgICAgICAgICA8cGFja2FnZXM+b3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kudGVzdGVyOm9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LnRlc3Rlci4qPC9wYWNrYWdlcz4KKyAgICAgICAgICAgIDwvZ3JvdXA+CisgICAgICAgICAgICA8Z3JvdXA+CisgICAgICAgICAgICAgIDx0aXRsZT5FZGdlbnQgTG93LUxldmVsIEFQSTwvdGl0bGU+CisgICAgICAgICAgICAgIDxwYWNrYWdlcz4KKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmVkZ2VudC5ncmFwaDpvcmcuYXBhY2hlLmVkZ2VudC5ncmFwaC4qOm9yZy5hcGFjaGUuZWRnZW50Lm9wbGV0Om9yZy5hcGFjaGUuZWRnZW50Lm9wbGV0Lio6b3JnLmFwYWNoZS5lZGdlbnQud2luZG93CisgICAgICAgICAgICAgIDwvcGFja2FnZXM+CisgICAgICAgICAgICA8L2dyb3VwPgorICAgICAgICAgICAgPGdyb3VwPgorICAgICAgICAgICAgICA8dGl0bGU+RWRnZW50IFNQSTwvdGl0bGU+CisgICAgICAgICAgICAgIDxwYWNrYWdlcz5vcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5zcGk6b3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuc3BpLio8L3BhY2thZ2VzPgorICAgICAgICAgICAgPC9ncm91cD4KKyAgICAgICAgICAgIDwhLS0gZXZlcnl0aGluZyBlbHNlIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYSAiT3RoZXIgUGFja2FnZXMiIGdyb3VwIC0tPgorICAgICAgICAgIDwvZ3JvdXBzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvcmVwb3J0aW5nPgorCisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDwhLS0gY29uZmlndXJlIC1QZGlzdHJpYnV0aW9uIHRvIGluY2x1ZGUgb3VyIGJpbmFyeSBkaXN0cmlidXRpb24gcHJvamVjdHMuIC0tPgorICAgICAgPGlkPmRpc3RyaWJ1dGlvbjwvaWQ+CisgICAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5kaXN0cmlidXRpb248L21vZHVsZT4KKyAgICAgIDwvbW9kdWxlcz4KKyAgICA8L3Byb2ZpbGU+CisgICAgPHByb2ZpbGU+CisgICAgICA8IS0tIGNvbmZpZ3VyZSAtUGFwYWNoZS1yZWxlYXNlIHNvdXJjZSByZWxlYXNlIGJ1bmRsZSBwcm9jZXNzaW5nIC0tPgorICAgICAgPGlkPmFwYWNoZS1yZWxlYXNlPC9pZD4KKyAgICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5zb3VyY2UtcmVsZWFzZS1hc3NlbWJseTwvaWQ+CisgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgIDwhLS0gaGVhZHMgdXA6IGNvbWJpbmUuc2VsZiBpbiB0aGUgZm9sbG93aW5nIGlzIGhpZ2hsaWdodGVkCisgICAgICAgICAgICAgICAgICAgIGFzIGFuIGVycm9yIGluIEVjbGlwc2UncyB4bWwgZWRpdG9yIHZpZXcuCisgICAgICAgICAgICAgICAgICAgIEp1c3QgaWdub3JlIHRoYXQuCisgICAgICAgICAgICAgICAgICAgIFNlZSAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9NTkctNTQ1NCAgc2lnaC4KKyAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24gY29tYmluZS5zZWxmPSJvdmVycmlkZSI+CisgICAgICAgICAgICAgICAgICA8cnVuT25seUF0RXhlY3V0aW9uUm9vdD50cnVlPC9ydW5Pbmx5QXRFeGVjdXRpb25Sb290PgorICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgorICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibHkvc291cmNlLXJlbGVhc2UueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+Z251PC90YXJMb25nRmlsZU1vZGU+CisgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPmFwYWNoZS1lZGdlbnQtJHtwcm9qZWN0LnZlcnNpb259LWluY3ViYXRpbmc8L2ZpbmFsTmFtZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgPC9wcm9maWxlcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtzbGY0ai52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWV0cmljcy1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4xLjI8L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjEyPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWpkazE0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtzbGY0ai52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCisgIDxyZXBvc2l0b3JpZXM+CisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8aWQ+YXBhY2hlLXJlbGVhc2U8L2lkPgorICAgICAgPHVybD5odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlczwvdXJsPgorICAgICAgPHJlbGVhc2VzPgorICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgorICAgICAgPC9yZWxlYXNlcz4KKyAgICAgIDxzbmFwc2hvdHM+CisgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgorICAgICAgPC9zbmFwc2hvdHM+CisgICAgPC9yZXBvc2l0b3J5PgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmFwYWNoZS1zbmFwc2hvdHM8L2lkPgorICAgICAgPHVybD5odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9zbmFwc2hvdHM8L3VybD4KKyAgICAgIDxyZWxlYXNlcz4KKyAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+CisgICAgICA8L3JlbGVhc2VzPgorICAgICAgPHNuYXBzaG90cz4KKyAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KKyAgICAgIDwvc25hcHNob3RzPgorICAgIDwvcmVwb3NpdG9yeT4KKyAgPC9yZXBvc2l0b3JpZXM+CisKKyAgPHBsdWdpblJlcG9zaXRvcmllcz4KKyAgICA8cGx1Z2luUmVwb3NpdG9yeT4KKyAgICAgIDxpZD5hcGFjaGUtcGx1Z2lucy1yZWxlYXNlPC9pZD4KKyAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvcmVsZWFzZXM8L3VybD4KKyAgICAgIDxyZWxlYXNlcz4KKyAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KKyAgICAgIDwvcmVsZWFzZXM+CisgICAgICA8c25hcHNob3RzPgorICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KKyAgICAgIDwvc25hcHNob3RzPgorICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KKyAgICA8cGx1Z2luUmVwb3NpdG9yeT4KKyAgICAgIDxpZD5hcGFjaGUtcGx1Z2lucy1zbmFwc2hvdHM8L2lkPgorICAgICAgPHVybD5odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9zbmFwc2hvdHM8L3VybD4KKyAgICAgIDxyZWxlYXNlcz4KKyAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+CisgICAgICA8L3JlbGVhc2VzPgorICAgICAgPHNuYXBzaG90cz4KKyAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KKyAgICAgIDwvc25hcHNob3RzPgorICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KKyAgPC9wbHVnaW5SZXBvc2l0b3JpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Byb3ZpZGVycy8uY2xhc3NwYXRoIGIvcHJvdmlkZXJzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjdhMGQuLjAwMDAwMDAKLS0tIGEvcHJvdmlkZXJzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJkZXZlbG9wbWVudC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGV2ZWxvcG1lbnQvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRpcmVjdC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGlyZWN0L3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvYXBpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2V4dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9ydW50aW1lIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL3NwaSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5KVU5JVF9DT05UQUlORVIvNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii91dGlscyIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9jb25zb2xlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Byb3ZpZGVycy8uZ2l0aWdub3JlIGIvcHJvdmlkZXJzLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGZlNDQuLjAwMDAwMDAKLS0tIGEvcHJvdmlkZXJzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS9jbGFzc2VzLwotKiovdGVzdC5jbGFzc2VzLwotKiovY2xhc3Nlcy8KLSoqL3VuaXR0ZXN0cy8KLS9iaW4vCmRpZmYgLS1naXQgYS9wcm92aWRlcnMvLnByb2plY3QgYi9wcm92aWRlcnMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OTFiMTMuLjAwMDAwMDAKLS0tIGEvcHJvdmlkZXJzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+cHJvdmlkZXJzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Byb3ZpZGVycy9SRUFETUUubWQgYi9wcm92aWRlcnMvUkVBRE1FLm1kCmluZGV4IGQ1MTJkZjEuLmQ3YjhhYjMgMTAwNjQ0Ci0tLSBhL3Byb3ZpZGVycy9SRUFETUUubWQKKysrIGIvcHJvdmlkZXJzL1JFQURNRS5tZApAQCAtMSArMSwxOSBAQAorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KIGVtYmVkZGVkIGNvbnRhaW5zIGEgVG9wb2xvZ3lQcm92aWRlciB0aGF0IGRpcmVjdGx5IGJ1aWxkcyBhbiBleGVjdXRhYmxlIGdyYXBoLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Byb3ZpZGVycy9kZXZlbG9wbWVudC9idWlsZC5ncmFkbGUgYi9wcm92aWRlcnMvZGV2ZWxvcG1lbnQvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I5ODc5Li4wMDAwMDAwCi0tLSBhL3Byb3ZpZGVycy9kZXZlbG9wbWVudC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpwcm92aWRlcnM6ZGlyZWN0JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29uc29sZTpzZXJ2ZXInCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzp1dGlsczptZXRyaWNzJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6dXRpbHM6c3RyZWFtc2NvcGUnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpydW50aW1lOmpteGNvbnRyb2wnCi0KLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KLQotYWRkQ29tcGlsZVRlc3REZXBlbmRlbmNpZXMgJzphcGk6dG9wb2xvZ3knLCAnOnV0aWxzOnN0cmVhbXNjb3BlJwpkaWZmIC0tZ2l0IGEvcHJvdmlkZXJzL2RldmVsb3BtZW50L3BvbS54bWwgYi9wcm92aWRlcnMvZGV2ZWxvcG1lbnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTA5ZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvdmlkZXJzL2RldmVsb3BtZW50L3BvbS54bWwKQEAgLTAsMCArMSw4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVyczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kZXZlbG9wbWVudDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBQcm92aWRlcnM6IERldmVsb3BtZW50PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzLWRpcmVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbnNvbGUtc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtbWV0cmljczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLXN0cmVhbXNjb3BlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qbXhjb250cm9sPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLXN0cmVhbXNjb3BlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wcm92aWRlcnMvZGlyZWN0L2J1aWxkLmdyYWRsZSBiL3Byb3ZpZGVycy9kaXJlY3QvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTk0YThiLi4wMDAwMDAwCi0tLSBhL3Byb3ZpZGVycy9kaXJlY3QvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOnRvcG9sb2d5JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6c3BpOnRvcG9sb2d5JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6c3BpOmdyYXBoJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6cnVudGltZTphcHBzZXJ2aWNlJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6cnVudGltZTpldGlhbycKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOnJ1bnRpbWU6anNvbmNvbnRyb2wnCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0KLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ3Rlc3RDb21waWxlJywgJzp1dGlsczptZXRyaWNzJwotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQotCi1hZGRDb21waWxlVGVzdERlcGVuZGVuY2llcyAnOmFwaTp0b3BvbG9neScsICc6dXRpbHM6bWV0cmljcycsICc6cnVudGltZTphcHBzZXJ2aWNlJwpkaWZmIC0tZ2l0IGEvcHJvdmlkZXJzL2RpcmVjdC9wb20ueG1sIGIvcHJvdmlkZXJzL2RpcmVjdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTY3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9wcm92aWRlcnMvZGlyZWN0L3BvbS54bWwKQEAgLTAsMCArMSwxMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnM8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGlyZWN0PC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IFByb3ZpZGVyczogRGlyZWN0PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXRlc3QtYXBwc2VydmljZS1hcHBsaWNhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtcmVzb3VyY2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZGVzdEZpbGVOYW1lPnRlc3QtYXBwc2VydmljZS1hcHBsaWNhdGlvbnMuamFyPC9kZXN0RmlsZU5hbWU+CisgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWFwcHNlcnZpY2U8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWV0aWFvPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qc29uY29udHJvbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtbWV0cmljczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLW1ldHJpY3M8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJvdmlkZXJzL2RpcmVjdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvcHJvdmlkZXJzL2RpcmVjdC9EaXJlY3RKb2JUZXN0LmphdmEgYi9wcm92aWRlcnMvZGlyZWN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9wcm92aWRlcnMvZGlyZWN0L0RpcmVjdEpvYlRlc3QuamF2YQppbmRleCA4YjhhNjA1Li40NjE3YjkxIDEwMDY0NAotLS0gYS9wcm92aWRlcnMvZGlyZWN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9wcm92aWRlcnMvZGlyZWN0L0RpcmVjdEpvYlRlc3QuamF2YQorKysgYi9wcm92aWRlcnMvZGlyZWN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9wcm92aWRlcnMvZGlyZWN0L0RpcmVjdEpvYlRlc3QuamF2YQpAQCAtMzcsNyArMzcsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50Lm9wbGV0LmNvcmUuUGVyaW9kaWNTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQub3BsZXQuY29yZS5QaXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudGVzdC50b3BvbG9neS5Ub3BvbG9neUFic3RyYWN0VGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvcHJvdmlkZXJzL2RpcmVjdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvcHJvdmlkZXJzL2RpcmVjdC9EaXJlY3RUb3BvbG9neVRlc3RCYXNlLmphdmEgYi9wcm92aWRlcnMvZGlyZWN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9wcm92aWRlcnMvZGlyZWN0L0RpcmVjdFRvcG9sb2d5VGVzdEJhc2UuamF2YQppbmRleCBiZWY3NGYwLi5mODdiNTYzIDEwMDY0NAotLS0gYS9wcm92aWRlcnMvZGlyZWN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9wcm92aWRlcnMvZGlyZWN0L0RpcmVjdFRvcG9sb2d5VGVzdEJhc2UuamF2YQorKysgYi9wcm92aWRlcnMvZGlyZWN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9wcm92aWRlcnMvZGlyZWN0L0RpcmVjdFRvcG9sb2d5VGVzdEJhc2UuamF2YQpAQCAtMSwzICsxLDIxIEBACisvKgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQudGVzdC5wcm92aWRlcnMuZGlyZWN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZXhlY3V0aW9uLkpvYjsKZGlmZiAtLWdpdCBhL3Byb3ZpZGVycy9kaXJlY3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3Byb3ZpZGVycy9kaXJlY3QvYXBwc2VydmljZS9BcHBTZXJ2aWNlVGVzdC5qYXZhIGIvcHJvdmlkZXJzL2RpcmVjdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvcHJvdmlkZXJzL2RpcmVjdC9hcHBzZXJ2aWNlL0FwcFNlcnZpY2VJVC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHByb3ZpZGVycy9kaXJlY3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3Byb3ZpZGVycy9kaXJlY3QvYXBwc2VydmljZS9BcHBTZXJ2aWNlVGVzdC5qYXZhCnJlbmFtZSB0byBwcm92aWRlcnMvZGlyZWN0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9wcm92aWRlcnMvZGlyZWN0L2FwcHNlcnZpY2UvQXBwU2VydmljZUlULmphdmEKaW5kZXggOGM4OGJlZi4uM2NiZTUwNSAxMDA2NDQKLS0tIGEvcHJvdmlkZXJzL2RpcmVjdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvcHJvdmlkZXJzL2RpcmVjdC9hcHBzZXJ2aWNlL0FwcFNlcnZpY2VUZXN0LmphdmEKKysrIGIvcHJvdmlkZXJzL2RpcmVjdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvcHJvdmlkZXJzL2RpcmVjdC9hcHBzZXJ2aWNlL0FwcFNlcnZpY2VJVC5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuc2VydmljZXMuQXBwbGljYXRpb25TZXJ2aWNlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1wdWJsaWMgY2xhc3MgQXBwU2VydmljZVRlc3QgeworcHVibGljIGNsYXNzIEFwcFNlcnZpY2VJVCB7CiAgICAgCiAgICAgCiAgICAgQFRlc3QKQEAgLTY1LDI0ICs2NSwzMyBAQAogICAgICAgICAKICAgICAgICAgYXBwU2VydmljZS5yZWdpc3RlclRvcG9sb2d5KCIiLCAodCxjKSAtPiB0LnN0cmluZ3MoImEiKSk7ICAgICAgCiAgICAgfQotICAgIAorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJKYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRGlyZWN0UHJvdmlkZXIgZGlyZWN0ID0gbmV3IERpcmVjdFByb3ZpZGVyKCk7CiAgICAgICAgIEFwcGxpY2F0aW9uU2VydmljZSBhcHBTZXJ2aWNlID0gQXBwU2VydmljZS5jcmVhdGVBbmRSZWdpc3RlcihkaXJlY3QsIGRpcmVjdCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcWQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImVkZ2VudC50ZXN0LnJvb3QuZGlyIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocWQpOwotICAgICAgICBGaWxlIHRlc3RBcHBzSmFyID0gbmV3IEZpbGUocWQsICJhcGkvdG9wb2xvZ3kvYnVpbGQvbGliL3Rlc3QvZWRnZW50LmFwaS50b3BvbG9neS5BUFBTLlRFU1QuamFyIik7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbnMgaGF2ZW4ndCBiZWVuIGF2YWlsYWJsZSBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIGphci4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFwcFNlcnZpY2UuZ2V0QXBwbGljYXRpb25OYW1lcygpLnNpemUoKSk7CisKKyAgICAgICAgRmlsZSB0ZXN0QXBwc0phciA9IGdldFNlcnZlckphcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RBcHBzSmFyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0QXBwc0phci5leGlzdHMoKSk7Ci0gICAgICAgIAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzaW5nIHNlcnZlciBqYXIgYXQ6ICIgKyB0ZXN0QXBwc0phci50b1N0cmluZygpKTsKKwogICAgICAgICBVUkwgdGVzdEFwcHNKYXJVUkwgPSB0ZXN0QXBwc0phci50b1VSSSgpLnRvVVJMKCk7CiAKICAgICAgICAgYXBwU2VydmljZS5yZWdpc3Rlckphcih0ZXN0QXBwc0phclVSTC50b0V4dGVybmFsRm9ybSgpLCBudWxsKTsKLSAgICAgICAgCisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGFwcFNlcnZpY2UuZ2V0QXBwbGljYXRpb25OYW1lcygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGFwcFNlcnZpY2UuZ2V0QXBwbGljYXRpb25OYW1lcygpLnNpemUoKSk7CiAgICAgICAgIGFzc2VydFRydWUoYXBwU2VydmljZS5nZXRBcHBsaWNhdGlvbk5hbWVzKCkuY29udGFpbnMoIkZpcnN0SmFyQXBwIikpOwogICAgICAgICBhc3NlcnRUcnVlKGFwcFNlcnZpY2UuZ2V0QXBwbGljYXRpb25OYW1lcygpLmNvbnRhaW5zKCJTZWNvbmRKYXJBcHAiKSk7CiAgICAgICAgIGFzc2VydFRydWUoYXBwU2VydmljZS5nZXRBcHBsaWNhdGlvbk5hbWVzKCkuY29udGFpbnMoIlRoaXJkSmFyQXBwIikpOyAgCiAgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIGdldFNlcnZlckphcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvdGVzdC1hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy5qYXIiKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3Byb3ZpZGVycy9pb3QvLmNsYXNzcGF0aCBiL3Byb3ZpZGVycy9pb3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzOWQzOC4uMDAwMDAwMAotLS0gYS9wcm92aWRlcnMvaW90Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkpVTklUX0NPTlRBSU5FUi80Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2Nvbm5lY3RvcnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvcHJvdmlkZXJzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2FwaSIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9leHQiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvc3BpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL3J1bnRpbWUiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvYXBwcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wcm92aWRlcnMvaW90Ly5naXRpZ25vcmUgYi9wcm92aWRlcnMvaW90Ly5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlM2MxNzIuLjAwMDAwMDAKLS0tIGEvcHJvdmlkZXJzL2lvdC8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotL2Jpbi8KZGlmZiAtLWdpdCBhL3Byb3ZpZGVycy9pb3QvLnByb2plY3QgYi9wcm92aWRlcnMvaW90Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDhiMmIzLi4wMDAwMDAwCi0tLSBhL3Byb3ZpZGVycy9pb3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5wcm92aWRlcl9pb3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcHJvdmlkZXJzL2lvdC9idWlsZC5ncmFkbGUgYi9wcm92aWRlcnMvaW90L2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1NDhhYy4uMDAwMDAwMAotLS0gYS9wcm92aWRlcnMvaW90L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOnByb3ZpZGVyczpkaXJlY3QnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpydW50aW1lOmpzb25jb250cm9sJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6cnVudGltZTphcHBzZXJ2aWNlJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczppb3QnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOnB1YnN1YicKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwcHM6aW90JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBwczpydW50aW1lJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JwpkaWZmIC0tZ2l0IGEvcHJvdmlkZXJzL2lvdC9wb20ueG1sIGIvcHJvdmlkZXJzL2lvdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NjhmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wcm92aWRlcnMvaW90L3BvbS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVyczwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1pb3Q8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogUHJvdmlkZXJzOiBJb1Q8L25hbWU+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWpzb25jb250cm9sPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1hcHBzZXJ2aWNlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtY29ubmVjdG9ycy1pb3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25uZWN0b3JzLXB1YnN1YjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBwcy1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcHJvdmlkZXJzL2lvdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Byb3ZpZGVycy9pb3QvSW90UHJvdmlkZXIuamF2YSBiL3Byb3ZpZGVycy9pb3Qvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9wcm92aWRlcnMvaW90L0lvdFByb3ZpZGVyLmphdmEKaW5kZXggNGViZGNjYS4uNmYzMDE3ZCAxMDA2NDQKLS0tIGEvcHJvdmlkZXJzL2lvdC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Byb3ZpZGVycy9pb3QvSW90UHJvdmlkZXIuamF2YQorKysgYi9wcm92aWRlcnMvaW90L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvcHJvdmlkZXJzL2lvdC9Jb3RQcm92aWRlci5qYXZhCkBAIC0xMzEsNyArMTMxLDcgQEAKICAqIGNsYXNzIE15QXBwIGltcGxlbWVudHMgVG9wb2xvZ3lCdWlsZGVyIHsgIC8vIGJlIGxvYWRhYmxlIGJ5IHJlZ2lzdGVySmFyKCkKICAqICAgJiM2NDtPdmVycmlkZQogICogICBwdWJsaWMgQmlDb25zdW1lciZsdDtUb3BvbG9neSB0LCBKc29uQ29uZmlnIGMmZ3Q7IGdldEJ1aWxkZXIoKSB7Ci0gKiAgICAgcmV0dXJuICh0LCBjKSAtPiBidWlsZFRvcG9sb2d5KElvdERldmljZVB1YlN1Yi5hZGRJb3REZXZpY2UodCksIGMpOworICogICAgIHJldHVybiAodCwgYykgLSZndDsgYnVpbGRUb3BvbG9neShJb3REZXZpY2VQdWJTdWIuYWRkSW90RGV2aWNlKHQpLCBjKTsKICAqICAgfQogICogICBwcml2YXRlIHZvaWQgYnVpbGRUb3BvbG9neShJb3REZXZpY2UgaW90RGV2aWNlLCBKc29uQ29uZmlnIGMpIHsKICAqICAgICBUb3BvbG9neSB0ID0gaW90RGV2aWNlLmdldFRvcG9sb2d5KCk7CmRpZmYgLS1naXQgYS9wcm92aWRlcnMvcG9tLnhtbCBiL3Byb3ZpZGVycy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOGQ5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9wcm92aWRlcnMvcG9tLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcHJvdmlkZXJzPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IFByb3ZpZGVyczwvbmFtZT4KKworICA8bW9kdWxlcz4KKyAgICA8bW9kdWxlPmRldmVsb3BtZW50PC9tb2R1bGU+CisgICAgPG1vZHVsZT5kaXJlY3Q8L21vZHVsZT4KKyAgICA8bW9kdWxlPmlvdDwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvLmNsYXNzcGF0aCBiL3J1bnRpbWUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3NGE2YS4uMDAwMDAwMAotLS0gYS9ydW50aW1lLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJhcHBzZXJ2aWNlL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqb2JyZWdpc3RyeS9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iam9icmVnaXN0cnkvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV0aWFvL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJldGlhby9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iam14Y29udHJvbC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iam14Y29udHJvbC9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ianNvbmNvbnRyb2wvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Impzb25jb250cm9sL3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuSlVOSVRfQ09OVEFJTkVSLzQiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvYXBpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2V4dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9zcGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcnVudGltZS8uZ2l0aWdub3JlIGIvcnVudGltZS8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhmZTQ0Li4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotL2NsYXNzZXMvCi0qKi90ZXN0LmNsYXNzZXMvCi0qKi9jbGFzc2VzLwotKiovdW5pdHRlc3RzLwotL2Jpbi8KZGlmZiAtLWdpdCBhL3J1bnRpbWUvLnByb2plY3QgYi9ydW50aW1lLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWMwMDg5Li4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5ydW50aW1lPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYXBwc2VydmljZS9idWlsZC5ncmFkbGUgYi9ydW50aW1lL2FwcHNlcnZpY2UvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBkNGMxLi4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvYXBwc2VydmljZS9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6ZXhlY3V0aW9uJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOnRvcG9sb2d5JwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19CmRpZmYgLS1naXQgYS9ydW50aW1lL2FwcHNlcnZpY2UvcG9tLnhtbCBiL3J1bnRpbWUvYXBwc2VydmljZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDRkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ydW50aW1lL2FwcHNlcnZpY2UvcG9tLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtYXBwc2VydmljZTwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBSdW50aW1lOiBBcHBTZXJ2aWNlPC9uYW1lPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZXhlY3V0aW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLSBKdXN0IG5lZWRlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2NoZWR1bGVkIGJlZm9yZSB0aGlzIG1vZHVsZSBpbiB0aGUgcmVhY3RvciAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXRlc3QtYXBwc2VydmljZS1hcHBsaWNhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ydW50aW1lL2V0aWFvL2J1aWxkLmdyYWRsZSBiL3J1bnRpbWUvZXRpYW8vYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTE1M2MyLi4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvZXRpYW8vYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOmV4ZWN1dGlvbicKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTpncmFwaCcKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOnNwaTpncmFwaCcKLSAgYWRkVGFyZ2V0RGlyQ29yZUV4dEphckRlcGVuZGVuY2llcyAnY29tcGlsZScKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQotCi1hZGRDb21waWxlVGVzdERlcGVuZGVuY2llcyAnOmFwaTpncmFwaCcKZGlmZiAtLWdpdCBhL3J1bnRpbWUvZXRpYW8vcG9tLnhtbCBiL3J1bnRpbWUvZXRpYW8vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFhMmFmCi0tLSAvZGV2L251bGwKKysrIGIvcnVudGltZS9ldGlhby9wb20ueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1ldGlhbzwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBSdW50aW1lOiBFdGlhbzwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1leGVjdXRpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGktZ3JhcGg8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcnVudGltZS9ldGlhby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3J1bnRpbWUvZXRpYW8vRXhlY3V0YWJsZS5qYXZhIGIvcnVudGltZS9ldGlhby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3J1bnRpbWUvZXRpYW8vRXhlY3V0YWJsZS5qYXZhCmluZGV4IDJkM2VlZmQuLjQ2YzdkZTAgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvZXRpYW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9ydW50aW1lL2V0aWFvL0V4ZWN1dGFibGUuamF2YQorKysgYi9ydW50aW1lL2V0aWFvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvcnVudGltZS9ldGlhby9FeGVjdXRhYmxlLmphdmEKQEAgLTIwNiw2ICsyMDYsMTYgQEAKICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJTY2hlZHVsZXIgY291bGQgbm90IGZpbmlzaCB7fSB0YXNrcyIsIHVuZmluaXNoZWQuc2l6ZSgpKTsKICAgICAgICAgfQogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFRpbWVvdXRWYWx1ZShsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXRzKSB7CisgICAgICAgIC8vIHRyeSB0byBwcm90ZWN0IHRoZSB0ZXN0cyBmcm9tIHRpbWluZyBvdXQgcHJlbWF0dXJlbHkKKyAgICAgICAgLy8gaW4gdGhlIGZhY2Ugb2Ygb3ZlcmxvYWRlZC9zbG93IGJ1aWxkL3Rlc3Qgc2VydmVycy4KKyAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbigiZWRnZW50LmJ1aWxkLmNpIikpIHsKKyAgICAgICAgICAgIC8vIGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIGJhc2UgdGhlIGRlY2lzaW9uIG9mIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRpbWVvdXQgYW5kL29yIHVuaXRzCisgICAgICAgICAgICByZXR1cm4gdGltZW91dCAqIDI7IC8vIHRyeSB0byBtaW5pbWl6ZQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aW1lb3V0OworICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnZva2VBY3Rpb24oQ29uc3VtZXI8SW52b2NhdGlvbjw/LCA/LCA/Pj4gYWN0aW9uKSB7CiAgICAgICAgIEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2U8Qm9vbGVhbj4gY29tcGxldGVyID0gbmV3IEV4ZWN1dG9yQ29tcGxldGlvblNlcnZpY2U8Pihjb250cm9sU2NoZWR1bGVyKTsKQEAgLTIxNiwxMyArMjI2LDE4IEBACiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogCisgICAgICAgIGxvbmcgZ2V0RnV0dXJlVGltZW91dCA9IDEwOworICAgICAgICBUaW1lVW5pdCBnZXRGdXR1cmVUaW1lb3V0VW5pdHMgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgICAgICBnZXRGdXR1cmVUaW1lb3V0ID0gZ2V0VGltZW91dFZhbHVlKGdldEZ1dHVyZVRpbWVvdXQsIGdldEZ1dHVyZVRpbWVvdXRVbml0cyk7CisgICAgICAgIAogICAgICAgICBpbnQgcmVtYWluaW5nVGFza3MgPSBpbnZvY2F0aW9ucy5zaXplKCk7CiAgICAgICAgIHdoaWxlIChyZW1haW5pbmdUYXNrcyA+IDApIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRnV0dXJlPEJvb2xlYW4+IGNvbXBsZXRlZCA9IGNvbXBsZXRlci5wb2xsKDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgICAgICBGdXR1cmU8Qm9vbGVhbj4gY29tcGxldGVkID0gY29tcGxldGVyLnBvbGwoZ2V0RnV0dXJlVGltZW91dCwgZ2V0RnV0dXJlVGltZW91dFVuaXRzKTsKICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBkdXJpbmcgY2xvc2UgbG9nIGV4Y2VwdGlvbiBhbmQgd2FpdCBvbiB0aGUgbmV4dCB0YXNrIHRvIGNvbXBsZXRlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5ldyBUaW1lb3V0RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuZXcgVGltZW91dEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlZCVzIHRpbWVvdXQiLCBnZXRGdXR1cmVUaW1lb3V0LCBnZXRGdXR1cmVUaW1lb3V0VW5pdHMudG9TdHJpbmcoKSkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9ydW50aW1lL2V0aWFvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvcnVudGltZS9ldGlhby9UcmFja2luZ1NjaGVkdWxlZEV4ZWN1dG9yLmphdmEgYi9ydW50aW1lL2V0aWFvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvcnVudGltZS9ldGlhby9UcmFja2luZ1NjaGVkdWxlZEV4ZWN1dG9yLmphdmEKaW5kZXggYzRkYzQ0ZC4uZmVmNDEwNSAxMDA2NDQKLS0tIGEvcnVudGltZS9ldGlhby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3J1bnRpbWUvZXRpYW8vVHJhY2tpbmdTY2hlZHVsZWRFeGVjdXRvci5qYXZhCisrKyBiL3J1bnRpbWUvZXRpYW8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9ydW50aW1lL2V0aWFvL1RyYWNraW5nU2NoZWR1bGVkRXhlY3V0b3IuamF2YQpAQCAtMTE3LDExICsxMTcsMzIgQEAKIAogICAgIHByaXZhdGUgaW50IGNhbmNlbEFsbEFzeW5jVGFza3MoYm9vbGVhbiBtYXlJbnRlcnJ1cHRJZlJ1bm5pbmcpIHsKICAgICAgICAgaW50IG5vdENhbmNlbGVkID0gMDsKKyAgICAgICAgLy8gZm9sbG93IHRoZSBpdGVyYXRvciBhY2Nlc3MgcGF0dGVybiBkb2MnZCBieSBDb2xsZWN0aW9uczpzeW5jaHJvbml6ZWRTZXQoKQogICAgICAgICBzeW5jaHJvbml6ZWQgKGFzeW5jVGFza3MpIHsKLSAgICAgICAgICAgIGZvciAoUnVubmFibGVTY2hlZHVsZWRGdXR1cmU8Pz4gdGFzayA6IGFzeW5jVGFza3MpIHsKKyAgICAgICAgICAgIC8vIGhtbSBoYXZlIGdvdHRlbiBDTUVzIGhlcmUgd2l0aCB0ZXN0TXVsdGlUb3BvbG9neVBvbGxXaXRoRXJyb3IuCisgICAgICAgICAgICAvLyBUaGlzIHNlZW1zIHRvIGZvbGxvdyB0aGUgcmVxdWlyZWQgYWNjZXNzIHBhdHRlcm4gZm9yIHN5bmNocm9uaXplZCBjb2xsZWN0aW9uIGl0ZXJhdG9yLgorICAgICAgICAgICAgLy8gQnV0IG9idmlvdXNseSBzb21ldGhpbmcncyBhbWlzcy4gIFRoZXJlIHNlZW0gdG8gYmUgb25seSBhIGZldyBvdGhlcgorICAgICAgICAgICAgLy8gYXN5bmNUYXNrcyBtb2RpZmllcnM6CisgICAgICAgICAgICAvLyAgICB0cmFja1Rhc2soKSAtIGFkZAorICAgICAgICAgICAgLy8gICAgaGFzQWN0aXZlVGFza3MoKSAtIGl0ZXJhdGVzIHdoaWxlIHN5bmNocm9uaXplZCBhbmQgY2FuIHJlbW92ZQorICAgICAgICAgICAgLy8gICAgcmVtb3ZlVHJhY2soKSAtIHJlbW92ZQorICAgICAgICAgICAgLy8gSnVzdCB0byBtYWtlIHRoaW5ncyBpcm9uIGNsYWQsIHN5bmNoIHRoZSBhZGQgYW5kIHJlbW92ZSB0b28KKyAgICAgICAgICAgIC8vIGhtbS4uLiBnb3QgYW5vdGhlciBDTUUgZXZlbiBhZnRlciBtb2RzIHRvIHRoZSBhYm92ZS4KKyAgICAgICAgICAgIC8vICAgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgIC8vICAgYXQgamF2YS51dGlsLkhhc2hNYXAkSGFzaEl0ZXJhdG9yLm5leHROb2RlKEhhc2hNYXAuamF2YToxNDM3KQorICAgICAgICAgICAgLy8gICBhdCBqYXZhLnV0aWwuSGFzaE1hcCRLZXlJdGVyYXRvci5uZXh0KEhhc2hNYXAuamF2YToxNDYxKQorICAgICAgICAgICAgLy8gICBhdDogZm9yIChSdW5uYWJsZVNjaGVkdWxlZEZ1dHVyZTw/PiB0YXNrIDogYXN5bmNUYXNrcykKKy8vICAgICAgICAgICAgZm9yIChSdW5uYWJsZVNjaGVkdWxlZEZ1dHVyZTw/PiB0YXNrIDogYXN5bmNUYXNrcykgeworLy8gICAgICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbChtYXlJbnRlcnJ1cHRJZlJ1bm5pbmcpKQorLy8gICAgICAgICAgICAgICAgICAgIG5vdENhbmNlbGVkKys7CisvLyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEl0ZXJhdG9yPFJ1bm5hYmxlU2NoZWR1bGVkRnV0dXJlPD8+PiBpID0gYXN5bmNUYXNrcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUnVubmFibGVTY2hlZHVsZWRGdXR1cmU8Pz4gdGFzayA9IGkubmV4dCgpOwogICAgICAgICAgICAgICAgIGlmICghdGFzay5jYW5jZWwobWF5SW50ZXJydXB0SWZSdW5uaW5nKSkKICAgICAgICAgICAgICAgICAgICAgbm90Q2FuY2VsZWQrKzsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gcmVtb3ZlIHRhc2tzIHdoaWNoIGFyZSBkb25lCiAgICAgICAgICAgICBoYXNBY3RpdmVUYXNrcygpOwogICAgICAgICB9CkBAIC0xMzQsNyArMTU1LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIDxWPiBSdW5uYWJsZVNjaGVkdWxlZEZ1dHVyZTxWPiB0cmFja1Rhc2soUnVubmFibGVTY2hlZHVsZWRGdXR1cmU8Vj4gdGFzaykgewogICAgICAgICB0YXNrID0gbmV3IFRyYWNrZWRGdXR1cmU8Vj4odGFzayk7Ci0gICAgICAgIGFzeW5jVGFza3MuYWRkKHRhc2spOworICAgICAgICBzeW5jaHJvbml6ZWQoYXN5bmNUYXNrcykgeyBhc3luY1Rhc2tzLmFkZCh0YXNrKTsgfSAvLyBzZWUgY2FuY2VsQWxsQXN5bmNUYXNrcwogICAgICAgICByZXR1cm4gdGFzazsKICAgICB9CiAKQEAgLTIxNCw3ICsyMzUsNyBAQAogICAgICAgICAgKiB0aGUgc2NoZWR1bGVyIHNlZW1zIHRvIGhhdmUgbm8gd29yay4KICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVUcmFjaygpIHsKLSAgICAgICAgICAgIGFzeW5jVGFza3MucmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgc3luY2hyb25pemVkKGFzeW5jVGFza3MpIHsgYXN5bmNUYXNrcy5yZW1vdmUodGhpcyk7IH0gLy8gc2VlIGNhbmNlbEFsbEFzeW5jVGFza3MKIAogICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBjb21wbGV0ZXIgaWYgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgogICAgICAgICAgICAgLy8gbm8gYXN5bmNUYXNrcyAodXNlciB0YXNrcykgcGVuZGluZywgb3IgdGhlIGV4ZWN1dG9yJ3MgdGFzayAKZGlmZiAtLWdpdCBhL3J1bnRpbWUvam14Y29udHJvbC9idWlsZC5ncmFkbGUgYi9ydW50aW1lL2pteGNvbnRyb2wvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTVkZWQzLi4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvam14Y29udHJvbC9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6ZXhlY3V0aW9uJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOmZ1bmN0aW9uJwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19CmRpZmYgLS1naXQgYS9ydW50aW1lL2pteGNvbnRyb2wvcG9tLnhtbCBiL3J1bnRpbWUvam14Y29udHJvbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMThlODgKLS0tIC9kZXYvbnVsbAorKysgYi9ydW50aW1lL2pteGNvbnRyb2wvcG9tLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtam14Y29udHJvbDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBSdW50aW1lOiBKTVhDb250cm9sPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvam9icmVnaXN0cnkvYnVpbGQuZ3JhZGxlIGIvcnVudGltZS9qb2JyZWdpc3RyeS9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMGQ0YzEuLjAwMDAwMDAKLS0tIGEvcnVudGltZS9qb2JyZWdpc3RyeS9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6ZXhlY3V0aW9uJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOnRvcG9sb2d5JwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19CmRpZmYgLS1naXQgYS9ydW50aW1lL2pvYnJlZ2lzdHJ5L3BvbS54bWwgYi9ydW50aW1lL2pvYnJlZ2lzdHJ5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhMjJlZQotLS0gL2Rldi9udWxsCisrKyBiL3J1bnRpbWUvam9icmVnaXN0cnkvcG9tLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWUtam9icmVnaXN0cnk8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogUnVudGltZTogSm9iUmVnaXN0cnk8L25hbWU+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1leGVjdXRpb248L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ydW50aW1lL2pzb25jb250cm9sL2J1aWxkLmdyYWRsZSBiL3J1bnRpbWUvanNvbmNvbnRyb2wvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTVkZWQzLi4wMDAwMDAwCi0tLSBhL3J1bnRpbWUvanNvbmNvbnRyb2wvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOmV4ZWN1dGlvbicKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTpmdW5jdGlvbicKLSAgYWRkVGFyZ2V0RGlyQ29yZUV4dEphckRlcGVuZGVuY2llcyAnY29tcGlsZScKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvcnVudGltZS9qc29uY29udHJvbC9wb20ueG1sIGIvcnVudGltZS9qc29uY29udHJvbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2QzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9ydW50aW1lL2pzb25jb250cm9sL3BvbS54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lLWpzb25jb250cm9sPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IFJ1bnRpbWU6IEpTT05Db250cm9sPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1mdW5jdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvcG9tLnhtbCBiL3J1bnRpbWUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQyYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvcnVudGltZS9wb20ueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1ydW50aW1lPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IFJ1bnRpbWU8L25hbWU+CisKKyAgPG1vZHVsZXM+CisgICAgPG1vZHVsZT5hcHBzZXJ2aWNlPC9tb2R1bGU+CisgICAgPG1vZHVsZT5ldGlhbzwvbW9kdWxlPgorICAgIDxtb2R1bGU+am14Y29udHJvbDwvbW9kdWxlPgorICAgIDxtb2R1bGU+am9icmVnaXN0cnk8L21vZHVsZT4KKyAgICA8bW9kdWxlPmpzb25jb250cm9sPC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy8uY2xhc3NwYXRoIGIvc2FtcGxlcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTIyMzQ2Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImFwcHMvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbm5lY3RvcnMvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbnNvbGUvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9Im9yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yLyIga2luZD0ic3JjIiBwYXRoPSJzY2VuYXJpb3Mvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRvcG9sb2d5L3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ1dGlscy9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2FuYWx5dGljcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9hcGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvY29ubmVjdG9ycyIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9jb25zb2xlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2V4dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9wcm92aWRlcnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvc3BpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL3V0aWxzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkpVTklUX0NPTlRBSU5FUi80Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL3J1bnRpbWUiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvcHJvdmlkZXJfaW90Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2FwcHMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuLi9leHRlcm5hbEphcnMvamF2YTgvY29ubmVjdG9ycy9pb3RwL2V4dC93YXRzb24taW90LTAuMi4yLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4uL2V4dGVybmFsSmFycy9qYXZhOC9jb25uZWN0b3JzL2lvdHAvZXh0L29yZy5lY2xpcHNlLnBhaG8uY2xpZW50Lm1xdHR2My0xLjEuMC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy8uZ2l0aWdub3JlIGIvc2FtcGxlcy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhmZTQ0Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotL2NsYXNzZXMvCi0qKi90ZXN0LmNsYXNzZXMvCi0qKi9jbGFzc2VzLwotKiovdW5pdHRlc3RzLwotL2Jpbi8KZGlmZiAtLWdpdCBhL3NhbXBsZXMvLnByb2plY3QgYi9zYW1wbGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM4MTVlLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5zYW1wbGVzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUkVBRE1FLm1kIGIvc2FtcGxlcy9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWQ4ZmQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TYW1wbGVzIGZvciB0aGUgZW1iZWRkZWQgc3RyZWFtcyBBUEkuCmRpZmYgLS1naXQgYS9zYW1wbGVzL2FwcHMvYnVpbGQuZ3JhZGxlIGIvc2FtcGxlcy9hcHBzL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0ODA0Yi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2FwcHMvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICAvLyBOLkIuIGNvbW1vbiBkZXBlbmRlbmNpZXMgYXJlIHNldCBpbiByb290IGJ1aWxkLmdyYWRsZQotCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOm1xdHQnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOmZpbGUnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOnNlcmlhbCcKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFuYWx5dGljczptYXRoMycKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFuYWx5dGljczpzZW5zb3JzJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6c2FtcGxlczp1dGlscycKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL0Fic3RyYWN0QXBwbGljYXRpb24uamF2YSBiL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9BYnN0cmFjdEFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDk5ZGQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL0Fic3RyYWN0QXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25zb2xlLnNlcnZlci5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzLm1xdHQuQWJzdHJhY3RNcXR0QXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBBbiBBcHBsaWNhdGlvbiBiYXNlIGNsYXNzLgotICogPHA+Ci0gKiBBcHBsaWNhdGlvbiBpbnN0YW5jZXMgbmVlZCB0bzoKLSAqIDx1bD4KLSAqIDxsaT5kZWZpbmUgYW4gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayAjYnVpbGRUb3BvbG9neShUb3BvbG9neSl9PC9saT4KLSAqIDxsaT5jYWxsIHtAbGluayAjcnVuKCl9IHRvIGJ1aWxkIGFuZCBzdWJtaXQgdGhlIHRvcG9sb2d5IGZvciBleGVjdXRpb24uPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoZSBjbGFzcyBwcm92aWRlcyBzb21lIGNvbW1vbiBwcm9jZXNzaW5nIG5lZWRzOgotICogPHVsPgotICogPGxpPlN1cHBvcnQgZm9yIGFuIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24gZmlsZTwvbGk+Ci0gKiA8bGk+UHJvdmlkZXMgYSB7QGxpbmsgVG9wb2xvZ3lQcm92aWRlckZhY3Rvcnl9PC9saT4KLSAqIDxsaT5Qcm92aWRlcyBhIHtAbGluayBBcHBsaWNhdGlvblV0aWxpdGllc308L2xpPgotICogPC91bD4KLSAqIEBzZWUgQWJzdHJhY3RNcXR0QXBwbGljYXRpb24KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXBwbGljYXRpb24gewotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcHJvcHNQYXRoOwotICAgIHByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzOwotICAgIHByaXZhdGUgZmluYWwgQXBwbGljYXRpb25VdGlsaXRpZXMgYXBwbGljYXRpb25VdGlsaXRpZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFic3RyYWN0QXBwbGljYXRpb24uY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIFRvcG9sb2d5IHQ7Ci0gICAgCi0gICAgcHVibGljIEFic3RyYWN0QXBwbGljYXRpb24oU3RyaW5nIHByb3BzUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucHJvcHNQYXRoID0gcHJvcHNQYXRoOwotICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLmxvYWQoRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIobmV3IEZpbGUocHJvcHNQYXRoKS50b1BhdGgoKSkpOwotICAgICAgICBhcHBsaWNhdGlvblV0aWxpdGllcyA9IG5ldyBBcHBsaWNhdGlvblV0aWxpdGllcyhwcm9wcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhbmQgcnVuIHRoZSBhcHBsaWNhdGlvbidzIHRvcG9sb2d5LgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vIFRPRE8gbmVlZCB0byBzZXR1cCBsb2dnaW5nIHRvIHNxdWVsY2ggc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBydW50aW1lL2Nvbm5lY3RvcnMsIAotLy8gaW5jbHVkaW5nIHBhaG8gb3V0cHV0Ci0KLSAgICAgICAgVG9wb2xvZ3lQcm92aWRlckZhY3RvcnkgdHBGYWN0b3J5ID0gbmV3IFRvcG9sb2d5UHJvdmlkZXJGYWN0b3J5KHByb3BzKTsKLSAgICAgICAgCi0gICAgICAgIERpcmVjdFByb3ZpZGVyIHRwID0gdHBGYWN0b3J5Lm5ld1Byb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSB0b3BvbG9neSBmb3IgdGhlIGFwcGxpY2F0aW9uCi0gICAgICAgIHQgPSB0cC5uZXdUb3BvbG9neShjb25maWcoKS5nZXRQcm9wZXJ0eSgiYXBwbGljYXRpb24ubmFtZSIpKTsKLSAgICAgICAgCi0gICAgICAgIHByZUJ1aWxkVG9wb2xvZ3kodCk7Ci0gICAgICAgIAotICAgICAgICBidWlsZFRvcG9sb2d5KHQpOwotICAgICAgICAKLSAgICAgICAgLy8gUnVuIHRoZSB0b3BvbG9neQotICAgICAgICBIdHRwU2VydmVyIGh0dHBTZXJ2ZXIgPSB0cC5nZXRTZXJ2aWNlcygpLmdldFNlcnZpY2UoSHR0cFNlcnZlci5jbGFzcyk7Ci0gICAgICAgIGlmIChodHRwU2VydmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWRnZW50IENvbnNvbGUgVVJMIGZvciB0aGUgam9iOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaHR0cFNlcnZlci5nZXRDb25zb2xlVXJsKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRwLnN1Ym1pdCh0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhcHBsaWNhdGlvbidzIHJhdyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydGllcyBjb25maWcoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhcHBsaWNhdGlvbidzIAotICAgICAqIEByZXR1cm4gdGhlIGhlbHBlcgotICAgICAqLwotICAgIHB1YmxpYyBBcHBsaWNhdGlvblV0aWxpdGllcyB1dGlscygpIHsKLSAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uVXRpbGl0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgaG9vayBmb3IgYSBzdWJjbGFzcyB0byBkbyB0aGluZ3MgcHJpb3IgdG8gdGhlIGludm9jYXRpb24KLSAgICAgKiBvZiB7QGxpbmsgI2J1aWxkVG9wb2xvZ3koVG9wb2xvZ3kpfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLgotICAgICAqIEBwYXJhbSB0IHRoZSBhcHBsaWNhdGlvbidzIHRvcG9sb2d5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlQnVpbGRUb3BvbG9neShUb3BvbG9neSB0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQnVpbGQgdGhlIGFwcGxpY2F0aW9uJ3MgdG9wb2xvZ3kuCi0gICAgICogQHBhcmFtIHQgVG9wb2xvZ3kgdG8gYWRkIHRvCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgYnVpbGRUb3BvbG9neShUb3BvbG9neSB0KTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVSdW50aW1lRXJyb3IoU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nZ2VyLmVycm9yKCJBIHJ1bnRpbWUgZXJyb3Igb2NjdXJyZWQiLCBlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9BcHBsaWNhdGlvblV0aWxpdGllcy5qYXZhIGIvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL0FwcGxpY2F0aW9uVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTBjZWUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL0FwcGxpY2F0aW9uVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMuUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMuUmFuZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuZmlsZS5GaWxlU3RyZWFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmZpbGUuRmlsZVdyaXRlckN5Y2xlQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuZmlsZS5GaWxlV3JpdGVyRmx1c2hDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5maWxlLkZpbGVXcml0ZXJQb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5maWxlLkZpbGVXcml0ZXJSZXRlbnRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24uUHJlZGljYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLlN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci0KLS8qKgotICogU29tZSBnZW5lcmFsIHB1cnBvc2UgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBkcml2ZW4gdXRpbGl0aWVzLgotICogPHA+Ci0gKiBVdGlsaXRpZXMgaW5jbHVkZToKLSAqIDx1bD4KLSAqIDxsaT5HZXQgYSBwcm9wZXJ0eSBuYW1lIGZvciBhIHNlbnNvciBjb25maWd1cmF0aW9uIGl0ZW08L2xpPgotICogPGxpPkdldCBhIFJhbmdlIHZhbHVlIGZvciBhIHNlbnNvciByYW5nZSBpdGVtPC9saT4KLSAqIDxsaT5Mb2cgYSBzdHJlYW08L2xpPgotICogPGxpPkNvbmRpdGlvbmFsbHkgdHJhY2UgYSBzdHJlYW08L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVXRpbGl0aWVzIHsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgcHJvcHM7Ci0gICAgCi0gICAgcHVibGljIEFwcGxpY2F0aW9uVXRpbGl0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHsKLSAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvcGVydGllcyBjb25maWcoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVHJhY2UgYSBzdHJlYW0gdG8gU3lzdGVtLm91dCBpZiB0aGUgc2Vuc29yIGlkJ3MgImxhYmVsIiBoYXMgYmVlbiBjb25maWd1cmVkCi0gICAgICogdG8gZW5hYmxlIHRyYWNpbmcuCi0gICAgICogPHA+Ci0gICAgICogSWYgdHJhY2luZyBoYXMgbm90IGJlZW4gZW5hYmxlZCBpbiB0aGUgY29uZmlnLCB0aGUgdG9wb2xvZ3kgd2lsbCBub3QKLSAgICAgKiBiZSBhdWdtZW50ZWQgdG8gdHJhY2UgdGhlIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSA8VD4gVHVwbGUgdHlwZQotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIHN0cmVhbSB0byB0cmFjZQotICAgICAqIEBwYXJhbSBzZW5zb3JJZCB0aGUgc2Vuc29yIGlkCi0gICAgICogQHBhcmFtIGxhYmVsIHNvbWUgdW5pcXVlIGxhYmVsCi0gICAgICogQHJldHVybiB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIDxUPiBUU3RyZWFtPFQ+IHRyYWNlU3RyZWFtKFRTdHJlYW08VD4gc3RyZWFtLCBTdHJpbmcgc2Vuc29ySWQsIFN1cHBsaWVyPFN0cmluZz4gbGFiZWwpIHsKLSAgICAgICAgcmV0dXJuIHRyYWNlU3RyZWFtKHN0cmVhbSwgKCkgLT4gc2Vuc29ySWQrIi4iK2xhYmVsLmdldCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFjZSBhIHN0cmVhbSB0byBTeXN0ZW0ub3V0IGlmIHRoZSAibGFiZWwiIGhhcyBiZWVuIGNvbmZpZ3VyZWQKLSAgICAgKiB0byBlbmFibGUgdHJhY2luZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0cmFjaW5nIGhhcyBub3QgYmVlbiBlbmFibGVkIGluIHRoZSBjb25maWcsIHRoZSB0b3BvbG9neSB3aWxsIG5vdAotICAgICAqIGJlIGF1Z21lbnRlZCB0byB0cmFjZSB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4gVHVwbGUgdHlwZQotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIHN0cmVhbSB0byB0cmFjZQotICAgICAqIEBwYXJhbSBsYWJlbCBzb21lIHVuaXF1ZSBsYWJlbAotICAgICAqIEByZXR1cm4gdGhlIGlucHV0IHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyA8VD4gVFN0cmVhbTxUPiB0cmFjZVN0cmVhbShUU3RyZWFtPFQ+IHN0cmVhbSwgU3VwcGxpZXI8U3RyaW5nPiBsYWJlbCkgewotICAgICAgICBpZiAoaW5jbHVkZVRyYWNlU3RyZWFtT3BzKGxhYmVsLmdldCgpKSkgewotICAgICAgICAgICAgVFN0cmVhbTw/PiBzID0gc3RyZWFtLmZpbHRlcih0cmFjZVR1cGxlc0ZuKGxhYmVsLmdldCgpKSkudGFnKGxhYmVsLmdldCgpKyIudHJhY2UiKTsKLSAgICAgICAgICAgIHMucGVlayhzYW1wbGUgLT4gU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIGxhYmVsLmdldCgpLCBzYW1wbGUudG9TdHJpbmcoKSkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZVRyYWNlU3RyZWFtT3BzKFN0cmluZyBsYWJlbCkgewotICAgICAgICBTdHJpbmcgaW5jbHVkZXNDc3YgPSBjb25maWcoKS5nZXRQcm9wZXJ0eSgic3RyZWFtLnRyYWNpbmcuaW5jbHVkZXMuY3N2IiwgIiIpOwotICAgICAgICBTdHJpbmcgaW5jbHVkZXNSZWdleCA9IGNvbmZpZygpLmdldFByb3BlcnR5KCJzdHJlYW0udHJhY2luZy5pbmNsdWRlcy5yZWdleCIsICIiKTsKLSAgICAgICAgU3RyaW5nIGV4Y2x1ZGVzQ3N2ID0gY29uZmlnKCkuZ2V0UHJvcGVydHkoInN0cmVhbS50cmFjaW5nLmV4Y2x1ZGVzLmNzdiIsICIiKTsKLSAgICAgICAgU3RyaW5nIGV4Y2x1ZGVzUmVnZXggPSBjb25maWcoKS5nZXRQcm9wZXJ0eSgic3RyZWFtLnRyYWNpbmcuZXhjbHVkZXMucmVnZXgiLCAiIik7Ci0gICAgICAgIAotICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlc1NldCA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgcyA6IGluY2x1ZGVzQ3N2LnNwbGl0KCIsIikpCi0gICAgICAgICAgICBpbmNsdWRlc1NldC5hZGQocy50cmltKCkpOwotICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlc1NldCA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgcyA6IGV4Y2x1ZGVzQ3N2LnNwbGl0KCIsIikpCi0gICAgICAgICAgICBleGNsdWRlc1NldC5hZGQocy50cmltKCkpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0luY2x1ZGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChpbmNsdWRlc1NldC5jb250YWlucyhsYWJlbCkgfHwgbGFiZWwubWF0Y2hlcyhpbmNsdWRlc1JlZ2V4KSkKLSAgICAgICAgICAgIGlzSW5jbHVkZWQgPSB0cnVlOwotICAgICAgICBpZiAoZXhjbHVkZXNTZXQuY29udGFpbnMobGFiZWwpIHx8IGxhYmVsLm1hdGNoZXMoZXhjbHVkZXNSZWdleCkpCi0gICAgICAgICAgICBpc0luY2x1ZGVkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaXNJbmNsdWRlZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSA8VD4gUHJlZGljYXRlPFQ+IHRyYWNlVHVwbGVzRm4oU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiB0dXBsZSAtPiB0cnVlOyAvLyBUT0RPIG1ha2UgZHluYW1pYyBjb25maWc7IGFmZmVjdGVkIGJ5ICJsYWJlbCIgdmFsdWUKLSAgICAgICAgLy8gY2hlY2sgbGFiZWwgZm9yIG1hdGNoIGFnYWluc3QgY3N2IG9yIHJlZ2V4IGZyb20gcHJvcHMKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm9wZXJ0eSBuYW1lIGZvciBhIHNlbnNvcidzIGNvbmZpZ3VyYXRpb24gaXRlbS4KLSAgICAgKiBAcGFyYW0gc2Vuc29ySWQgdGhlIHNlbnNvcidzIGlkCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCBmb3IgYW4gaW5zdGFuY2Ugb2YgImtpbmQiIChlLmcuLCAidGVtcFRocmVzaG9sZCIpCi0gICAgICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgY29uZmlndXJhdGlvbiBpdGVtIChlLmcuLCAicmFuZ2UiKQotICAgICAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vuc29yUHJvcGVydHlOYW1lKFN0cmluZyBzZW5zb3JJZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2luZCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGtpbmQgKyAiLiIgKyBsYWJlbDsgIC8vIGtpbmQubGFiZWwKLSAgICAgICAgaWYgKHNlbnNvcklkIT1udWxsICYmICFzZW5zb3JJZC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBuYW1lID0gc2Vuc29ySWQgKyAiLiIgKyBuYW1lOyAgLy8gc2Vuc29ySWQua2luZC5sYWJlbAotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTZW5zb3JDb25maWdWYWx1ZShTdHJpbmcgc2Vuc29ySWQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGtpbmQpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRTZW5zb3JQcm9wZXJ0eU5hbWUoc2Vuc29ySWQsIGxhYmVsLCBraW5kKTsKLSAgICAgICAgU3RyaW5nIHZhbCA9IGNvbmZpZygpLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICBpZiAodmFsPT1udWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBjb25maWd1cmF0aW9uIHByb3BlcnR5ICIrbmFtZSk7Ci0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgUmFuZ2UgZm9yIGEgc2Vuc29yIHJhbmdlIGNvbmZpZ3VyYXRpb24gaXRlbS4KLSAgICAgKiBAcGFyYW0gc2Vuc29ySWQgdGhlIHNlbnNvcidzIGlkCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSByYW5nZSdzIGxhYmVsCi0gICAgICogQHJldHVybiB0aGUgUmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFuZ2U8SW50ZWdlcj4gZ2V0UmFuZ2VJbnRlZ2VyKFN0cmluZyBzZW5zb3JJZCwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIFN0cmluZyB2YWwgPSBnZXRTZW5zb3JDb25maWdWYWx1ZShzZW5zb3JJZCwgbGFiZWwsICJyYW5nZSIpOwotICAgICAgICByZXR1cm4gUmFuZ2VzLnZhbHVlT2ZJbnRlZ2VyKHZhbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgUmFuZ2UgZm9yIGEgc2Vuc29yIHJhbmdlIGNvbmZpZ3VyYXRpb24gaXRlbS4KLSAgICAgKiBAcGFyYW0gc2Vuc29ySWQgdGhlIHNlbnNvcidzIGlkCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSByYW5nZSdzIGxhYmVsCi0gICAgICogQHJldHVybiB0aGUgUmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFuZ2U8Qnl0ZT4gZ2V0UmFuZ2VCeXRlKFN0cmluZyBzZW5zb3JJZCwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIFN0cmluZyB2YWwgPSBnZXRTZW5zb3JDb25maWdWYWx1ZShzZW5zb3JJZCwgbGFiZWwsICJyYW5nZSIpOwotICAgICAgICByZXR1cm4gUmFuZ2VzLnZhbHVlT2ZCeXRlKHZhbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgUmFuZ2UgZm9yIGEgc2Vuc29yIHJhbmdlIGNvbmZpZ3VyYXRpb24gaXRlbS4KLSAgICAgKiBAcGFyYW0gc2Vuc29ySWQgdGhlIHNlbnNvcidzIGlkCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSByYW5nZSdzIGxhYmVsCi0gICAgICogQHJldHVybiB0aGUgUmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFuZ2U8U2hvcnQ+IGdldFJhbmdlU2hvcnQoU3RyaW5nIHNlbnNvcklkLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgU3RyaW5nIHZhbCA9IGdldFNlbnNvckNvbmZpZ1ZhbHVlKHNlbnNvcklkLCBsYWJlbCwgInJhbmdlIik7Ci0gICAgICAgIHJldHVybiBSYW5nZXMudmFsdWVPZlNob3J0KHZhbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgUmFuZ2UgZm9yIGEgc2Vuc29yIHJhbmdlIGNvbmZpZ3VyYXRpb24gaXRlbS4KLSAgICAgKiBAcGFyYW0gc2Vuc29ySWQgdGhlIHNlbnNvcidzIGlkCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSByYW5nZSdzIGxhYmVsCi0gICAgICogQHJldHVybiB0aGUgUmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFuZ2U8RmxvYXQ+IGdldFJhbmdlRmxvYXQoU3RyaW5nIHNlbnNvcklkLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgU3RyaW5nIHZhbCA9IGdldFNlbnNvckNvbmZpZ1ZhbHVlKHNlbnNvcklkLCBsYWJlbCwgInJhbmdlIik7Ci0gICAgICAgIHJldHVybiBSYW5nZXMudmFsdWVPZkZsb2F0KHZhbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgUmFuZ2UgZm9yIGEgc2Vuc29yIHJhbmdlIGNvbmZpZ3VyYXRpb24gaXRlbS4KLSAgICAgKiBAcGFyYW0gc2Vuc29ySWQgdGhlIHNlbnNvcidzIGlkCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSByYW5nZSdzIGxhYmVsCi0gICAgICogQHJldHVybiB0aGUgUmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFuZ2U8RG91YmxlPiBnZXRSYW5nZURvdWJsZShTdHJpbmcgc2Vuc29ySWQsIFN0cmluZyBsYWJlbCkgewotICAgICAgICBTdHJpbmcgdmFsID0gZ2V0U2Vuc29yQ29uZmlnVmFsdWUoc2Vuc29ySWQsIGxhYmVsLCAicmFuZ2UiKTsKLSAgICAgICAgcmV0dXJuIFJhbmdlcy52YWx1ZU9mRG91YmxlKHZhbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9nIGV2ZXJ5IHR1cGxlIG9uIHRoZSBzdHJlYW0gdXNpbmcgdGhlIHtAY29kZSBGaWxlU3RyZWFtc30gY29ubmVjdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBsb2dzIGFyZSBhZGRlZCB0byB0aGUgZGlyZWN0b3J5IGFzIHNwZWNpZmllZAotICAgICAqIGJ5IHRoZSAiYXBwbGljYXRpb24ubG9nLmRpciIgcHJvcGVydHkuCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSAiYWN0aXZlIiAob3BlbiAvIGJlaW5nIHdyaXR0ZW4pIGxvZyBmaWxlIG5hbWUgaXMge0Bjb2RlIC48YmFzZU5hbWU+fS4KLSAgICAgKiA8YnI+Ci0gICAgICogQ29tcGxldGVkIHN0YWJsZSBsb2dzIGhhdmUgYSBuYW1lIG9mIHtAY29kZSA8YmFzZU5hbWU+X1lZWVlNTUREX0hITU1TU30uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGxvZyBlbnRyeSBmb3JtYXQgYmVpbmcgdXNlZCBpczoKLSAgICAgKiB7QGNvZGUgWzxkYXRlPl0gWzxldmVudFRhZz5dIDx0dXBsZT4udG9TdHJpbmcoKX0KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIEZpbGVTdHJlYW1zI3RleHRGaWxlV3JpdGVyKFRTdHJlYW0sIG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLlN1cHBsaWVyLCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5TdXBwbGllcil9Ci0gICAgICogCi0gICAgICogQHBhcmFtIDxUPiBUdXBsZSB0eXBlCi0gICAgICogQHBhcmFtIHN0cmVhbSB0aGUgVFN0cmVhbQotICAgICAqIEBwYXJhbSBiYXNlTmFtZSB0aGUgYmFzZSBsb2cgbmFtZQotICAgICAqIEBwYXJhbSBldmVudFRhZyBhIHRhZyB0aGF0IGdldHMgYWRkZWQgdG8gdGhlIGxvZyBlbnRyeQotICAgICAqIEByZXR1cm4gdGhlIGlucHV0IHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyA8VD4gVFN0cmVhbTxUPiBsb2dTdHJlYW0oVFN0cmVhbTxUPiBzdHJlYW0sIFN0cmluZyBldmVudFRhZywgU3RyaW5nIGJhc2VOYW1lKSB7Ci0gICAgICAgIC8vIERlZmluZSB0aGUgd3JpdGVyIHBvbGljeS4KLSAgICAgICAgLy8gVE9ETyBjb3VsZCBtYWtlIHRoZSBwb2xpY3kgY29uZmlndXJhYmxlIHZpYSBjb25maWcoKQotICAgICAgICBGaWxlV3JpdGVyUG9saWN5PFN0cmluZz4gcG9saWN5ID0gbmV3IEZpbGVXcml0ZXJQb2xpY3k8U3RyaW5nPigKLSAgICAgICAgICAgICAgICBGaWxlV3JpdGVyRmx1c2hDb25maWcubmV3VGltZUJhc2VkQ29uZmlnKDJfMDAwLyptc2VjKi8pLCAvLyBmbHVzaCBldmVyeSAyc2VjCi0gICAgICAgICAgICAgICAgRmlsZVdyaXRlckN5Y2xlQ29uZmlnLm5ld0ZpbGVTaXplQmFzZWRDb25maWcoMTBfMDAwKSwgIC8vIG5ldyBmaWxlIGV2ZXJ5IDEwS0IKLSAgICAgICAgICAgICAgICBGaWxlV3JpdGVyUmV0ZW50aW9uQ29uZmlnLm5ld0ZpbGVDb3VudEJhc2VkQ29uZmlnKDEpICAgLy8gcmV0YWluIDEgZmlsZQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICAvLyBDb21wb3NlIHRoZSBiYXNlIGZpbGUgcGF0aG5hbWUKLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShjb25maWcoKS5nZXRQcm9wZXJ0eSgiYXBwbGljYXRpb24ubG9nLmRpciIpKTsKLSAgICAgICAgU3RyaW5nIGJhc2VQYXRobmFtZSA9IG5ldyBGaWxlKGRpciwgYmFzZU5hbWUpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAKLSAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBzdHJlYW0gdG8gYSBUU3RyZWFtPFN0cmluZz4gb2Ygc3RyaW5nIGxvZyBlbnRyeSB2YWx1ZXMKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IHN0cmluZ0VudHJpZXMgPSBzdHJlYW0ubWFwKHNhbXBsZSAtPiBTdHJpbmcuZm9ybWF0KCJbJXNdIFslc10gJXMiLCBuZXcgRGF0ZSgpLnRvU3RyaW5nKCksIGV2ZW50VGFnLCBzYW1wbGUudG9TdHJpbmcoKSkpCi0gICAgICAgICAgICAgICAgLnRhZyhiYXNlTmFtZSsiLmxvZyIpOwotCi0gICAgICAgIC8vIFVzZSB0aGUgRmlsZVN0cmVhbXMgY29ubmVjdG9yIHRvIHdyaXRlIHRoZSBsb2dzLgotICAgICAgICAvLwotICAgICAgICAvLyBBIGhhY2sgZm9yIGdldHRpbmcgdGhlIGxvZyBkaXJlY3RvcmllcyBjcmVhdGVkIGF0IHJ1bnRpbWUKLSAgICAgICAgLy8gVE9ETyBhZGQgYW5vdGhlciBwb2xpY3kgdGhpbmcuLi4gb3Igc2ltcGx5IG1ha2UgdGV4dEZpbGVXcml0ZXIgZG8gaXQ/Ci0gICAgICAgIC8vCi0gICAgICAgIEZpbGVTdHJlYW1zLnRleHRGaWxlV3JpdGVyKHN0cmluZ0VudHJpZXMsCi0gICAgICAgICAgICAgICAgKCkgLT4geyBpZiAoIWRpci5leGlzdHMoKSkgZGlyLm1rZGlycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VQYXRobmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICgpIC0+IHBvbGljeSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL0pzb25UdXBsZXMuamF2YSBiL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9Kc29uVHVwbGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjMxYzguLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL0pzb25UdXBsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5zdGF0LlN0YXRpc3RpYy5NQVg7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5zdGF0LlN0YXRpc3RpYy5NRUFOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuc3RhdC5TdGF0aXN0aWMuTUlOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuc3RhdC5TdGF0aXN0aWMuU1REREVWOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubWF0aDMudXRpbC5QYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5qc29uLkpzb25BbmFseXRpY3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLnN0YXQuU3RhdGlzdGljOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLkJpRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24uRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLQotLyoqCi0gKiBVdGlsdGllcyB0byBlYXNlIHdvcmtpbmcgd29ya2luZyB3aXRoIHNlbnNvciAic2FtcGxlcyIgYnkgd3JhcHBpbmcgdGhlbQotICogaW4gSnNvbk9iamVjdHMuCi0gKiA8cD4KLSAqIFRoZSBKc29uIFR1cGxlIHNlbnNvciAic2FtcGxlcyIgaGF2ZSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gb2YgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIEpzb25UdXBsZXMgewotICAgICAgICAKLSAgICAvKgotICAgICAqIENvbW1vbiBhdHRyaWJ1dGVzIGluIHRoZSBKc29uT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFMgPSAibXNlYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JFQURJTkcgPSAicmVhZGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FHR19CRUdJTl9UUyA9ICJhZ2cuYmVnaW4ubXNlYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FHR19DT1VOVCA9ICJhZ2cuY291bnQiOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEpzb25PYmplY3Qgd3JhcHBpbmcgYSByYXcge0Bjb2RlIFBhaXI8TG9uZyBtc2VjLFQgcmVhZGluZz4+fSBzYW1wbGUuCi0gICAgICogQHBhcmFtIDxUPiBUdXBsZSB0eXBlCi0gICAgICogQHBhcmFtIHNhbXBsZSB0aGUgcmF3IHNhbXBsZQotICAgICAqIEBwYXJhbSBpZCB0aGUgc2Vuc29yJ3MgSWQKLSAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIHNhbXBsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEpzb25PYmplY3Qgd3JhcChQYWlyPExvbmcsVD4gc2FtcGxlLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgSnNvbk9iamVjdCBqbyA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgIGpvLmFkZFByb3BlcnR5KEtFWV9JRCwgaWQpOwotICAgICAgICBqby5hZGRQcm9wZXJ0eShLRVlfVFMsIHNhbXBsZS5nZXRGaXJzdCgpKTsKLSAgICAgICAgVCB2YWx1ZSA9IHNhbXBsZS5nZXRTZWNvbmQoKTsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKQotICAgICAgICAgICAgam8uYWRkUHJvcGVydHkoS0VZX1JFQURJTkcsIChOdW1iZXIpc2FtcGxlLmdldFNlY29uZCgpKTsKLSAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICBqby5hZGRQcm9wZXJ0eShLRVlfUkVBRElORywgKFN0cmluZylzYW1wbGUuZ2V0U2Vjb25kKCkpOwotICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pCi0gICAgICAgICAgICBqby5hZGRQcm9wZXJ0eShLRVlfUkVBRElORywgKEJvb2xlYW4pc2FtcGxlLmdldFNlY29uZCgpKTsKLS8vICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGFycmF5KSB7Ci0vLyAgICAgICAgICAgIC8vIFRPRE8gY3Z0IHRvIEpzb25BcnJheQotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgewotLy8gICAgICAgICAgICAvLyBUT0RPIGN2dCB0byBKc29uT2JqZWN0Ci0vLyAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmdldENsYXNzKCkgOiBPYmplY3QuY2xhc3M7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmhhbmRsZWQgdmFsdWUgdHlwZTogIisgY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqbzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc3RyZWFtIG9mIEpzb25PYmplY3Qgd3JhcHBpbmcgYSBzdHJlYW0gb2YgCi0gICAgICogcmF3IHtAY29kZSBQYWlyPExvbmcgbXNlYyxUIHJlYWRpbmc+Pn0gc2FtcGxlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSA8VD4gVHVwbGUgdHlwZQotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIHJhdyBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gaWQgdGhlIHNlbnNvcidzIElkCi0gICAgICogQHJldHVybiB0aGUgd3JhcHBlZCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUU3RyZWFtPEpzb25PYmplY3Q+IHdyYXAoVFN0cmVhbTxQYWlyPExvbmcsVD4+IHN0cmVhbSwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBzdHJlYW0ubWFwKHBhaXIgLT4gd3JhcChwYWlyLCBpZCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgcGFydGl0aW9uIGtleSBmdW5jdGlvbiBmb3Igd3JhcHBlZCBzZW5zb3Igc2FtcGxlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUge0Bjb2RlIEtFWV9JRH0gcHJvcGVydHkgaXMgcmV0dXJuZWQgZm9yIHRoZSBrZXkuCi0gICAgICogQHJldHVybiB0aGUgZnVuY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uPEpzb25PYmplY3QsU3RyaW5nPiBrZXlGbigpIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZSAtPiBzYW1wbGUuZ2V0KEtFWV9JRCkuZ2V0QXNTdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RhdGlzdGljIHZhbHVlIGZyb20gYSBzYW1wbGUuCi0gICAgICogPHA+Ci0gICAgICogU2FtZSBhcyB7QGNvZGUgZ2V0U3RhdGlzdGljKGpvLCBKc29uVHVwbGVzLktFWV9SRUFESU5HLCBzdGF0KX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGpvIHRoZSBzYW1wbGUKLSAgICAgKiBAcGFyYW0gc3RhdCB0aGUgU3RhdGlzdGljIG9mIGludGVyZXN0Ci0gICAgICogQHJldHVybiB0aGUgSnNvbkVsZW1lbnQgZm9yIHRoZSBTdGF0aXN0aWMKLSAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gb2YgdGhlIHN0YXQgaXNuJ3QgcHJlc2VudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSnNvbkVsZW1lbnQgZ2V0U3RhdGlzdGljKEpzb25PYmplY3Qgam8sIFN0YXRpc3RpYyBzdGF0KSB7Ci0gICAgICAgIHJldHVybiBnZXRTdGF0aXN0aWMoam8sIEpzb25UdXBsZXMuS0VZX1JFQURJTkcsIHN0YXQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdGF0aXN0aWMgdmFsdWUgZnJvbSBhIHNhbXBsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBDb252ZW5pZW5jZSBmb3Igd29ya2luZyB3aXRoIHNhbXBsZXMgY29udGFpbmluZyBhIHByb3BlcnR5Ci0gICAgICogd2hvc2UgdmFsdWUgaXMgb25lIG9yIG1vcmUge0BsaW5rIFN0YXRpc3RpY30KLSAgICAgKiBhcyBjcmVhdGVkIGJ5IAotICAgICAqIHtAbGluayBKc29uQW5hbHl0aWNzI2FnZ3JlZ2F0ZShvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UV2luZG93LCBTdHJpbmcsIFN0cmluZywgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLmpzb24uSnNvblVuaXZhcmlhdGVBZ2dyZWdhdGUuLi4pIEpzb25BbmFseXRpY3MuYWdncmVnYXRlKCl9Ci0gICAgICogCi0gICAgICogQHBhcmFtIGpvIHRoZSBzYW1wbGUKLSAgICAgKiBAcGFyYW0gdmFsdWVLZXkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIEpzb25PYmplY3Qgb2YgU3RhdGlzdGljcwotICAgICAqIEBwYXJhbSBzdGF0IHRoZSBTdGF0aXN0aWMgb2YgaW50ZXJlc3QKLSAgICAgKiBAcmV0dXJuIHRoZSBKc29uRWxlbWVudCBmb3IgdGhlIFN0YXRpc3RpYwotICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBvZiB0aGUgc3RhdCBpc24ndCBwcmVzZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKc29uRWxlbWVudCBnZXRTdGF0aXN0aWMoSnNvbk9iamVjdCBqbywgU3RyaW5nIHZhbHVlS2V5LCBTdGF0aXN0aWMgc3RhdCkgewotICAgICAgICBKc29uT2JqZWN0IHN0YXRzam8gPSBqby5nZXQodmFsdWVLZXkpLmdldEFzSnNvbk9iamVjdCgpOwotICAgICAgICByZXR1cm4gc3RhdHNqby5nZXQoc3RhdC5uYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgdGhlIHNwZWNpZmllZCBzdGF0aXN0aWNzIG9uIHRoZSBsaXN0IG9mCi0gICAgICogc2FtcGxlcyBhbmQgcmV0dXJucyBhIG5ldyBzYW1wbGUgY29udGFpbmluZyB0aGUgcmVzdWx0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBzaW5nbGUgdHVwbGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBzdGF0aXN0aWNzIGNvbXB1dGVkIG92ZXIKLSAgICAgKiBhbGwgb2YgdGhlIHtAY29kZSBKc29uVHVwbGUuS0VZX1JFQURJTkd9IAotICAgICAqIHZhbHVlcyBmcm9tIHtAY29kZSBMaXN0PEpzb25PYmplY3Q+fS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVzdWx0aW5nIHNhbXBsZSBjb250YWlucyB0aGUgcHJvcGVydGllczoKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkpzb25UdXBsZS5LRVlfSUQ8L2xpPgotICAgICAqIDxsaT5Kc29uVHVwbGUuS0VZX01TRUMgLSBtc2VjVGltZXN0YW1wIG9mIHRoZSBsYXN0IHNhbXBsZSBpbiB0aGUgd2luZG93PC9saT4KLSAgICAgKiA8bGk+SnNvblR1cGxlLktFWV9BR0dfQkVHSU5fTVNFQyAtIG1zZWNUaW1lc3RhbXAgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgd2luZG93PC9saT4KLSAgICAgKiA8bGk+SnNvblR1cGxlLktFWV9BR0dfQ09VTlQgLSBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgd2luZG93ICh7QGNvZGUgdmFsdWU9ZmFjdG9yfSk8L2xpPgotICAgICAqIDxsaT5Kc29uVHVwbGUuS0VZX1JFQURJTkcgLSBhIEpzb25PYmplY3Qgb2YgdGhlIHN0YXRpc3RpY3MKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyBkZWZpbmVkIGJ5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICB7QGxpbmsgSnNvbkFuYWx5dGljcyNhZ2dyZWdhdGUob3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFdpbmRvdywgU3RyaW5nLCBTdHJpbmcsIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5qc29uLkpzb25Vbml2YXJpYXRlQWdncmVnYXRlLi4uKSBKc29uQW5hbHl0aWNzLmFnZ3JlZ2F0ZSgpfQotICAgICAqIDwvdWw+Ci0gICAgICogPHA+Ci0gICAgICogU2FtcGxlIHVzZToKLSAgICAgKiA8cHJlPntAY29kZQotICAgICAqIFRTdHJlYW08SnNvbk9iamVjdD4gcyA9IC4uLgotICAgICAqIC8vIHJlZHVjZSBzIGJ5IGEgZmFjdG9yIG9mIDEwMCB3aXRoIHN0YXRzIE1FQU4gYW5kIFNUREVWIAotICAgICAqIFRTdHJlYW08SnNvbk9iamVjdD4gcmVkdWNlZCA9IHMuYmF0Y2goMTAwLCBzdGF0aXN0aWNzKFN0YXRpc3RpYy5NRUFOLCBTdGF0aXN0aWMuU1REREVWKSk7Ci0gICAgICogfTwvcHJlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGF0aXN0aWNzIHRoZSBzdGF0aXN0aWNzIHRvIGNhbGN1bGF0ZSBvdmVyIHRoZSB3aW5kb3cKLSAgICAgKiBAcmV0dXJuIHtAY29kZSBUU3RyZWFtPEpzb25PYmplY3Q+fSBmb3IgdGhlIHJlZHVjZWQge0Bjb2RlIHN0cmVhbX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJpRnVuY3Rpb248TGlzdDxKc29uT2JqZWN0PixTdHJpbmcsSnNvbk9iamVjdD4gc3RhdGlzdGljcyhTdGF0aXN0aWMuLi4gc3RhdGlzdGljcykgewotICAgICAgICBCaUZ1bmN0aW9uPExpc3Q8SnNvbk9iamVjdD4sSnNvbkVsZW1lbnQsSnNvbk9iamVjdD4gc3RhdHNGbiA9IAotICAgICAgICAgICAgICAgIEpzb25BbmFseXRpY3MuYWdncmVnYXRlTGlzdChLRVlfSUQsIEtFWV9SRUFESU5HLAotICAgICAgICAgICAgICAgICAgICBqIC0+IGouZ2V0KEtFWV9SRUFESU5HKS5nZXRBc0RvdWJsZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgTUlOLCBNQVgsIE1FQU4sIFNURERFVik7Ci0KLSAgICAgICAgcmV0dXJuIChzYW1wbGVzLCBrZXkpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgSnNvbk9iamVjdCBqbyA9IHN0YXRzRm4uYXBwbHkoc2FtcGxlcywgc2FtcGxlcy5nZXQoMCkuZ2V0KEtFWV9JRCkpOwotICAgICAgICAgICAgICAgICAgICBKc29uVHVwbGVzLmFkZEFnZ1N0ZEluZm8oam8sIHNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gam87Ci0gICAgICAgICAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFnZ1N0ZEluZm8oSnNvbk9iamVjdCBqbywgTGlzdDxKc29uT2JqZWN0PiBzYW1wbGVzKSB7Ci0gICAgICAgIC8vIGJlZ2luTXNlYywgZW5kTXNlYywgblNhbXBsZXMKLSAgICAgICAgbG9uZyBtc2VjID0gc2FtcGxlcy5nZXQoMCkuZ2V0KEtFWV9UUykuZ2V0QXNMb25nKCk7Ci0gICAgICAgIGxvbmcgbXNlYzIgPSBzYW1wbGVzLmdldChzYW1wbGVzLnNpemUoKS0xKS5nZXQoS0VZX1RTKS5nZXRBc0xvbmcoKTsKLSAgICAgICAgaW50IG5TYW1wbGVzID0gc2FtcGxlcy5zaXplKCk7Ci0gICAgICAgIAotICAgICAgICBqby5hZGRQcm9wZXJ0eShLRVlfVFMsIG1zZWMyKTsKLSAgICAgICAgam8uYWRkUHJvcGVydHkoS0VZX0FHR19CRUdJTl9UUywgbXNlYyk7Ci0gICAgICAgIGpvLmFkZFByb3BlcnR5KEtFWV9BR0dfQ09VTlQsIG5TYW1wbGVzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9Ub3BvbG9neVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL1RvcG9sb2d5UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjhmY2IuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL1RvcG9sb2d5UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFByb3ZpZGVyOwotCi0vKioKLSAqIEEgY29uZmlndXJhdGlvbiBkcml2ZW4gZmFjdG9yeSBmb3IgYW4gRWRnZW50IHRvcG9sb2d5IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgVG9wb2xvZ3lQcm92aWRlckZhY3RvcnkgewotICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBwcm9wczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBmYWN0b3J5Ci0gICAgICogQHBhcmFtIHByb3BzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFRvcG9sb2d5UHJvdmlkZXJGYWN0b3J5KFByb3BlcnRpZXMgcHJvcHMpIHsKLSAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYSBuZXcgdG9wb2xvZ3kgcHJvdmlkZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgcHJvdmlkZXIgaXMge0Bjb2RlIG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXJ9LgotICAgICAqIDxwPgotICAgICAqIFRoZSB7QGNvZGUgdG9wb2xvZ3kucHJvdmlkZXJ9IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgY2FuIHNwZWNpZnkKLSAgICAgKiBhbiBhbHRlcm5hdGl2ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlcgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlciBjb3VsZG4ndCBiZSBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIERpcmVjdFByb3ZpZGVyIG5ld1Byb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gcHJvcHMuZ2V0UHJvcGVydHkoInRvcG9sb2d5LnByb3ZpZGVyIiwgIm9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXIiKTsKLSAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ2xhc3Mgbm90IGZvdW5kOiAiK2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChEaXJlY3RQcm92aWRlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvYXBwbGljYXRpb25UZW1wbGF0ZS5wcm9wZXJ0aWVzIGIvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL2FwcGxpY2F0aW9uVGVtcGxhdGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1ZDNkYi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvYXBwbGljYXRpb25UZW1wbGF0ZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIyBBIHRlbXBsYXRlIGZpbGUgZm9yIEFwcGxpY2F0aW9uIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotIwotIyBUaGUgZGVmYXVsdCBFZGdlbnQgdG9wb2xvZ3kgcHJvdmlkZXIgaXMgRGlyZWN0UHJvdmlkZXIKLSN0b3BvbG9neS5wcm92aWRlcj1vcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuRGV2ZWxvcG1lbnRQcm92aWRlcgotIwotYXBwbGljYXRpb24ubmFtZT1NeUFuYWx5dGljcwotIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgQXBwbGljYXRpb24gc3RyZWFtIGxvZ2dpbmcgY29uZmlndXJhdGlvbgotIyBXaGVyZSB0aGUgYXBwIHB1dHMgaXRzIHN0cmVhbSBsb2dzLiAgCi0jIFRoZSBkaXJlY3Rvcnkgd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIHRvcG9sb2d5Ci0jIHJ1bnMgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgotYXBwbGljYXRpb24ubG9nLmRpcj0vdG1wL015QW5hbHl0aWNzL2xvZ3MKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIEFwcGxpY2F0aW9uICJyYW5nZXMiIC0gZS5nLiwgZm9yIHRocmVzaG9sZCBkZXRlY3Rpb25zCi0jIFNwZWNpZnkgdmFsdWVzIGdlbmVyYXRlZCBieSBSYW5nZS50b1N0cmluZygpOgotIyAgPGxvd2VyQm91bmRUeXBlPjxsb3dlckJvdW5kPi4uPHVwcGVyQm91bmQ+PHVwcGVyQm91bmRUeXBlPgotIyAgd2hlcmUKLSMgICAgICBsb3dlckJvdW5kVHlwZSBpcyAiWyIgaW5jbHVzaXZlIG9yICIoIiBleGNsdXNpdmUKLSMgICAgICB1cHBlckJvdW5kVHlwZSBpcyAiXSIgaW5jbHVzaXZlIG9yICIpIiBleGNsdXNpdmUKLSMgICAgICBsb3dlckJvdW5kIG9yIHVwcGVyQm91bmQgaXMgIioiIGZvciBvcGVuIHJhbmdlcywKLSMgICAgICAgICBlLmcuLCBbKi4uNTBdICBmb3IgImF0TW9zdCIgNTAKLSMKLXNlbnNvcjEucmFuZ2Uub3V0c2lkZTFoek1lYW5SYW5nZT1bMTI0Li4xMjldCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBNUVRUIERldmljZSBhbmQgQ29ubmVjdG9yIGNvbmZpZ3VyYXRpb24gaW5mby4KLSMKLSMgTVFUVCBEZXZpY2UgLS0gU2VlIG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMubXF0dC5kZXZpY2UuTXF0dERldmljZSBmb3IgYWxsCi0jIG9mIHRoZSBwcm9wZXJ0aWVzLgotIwotIyBBbiBvcHRpb25hbCB0b3BpYyBwcmVmaXguICBJdCBjYW4gYmUgdXNlZCB0byBpc29sYXRlIHVzZXJzIG9yIGFwcGxpY2F0aW9ucwotIyBpbiBzaGFyZWQgTVFUVCBicm9rZXIgY29uZmlndXJhdGlvbnMuICBCeSBkZWZhdWx0IGl0IGlzIGluY29ycG9yYXRlZAotIyBpbnRvIGRldmljZSB0b3BpY3MgYW5kIHRoZSBNUVRUIGNsaWVudElkLgotIyBJZiB5b3UgdXNlIGEgcHVibGljIE1RVFQgYnJva2VyIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIHRvcGljCi0jIHByZWZpeCBzbyBpdCBpcyBzdGlsbCB1bmlxdWUgZm9yIHlvdSBidXQgZG9lc24ndCBpbmNsdWRlIHRoZQotIyB1c2VyIG5hbWUgb3IgYXBwbGljYXRpb24gbmFtZS4KLW1xdHREZXZpY2UudG9waWMucHJlZml4PWlibS54eXp6eS1zdHJlYW1zLnNhbXBsZXMvdXNlci97dXNlci5uYW1lfS97YXBwbGljYXRpb24ubmFtZX0vCi0jCi0jIFRoZSBkZXZpY2UgaWQgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGRldmljZSdzIGV2ZW50cyBhbmQgY29tbWFuZHMKLSMgaW4gdGhlIE1RVFQgdG9waWMgbmFtZXNwYWNlLgotIyBCeSBkZWZhdWx0IGl0IGFsc28gZ2V0cyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgTVFUVCBjbGllbnRJZCB2YWx1ZS4KLW1xdHREZXZpY2UuaWQ9MDEyMzQ1Ci0jCi0jIFRoZSBNUVRUIGNsaWVudElkLiAgT25seSBvbmUgaW5zdGFuY2Ugb2YgYSBNcXR0RGV2aWNlIGNhbiBjb25uZWN0Ci0jIHRvIHRoZSBNUVRUIGJyb2tlciB3aXRoIGEgZ2l2ZW4gY2xpZW50SWQuCi0jbXF0dERldmljZS5tcXR0LmNsaWVudElkPXttcXR0RGV2aWNlLnRvcGljLnByZWZpeH1pZC97bXF0dERldmljZS5pZH0KLSMKLSMgTVFUVCBDb25uZWN0b3IgIFNlZSBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLm1xdHQuTXF0dENvbmZpZy5mcm9tUHJvcGVydGllcygpCi0jCi0jIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgZm9yIGEgbG9jYWwgTVFUVCBicm9rZXIuCi0jIFNlZSBtb3NxdWl0dG8ub3JnIGZvciBpbnN0cnVjdGlvbnMgb24gZG93bmxvYWRpbmcgYSBNUVRUIGJyb2tlci4KLSMgT3IgdXNlIHNvbWUgb3RoZXIgTVFUVCBicm9rZXIgYXZhaWxhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQuCi1tcXR0LnNlcnZlclVSTHM9dGNwOi8vbG9jYWxob3N0OjE4ODMKLSMKLSMgQWx0ZXJuYXRpdmVseSwgdGhlcmUgYXJlIHNvbWUgcHVibGljIE1RVFQgYnJva2VycyBhdmFpbGFibGUgdG8gZXhwZXJpbWVudCB3aXRoLgotIyBUaGVpciBhdmFpbGFiaWxpdHkgc3RhdHVzIGlzbid0IGd1YXJhbnRlZWQuICBJZiB5b3UncmUgdW5hYmxlIHRvIGNvbm5lY3QKLSMgdG8gdGhlIGJyb2tlciwgaXQncyBsaWtlbHkgdGhhdCBpdCBpc24ndCB1cCBvciB5b3VyIGZpcmV3YWxscyBkb24ndAotIyBhbGxvdyB5b3UgdG8gY29ubmVjdC4gIERPIE5PVCBQVUJMSVNIIEFOWVRISU5HIFNFTlNJVElWRSAtIGFueW9uZQotIyBjYW4gYmUgbGlzdGluZy4KLSNtcXR0LnNlcnZlclVSTHM9dGNwOi8vaW90LmVjbGlwc2Uub3JnOjE4ODMKLSNtcXR0LnNlcnZlclVSTHM9dGNwOi8vdGVzdC5tb3NxdWl0dG8ub3JnOjE4ODMKLSMKLSNtcXR0LnVzZXJOYW1lPXh5enp5Ci0jbXF0dC5wYXNzd29yZD1teU1vc3F1aXR0b1B3Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBQYXR0ZXJucyBmb3IgaWRlbnRpZnlpbmcgd2hpY2ggc3RyZWFtcyB0byB0cmFjZSB0byBTeXN0ZW0ub3V0Ci0jIFRvIGVuYWJsZSB1c2UgaW5jbHVkZS5jc3YgYW5kL29yIGluY2x1ZGVzLnJlZ2V4LgotIyBUbyBleGNsdWRlIGFuIG90aGVyd2lzZSBpbmNsdWRlZCBmaWxlLCB1c2UgZXhjbHVkZXMuY3N2IGFuZC9vciBleGNsdWRlcy5yZWdleAotIwotIyBTb21lIHRyYWNpbmcgbGFiZWxzCi0jIHNlbnNvcjEucmF3MWtoeixzZW5zb3IxLmoxa2h6LHNlbnNvcjEuajFoelN0YXRzLHNlbnNvcjEub3V0c2lkZTFoek1lYW5SYW5nZSosCi0jIHNlbnNvcjEucGVyaW9kaWNMYXN0TioKLSMKLSNzdHJlYW0udHJhY2luZy5pbmNsdWRlcy5jc3Y9c2Vuc29yMS5qMWh6U3RhdHMKLXN0cmVhbS50cmFjaW5nLmluY2x1ZGVzLnJlZ2V4PXNlbnNvcjEub3V0c2lkZTFoek1lYW5SYW5nZS4qCi0jc3RyZWFtLnRyYWNpbmcuZXhjbHVkZXMucmVnZXg9LioKLSNzdHJlYW0udHJhY2luZy5leGNsdWRlcy5jc3Y9c2Vuc29yMS5yYXcxa2h6CmRpZmYgLS1naXQgYS9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvbXF0dC9BYnN0cmFjdE1xdHRBcHBsaWNhdGlvbi5qYXZhIGIvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL21xdHQvQWJzdHJhY3RNcXR0QXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkOTQzYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvbXF0dC9BYnN0cmFjdE1xdHRBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMubXF0dDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmlvdC5Jb3REZXZpY2UuQ01EX1BBWUxPQUQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5tcXR0LmlvdC5NcXR0RGV2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5BYnN0cmFjdEFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5BcHBsaWNhdGlvblV0aWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuVG9wb2xvZ3lQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLQotLyoqCi0gKiBBbiBNUVRUIEFwcGxpY2F0aW9uIGJhc2UgY2xhc3MuCi0gKiA8cD4KLSAqIEFwcGxpY2F0aW9uIGluc3RhbmNlcyBuZWVkIHRvOgotICogPHVsPgotICogPGxpPmRlZmluZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rICNidWlsZFRvcG9sb2d5KFRvcG9sb2d5KX08L2xpPgotICogPGxpPmNhbGwge0BsaW5rICNydW4oKX0gdG8gYnVpbGQgYW5kIHN1Ym1pdCB0aGUgdG9wb2xvZ3kgZm9yIGV4ZWN1dGlvbi48L2xpPgotICogPC91bD4KLSAqIDxwPgotICogVGhlIGNsYXNzIHByb3ZpZGVzIHNvbWUgY29tbW9uIHByb2Nlc3NpbmcgbmVlZHM6Ci0gKiA8dWw+Ci0gKiA8bGk+U3VwcG9ydCBmb3IgYW4gZXh0ZXJuYWwgY29uZmlndXJhdGlvbiBmaWxlPC9saT4KLSAqIDxsaT5Qcm92aWRlcyBhIHtAbGluayBUb3BvbG9neVByb3ZpZGVyRmFjdG9yeX08L2xpPgotICogPGxpPlByb3ZpZGVzIGEge0BsaW5rIEFwcGxpY2F0aW9uVXRpbGl0aWVzfTwvbGk+Ci0gKiA8bGk+UHJvdmlkZXMgYSB7QGxpbmsgTXF0dERldmljZX08L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TXF0dEFwcGxpY2F0aW9uIGV4dGVuZHMgQWJzdHJhY3RBcHBsaWNhdGlvbiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBNcXR0RGV2aWNlIG1xdHREZXZpY2U7Ci0gICAgCi0gICAgcHVibGljIEFic3RyYWN0TXF0dEFwcGxpY2F0aW9uKFN0cmluZyBwcm9wc1BhdGgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlcihwcm9wc1BhdGgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVCdWlsZFRvcG9sb2d5KFRvcG9sb2d5IHQpIHsKLSAgICAgICAgLy8gQWRkIGFuIE1RVFQgZGV2aWNlIGNvbW11bmljYXRpb24gbWFuYWdlciB0byB0aGUgdG9wb2xvZ3kKLSAgICAgICAgdXBkYXRlVG9waWNQcmVmaXgoKTsKLSAgICAgICAgbXF0dERldmljZSA9IG5ldyBNcXR0RGV2aWNlKHQsIHByb3BzKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNcXR0RGV2aWNlIHNlcnZlclVSTHMgIiArIEFycmF5cy50b1N0cmluZyhtcXR0RGV2aWNlLmdldE1xdHRDb25maWcoKS5nZXRTZXJ2ZXJVUkxzKCkpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNcXR0RGV2aWNlIGNsaWVudElkICIgKyBtcXR0RGV2aWNlLmdldE1xdHRDb25maWcoKS5nZXRDbGllbnRJZCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNcXR0RGV2aWNlIGRldmljZUlkICIgKyBwcm9wcy5nZXRQcm9wZXJ0eSgibXF0dERldmljZS5pZCIpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNcXR0RGV2aWNlIGV2ZW50IHRvcGljIHBhdHRlcm4gIiArIG1xdHREZXZpY2UuZXZlbnRUb3BpYyhudWxsKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXF0dERldmljZSBjb21tYW5kIHRvcGljIHBhdHRlcm4gIiArIG1xdHREZXZpY2UuY29tbWFuZFRvcGljKG51bGwpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhcHBsaWNhdGlvbidzIE1xdHREZXZpY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBNcXR0RGV2aWNlCi0gICAgICovCi0gICAgcHVibGljIE1xdHREZXZpY2UgbXF0dERldmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG1xdHREZXZpY2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUb3BpY1ByZWZpeCgpIHsKLSAgICAgICAgU3RyaW5nIHZhbCA9IHByb3BzLmdldFByb3BlcnR5KCJtcXR0RGV2aWNlLnRvcGljLnByZWZpeCIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCJ7dXNlci5uYW1lfSIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5uYW1lIikpOwotICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoInthcHBsaWNhdGlvbi5uYW1lfSIsIHByb3BzLmdldFByb3BlcnR5KCJhcHBsaWNhdGlvbi5uYW1lIikpOwotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoIm1xdHREZXZpY2UudG9waWMucHJlZml4IiwgdmFsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb21wb3NlIGEgTXF0dERldmljZSBldmVudElkIGZvciB0aGUgc2Vuc29yLgotICAgICAqIEBwYXJhbSBzZW5zb3JJZCB0aGUgc2Vuc29yIGlkCi0gICAgICogQHBhcmFtIGV2ZW50SWQgdGhlIHNlbnNvcidzIGV2ZW50SWQKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXZpY2UgZXZlbnRJZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2Vuc29yRXZlbnRJZChTdHJpbmcgc2Vuc29ySWQsIFN0cmluZyBldmVudElkKSB7Ci0gICAgICAgIHJldHVybiBzZW5zb3JJZCArICIuIiArIGV2ZW50SWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbXBvc2UgYSBNcXR0RGV2aWNlIGNvbW1hbmRJZCBmb3IgdGhlIHNlbnNvcgotICAgICAqIEBwYXJhbSBzZW5zb3JJZCB0aGUgc2Vuc29yIGlkCi0gICAgICogQHBhcmFtIGNvbW1hbmRJZCB0aGUgc2Vuc29yJ3MgY29tbWFuZElkCi0gICAgICogQHJldHVybiB0aGUgZGV2aWNlIGNvbW1hbmRJZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29tbWFuZElkKFN0cmluZyBzZW5zb3JJZCwgU3RyaW5nIGNvbW1hbmRJZCkgewotICAgICAgICByZXR1cm4gc2Vuc29ySWQgKyAiLiIgKyBjb21tYW5kSWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEV4dHJhY3QgYSBzaW1wbGUgc3RyaW5nIHZhbHVlZCBjb21tYW5kIGFyZyAKLSAgICAgKiBmcm9tIGEge0BsaW5rIE1xdHREZXZpY2UjY29tbWFuZHMoU3RyaW5nLi4uKX0gcmV0dXJuZWQKLSAgICAgKiBKc29uT2JqZWN0IHR1cGxlLgotICAgICAqIDxwPgotICAgICAqIEludGVycHJldCB0aGUgSnNvbk9iamVjdCdzIGVtYmVkZGVkIHBheWxvYWQgYXMgYSBKc29uT2JqZWN0IHdpdGggYSBzaW5nbGUKLSAgICAgKiAidmFsdWUiIHByb3BlcnR5LgotICAgICAqIEBwYXJhbSBqbyB0aGUgY29tbWFuZCB0dXBsZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kJ3MgYXJndW1lbnQgdmFsdWUgCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21tYW5kVmFsdWVTdHJpbmcoSnNvbk9iamVjdCBqbykgewotICAgICAgICByZXR1cm4gam8uZ2V0KENNRF9QQVlMT0FEKS5nZXRBc0pzb25PYmplY3QoKS5nZXQoInZhbHVlIikuZ2V0QXNTdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9tcXR0L0RldmljZUNvbW1zQXBwLmphdmEgYi9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvbXF0dC9EZXZpY2VDb21tc0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGRlYWE0Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9tcXR0L0RldmljZUNvbW1zQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5tcXR0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5pb3QuUW9TOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMubXF0dC5NcXR0U3RyZWFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5Lmpzb24uSnNvbkZ1bmN0aW9uczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwotCi0vKioKLSAqIEFuIE1RVFQgRGV2aWNlIENvbW11bmljYXRpb25zIGNsaWVudCBmb3Igd2F0Y2hpbmcgZGV2aWNlIGV2ZW50cwotICogYW5kIHNlbmRpbmcgY29tbWFuZHMuCi0gKiA8cD4KLSAqIFRoaXMgaXMgYW4gImFwcGxpY2F0aW9uIHByb3BlcnRpZXMiIGF3YXJlIGNsaWVudCB0aGF0IGdldHMgTVFUVCBjb25maWd1cmF0aW9uCi0gKiBmcm9tIGFuIEVkZ2VudCBzYW1wbGUgYXBwIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmaWxlLgotICogPHA+Ci0gKiBUaGlzIGNsaWVudCBhdm9pZHMgdGhlIG5lZWQgZm9yIG90aGVyIE1RVFQgY2xpZW50cyAoZS5nLiwgZnJvbSBhIG1vc3F1aXR0bwotICogaW5zdGFsbGF0aW9uKSB0byBvYnNlcnZlIGFuZCBjb250cm9sIHRoZSBhcHBsaWNhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXZpY2VDb21tc0FwcCBleHRlbmRzIEFic3RyYWN0TXF0dEFwcGxpY2F0aW9uIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdXNhZ2UgPSAiVXNhZ2U6IHdhdGNoIHwgc2VuZCA8Y21kTGFiZWw+IDxjbWRBcmc+IjsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1vZGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY21kTGFiZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY21kQXJnOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAxKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigibWlzc2luZyBwYXRobmFtZSB0byBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzIGZpbGUiKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBEZXZpY2VDb21tc0FwcCBhcHBsaWNhdGlvbiA9IG5ldyBEZXZpY2VDb21tc0FwcChhcmdzW2krK10pOwotICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBhcmdzW2krK107Ci0gICAgICAgICAgICBpZiAoISgid2F0Y2giLmVxdWFscyhtb2RlKSB8fCAic2VuZCIuZXF1YWxzKG1vZGUpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydCBtb2RlOiAiK2FwcGxpY2F0aW9uLm1vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBwbGljYXRpb24ubW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICBpZiAoYXBwbGljYXRpb24ubW9kZS5lcXVhbHMoInNlbmQiKSkgewotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLmNtZExhYmVsID0gYXJnc1tpKytdOwotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLmNtZEFyZyA9IGFyZ3NbaSsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICBhcHBsaWNhdGlvbi5ydW4oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICAgICAgICAgICsiXG4iK3VzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIHByb3BzUGF0aCBwYXRobmFtZSB0byBhbiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIERldmljZUNvbW1zQXBwKFN0cmluZyBwcm9wc1BhdGgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlcihwcm9wc1BhdGgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBidWlsZFRvcG9sb2d5KFRvcG9sb2d5IHQpIHsKLSAgICAgICAgbXF0dERldmljZSgpLmdldE1xdHRDb25maWcoKS5zZXRDbGllbnRJZChudWxsKTsKLSAgICAgICAgTXF0dFN0cmVhbXMgbXF0dCA9IG5ldyBNcXR0U3RyZWFtcyh0LCAoKSAtPiBtcXR0RGV2aWNlKCkuZ2V0TXF0dENvbmZpZygpKTsKLSAgICAgICAgaWYgKG1vZGUuZXF1YWxzKCJzZW5kIikpIHsKLSAgICAgICAgICAgIFN0cmluZyB0b3BpYyA9IG1xdHREZXZpY2UoKS5jb21tYW5kVG9waWMoY21kTGFiZWwpOwotICAgICAgICAgICAgSnNvbk9iamVjdCBqbyA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICBqby5hZGRQcm9wZXJ0eSgidmFsdWUiLCBjbWRBcmcpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQdWJsaXNoaW5nIGNvbW1hbmQ6IHRvcGljPSIrdG9waWMrIiAgdmFsdWU9Iitqbyk7Ci0gICAgICAgICAgICBUU3RyZWFtPFN0cmluZz4gY21kID0gdC5zdHJpbmdzKEpzb25GdW5jdGlvbnMuYXNTdHJpbmcoKS5hcHBseShqbykpOwotICAgICAgICAgICAgbXF0dC5wdWJsaXNoKGNtZCwgdG9waWMsIFFvUy5GSVJFX0FORF9GT1JHRVQsIGZhbHNlLypyZXRhaW4qLyk7Ci0gICAgICAgICAgICAvLyBIbW0uLi4gdGhlIHBhaG8gTVFUVCAqbm9uLWRhZW1vbiogdGhyZWFkcyBwcmV2ZW50IHRoZSBhcHAKLSAgICAgICAgICAgIC8vIGZyb20gZXhpdGluZyBhZnRlciByZXR1cm5pbmcgZnJvbSBtYWluKCkgZm9sbG93aW5nIGpvYiBzdWJtaXQoKS4KLSAgICAgICAgICAgIC8vIExhY2tpbmcgTXF0dFN0cmVhbXMuc2h1dGRvd24oKSBvciBzdWNoLi4uCi0gICAgICAgICAgICAvLyBEZWxheSBhIGJpdCBhbmQgdGhlbiBleHBsaWNpdGx5IGV4aXQoKS4gIFVnaC4KLSAgICAgICAgICAgIGNtZC5zaW5rKHR1cGxlIC0+IHsgCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMqMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOyB9KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtb2RlLmVxdWFscygid2F0Y2giKSkgewotICAgICAgICAgICAgU3RyaW5nIHRvcGljRmlsdGVyID0gbXF0dERldmljZSgpLmV2ZW50VG9waWMobnVsbCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldhdGNoaW5nIHRvcGljIGZpbHRlciAiK3RvcGljRmlsdGVyKTsKLSAgICAgICAgICAgIFRTdHJlYW08U3RyaW5nPiBldmVudHMgPSBtcXR0LnN1YnNjcmliZSh0b3BpY0ZpbHRlciwgUW9TLkZJUkVfQU5EX0ZPUkdFVCwKLSAgICAgICAgICAgICAgICAgICAgKHRvcGljLHBheWxvYWQpIC0+IHsgCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICJcbiMgdG9waWMgIit0b3BpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gIlxuIiArIG5ldyBTdHJpbmcocGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBldmVudHMucHJpbnQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9tcXR0L3BhY2thZ2UtaW5mby5qYXZhIGIvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL21xdHQvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NTk4Y2IuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL21xdHQvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS8qKgotICogQmFzZSBzdXBwb3J0IGZvciBFZGdlbnQgTVFUVCBiYXNlZCBhcHBsaWNhdGlvbiBzYW1wbGVzLgotICogPHA+Ci0gKiBUaGlzIHBhY2thZ2UgYnVpbGRzIG9uIHtAY29kZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHN9IHByb3ZpZGluZwotICogYWRkaXRpb25hbCBjb21tb24gY2FwYWJpbGl0aWVzIGluIHRoZSBhcmVhIG9mIE1RVFQgYmFzZWQgZGV2aWNlIGFwcGxpYXRpb25zLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5tcXR0OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9wYWNrYWdlLWluZm8uamF2YSBiL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MmJhMi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS8qKgotICogU3VwcG9ydCBmb3Igc29tZSBtb3JlIGNvbXBsZXggRWRnZW50IGFwcGxpY2F0aW9uIHNhbXBsZXMuCi0gKiA8cD4KLSAqIFRoaXMgcGFja2FnZSBwcm92aWRlcyBzb21lIGNvbW1vbmx5IG5lZWRlZCBjYXBhYmlsaXRpZXMgcGFydGljdWxhcmx5IGluCi0gKiB0aGUgYXJlYSBvZiBhbiBleHRlcm5hbCBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uIGluZmx1ZW5jZSBvbiB2YXJpb3VzCi0gKiB0aGluZ3MuCi0gKiA8cD4KLSAqIEZvY2FsIGFyZWFzOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuQWJzdHJhY3RBcHBsaWNhdGlvbn0gLSBhIGJhc2UgY2xhc3MgZm9yCi0gKiAgICAgRWRnZW50IGFwcGxpY2F0aW9ucyBwcm92aWRpbmcgY29tbW9ubHkgbmVlZGVkIGZlYXR1cmVzLgotICogICAgIDwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5Ub3BvbG9neVByb3ZpZGVyRmFjdG9yeX0gLSBhIGNvbmZpZ3VyYXRpb24KLSAqICAgICBkcml2ZW4gZmFjdG9yeSBmb3IgYW4gRWRnZW50IHRvcG9sb2d5IHByb3ZpZGVyLgotICogICAgIDwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5BcHBsaWNhdGlvblV0aWxpdGllc30gLSBzb21lCi0gKiAgICAgZ2VuZXJhbCBjb25maWd1cmF0aW9uIGRyaXZlbiB1dGlsaXRpZXMuIAotICogICAgIDwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5Kc29uVHVwbGVzfSAtIHV0aWxpdGllcyBmb3Igd3JhcHBpbmcKLSAqICAgICBzZW5zb3Igc2FtcGxlcyBpbiBhIEpzb25PYmplY3QgYW5kIG9wZXJhdGluZyBvbiBpdC4KLSAqICAgICA8L2xpPgotICogPC91bD4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL3NlbnNvckFuYWx5dGljcy9TZW5zb3IxLmphdmEgYi9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvc2Vuc29yQW5hbHl0aWNzL1NlbnNvcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhZDlmNC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvc2Vuc29yQW5hbHl0aWNzL1NlbnNvcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzLnNlbnNvckFuYWx5dGljczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuc3RhdC5TdGF0aXN0aWMuTUFYOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuc3RhdC5TdGF0aXN0aWMuTUVBTjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLnN0YXQuU3RhdGlzdGljLk1JTjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLnN0YXQuU3RhdGlzdGljLlNURERFVjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzLkpzb25UdXBsZXMuS0VZX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuSnNvblR1cGxlcy5LRVlfUkVBRElORzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzLkpzb25UdXBsZXMuS0VZX1RTOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tYXRoMy51dGlsLlBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMuUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMuUmFuZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90LlFvUzsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5TdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuSnNvblR1cGxlczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnV0aWxzLnNlbnNvci5QZXJpb2RpY1JhbmRvbVNlbnNvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LnBsdW1iaW5nLlBsdW1iaW5nU3RyZWFtczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uQXJyYXk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7Ci0KLS8qKgotICogQW5hbHl0aWNzIGZvciAiU2Vuc29yMSIuCi0gKiA8cD4KLSAqIFRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBzb21lIGNvbW1vbiBjb250aW51b3VzIHNlbnNvciBhbmFseXRpYyB0aGVtZXMuCi0gKiA8cD4KLSAqIEluIHRoaXMgY2FzZSB3ZSBoYXZlIGEgc2ltdWxhdGVkIHNlbnNvciBwcm9kdWNpbmcgMTAwMCBzYW1wbGVzIHBlciBzZWNvbmQKLSAqIG9mIGFuIGludGVnZXIgdHlwZSBpbiB0aGUgcmFuZ2Ugb2YgMC0yNTUuCi0gKiA8cD4KLSAqIFRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lIGNyZWF0ZWQgaXMgcm91Z2hseToKLSAqIDx1bD4KLSAqIDxsaT5CYXRjaGVkIERhdGEgUmVkdWN0aW9uIC0gcmVkdWNlIHRoZSBzZW5zb3IncyAxMDAwIHNhbXBsZXMgcGVyIHNlY29uZAotICogICAgIGRvd24gdG8gMSBzYW1wbGUgcGVyIHNlY29uZCBzaW1wbGUgc3RhdGlzdGljYWwgYWdncmVnYXRpb24gb2YgdGhlIHJlYWRpbmdzLgotICogICAgIDwvbGk+Ci0gKiA8bGk+Q29tcHV0ZSBoaXN0b3JpY2FsIGluZm9ybWF0aW9uIC0gZWFjaCAxaHogc2FtcGxlIGlzIGF1Z21lbnRlZAotICogICAgIHdpdGggYSAzMCBzZWNvbmQgdHJhaWxpbmcgYXZlcmFnZSBvZiB0aGUgMWh6IHJlYWRpbmdzLgotICogICAgIDwvbGk+Ci0gKiA8bGk+VGhyZXNob2xkIGRldGVjdGlvbiAtIGVhY2ggMWh6IHNhbXBsZSdzIHZhbHVlIGlzIGNvbXBhcmVkCi0gKiAgICAgYWdhaW5zdCBhIHRhcmdldCByYW5nZSBhbmQgb3V0bGllcnMgYXJlIGlkZW50aWZpZWQuCi0gKiAgICAgPC9saT4KLSAqIDxsaT5Mb2NhbCBsb2dnaW5nIC0gb3V0bGllcnMgYXJlIGxvZ2dlZCB0byBhIGxvY2FsIGZpbGUKLSAqICAgICA8L2xpPgotICogPGxpPlB1Ymxpc2hpbmcgcmVzdWx0cyB0byBhIE1RVFQgYnJva2VyOgotICogICAgIDx1bD4KLSAqICAgICA8bGk+d2hlbiBlbmFibGVkLCBpbnZkaXZpZHVhbCBvdXRsaWVycyBhcmUgcHVibGlzaGVkLjwvbGk+Ci0gKiAgICAgPGxpPkV2ZXJ5IDMwIHNlY29uZHMgYSBsaXN0IG9mIHRoZSBsYXN0IDEwIG91dGxpZXJzIGlzIHB1Ymxpc2hlZC48L2xpPgotICogICAgIDwvdWw+Ci0gKiAgICAgPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoZSBzYW1wbGUgYWxzbyBkZW1vbnN0cmF0ZXM6Ci0gKiA8dWw+Ci0gKiA8bGk+RHluYW1pYyBjb25maWd1cmF0aW9uIGNvbnRyb2wgLSBzdWJzY3JpYmUgdG8gYSBNUVRUIGJyb2tlcgotICogICAgIHRvIHJlY2VpdmUgY29tbWFuZHMgdG8gYWRqdXN0IHRoZSB0aHJlc2hvbGQgZGV0ZWN0aW9uIHJhbmdlIHZhbHVlLiAKLSAqICAgICA8L2xpPgotICogPGxpPkdlbmVyYWxseSwgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb2Nlc3NpbmcgaXMgZHJpdmVuIHZpYSBhbgotICogICAgIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb24uCi0gKiAgICAgPC9saT4KLSAqIDxsaT5Db25kaXRpb25hbCBzdHJlYW0gdHJhY2luZyAtIGNvbmZpZ3VyYXRpb24gY29udHJvbGxlZCBpbmNsdXNpb24gb2YgdHJhY2luZy4KLSAqICAgICA8L2xpPgotICogPGxpPlVzZSBvZiB7QGxpbmsgVFN0cmVhbSN0YWcoU3RyaW5nLi4uKX0gdG8gaW1wcm92ZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQotICogICAgIHRoZSBFZGdlbnQgRGV2ZWxvcG1lbnRQcm92aWRlciBjb25zb2xlLjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgU2Vuc29yMSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZW5zb3JBbmFseXRpY3NBcHBsaWNhdGlvbiBhcHA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUb3BvbG9neSB0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlbnNvcklkID0gInNlbnNvcjEiOwotCi0gICAgcHVibGljIFNlbnNvcjEoVG9wb2xvZ3kgdCwgU2Vuc29yQW5hbHl0aWNzQXBwbGljYXRpb24gYXBwKSB7Ci0gICAgICAgIHRoaXMudCA9IHQ7Ci0gICAgICAgIHRoaXMuYXBwID0gYXBwOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIHNlbnNvcidzIGFuYWx5dGljcyB0byB0aGUgdG9wb2xvZ3kuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQW5hbHl0aWNzKCkgewotCi0gICAgICAgIC8vIE5lZWQgc3luY2hyb25pemF0aW9uIGZvciBzZXQvZ2V0IG9mIGR5bmFtaWNhbGx5IGNoYW5nZWFibGUgdmFsdWVzLgotICAgICAgICBBdG9taWNSZWZlcmVuY2U8UmFuZ2U8SW50ZWdlcj4+IHJhbmdlID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7Ci0gICAgICAgIEF0b21pY1JlZmVyZW5jZTxCb29sZWFuPiBpc1B1Ymxpc2gxaHpPdXRzaWRlUmFuZ2UgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGNvbnRyb2xzCi0gICAgICAgIHJhbmdlLnNldChhcHAudXRpbHMoKS5nZXRSYW5nZUludGVnZXIoc2Vuc29ySWQsICJvdXRzaWRlMWh6TWVhblJhbmdlIikpOwotICAgICAgICBpc1B1Ymxpc2gxaHpPdXRzaWRlUmFuZ2Uuc2V0KGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEhhbmRsZSB0aGUgc2Vuc29yJ3MgZGV2aWNlIGNvbW1hbmRzCi0gICAgICAgIGFwcC5tcXR0RGV2aWNlKCkuY29tbWFuZHMoY29tbWFuZElkKCJzZXQxaHpNZWFuUmFuZ2VUaHJlc2hvbGQiKSkKLSAgICAgICAgICAgIC50YWcoY29tbWFuZElkKCJzZXQxaHpNZWFuUmFuZ2VUaHJlc2hvbGRDbWQiKSkKLSAgICAgICAgICAgIC5zaW5rKGpvIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2U8SW50ZWdlcj4gbmV3UmFuZ2UgPSBSYW5nZXMudmFsdWVPZkludGVnZXIoZ2V0Q29tbWFuZFZhbHVlKGpvKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT0gQ2hhbmdpbmcgcmFuZ2UgdG8gIituZXdSYW5nZSsiID09PT09PSIpOwotICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXQobmV3UmFuZ2UpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBhcHAubXF0dERldmljZSgpLmNvbW1hbmRzKGNvbW1hbmRJZCgic2V0UHVibGlzaDFoek91dHNpZGVSYW5nZSIpKQotICAgICAgICAgICAgLnRhZyhjb21tYW5kSWQoInNldFB1Ymxpc2gxaHpPdXRzaWRlUmFuZ2VDbWQiKSkKLSAgICAgICAgICAgIC5zaW5rKGpvIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBiID0gbmV3IEJvb2xlYW4oZ2V0Q29tbWFuZFZhbHVlKGpvKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT0gQ2hhbmdpbmcgaXNQdWJsaXNoMWh6T3V0c2lkZVJhbmdlIHRvICIrYisiID09PT09PSIpOwotICAgICAgICAgICAgICAgICAgICBpc1B1Ymxpc2gxaHpPdXRzaWRlUmFuZ2Uuc2V0KGIpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgcmF3IHNpbXVsYXRlZCBzZW5zb3Igc3RyZWFtIG9mIDEwMDAgdHVwbGVzL3NlYy4KLSAgICAgICAgLy8gRWFjaCB0dXBsZSBpcyBQYWlyPExvbmcgdGltZXN0YW1wTXNlYywgc2Vuc29yLXJlYWRpbmcgKDAuLjI1NSk+LgotICAgICAgICBQZXJpb2RpY1JhbmRvbVNlbnNvciBzaW11bGF0ZWRTZW5zb3JGYWN0b3J5ID0gbmV3IFBlcmlvZGljUmFuZG9tU2Vuc29yKCk7Ci0gICAgICAgIFRTdHJlYW08UGFpcjxMb25nLEludGVnZXI+PiByYXcxa2h6ID0gCi0gICAgICAgICAgICAgICAgc2ltdWxhdGVkU2Vuc29yRmFjdG9yeS5uZXdJbnRlZ2VyKHQsIDEvKnBlcmlvZE1zZWMqLywgMjU1KQotICAgICAgICAgICAgICAgIC50YWcoInJhdzFraHoiKTsKLSAgICAgICAgdHJhY2VTdHJlYW0ocmF3MWtoeiwgInJhdzFraHoiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdyYXAgdGhlIHJhdyBzZW5zb3IgcmVhZGluZyBpbiBhIEpzb25PYmplY3QgZm9yIGNvbnZlbmllbmNlLgotICAgICAgICBUU3RyZWFtPEpzb25PYmplY3Q+IGoxa2h6ID0gSnNvblR1cGxlcy53cmFwKHJhdzFraHosIHNlbnNvcklkKQotICAgICAgICAgICAgICAgIC50YWcoImoxa2h6Iik7Ci0gICAgICAgIHRyYWNlU3RyZWFtKGoxa2h6LCAiajFraHoiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERhdGEtcmVkdWN0aW9uOiByZWR1Y2UgMWtoeiBzYW1wbGVzIGRvd24gdG8KLSAgICAgICAgLy8gMWh6IGFnZ3JlZ2F0ZSBzdGF0aXN0aWNzIHNhbXBsZXMuCi0gICAgICAgIFRTdHJlYW08SnNvbk9iamVjdD4gajFoelN0YXRzID0gajFraHoubGFzdCgxMDAwLCBKc29uVHVwbGVzLmtleUZuKCkpCi0gICAgICAgICAgICAgICAgLmJhdGNoKEpzb25UdXBsZXMuc3RhdGlzdGljcyhNSU4sIE1BWCwgTUVBTiwgU1REREVWKSkKLSAgICAgICAgICAgICAgICAudGFnKCIxaHpTdGF0cyIpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgMzAgc2Vjb25kIHNsaWRpbmcgd2luZG93IG9mIGF2ZXJhZ2UgdHJhaWxpbmcgTWVhbiB2YWx1ZXMKLSAgICAgICAgLy8gYW5kIGVucmljaCBzYW1wbGVzIHdpdGggdGhhdCBpbmZvcm1hdGlvbi4KLSAgICAgICAgajFoelN0YXRzID0gajFoelN0YXRzLmxhc3QoMzAsIEpzb25UdXBsZXMua2V5Rm4oKSkuYWdncmVnYXRlKAotICAgICAgICAgICAgKHNhbXBsZXMsIGtleSkgLT4gewotICAgICAgICAgICAgICAgIC8vIGVucmljaCBhbmQgcmV0dXJuIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIHR1cGxlCi0gICAgICAgICAgICAgICAgSnNvbk9iamVjdCBqbyA9IHNhbXBsZXMuZ2V0KHNhbXBsZXMuc2l6ZSgpLTEpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBtZWFuU3VtID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKEpzb25PYmplY3QganMgOiBzYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lYW5TdW0gKz0gSnNvblR1cGxlcy5nZXRTdGF0aXN0aWMoanMsIE1FQU4pLmdldEFzRG91YmxlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGpvLmFkZFByb3BlcnR5KCJBdmdUcmFpbGluZ01lYW4iLCBNYXRoLnJvdW5kKG1lYW5TdW0gLyBzYW1wbGVzLnNpemUoKSkpOwotICAgICAgICAgICAgICAgIGpvLmFkZFByb3BlcnR5KCJBdmdUcmFpbGluZ01lYW5DbnQiLCBzYW1wbGVzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGpvOwotICAgICAgICAgICAgfSkKLSAgICAgICAgICAgIC50YWcoIjFoelN0YXRzLmVucmljaGVkIik7Ci0gICAgICAgIHRyYWNlU3RyZWFtKGoxaHpTdGF0cywgImoxaHpTdGF0cyIpOwotCi0gICAgICAgIC8vIERldGVjdCAxaHogc2FtcGxlcyB3aG9zZSBNRUFOIHZhbHVlIGFyZQotICAgICAgICAvLyBvdXRzaWRlIHRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmllZCByYW5nZS4KLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBvdXRzaWRlMWh6TWVhblJhbmdlID0gajFoelN0YXRzLmZpbHRlcigKLSAgICAgICAgICAgICAgICBzYW1wbGUgLT4gewotICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBKc29uVHVwbGVzLmdldFN0YXRpc3RpYyhzYW1wbGUsIE1FQU4pLmdldEFzSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAhcmFuZ2UuZ2V0KCkuY29udGFpbnModmFsdWUpOwotICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgLnRhZygib3V0c2lkZTFoek1lYW5SYW5nZSIpOwotICAgICAgICB0cmFjZVN0cmVhbShvdXRzaWRlMWh6TWVhblJhbmdlLCAoKSAtPiAib3V0c2lkZTFoek1lYW5SYW5nZSIrcmFuZ2UuZ2V0KCkpOyAKLSAgICAgICAgCi0gICAgICAgIC8vIExvZyBldmVyeSBvdXRzaWRlMWh6TWVhblJhbmdlIGV2ZW50Ci0gICAgICAgIGFwcC51dGlscygpLmxvZ1N0cmVhbShvdXRzaWRlMWh6TWVhblJhbmdlLCAiQUxFUlQiLCAib3V0c2lkZTFoek1lYW5SYW5nZSIpOwotICAgICAgICAKLSAgICAgICAgLy8gQ29uZGl0aW9uYWxseSBwdWJsaXNoIGV2ZXJ5IG91dHNpZGUxaHpNZWFuUmFuZ2UgZXZlbnQuCi0gICAgICAgIC8vIFVzZSBhIHByZXNzdXJlUmVsaWV2ZXIgdG8gcHJldmVudCBiYWNrcHJlc3N1cmUgaWYgdGhlIGJyb2tlcgotICAgICAgICAvLyBjYW4ndCBiZSBjb250YWN0ZWQuCi0gICAgICAgIC8vIFRPRE8gZW5oYW5jZSBNcXR0RGV2aWNlIHdpdGggY29uZmlndXJhYmxlIHJlbGlldmVyLiAKLSAgICAgICAgYXBwLm1xdHREZXZpY2UoKS5ldmVudHMoCi0gICAgICAgICAgICAgICAgUGx1bWJpbmdTdHJlYW1zLnByZXNzdXJlUmVsaWV2ZXIoCi0gICAgICAgICAgICAgICAgICAgIG91dHNpZGUxaHpNZWFuUmFuZ2UuZmlsdGVyKHR1cGxlIC0+IGlzUHVibGlzaDFoek91dHNpZGVSYW5nZS5nZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YWcoIm91dHNpZGUxaHpNZWFuUmFuZ2VFdmVudC5jb25kaXRpb25hbCIpLAotICAgICAgICAgICAgICAgICAgICB0dXBsZSAtPiAwLCAzMCkudGFnKCJvdXRzaWRlMWh6TWVhblJhbmdlRXZlbnQucHJlc3N1cmVSZWxpZXZlZCIpLAotICAgICAgICAgICAgICAgIGFwcC5zZW5zb3JFdmVudElkKHNlbnNvcklkLCAib3V0c2lkZTFoek1lYW5SYW5nZUV2ZW50IiksIFFvUy5GSVJFX0FORF9GT1JHRVQpOwotICAgICAgICAKLSAgICAgICAgLy8gRGVtb25zdHJhdGUgcGVyaW9kaWMgcHVibGlzaGluZyBvZiBhIHNsaWRpbmcgd2luZG93IGlmCi0gICAgICAgIC8vIHNvbWV0aGluZyBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBsYXN0IHB1Ymxpc2hlZC4KLSAgICAgICAgcGVyaW9kaWNhbGx5UHVibGlzaExhc3ROSW5mbyhvdXRzaWRlMWh6TWVhblJhbmdlLCAxMCwgMzAsCi0gICAgICAgICAgICAgICAgInBlcmlvZGljTGFzdE91dHNpZGVSYW5nZUV2ZW50Iik7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIGhpc3RvZ3JhbTogI2FsZXJ0cyBvdmVyIHRoZSBsYXN0IDhocgotCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmlvZGljYWxseSBwdWJsaXNoIHRoZSBsYXN0TiBvbiBhIHN0cmVhbS4KLSAgICAgKiBAcGFyYW0gc3RyZWFtIHR1cGxlcyB0byAKLSAgICAgKiBAcGFyYW0gY291bnQgc2xpZGluZyB3aW5kb3cgc2l6ZSAibGFzdE4iCi0gICAgICogQHBhcmFtIG5TZWMgcHVibGlzaCBmcmVxdWVuY3kKLSAgICAgKiBAcGFyYW0gZXZlbnQgc2Vuc29yJ3MgcHVibGlzaCBldmVudCBsYWJlbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwZXJpb2RpY2FsbHlQdWJsaXNoTGFzdE5JbmZvKFRTdHJlYW08SnNvbk9iamVjdD4gc3RyZWFtLCAKLSAgICAgICAgICAgIGludCBjb3VudCwgaW50IG5TZWMsIFN0cmluZyBldmVudCkgewotCi0gICAgICAgIC8vIERlbW9uc3RyYXRlIHBlcmlvZGljIHB1Ymxpc2hpbmcgb2YgYSBzbGlkaW5nIHdpbmRvdyBpZgotICAgICAgICAvLyBzb21ldGhpbmcgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBwdWJsaXNoZWQuCi0KLSAgICAgICAgLy8gTWFpbnRhaW4gYSBzbGlkaW5nIHdpbmRvdyBvZiB0aGUgbGFzdCBOIHR1cGxlcy4KLSAgICAgICAgLy8gVE9ETyB0b2RheSwgd2luZG93cyBkb24ndCBwcm92aWRlICJhbnl0aW1lIiBhY2Nlc3MgdG8gdGhlaXIgY29sbGVjdGlvbgotICAgICAgICAvLyBzbyBtYWludGFpbiBvdXIgb3duIGN1cnJlbnQgY29weSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdlIGNhbgotICAgICAgICAvLyBhY2Nlc3MgaXQgd2hlbiBuZWVkZWQuCi0gICAgICAgIC8vIAotICAgICAgICBMaXN0PEpzb25PYmplY3Q+IGxhc3ROID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PD4oKSk7Ci0gICAgICAgIHN0cmVhbS5sYXN0KGNvdW50LCBKc29uVHVwbGVzLmtleUZuKCkpCi0gICAgICAgICAgICAuYWdncmVnYXRlKChzYW1wbGVzLCBrZXkpIC0+IHNhbXBsZXMpCi0gICAgICAgICAgICAudGFnKGV2ZW50KyIubGFzdE4iKQotICAgICAgICAgICAgLnNpbmsoc2FtcGxlcyAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmUgdGhlIG5ldyBsaXN0L3dpbmRvdy4gIAotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobGFzdE4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0Ti5hZGRBbGwoc2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICAgICAgLy8gUHVibGlzaCB0aGUgbGFzdE4gKHdpdGggdHJpbW1lZCBkb3duIGluZm8pIGV2ZXJ5IG5TZWMgc2Vjb25kcwotICAgICAgICAvLyBpZiBhbnl0aGluZyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHB1Ymxpc2guCi0gICAgICAgIFRTdHJlYW08SnNvbk9iamVjdD4gcGVyaW9kaWNMYXN0TiA9IAotICAgICAgICAgICAgICAgIHQucG9sbCgoKSAtPiAxLCBuU2VjLCBUaW1lVW5pdC5TRUNPTkRTKS50YWcoZXZlbnQrIi50cmlnZ2VyIikKLSAgICAgICAgICAgICAgICAuZmlsdGVyKHRyaWdnZXIgLT4gIWxhc3ROLmlzRW1wdHkoKSkudGFnKGV2ZW50KyIuY2hhbmdlZCIpCi0gICAgICAgICAgICAgICAgLm1hcCh0cmlnZ2VyIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKGxhc3ROKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzaW5nbGUgSnNvbk9iamVjdCB3aXRoIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiByZWR1Y2VkLWNvbnRlbnQgc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICAgICAgSnNvbk9iamVjdCBqbyA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqby5hZGRQcm9wZXJ0eShLRVlfSUQsIHNlbnNvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvLmFkZFByb3BlcnR5KEtFWV9UUywgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgam8uYWRkUHJvcGVydHkoIndpbmRvdyIsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvLmFkZFByb3BlcnR5KCJwdWJGcmVxU2VjIiwgblNlYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKc29uQXJyYXkgamEgPSBuZXcgSnNvbkFycmF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqby5hZGQoImxhc3ROIiwgamEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChKc29uT2JqZWN0IGogOiBsYXN0TikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzb25PYmplY3Qgam8yID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYS5hZGQoam8yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbzIuYWRkKEtFWV9UUywgai5nZXQoS0VZX1RTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkdWNlIHNpemU6IGluY2x1ZGUgb25seSAyIHNpZ25pZmljYW50IGRpZ2l0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvMi5hZGRQcm9wZXJ0eShLRVlfUkVBRElORywgU3RyaW5nLmZvcm1hdCgiJS4yZiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uVHVwbGVzLmdldFN0YXRpc3RpYyhqLCBNRUFOKS5nZXRBc0RvdWJsZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0Ti5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAudGFnKGV2ZW50KTsKLQotICAgICAgICB0cmFjZVN0cmVhbShwZXJpb2RpY0xhc3ROLCBldmVudCk7Ci0KLSAgICAgICAgLy8gVXNlIGEgcHJlc3N1cmVSZWxpZXZlciB0byBwcmV2ZW50IGJhY2twcmVzc3VyZSBpZiB0aGUgYnJva2VyCi0gICAgICAgIC8vIGNhbid0IGJlIGNvbnRhY3RlZC4KLSAgICAgICAgLy8gVE9ETyBlbmhhbmNlIE1xdHREZXZpY2Ugd2l0aCBjb25maWd1cmFibGUgcmVsaWV2ZXIuIAotICAgICAgICBhcHAubXF0dERldmljZSgpLmV2ZW50cygKLSAgICAgICAgICAgICAgICBQbHVtYmluZ1N0cmVhbXMucHJlc3N1cmVSZWxpZXZlcihwZXJpb2RpY0xhc3ROLCB0dXBsZSAtPiAwLCAzMCkKLSAgICAgICAgICAgICAgICAgICAgLnRhZyhldmVudCsiLnByZXNzdXJlUmVsaWV2ZWQiKSwKLSAgICAgICAgICAgICAgICBhcHAuc2Vuc29yRXZlbnRJZChzZW5zb3JJZCwgZXZlbnQpLCBRb1MuRklSRV9BTkRfRk9SR0VUKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZElkKFN0cmluZyBjb21tYW5kSWQpIHsKLSAgICAgICAgcmV0dXJuIGFwcC5jb21tYW5kSWQoc2Vuc29ySWQsIGNvbW1hbmRJZCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldENvbW1hbmRWYWx1ZShKc29uT2JqZWN0IGpvKSB7Ci0gICAgICAgIHJldHVybiBhcHAuZ2V0Q29tbWFuZFZhbHVlU3RyaW5nKGpvKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSA8VD4gVFN0cmVhbTxUPiB0cmFjZVN0cmVhbShUU3RyZWFtPFQ+IHN0cmVhbSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiB0cmFjZVN0cmVhbShzdHJlYW0sICgpIC0+IGxhYmVsKTsgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgPFQ+IFRTdHJlYW08VD4gdHJhY2VTdHJlYW0oVFN0cmVhbTxUPiBzdHJlYW0sIFN1cHBsaWVyPFN0cmluZz4gbGFiZWwpIHsKLSAgICAgICAgcmV0dXJuIGFwcC51dGlscygpLnRyYWNlU3RyZWFtKHN0cmVhbSwgc2Vuc29ySWQsIGxhYmVsKTsgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL3NlbnNvckFuYWx5dGljcy9TZW5zb3JBbmFseXRpY3NBcHBsaWNhdGlvbi5qYXZhIGIvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL3NlbnNvckFuYWx5dGljcy9TZW5zb3JBbmFseXRpY3NBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFiZjk1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvYXBwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvYXBwcy9zZW5zb3JBbmFseXRpY3MvU2Vuc29yQW5hbHl0aWNzQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuc2Vuc29yQW5hbHl0aWNzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzLm1xdHQuQWJzdHJhY3RNcXR0QXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLS8qKgotICogQSBzYW1wbGUgYXBwbGljYXRpb24gZGVtb25zdHJhdGluZyBzb21lIGNvbW1vbiBzZW5zb3IgYW5hbHl0aWMgcHJvY2Vzc2luZwotICogdGhlbWVzLgotICovCi1wdWJsaWMgY2xhc3MgU2Vuc29yQW5hbHl0aWNzQXBwbGljYXRpb24gZXh0ZW5kcyBBYnN0cmFjdE1xdHRBcHBsaWNhdGlvbiB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigibWlzc2luZyBwYXRobmFtZSB0byBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzIGZpbGUiKTsKLSAgICAgICAgCi0gICAgICAgIFNlbnNvckFuYWx5dGljc0FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gbmV3IFNlbnNvckFuYWx5dGljc0FwcGxpY2F0aW9uKGFyZ3NbMF0pOwotICAgICAgICAKLSAgICAgICAgYXBwbGljYXRpb24ucnVuKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gcHJvcHNQYXRoIHBhdGhuYW1lIHRvIGFuIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgU2Vuc29yQW5hbHl0aWNzQXBwbGljYXRpb24oU3RyaW5nIHByb3BzUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHByb3BzUGF0aCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGJ1aWxkVG9wb2xvZ3koVG9wb2xvZ3kgdCkgewotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRoZSAic2Vuc29yMSIgYW5hbHl0aWNzIHRvIHRoZSB0b3BvbG9neQotICAgICAgICBuZXcgU2Vuc29yMSh0LCB0aGlzKS5hZGRBbmFseXRpY3MoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8gQWRkIHRoZSAic2Vuc29yMiIgYW5hbHl0aWNzIHRvIHRoZSB0b3BvbG9neQotICAgICAgICAvLyBUT0RPIEFkZCB0aGUgInNlbnNvcjMiIGFuYWx5dGljcyB0byB0aGUgdG9wb2xvZ3kKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvc2Vuc29yQW5hbHl0aWNzL3BhY2thZ2UtaW5mby5qYXZhIGIvc2FtcGxlcy9hcHBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9hcHBzL3NlbnNvckFuYWx5dGljcy9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlODJiNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2FwcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2FwcHMvc2Vuc29yQW5hbHl0aWNzL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLyoqCi0gKiBUaGUgU2Vuc29yIEFuYWx5dGljcyBzYW1wbGUgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIHNvbWUgY29tbW9uIAotICogY29udGludW91cyBzZW5zb3IgYW5hbHl0aWMgYXBwbGljYXRpb24gdGhlbWVzLgotICogU2VlIHtAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuc2Vuc29yQW5hbHl0aWNzLlNlbnNvcjEgU2Vuc29yMX0gZm9yIHRoZQotICogY29yZSBvZiB0aGUgYW5hbHl0aWNzIHByb2Nlc3NpbmcgYW5kICAKLSAqIHtAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuc2Vuc29yQW5hbHl0aWNzLlNlbnNvckFuYWx5dGljc0FwcGxpY2F0aW9uCi0gKiBTZW5zb3JBbmFseXRpY3NBcHBsaWNhdGlvbn0KLSAqIGZvciB0aGUgbWFpbiBwcm9ncmFtLgotICogPHA+Ci0gKiBUaGUgdGhlbWVzIGluY2x1ZGU6Ci0gKiA8dWw+Ci0gKiA8bGk+QmF0Y2hlZCBEYXRhIFJlZHVjdGlvbiAtIHJlZHVjaW5nIGhpZ2hlciBmcmVxdWVuY3kgc2Vuc29yIHJlYWRpbmcKLSAqICAgICBzYW1wbGVzIGRvd24gdG8gYSBsb3dlciBmcmVxdWVuY3kgdXNpbmcgc3RhdGlzdGljYWwgYWdncmVnYXRpb25zCi0gKiAgICAgb2YgdGhlIHJhdyByZWFkaW5ncy4KLSAqICAgICA8L2xpPgotICogPGxpPkNvbXB1dGluZyBjb250aW51b3VzIGhpc3RvcmljYWwgc3RhdGlzdGljcyBzdWNoIGFzIGEKLSAqICAgICAzMCBzZWNvbmQgdHJhaWxpbmcgYXZlcmFnZSBvZiBzZW5zb3IgcmVhZGluZ3MuCi0gKiAgICAgPC9saT4KLSAqIDxsaT5PdXRsaWVyIC8gdGhyZXNob2xkIGRldGVjdGlvbiBhZ2FpbnN0IGEgY29uZmlndXJhYmxlIHJhbmdlPC9saT4KLSAqIDxsaT5Mb2NhbCBsb2dnaW5nIG9mIHN0cmVhbSB0dXBsZXM8L2xpPgotICogPGxpPlB1Ymxpc2hpbmcgYW5hbHl0aWMgcmVzdWx0cyB0byBhbiBNUVRUIGJyb2tlcjwvbGk+Ci0gKiA8bGk+RHluYW1pYyBjb25maWd1cmF0aW9uIGNvbnRyb2wgLSBzdWJzY3JpYmluZyB0byBhIE1RVFQgYnJva2VyCi0gKiAgICAgdG8gcmVjZWl2ZSBjb21tYW5kcyB0byBhZGp1c3QgdGhlIHRocmVzaG9sZCBkZXRlY3Rpb24gcmFuZ2UgdmFsdWUuIAotICogICAgIDwvbGk+Ci0gKiA8bGk+R2VuZXJhbGx5LCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcHJvY2Vzc2luZyBpcyBkcml2ZW4gdmlhIGFuCi0gKiAgICAgZXh0ZXJuYWwgY29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbi4KLSAqICAgICA8L2xpPgotICogPGxpPkNvbmRpdGlvbmFsIHN0cmVhbSB0cmFjaW5nIC0gY29uZmlndXJhdGlvbiBjb250cm9sbGVkIGluY2x1c2lvbiBvZiB0cmFjaW5nLgotICogICAgIDwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiA8aDI+UHJlcmVxdWlzaXRlczo8L2gyPgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIGZvciBhIGxvY2FsIE1RVFQgYnJva2VyLgotICogQSBnb29kIHJlc291cmNlIGlzIDxhIGhyZWY9Imh0dHA6Ly9tb3NxdWl0dG8ub3JnIj5tb3NxdWl0dG8ub3JnPC9hPgotICogaWYgeW91IHdhbnQgdG8gZG93bmxvYWQgYW5kIHNldHVwIHlvdXIgb3duIE1RVFQgYnJva2VyLgotICogT3IgeW91IGNhbiB1c2Ugc29tZSBvdGhlciBicm9rZXIgYXZhaWxhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQuCi0gKiA8cD4KLSAqIEFsdGVybmF0aXZlbHksIHRoZXJlIGFyZSBzb21lIHB1YmxpYyBNUVRUIGJyb2tlcnMgYXZhaWxhYmxlIHRvIGV4cGVyaW1lbnQgd2l0aC4KLSAqIFRoZWlyIGF2YWlsYWJpbGl0eSBzdGF0dXMgaXNuJ3QgZ3VhcmFudGVlZC4gIElmIHlvdSdyZSB1bmFibGUgdG8gY29ubmVjdAotICogdG8gdGhlIGJyb2tlciwgaXQncyBsaWtlbHkgdGhhdCBpdCBpc24ndCB1cCBvciB5b3VyIGZpcmV3YWxscyBkb24ndAotICogYWxsb3cgeW91IHRvIGNvbm5lY3QuICBETyBOT1QgUFVCTElTSCBBTllUSElORyBTRU5TSVRJVkUgLSBhbnlvbmUKLSAqIGNhbiBiZSBsaXN0aW5nLiAgQSBjb3VwbGUgb2YgcHVibGljIGJyb2tlciBsb2NhdGlvbnMgYXJlIG5vdGVkCi0gKiBpbiB0aGUgYXBwbGljYXRpb24ncyBwcm9wZXJ0aWVzIGZpbGUuCi0gKiA8cD4KLSAqIFRoZSBkZWZhdWx0IHtAY29kZSBtcXR0RGV2aWNlLnRvcGljLnByZWZpeH0gdmFsdWUsIHVzZWQgYnkgZGVmYXVsdCBpbiAKLSAqIGdlbmVyYXRlZCBNUVRUIHRvcGljIHZhbHVlcyBhbmQgTVFUVCBjbGllbnRJZCwgY29udGFpbnMgdGhlIHVzZXIncwotICogbG9jYWwgbG9naW4gaWQuICBUaGUgU2Vuc29yQW5hbHl0aWNzIHNhbXBsZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGFueQotICogb3RoZXIgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLgotICogPHA+Ci0gKiBFZGl0IHtAY29kZSA8ZWRnZW50LXJlbGVhc2U+L2phdmE4L3NjcmlwdHMvYXBwcy9zZW5zb3JBbmFseXRpY3Mvc2Vuc29yYW5hbHl0aWNzLnByb3BlcnRpZXN9Ci0gKiB0byBjaGFuZ2UgdGhlIGJyb2tlciBsb2NhdGlvbiBvciB0b3BpYyBwcmVmaXguCi0gKiAKLSAqIDxoMj5BcHBsaWNhdGlvbiBvdXRwdXQ6PC9oMj4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIHBlcmlvZGljYWxseSAoZXZlcnkgMzBzZWMpLCBwdWJsaXNoZXMgYSBsaXN0IG9mCi0gKiB0aGUgbGFzdCAxMCBvdXRsaWVycyB0byBNUVRULiAgV2hlbiBlbmFibGVkLCBpdCBhbHNvIHB1Ymxpc2hlcyAKLSAqIGZ1bGwgZGV0YWlscyBvZiBpbmRpdmlkdWFsIG91dGxpZXJzIGFzIHRoZXkgb2NjdXIuCi0gKiBJdCBhbHNvIHN1YnNjcmliZXMgdG8gTVFUVCB0b3BpY3MgZm9yIGNvbW1hbmRzIHRvIGR5bmFtaWNhbGx5IGNoYW5nZSB0aGUKLSAqIHRocmVzaG9sZCByYW5nZSBhbmQgd2hldGhlciB0byBwdWJsaXNoIGluZGl2aWR1YWwgb3V0bGllcnMuCi0gKiA8cD4KLSAqIEFsbCBNUVRUIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0b3BpYyBwYXR0ZXJucywKLSAqIGFyZSBpbiB0aGUgYXBwbGljYXRpb24ucHJvcGVydGllcyBmaWxlLgotICogPHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gbG9ncyBvdXRsaWVyIGV2ZW50cyBpbiBsb2NhbCBmaWxlcy4gIFRoZSBhY3R1YWwgbG9jYXRpb24KLSAqIGlzIHNwZWNpZmllZCBpbiB0aGUgYXBwbGljYXRpb24ucHJvcGVydGllcyBmaWxlLgotICogPHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gZ2VuZXJhdGVzIHNvbWUgb3V0cHV0IG9uIHN0ZG91dCBhbmQgc3RkZXJyLgotICogVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzOgotICogPHVsPgotICogPGxpPk1RVFQgZGV2aWNlIGluZm8uIExpbmVzIDEgdGhyb3VnaCA1IGluIHRoZSBzYW1wbGUgY29uc29sZSBvdXRwdXQgYmVsb3cuPC9saT4KLSAqIDxsaT5VUkwgZm9yIHRoZSBFZGdlbnQgZGV2ZWxvcG1lbnQgY29uc29sZS4gIExpbmUgNi48L2xpPgotICogPGxpPlRyYWNlIG9mIHRoZSBvdXRsaWVyIGV2ZW50IHN0cmVhbS4gTGluZSA3LgotICogICAgIFRoZSBvdXRwdXQgaXMgYSBsYWJlbCwgd2hpY2ggaW5jbHVkZXMgdGhlIGFjdGl2ZSB0aHJlc2hvbGQgcmFuZ2UsCi0gKiAgICAgZm9sbG93ZWQgYnkgdGhlIGV2ZW50J3MgSlNPTi4KLSAqICAgICBUaGVzZSBhcmUgdGhlIGV2ZW50cyB0aGF0IHdpbGwgYWxzbyBiZSBsb2dnZWQgYW5kIGNvbmRpdGlvbmFsbHkgcHVibGlzaGVkCi0gKiAgICAgYXMgd2VsbCBhcyBpbmNsdWRlZCBpbiB0aGUgcGVyaW9kaWMgbGFzdE4gaW5mbyBwdWJsaXNoZWQgZXZlcnkgMzBzZWMuCi0gKiAgICAgPC9saT4KLSAqIDxsaT5Bbm5vdW5jZW1lbnQgd2hlbiBhICJjaGFuZ2UgdGhyZXNob2xkIiBvciAiZW5hYmxlIHB1Ymxpc2ggb2YgMWtoeiBvdXRsaWVycyIKLSAqICAgICBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQuCi0gKiAgICAgTGluZSA4IGFuZCA5LiAKLSAqICAgICA8L2xpPgotICogPGxpPkF0IHRoaXMgdGltZSBzb21lIElORk8gdHJhY2Ugb3V0cHV0IGZyb20gdGhlIE1RVFQgY29ubmVjdG9yPC9saT4KLSAqIDxsaT5BdCB0aGlzIHRpbWUgc29tZSBJTkZPIHRyYWNlIG91dHB1dCBmcm9tIHRoZSBGaWxlIGNvbm5lY3RvcjwvbGk+Ci0gKiA8L3VsPgotICogU2FtcGxlIGNvbnNvbGUgb3V0cHV0OgotICogPHByZT57QGNvZGUKLSAqIFsxXSBNcXR0RGV2aWNlIHNlcnZlclVSTHMgW3RjcDovL2xvY2FsaG9zdDoxODgzXQotICogWzJdIE1xdHREZXZpY2UgY2xpZW50SWQgaWQvMDEyMzQ1Ci0gKiBbM10gTXF0dERldmljZSBkZXZpY2VJZCAwMTIzNDUKLSAqIFs0XSBNcXR0RGV2aWNlIGV2ZW50IHRvcGljIHBhdHRlcm4gaWQvMDEyMzQ1L2V2dC8rL2ZtdC9qc29uCi0gKiBbNV0gTXF0dERldmljZSBjb21tYW5kIHRvcGljIHBhdHRlcm4gaWQvMDEyMzQ1L2NtZC8rL2ZtdC9qc29uCi0gKiBbNl0gRWRnZW50IENvbnNvbGUgVVJMIGZvciB0aGUgam9iOiBodHRwOi8vbG9jYWxob3N0OjU3MzI0L2NvbnNvbGUKLSAqIFs3XSBzZW5zb3IxLm91dHNpZGUxaHpNZWFuUmFuZ2VbMTI0Li4xMjldOiB7ImlkIjoic2Vuc29yMSIsInJlYWRpbmciOnsiTiI6MTAwMCwiTUlOIjowLjAsIk1BWCI6MjU0LjAsIk1FQU4iOjEzMC4yMzIwMDAwMDAwMDAwNiwiU1REREVWIjo3NS41NTM1NDczMzI0MzUxfSwibXNlYyI6MTQ1NDYyMzg3NDQwOCwiYWdnLmJlZ2luLm1zZWMiOjE0NTQ2MjM4NzM0MTAsImFnZy5jb3VudCI6MTAwMCwiQXZnVHJhaWxpbmdNZWFuIjoxMjgsIkF2Z1RyYWlsaW5nTWVhbkNudCI6NH0KLSAqIC4uLgotICogWzhdID09PT09IENoYW5naW5nIHJhbmdlIHRvIFsxMjUuLjEyN10gPT09PT09Ci0gKiBzZW5zb3IxLm91dHNpZGUxaHpNZWFuUmFuZ2VbMTI1Li4xMjddOiB7ImlkIjoic2Vuc29yMSIsInJlYWRpbmciOnsiTiI6MTAwMCwiTUlOIjowLjAsIk1BWCI6MjU0LjAsIk1FQU4iOjEyOS4wMDA5OTk5OTk5OTk3OCwiU1REREVWIjo3NC4zMDc2MDgwODcwNTY3fSwibXNlYyI6MTQ1NDYyNDE0MjQxOSwiYWdnLmJlZ2luLm1zZWMiOjE0NTQ2MjQxNDE0MjAsImFnZy5jb3VudCI6MTAwMCwiQXZnVHJhaWxpbmdNZWFuIjoxMjcsIkF2Z1RyYWlsaW5nTWVhbkNudCI6MzB9Ci0gKiBbOV0gPT09PT0gQ2hhbmdpbmcgaXNQdWJsaXNoMWh6T3V0c2lkZVJhbmdlIHRvIHRydWUgPT09PT09Ci0gKiAuLi4KLSAqIH08L3ByZT4KLSAqIAotICogPGgyPlJ1bm5pbmcsIG9ic2VydmluZyBhbmQgY29udHJvbGxpbmcgdGhlIGFwcGxpY2F0aW9uOjwvaDI+Ci0gKiA8cHJlPntAY29kZQotICogJCAuL3J1blNlbnNvckFuYWx5dGljcy5zaAotICogfTwvcHJlPgotICogPHA+Ci0gKiBUbyBvYnNlcnZlIHRoZSBsb2NhbGx5IGxvZ2dlZCBvdXRsaWVyIGV2ZW50czoKLSAqIDxwcmU+e0Bjb2RlCi0gKiAkIHRhaWwgLWYgL3RtcC9TZW5zb3JBbmFseXRpY3MvbG9ncy8ub3V0c2lkZTFoek1lYW5SYW5nZQotICogfTwvcHJlPgotICogPHA+Ci0gKiBUbyBvYnNlcnZlIHRoZSBldmVudHMgdGhhdCBhcmUgZ2V0dGluZyBwdWJsaXNoZWQgdG8gTVFUVDoKLSAqIDxwcmU+e0Bjb2RlCi0gKiAkIC4vcnVuRGV2aWNlQ29tbXMuc2ggd2F0Y2gKLSAqIH08L3ByZT4KLSAqIDxwPgotICogVG8gY2hhbmdlIHRoZSBvdXRsaWVyIHRocmVzaG9sZCBzZXR0aW5nOgotICogPGJyPlRoZSBjb21tYW5kIHZhbHVlIGlzIHRoZSBuZXcgcmFuZ2Ugc3RyaW5nOiB7QGNvZGUgWzxsb3dlckJvdW5kPi4uPHVwcGVyQm91bmQ+XX0uCi0gKiA8cHJlPntAY29kZQotICogJCAuL3J1bkRldmljZUNvbW1zLnNoIHNlbmQgc2Vuc29yMS5zZXQxaHpNZWFuUmFuZ2VUaHJlc2hvbGQgIlsxMjUuLjEyN10iCi0gKiB9PC9wcmU+Ci0gKiA8cD4KLSAqIFRvIGNoYW5nZSB0aGUgInB1Ymxpc2ggaW5kaXZpZHVhbCAxaHogb3V0bGllcnMiIGNvbnRyb2w6Ci0gKiA8cHJlPntAY29kZQotICogJCAuL3J1bkRldmljZUNvbW1zLnNoIHNlbmQgc2Vuc29yMS5zZXRQdWJsaXNoMWh6T3V0c2lkZVJhbmdlIHRydWUKLSAqIH08L3ByZT4KLSAqIAotICogPGgzPkFsdGVybmF0aXZlIE1RVFQgY2xpZW50czwvaDM+Ci0gKiBZb3UgY2FuIHVzZSBhbnkgTVFUVCBjbGllbnQgYnV0IHlvdSB3aWxsIGhhdmUgdG8gc3BlY2lmeSB0aGUgCi0gKiBNUVRUIHNlcnZlciwgdGhlIGV2ZW50IHRvcGljcyB0byB3YXRjaCAvIHN1YnNjcmliZSB0bywgYW5kIHRoZSBjb21tYW5kIHRvcGljcwotICogYW5kIEpTT04gZm9yIHB1Ymxpc2ggY29tbWFuZHMuICBUaGUgTXF0dERldmljZSBvdXRwdXQgYWJvdmUgcHJvdmlkZXMgbW9zdAotICogb2YgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4KLSAqIDxwPgotICogRm9yIGV4YW1wbGUsIHRoZSB7QGNvZGUgbW9zcXVpdHRvX3B1Yn0gYW5kCi0gKiB7QGNvZGUgbW9zcXVpdHRvX3N1Yn0gY29tbWFuZHMgZXF1aXZhbGVudCB0byB0aGUgYWJvdmUgcnVuRGV2aWNlQ29tbXMuc2gKLSAqIGNvbW1hbmRzIGFyZToKLSAqIDxwcmU+e0Bjb2RlCi0gKiAjIFdhdGNoIHRoZSBkZXZpY2UncyBldmVudCB0b3BpY3MKLSAqICQgL3Vzci9sb2NhbC9iaW4vbW9zcXVpdHRvX3N1YiAtdCBpZC8wMTIzNDUvZXZ0LysvZm10L2pzb24KLSAqICMgY2hhbmdlIHRoZSBvdXRsaWVyIHRocmVzaG9sZCBzZXR0aW5nCi0gKiAkIC91c3IvbG9jYWwvYmluL21vc3F1aXR0b19wdWIgLW0gJ3sidmFsdWUiOiJbMTI1Li4xMjddIn0nIC10IGlkLzAxMjM0NS9jbWQvc2Vuc29yMS5zZXQxaHpNZWFuUmFuZ2VUaHJlc2hvbGQvZm10L2pzb24KLSAqICMgY2hhbmdlIHRoZSAicHVibGlzaCBpbmRpdmlkdWFsIDFoeiBvdXRsaWVycyIgY29udHJvbAotICogJCAvdXNyL2xvY2FsL2Jpbi9tb3NxdWl0dG9fcHViIC1tICd7InZhbHVlIjoidHJ1ZSJ9JyAtdCBpZC8wMTIzNDUvY21kL3NlbnNvcjEuc2V0UHVibGlzaDFoek91dHNpZGVSYW5nZS9mbXQvanNvbgotICogfTwvcHJlPgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5zZW5zb3JBbmFseXRpY3M7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvYnVpbGQuZ3JhZGxlIGIvc2FtcGxlcy9jb25uZWN0b3JzL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5YThlNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICAvLyBOLkIuIGNvbW1vbiBkZXBlbmRlbmNpZXMgYXJlIHNldCBpbiByb290IGJ1aWxkLmdyYWRsZQotCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphbmFseXRpY3M6bWF0aDMnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOm1xdHQnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOmthZmthJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczpmaWxlJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczppb3RwJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczpqZGJjJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczpzZXJpYWwnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpzYW1wbGVzOnRvcG9sb2d5JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6c2FtcGxlczp1dGlscycKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL01zZ1N1cHBsaWVyLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvTXNnU3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmMmI0ZS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvTXNnU3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5TdXBwbGllcjsKLQotLyoqCi0gKiBBIFN1cHBsaWVyJmx0O1N0cmluZyZndDsgZm9yIGNyZWF0aW5nIHNhbXBsZSBtZXNzYWdlcyB0byBwdWJsaXNoLgotICovCi1wdWJsaWMgY2xhc3MgTXNnU3VwcGxpZXIgaW1wbGVtZW50cyBTdXBwbGllcjxTdHJpbmc+IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtYXhDbnQ7Ci0gICAgcHJpdmF0ZSBpbnQgY250OwotICAgIHByaXZhdGUgYm9vbGVhbiBkb25lOwotICAgIAotICAgIHB1YmxpYyBNc2dTdXBwbGllcihpbnQgbWF4Q250KSB7Ci0gICAgICAgIHRoaXMubWF4Q250ID0gbWF4Q250OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldCgpIHsKLSAgICAgICAgKytjbnQ7Ci0gICAgICAgIGlmIChtYXhDbnQgPj0gMCAmJiBjbnQgPj0gbWF4Q250KSB7Ci0gICAgICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBvbGw6IG5vIG1vcmUgbWVzc2FnZXMgdG8gZ2VuZXJhdGUuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiTWVzc2FnZS0lZCBmcm9tICVzIiwgY250LCBVdGlsLnNpbXBsZVRTKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBvbGwgZ2VuZXJhdGVkIG1zZyB0byBwdWJsaXNoOiAiICsgbXNnKTsKLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvT3B0aW9ucy5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhYjVjNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5GdW5jdGlvbjsKLQotLyoqCi0gKiBTaW1wbGUgY29tbWFuZCBvcHRpb24gcHJvY2Vzc29yLgotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9ucyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZyxGdW5jdGlvbjxTdHJpbmcsPz4+IGhhbmRsZXJzID0gbmV3IEhhc2hNYXA8PigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsT2JqZWN0PiBkZWZhdWx0cyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAKLSAgICBwdWJsaWMgPFQ+IHZvaWQgYWRkSGFuZGxlcihTdHJpbmcgb3B0LCBGdW5jdGlvbjxTdHJpbmcsVD4gY3Z0Rm4pIHsKLSAgICAgICAgYWRkSGFuZGxlcihvcHQsIGN2dEZuLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIDxUPiB2b2lkIGFkZEhhbmRsZXIoU3RyaW5nIG9wdCwgRnVuY3Rpb248U3RyaW5nLFQ+IGN2dEZuLCBUIGRmbHQpIHsKLSAgICAgICAgaGFuZGxlcnMucHV0KG9wdCwgY3Z0Rm4pOwotICAgICAgICBpZiAoZGZsdCAhPSBudWxsKQotICAgICAgICAgICAgZGVmYXVsdHMucHV0KG9wdCwgZGZsdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NBcmdzKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLEZ1bmN0aW9uPFN0cmluZyw/Pj4gZSA6IGhhbmRsZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGhhbmRsZU9wdChlLmdldEtleSgpLCBlLmdldFZhbHVlKCksIGFyZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogYXJncykgewotICAgICAgICAgICAgU3RyaW5nW10gaXRlbSA9IGFyZy5zcGxpdCgiPSIpOwotICAgICAgICAgICAgaWYgKCFoYW5kbGVycy5jb250YWluc0tleShpdGVtWzBdKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYXJndW1lbnQgJyIrYXJnKyInIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU9wdChTdHJpbmcgb3B0LCBGdW5jdGlvbjxTdHJpbmcsPz4gY3Z0Rm4sIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nIHYgPSBnZXRBcmcoY3Z0Rm4hPW51bGwgPyBvcHQgOiBvcHQrIj10cnVlIiwgYXJncyk7Ci0gICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgICAgICBvcHRpb25zLnB1dChvcHQsIGN2dEZuPT1udWxsID8gdHJ1ZSA6IGN2dEZuLmFwcGx5KHYpKTsKLSAgICAgICAgZWxzZSBpZiAoZGVmYXVsdHMuZ2V0KG9wdCkgIT0gbnVsbCkKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KG9wdCwgZGVmYXVsdHMuZ2V0KG9wdCkpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXQoU3RyaW5nIG9wdCkgewotICAgICAgICByZXR1cm4gZ2V0KG9wdCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyA8VD4gVCBnZXQoU3RyaW5nIG9wdCwgVCBkZmx0KSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zLmdldChvcHQpID09IG51bGwgPyBkZmx0IDogKFQpb3B0aW9ucy5nZXQob3B0KTsgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PFN0cmluZyxPYmplY3Q+PiBnZXRBbGwoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQob3B0aW9ucy5lbnRyeVNldCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBvcHQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBvcHRpb25zLnB1dChvcHQsIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXJnKFN0cmluZyBpdGVtLCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGl0ZW1QYXJ0cyA9IGl0ZW0uc3BsaXQoIj0iKTsKLSAgICAgICAgaWYgKGl0ZW1QYXJ0cy5sZW5ndGg+MSkKLSAgICAgICAgICAgIGl0ZW0gPSBpdGVtUGFydHNbMF07Ci0gICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gYXJnLnNwbGl0KCI9Iik7Ci0gICAgICAgICAgICBpZiAoaXRlbS5lcXVhbHMocGFydHNbMF0pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0c1sxXTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtUGFydHMubGVuZ3RoID4gMSA/IGl0ZW1QYXJ0c1sxXSA6IHBhcnRzWzFdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9VdGlsLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTgwM2VmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5leGVjdXRpb24uSm9iOwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgY29ubmVjdG9yIHNhbXBsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIGEgc2ltcGxlIHRpbWVzdGFtcCB3aXRoIHRoZSBmb3JtIHtAY29kZSBISDptbTpzcy5TU1N9Ci0gICAgICogQHJldHVybiB0aGUgdGltZXN0YW1wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2ltcGxlVFMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiSEg6bW06c3MuU1NTIikuZm9ybWF0KG5ldyBEYXRlKCkpOwotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIFdhaXQgZm9yIHRoZSBqb2IgdG8gcmVhY2ggdGhlIHNwZWNpZmllZCBzdGF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHBsYWNlaG9sZGVyIHRpbGwgR3JhcGhKb2IgZGlyZWN0bHkgc3VwcG9ydHMgYXdhaXRTdGF0ZSgpPwotICAgICAqIEBwYXJhbSBqb2IgdGhlIGpvYgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgc3RhdGUgdG8gd2FpdCBmb3IKLSAgICAgKiBAcGFyYW0gdGltZW91dCBzcGVjaWZ5IC0xIHRvIHdhaXQgZm9yZXZlciAodW50aWwgaW50ZXJydXB0ZWQpCi0gICAgICogQHBhcmFtIHVuaXQgbWF5IGJlIG51bGwgaWYgdGltZW91dCBpcyAtMQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RhdGUgd2FzIHJlYWNoZWQsIGZhbHNlIG90aGVyd2lzZTogdGhlIHRpbWUgbGltaXQKLSAgICAgKiB3YXMgcmVhY2hlZCBvZiB0aGUgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXdhaXRTdGF0ZShKb2Igam9iLCBKb2IuU3RhdGUgc3RhdGUsIGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgewotICAgICAgICBsb25nIGVuZFdhaXQgPSAtMTsKLSAgICAgICAgaWYgKHRpbWVvdXQgIT0gLTEpIHsKLSAgICAgICAgICAgIGVuZFdhaXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyB1bml0LnRvTWlsbGlzKHRpbWVvdXQpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBKb2IuU3RhdGUgY3VyU3RhdGUgPSBqb2IuZ2V0Q3VycmVudFN0YXRlKCk7Ci0gICAgICAgICAgICBpZiAoY3VyU3RhdGUgPT0gc3RhdGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoZW5kV2FpdCAhPSAtMSkgewotICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRXYWl0KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9lbG0zMjcvQ21kLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L0NtZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2FlNjFhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9lbG0zMjcvQ21kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmVsbTMyNzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLQotLyoqCi0gKiBFTE0zMjcgYW5kIE9CRC1JSSBjb21tYW5kIGludGVyZmFjZS4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ21kIHsKLSAgICAvKioKLSAgICAgKiBLZXkgKHtAdmFsdWV9KSBmb3IgUElEIGlkZW50aWZpZXIgaW4gSlNPTiByZXN1bHQuCi0gICAgICovCi0gICAgU3RyaW5nIFBJRCA9ICJwaWQiOwotCi0gICAgLyoqCi0gICAgICogS2V5ICh7QHZhbHVlfSkgZm9yIHRpbWVzdGFtcCBpbiBKU09OIHJlc3VsdC4gVGltZXN0YW1wIHZhbHVlIGlzIHRoZQotICAgICAqIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIDE5MDcgZXBvY2guCi0gICAgICovCi0gICAgU3RyaW5nIFRTID0gInRzIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBLZXkgKHtAdmFsdWV9KSBmb3IgdGhlIHJldHVybmVkIHZhbHVlIGluIEpTT04gcmVzdWx0LgotICAgICAqIE1heSBub3QgYmUgcHJlc2VudC4KLSAgICAgKi8KLSAgICBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOwotCi0gICAgLyoqCi0gICAgICogSG93IHRoZSBjb21tYW5kIGlzIHdyaXR0ZW4gdG8gdGhlIHNlcmlhbCBwb3J0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIE91dHB1dFN0cmVhbSB0byB3cml0ZSBieXRlcyB0by4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgRXhjZXB0aW9uIHdyaXRpbmcgYnl0ZXMuCi0gICAgICovCi0gICAgdm9pZCB3cml0ZUNtZChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIHRoZSByZXBseSBpbnRvIGEgcmVzdWx0LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKiAgICAgICAgICAgIEpTT04gb2JqZWN0IHRvIHBvcHVsYXRlIHdpdGggdGhlIHJlc3VsdC4KLSAgICAgKiBAcGFyYW0gcmVwbHkKLSAgICAgKiAgICAgICAgICAgIEJ5dGVzIHRoYXQgd2VyZSByZXR1cm5lZCBmcm9tIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi4KLSAgICAgKiAgICAgICAgICAgIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHJlc3VsdCBpcyB2YWxpZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiByZXN1bHQoSnNvbk9iamVjdCByZXN1bHQsIGJ5dGVbXSByZXBseSk7Ci0KLSAgICAvKioKLSAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21tYW5kLgotICAgICAqLwotICAgIFN0cmluZyBpZCgpOwotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2VsbTMyNy9FbG0zMjdDbWRzLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L0VsbTMyN0NtZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMGMyMy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L0VsbTMyN0NtZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLnNlcmlhbC5TZXJpYWxEZXZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmVsbTMyNy5ydW50aW1lLkNvbW1hbmRFeGVjdXRvcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwotCi0vKioKLSAqIEVMTTMyNyBjb21tYW5kcy4KLSAqIAotICogCi0gKi8KLXB1YmxpYyBlbnVtIEVsbTMyN0NtZHMgaW1wbGVtZW50cyBDbWQgewotCi0gICAgSU5JVCgiQVRaIiksCi0gICAgRUNIT19PRkYoIkFURTAiKSwKLSAgICBQUk9UT0NPTF8zKCJBVFNQMyIpLAotICAgIFBST1RPQ09MXzUoIkFUU1A1IiksCi0gICAgQllQQVNTX0lOSVQoIkFUQkkiKSwKLSAgICBGQVNUX0lOSVQoIkFURkkiKSwKLSAgICBTTE9XX0lOSVQoIkFUU0kiKSw7Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBjbWQ7Ci0KLSAgICBFbG0zMjdDbWRzKFN0cmluZyBjb2RlKSB7Ci0gICAgICAgIGNtZCA9IChjb2RlICsgIlxyIikuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVDbWQoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKGNtZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVzdWx0KEpzb25PYmplY3QgcmVzdWx0LCBieXRlW10gZGF0YSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGlkKCkgewotICAgICAgICByZXR1cm4gbmFtZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBFTE0zMjcgdG8gYSBzcGVjaWZpYyBwcm90b2NvbC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFNlcmlhbCBkZXZpY2UgdGhlIEVMTTMyNyBpcyBjb25uZWN0ZWQgdG8uCi0gICAgICogQHBhcmFtIHByb3RvY29sIE9CRC1JSSBwcm90b2NvbCB0byBpbml0aWFsaXplIHRvLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJvdG9jb2woU2VyaWFsRGV2aWNlIGRldmljZSwgRWxtMzI3Q21kcyBwcm90b2NvbCkgewotICAgICAgICBkZXZpY2Uuc2V0SW5pdGlhbGl6ZXIocG9ydCAtPiBDb21tYW5kRXhlY3V0b3IuaW5pdGlhbGl6ZShwcm90b2NvbCwgcG9ydC5nZXRPdXRwdXQoKSwgcG9ydC5nZXRJbnB1dCgpKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L0VsbTMyN1N0cmVhbXMuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9lbG0zMjcvRWxtMzI3U3RyZWFtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmFmNGRiLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9lbG0zMjcvRWxtMzI3U3RyZWFtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5lbG0zMjc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuc2VyaWFsLlNlcmlhbERldmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5TdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LnJ1bnRpbWUuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OwotCi0vKioKLSAqIFN0cmVhbXMgZmV0Y2hpbmcgT0JELUlJIGRhdGEgZnJvbSBhbiBFTE0zMjcgdGhyb3VnaAotICogYSBzZXJpYWwgZGV2aWNlLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRUxNMzI3Ij5FTE0zMjc8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbG0zMjdTdHJlYW1zIHsKLQkKLSAgICAvKioKLSAgICAgKiBQZXJpb2RpY2FsbHkgZXhlY3V0ZSBhIG51bWJlciBvZiBFTE0zMjcgY29tbWFuZHMuCi0gICAgICogRWFjaCB0dXBsZSBvbiB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgSlNPTiBhcnJheSBjb250YWluaW5nCi0gICAgICogdGhlIHJlc3VsdCBmb3IgZWFjaCBjb21tYW5kLgotICAgICAqIDxCUj4KLSAgICAgKiBFYWNoIHJlc3VsdCBpcyBhIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhlCi0gICAgICoge0BsaW5rIENtZCNpZCgpIGNvbW1hbmQgaWRlbnRpZmllcn0gd2l0aCBrZXkge0BsaW5rIENtZCNQSUQgcGlkfQotICAgICAqIGFuZCBhbnkgcmVzdWx0IHNldCBieSB0aGUgaW5kaXZpZHVhbCBjb21tYW5kLCB0eXBpY2FsbHkgd2l0aAotICAgICAqIHRoZSBrZXkge0BsaW5rIENtZCNWQUxVRSB2YWx1ZX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGRldmljZSBTZXJpYWwgZGV2aWNlIHRoZSBFTE0zMjcgaXMgY29ubmVjdGVkIHRvLgotICAgICAqIEBwYXJhbSBwZXJpb2QgUGVyaW9kIHRvIHBvbGwuCi0gICAgICogQHBhcmFtIHVuaXQgVW5pdCBvZiB7QGNvZGUgcGVyaW9kfS4KLSAgICAgKiBAcGFyYW0gY21kcyBDb21tYW5kcyB0byBleGVjdXRlLgotICAgICAqIEByZXR1cm4gU3RyZWFtIGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbW1hbmQgZXhlY3Rpb25zLgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgVFN0cmVhbTxKc29uQXJyYXk+IHBvbGwoU2VyaWFsRGV2aWNlIGRldmljZSwgbG9uZyBwZXJpb2QsIFRpbWVVbml0IHVuaXQsIENtZCAuLi4gY21kcykgewotCQkKLQkJU3VwcGxpZXI8SnNvbkFycmF5PiBkYXRhID0gZGV2aWNlLmdldFNvdXJjZSgKLQkJCQlwb3J0IC0+Ci0JCXsKLQkJCUpzb25BcnJheSBhcnJheSA9IG5ldyBKc29uQXJyYXkoKTsKLQkJCWZvciAoQ21kIGNtZCA6IGNtZHMpIHsKLQkJCQlhcnJheS5hZGQoQ29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUoY21kLCBwb3J0LmdldE91dHB1dCgpLCBwb3J0LmdldElucHV0KCkpKTsKLQkJCX0KLQkJCXJldHVybiBhcnJheTsKLQkJCQotCQl9KTsKLQkJCi0JCXJldHVybiBkZXZpY2UudG9wb2xvZ3koKS5wb2xsKGRhdGEsIHBlcmlvZCwgdW5pdCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L1BpZHMwMS5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2VsbTMyNy9QaWRzMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyYmViMy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L1BpZHMwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LnJ1bnRpbWUuQ29tbWFuZEV4ZWN1dG9yOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7Ci0KLS8qKgotICogT0JELUlJIFN0YW5kYXJkIE1vZGUgMDEgUGlkcy4KLSAqCi0gKiAKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT0JELUlJX1BJRHMjTW9kZV8wMSI+T0JELUlJIE1vZGUgMDEgUGlkczwvYT4KLSAqLwotcHVibGljIGVudW0gUGlkczAxIGltcGxlbWVudHMgQ21kIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIFBJRHMuCi0gICAgICovCi0JQVZBSUxBQkxFX1BJRFMoIjAwIiksCi0JCi0JLyoqCi0JICogRW5naW5lIGNvb2xhbnQgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBDLgotCSAqLwotCUVOR0lORV9DT09MQU5UX1RFTVAoIjA1IikgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gZGVjb2RlKEpzb25PYmplY3QgcmVzdWx0LCBieXRlW10gcmVwbHkpIHsKLQkJCQotCQkJaW50W10gYmluYXJ5ID0gQ29tbWFuZEV4ZWN1dG9yLmJpbmFyeShyZXBseSwgNCwgMik7Ci0JCQkKLQkJCWludCBjID0gYmluYXJ5WzBdIC0gNDA7Ci0JCQlyZXN1bHQuYWRkUHJvcGVydHkoVkFMVUUsIGMpOwotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0sCi0KLQkvKioKLQkgKiBFbmdpbmUgc3BlZWQgaW4gcnBtLgotCSAqLwotCVJQTSgiMEMiKSB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWNvZGUoSnNvbk9iamVjdCByZXN1bHQsIGJ5dGVbXSByZXBseSkgewotCQkJCi0JCQlpbnRbXSBiaW5hcnkgPSBDb21tYW5kRXhlY3V0b3IuYmluYXJ5KHJlcGx5LCA0LCA0KTsKLQkJCWludCBycG0gPSAoKGJpbmFyeVswXSAqIDI1NikgKyBiaW5hcnlbMV0pLzQ7Ci0JCQlyZXN1bHQuYWRkUHJvcGVydHkoVkFMVUUsIHJwbSk7Ci0JCQkKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfSwKLQkKLQkvKioKLQkgKiBWZWhpY2xlIHNwZWVkIGluIGttL2guCi0JICovCi0JU1BFRUQoIjBEIil7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWNvZGUoSnNvbk9iamVjdCByZXN1bHQsIGJ5dGVbXSByZXBseSkgewotCQkJCi0JCQlpbnRbXSBiaW5hcnkgPSBDb21tYW5kRXhlY3V0b3IuYmluYXJ5KHJlcGx5LCA0LCAyKTsKLQkJCQotCQkJcmVzdWx0LmFkZFByb3BlcnR5KFZBTFVFLCBiaW5hcnlbMF0pOwotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0sCi0JCi0JLyoqCi0gICAgICogRW5naW5lIGFpciBpbnRha2UgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBDLgotICAgICAqLwotCUFJUl9JTlRBS0VfVEVNUCgiMEYiKXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIGRlY29kZShKc29uT2JqZWN0IHJlc3VsdCwgYnl0ZVtdIHJlcGx5KSB7Ci0JCQkKLQkJCWludFtdIGJpbmFyeSA9IENvbW1hbmRFeGVjdXRvci5iaW5hcnkocmVwbHksIDQsIDIpOwotCQkJCi0JCQlpbnQgYyA9IGJpbmFyeVswXSAtIDQwOwotCQkJcmVzdWx0LmFkZFByb3BlcnR5KFZBTFVFLCBjKTsKLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9LAotCTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBpZDsKLQlwcml2YXRlIGZpbmFsIGJ5dGVbXSBjbWQ7Ci0JCi0JUGlkczAxKFN0cmluZyBwaWQpIHsKLQkJdGhpcy5waWQgPSBwaWQ7Ci0JCWNtZCA9ICgiMDEiICsgcGlkICsgIjFcciIpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGlkKCkgewotCQlyZXR1cm4gcGlkOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZUNtZChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXQud3JpdGUoY21kKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gcmVzdWx0KEpzb25PYmplY3QgcmVzdWx0LCBieXRlW10gZGF0YSkgewotCQlyZXR1cm4gdmFsaWRhdGVSZXBseShkYXRhKSAmJiBkZWNvZGUocmVzdWx0LCBkYXRhKTsKLQl9Ci0JIGJvb2xlYW4gZGVjb2RlKEpzb25PYmplY3QgcmVzdWx0LCBieXRlW10gZGF0YSkgewotCQkgcmV0dXJuIHRydWU7Ci0JIH0KLQkKLQlib29sZWFuIHZhbGlkYXRlUmVwbHkoYnl0ZVtdIHJlcGx5KSB7Ci0JCWlmIChyZXBseVswXSAhPSAnNCcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyZXBseVsxXSAhPSAnMScpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyZXBseVsyXSAhPSBwaWQuY2hhckF0KDApKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocmVwbHlbM10gIT0gcGlkLmNoYXJBdCgxKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9lbG0zMjcvcGFja2FnZS1pbmZvLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDNhOWI5Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9lbG0zMjcvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS8qKgotICogT0JELUlJIHByb3RvY29sIHNhbXBsZSB1c2luZyBFTE0zMjcuCi0gKiAKLSAqIEVMTTMyNyBkZXZpY2VzIGFsbG93IGNvbm5lY3Rpdml0eSB0byBhIHZlaGljbGUncyBPQkQtSUkgaW5mb3JtYXRpb24uCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PQkQtSUkiPk9CRC1JSTwvYT4KLSAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRUxNMzI3Ij5FTE0zMjc8L2E+Ci0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmVsbTMyNzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L3J1bnRpbWUvQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZWxtMzI3L3J1bnRpbWUvQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTM0MmYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2VsbTMyNy9ydW50aW1lL0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LkNtZDsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LkVsbTMyN0NtZHM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLQotLyoqCi0gKiBSdW50aW1lIGV4ZWN1dGlvbiBvZiBFTE0zMjcgJmFtcDsgT0JELUlJIGNvbW1hbmRzLgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRFeGVjdXRvciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludFtdIGJpbmFyeShieXRlW10gcmVwbHksIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgaW50W10gYmluYXJ5ID0gbmV3IGludFtsZW5ndGggLyAyXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBoID0gQ2hhcmFjdGVyLmRpZ2l0KHJlcGx5W29mZnNldCsrXSwgMTYpOwotICAgICAgICAgICAgaW50IGwgPSBDaGFyYWN0ZXIuZGlnaXQocmVwbHlbb2Zmc2V0KytdLCAxNik7Ci0gICAgICAgICAgICBiaW5hcnlbaV0gPSAoKGggKiAxNikgKyBsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluYXJ5OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKENtZCBwcm90b2NvbCwgT3V0cHV0U3RyZWFtIG91dCwgSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgZXhlY3V0ZVVudGlsT0soMTAsIEVsbTMyN0NtZHMuSU5JVCwgb3V0LCBpbik7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0KLSAgICAgICAgICAgIGV4ZWN1dGVVbnRpbE9LKDEsIEVsbTMyN0NtZHMuRUNIT19PRkYsIG91dCwgaW4pOwotCi0gICAgICAgICAgICBleGVjdXRlVW50aWxPSygxLCBwcm90b2NvbCwgb3V0LCBpbik7Ci0gICAgICAgICAgICBleGVjdXRlVW50aWxPSygxLCBFbG0zMjdDbWRzLlNMT1dfSU5JVCwgb3V0LCBpbik7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW9lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVhZFVudGlsUHJvbXB0KElucHV0U3RyZWFtIGluLCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVzLnJlc2V0KCk7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGludCBiID0gaW4ucmVhZCgpOwotICAgICAgICAgICAgaWYgKGIgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKGIgPT0gJyAnKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGIgPT0gJ1xyJykKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiID09ICc+JykKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgYnl0ZXMud3JpdGUoYik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEpzb25PYmplY3QgZXhlY3V0ZVVudGlsT0soaW50IG4sIENtZCBjbWQsIE91dHB1dFN0cmVhbSBvdXQsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTYpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIGNtZC53cml0ZUNtZChvdXQpOwotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFyZWFkVW50aWxQcm9tcHQoaW4sIGJ5dGVzKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBieXRlW10gcmVwbHkgPSBieXRlcy50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgIEpzb25PYmplY3QgaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNtZC5yZXN1bHQoaiwgcmVwbHkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gajsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb3VsZCBub3QgZXhlY3V0ZSBjb21tYW5kOiIgKyBjbWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSnNvbk9iamVjdCBleGVjdXRlKENtZCBjbWQsIE91dHB1dFN0cmVhbSBvdXQsIElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIHRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxNikpIHsKLSAgICAgICAgICAgIGNtZC53cml0ZUNtZChvdXQpOwotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0KLSAgICAgICAgICAgIEpzb25PYmplY3QgcmVzdWx0ID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRQcm9wZXJ0eShDbWQuUElELCBjbWQuaWQoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYWRkUHJvcGVydHkoQ21kLlRTLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0KLSAgICAgICAgICAgIHJlYWRVbnRpbFByb21wdChpbiwgYnl0ZXMpOwotCi0gICAgICAgICAgICBjbWQucmVzdWx0KHJlc3VsdCwgYnl0ZXMudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2ZpbGUvRmlsZVJlYWRlckFwcC5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2ZpbGUvRmlsZVJlYWRlckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDA4NmI3Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9maWxlL0ZpbGVSZWFkZXJBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuZmlsZS5GaWxlU3RyZWFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25zb2xlLnNlcnZlci5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kZXZlbG9wbWVudC5EZXZlbG9wbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLS8qKgotICogV2F0Y2ggYSBkaXJlY3RvcnkgZm9yIGZpbGVzIGFuZCBjb252ZXJ0IHRoZWlyIGNvbnRlbnRzIGludG8gYSBzdHJlYW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlUmVhZGVyQXBwIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGJhc2VMZWFmbmFtZSA9ICJGaWxlU2FtcGxlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIm1pc3NpbmcgcGF0aG5hbWUgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5Iik7Ci0gICAgICAgIEZpbGVSZWFkZXJBcHAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXJBcHAoYXJnc1swXSk7Ci0gICAgICAgIHJlYWRlci5ydW4oKTsKLSAgICB9Ci0gICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IGFuIGV4aXN0aW5nIGRpcmVjdG9yeSB0byB3YXRjaCBmb3IgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlUmVhZGVyQXBwKFN0cmluZyBkaXJlY3RvcnkpIHsKLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShkaXJlY3RvcnkpOwotICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGV2ZWxvcG1lbnRQcm92aWRlciB0cCA9IG5ldyBEZXZlbG9wbWVudFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBidWlsZCB0aGUgYXBwbGljYXRpb24gLyB0b3BvbG9neQotICAgICAgICAKLSAgICAgICAgVG9wb2xvZ3kgdCA9IHRwLm5ld1RvcG9sb2d5KCJGaWxlU2FtcGxlIGNvbnN1bWVyIik7Ci0KLSAgICAgICAgLy8gd2F0Y2ggZm9yIGZpbGVzCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBwYXRobmFtZXMgPSBGaWxlU3RyZWFtcy5kaXJlY3RvcnlXYXRjaGVyKHQsICgpIC0+IGRpcmVjdG9yeSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjcmVhdGUgYSBzdHJlYW0gY29udGFpbmluZyB0aGUgZmlsZXMnIGNvbnRlbnRzLgotICAgICAgICAvLyB1c2UgYSBwcmVGbiB0byBpbmNsdWRlIGEgc2VwYXJhdG9yIGluIHRoZSByZXN1bHRzLgotICAgICAgICAvLyB1c2UgYSBwb3N0Rm4gdG8gZGVsZXRlIHRoZSBmaWxlIG9uY2UgaXRzIGJlZW4gcHJvY2Vzc2VkLgotICAgICAgICBUU3RyZWFtPFN0cmluZz4gY29udGVudHMgPSBGaWxlU3RyZWFtcy50ZXh0RmlsZVJlYWRlcihwYXRobmFtZXMsCi0gICAgICAgICAgICAgICAgdHVwbGUgLT4gIjxQUkUtRlVOQ1RJT04+ICIrdHVwbGUsIAotICAgICAgICAgICAgICAgICh0dXBsZSxleGNlcHRpb24pIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlcmNpc2UgYSBsaXR0bGUgY2F1dGlvbiBpbiBjYXNlIHRoZSB1c2VyIHBvaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gdXMgYXQgYSBkaXJlY3Rvcnkgd2l0aCBvdGhlciB0aGluZ3MgaW4gaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR1cGxlLmNvbnRhaW5zKCIvIitiYXNlTGVhZm5hbWUrIl8iKSkgeyAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHR1cGxlKS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vIHByaW50IG91dCB3aGF0J3MgYmVpbmcgcmVhZAotICAgICAgICBjb250ZW50cy5wcmludCgpOwotICAgICAgICAKLSAgICAgICAgLy8gcnVuIHRoZSBhcHBsaWNhdGlvbiAvIHRvcG9sb2d5Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnRpbmcgdGhlIHJlYWRlciB3YXRjaGluZyBkaXJlY3RvcnkgIiArIGRpcmVjdG9yeSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc29sZSBVUkwgZm9yIHRoZSBqb2I6ICIKLSAgICAgICAgICAgICAgICArIHRwLmdldFNlcnZpY2VzKCkuZ2V0U2VydmljZShIdHRwU2VydmVyLmNsYXNzKS5nZXRDb25zb2xlVXJsKCkpOwotICAgICAgICB0cC5zdWJtaXQodCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZmlsZS9GaWxlV3JpdGVyQXBwLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZmlsZS9GaWxlV3JpdGVyQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTZjYjYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2ZpbGUvRmlsZVdyaXRlckFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5maWxlLkZpbGVTdHJlYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuZmlsZS5GaWxlV3JpdGVyQ3ljbGVDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5maWxlLkZpbGVXcml0ZXJGbHVzaENvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmZpbGUuRmlsZVdyaXRlclBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmZpbGUuRmlsZVdyaXRlclJldGVudGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25zb2xlLnNlcnZlci5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kZXZlbG9wbWVudC5EZXZlbG9wbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLS8qKgotICogV3JpdGUgYSBUU3RyZWFtJmx0O1N0cmluZyZndDsgdG8gZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlV3JpdGVyQXBwIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmFzZVBhdGhuYW1lOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBiYXNlTGVhZm5hbWUgPSAiRmlsZVNhbXBsZSI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigibWlzc2luZyBwYXRobmFtZSB0byBhbiBleGlzdGluZyBkaXJlY3RvcnkiKTsKLSAgICAgICAgRmlsZVdyaXRlckFwcCB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlckFwcChhcmdzWzBdKTsKLSAgICAgICAgd3JpdGVyLnJ1bigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IGFuIGV4aXN0aW5nIGRpcmVjdG9yeSB0byBjcmVhdGUgZmlsZXMgaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVdyaXRlckFwcChTdHJpbmcgZGlyZWN0b3J5KSB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5KTsKLSAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkaXJlY3RvcnkgZG9lc24ndCBleGlzdCIpOwotICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKLSAgICAgICAgYmFzZVBhdGhuYW1lID0gZGlyZWN0b3J5KyIvIitiYXNlTGVhZm5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEZXZlbG9wbWVudFByb3ZpZGVyIHRwID0gbmV3IERldmVsb3BtZW50UHJvdmlkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBhcHBsaWNhdGlvbiAvIHRvcG9sb2d5Ci0gICAgICAgIAotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koIkZpbGVTYW1wbGUgcHJvZHVjZXIiKTsKLSAgICAgICAgCi0gICAgICAgIEZpbGVXcml0ZXJQb2xpY3k8U3RyaW5nPiBwb2xpY3kgPSBuZXcgRmlsZVdyaXRlclBvbGljeTxTdHJpbmc+KAotICAgICAgICAgICAgICAgIEZpbGVXcml0ZXJGbHVzaENvbmZpZy5uZXdJbXBsaWNpdENvbmZpZygpLAotICAgICAgICAgICAgICAgIEZpbGVXcml0ZXJDeWNsZUNvbmZpZy5uZXdDb3VudEJhc2VkQ29uZmlnKDUpLAotICAgICAgICAgICAgICAgIEZpbGVXcml0ZXJSZXRlbnRpb25Db25maWcubmV3RmlsZUNvdW50QmFzZWRDb25maWcoMykpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHR1cGxlIHN0cmVhbSB0byB3cml0ZSBvdXQKLSAgICAgICAgQXRvbWljSW50ZWdlciBjbnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOwotICAgICAgICBUU3RyZWFtPFN0cmluZz4gc3RyZWFtID0gdC5wb2xsKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gU3RyaW5nLmZvcm1hdCgic2FtcGxlIHR1cGxlICVkICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNudC5pbmNyZW1lbnRBbmRHZXQoKSwgbmV3IERhdGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZWQgdHVwbGU6ICIrc3RyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwotICAgICAgICAgICAgfSwgMSwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIAotICAgICAgICAvLyB3cml0ZSB0aGUgc3RyZWFtCi0gICAgICAgIEZpbGVTdHJlYW1zLnRleHRGaWxlV3JpdGVyKHN0cmVhbSwgKCkgLT4gYmFzZVBhdGhuYW1lLCAoKSAtPiBwb2xpY3kpOwotICAgICAgICAKLSAgICAgICAgLy8gcnVuIHRoZSBhcHBsaWNhdGlvbiAvIHRvcG9sb2d5Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnRpbmcgdGhlIHByb2R1Y2VyIHdyaXRpbmcgdG8gZGlyZWN0b3J5ICIgKyBkaXJlY3RvcnkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnNvbGUgVVJMIGZvciB0aGUgam9iOiAiCi0gICAgICAgICAgICAgICAgKyB0cC5nZXRTZXJ2aWNlcygpLmdldFNlcnZpY2UoSHR0cFNlcnZlci5jbGFzcykuZ2V0Q29uc29sZVVybCgpKTsKLSAgICAgICAgdHAuc3VibWl0KHQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2ZpbGUvUkVBRE1FIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2ZpbGUvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDc3NTE4Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9maWxlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNhbXBsZSBGaWxlIFN0cmVhbXMgY29ubmVjdG9yIHRvcG9sb2d5IGFwcGxpY2F0aW9ucy4KLQotVGhlIGZpbGUgd3JpdGVyIGFwcGxpY2F0aW9uIHdyaXRlcyBhIHN0cmVhbSdzIHR1cGxlcyB0byBmaWxlcy4KLQotVGhlIGZpbGUgcmVhZGVyIGFwcGxpY2F0aW9uIHdhdGNoZXMgYSBkaXJlY3RvcnkgZm9yIGZpbGVzIGFuZCByZWFkcyB0aGVpcgotY29udGVudHMgaW50byBhIHN0cmVhbSBvZiB0dXBsZXMuCi0KLXNlZSBzY3JpcHRzL2Nvbm5lY3RvcnMvZmlsZS9SRUFETUUgdG8gcnVuIHRoZW0KLQotRmlsZVdyaXRlckFwcC5qYXZhIC0gdGhlIHdyaXRlciBhcHBsaWNhdGlvbiB0b3BvbG9neQotRmlsZVJlYWRlckFwcC5qYXZhIC0gdGhlIHJlYWRlciBhcHBsaWNhdGlvbiB0b3BvbG9neQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2ZpbGUvcGFja2FnZS1pbmZvLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZmlsZS9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjZmU3NC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvZmlsZS9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLyoqCi0gKiBTYW1wbGVzIHNob3dpbmcgdXNlIG9mIHRoZSAKLSAqIDxhIGhyZWY9IntAZG9jUm9vdH0vb3JnL2FwYWNoZS9lZGdlbnQvY29ubmVjdG9ycy9maWxlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KLSAqICAgICBGaWxlIHN0cmVhbSBjb25uZWN0b3I8L2E+LgotICogPHA+Ci0gKiBTZWUgJmx0O2VkZ2VudC1yZWxlYXNlJmd0Oy9zY3JpcHRzL2Nvbm5lY3RvcnMvZmlsZS9SRUFETUUgdG8gcnVuIHRoZSBzYW1wbGVzLgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIHNhbXBsZXMgYXJlIHByb3ZpZGVkOgotICogPHVsPgotICogPGxpPkZpbGVSZWFkZXJBcHAuamF2YSAtIGEgc2ltcGxlIGRpcmVjdG9yeSB3YXRjaGVyIGFuZCBmaWxlIHJlYWRlciBhcHBsaWNhdGlvbiB0b3BvbG9neTwvbGk+Ci0gKiA8bGk+RmlsZVdyaXRlckFwcC5qYXZhIC0gYSBzaW1wbGUgZmlsZSB3cml0ZXIgYXBwbGljYXRpb24gdG9wb2xvZ3k8L2xpPgotICogPC91bD4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZmlsZTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBBcHBDbGllbnQuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBBcHBDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0ZTJkYy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvaW90cC9Jb3RwQXBwQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5pb3RwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7Ci1pbXBvcnQgY29tLmlibS5pb3RmLmNsaWVudC5hcHAuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgY29tLmlibS5pb3RmLmNsaWVudC5hcHAuQ29tbWFuZDsKLWltcG9ydCBjb20uaWJtLmlvdGYuY2xpZW50LmFwcC5FdmVudDsKLWltcG9ydCBjb20uaWJtLmlvdGYuY2xpZW50LmFwcC5FdmVudENhbGxiYWNrOwotCi0vKioKLSAqIEFuIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIEFwcGxpY2F0aW9uQ2xpZW50IHRoYXQgcHVibGlzaGVzIGRldmljZSBjbWRzIAotICogYW5kIHN1YnNjcmliZXMgdG8gZGV2aWNlIGV2ZW50cyBmb3IKLSAqIHtAbGluayBJb3RwRGV2aWNlU2FtcGxlfSBhbmQge0BsaW5rIElvdHBHV0RldmljZVNhbXBsZX0uCi0gKiA8cD4KLSAqIFVzYWdlOiB7QGNvZGUgW3VzZUdXXSA8YXBwLWNmZy1wYXRoPiAjIHNlZSBzY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9pb3RwLWFwcC1jbGllbnQuY2ZnfQotICogPHA+Ci0gKiBUaGlzIGNvbm5lY3RzIHRvIHlvdXIgSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0gc2VydmljZQotICogYXMgdGhlIEFwcGxpY2F0aW9uIGRlZmluZWQgaW4gYSBhcHBsaWNhdGlvbiBjb25maWcgZmlsZS4KLSAqIFRoZSBmaWxlIGZvcm1hdCBpcyB0aGUgc3RhbmRhcmQgb25lIGZvciBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybS4KLSAqIDxwPgotICogTm90ZSwgdGhlIGNvbmZpZyBmaWxlIGFsc28gY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGlzIGFwcGxpY2F0aW9uLgotICoKLSAqIDxwPlNlZSB7QGNvZGUgc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvUkVBRE1FfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYQotICogcHJvdG90eXBlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcnVubmluZyB0aGUgYXBwbGljYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBJb3RwQXBwQ2xpZW50IHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB1c2FnZSA9ICJbdXNlR1ddIDxhcHAtY2ZnLXBhdGg+ICMgc2VlIHNjcmlwdHMvY29ubmVjdG9ycy9pb3RwL2lvdHAtYXBwLWNsaWVudC5jZmciOwotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCi0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVc2FnZTogIiArIHVzYWdlKTsKLSAgICBMaXN0PFN0cmluZz4gYXJnTGlzdCA9IEFycmF5cy5hc0xpc3QoYXJncyk7Ci0gICAgYm9vbGVhbiB1c2VHVyA9IGFyZ0xpc3QuY29udGFpbnMoInVzZUdXIik7Ci0gICAgU3RyaW5nIGRldmljZUNmZ1BhdGggPSBhcmdMaXN0LmdldChhcmdMaXN0LnNpemUoKSAtIDEpOwotCi0gICAgUHJvcGVydGllcyBjZmdQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgY2ZnUHJvcHMubG9hZChuZXcgRmlsZVJlYWRlcihuZXcgRmlsZShkZXZpY2VDZmdQYXRoKSkpOwotICAgIAotICAgIFN0cmluZyBpb3RwT3JnID0gZ2V0UHJvcGVydHkoY2ZnUHJvcHMsICJPcmdhbml6YXRpb24tSUQiLCAib3JnIik7Ci0gICAgU3RyaW5nIGlvdHBBcHBJZCA9IGdldFByb3BlcnR5KGNmZ1Byb3BzLCAiaWQiKTsKLSAgICBTdHJpbmcgaW90cEFwaUtleSA9IGdldFByb3BlcnR5KGNmZ1Byb3BzLCAiQVBJLUtleSIsICJhdXRoLWtleSIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3JnOiAgICAgIiArIGlvdHBPcmcpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaWQ6ICAgICAgIiArIGlvdHBBcHBJZCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJBcGlLZXk6ICAiICsgaW90cEFwaUtleSk7Ci0KLSAgICBTdHJpbmcgaW90cERldlR5cGUgPSBjZmdQcm9wcy5nZXRQcm9wZXJ0eSgiZGV2aWNlVHlwZSIpOwotICAgIFN0cmluZyBpb3RwRGV2SWQgPSBjZmdQcm9wcy5nZXRQcm9wZXJ0eSgiZGV2aWNlSWQiKTsKLSAgICBpZiAodXNlR1cpIHsKLSAgICAgIGlvdHBEZXZUeXBlID0gY2ZnUHJvcHMuZ2V0UHJvcGVydHkoImd3RGV2aWNlVHlwZSIpOwotICAgICAgaW90cERldklkID0gY2ZnUHJvcHMuZ2V0UHJvcGVydHkoImd3RGV2aWNlSWQiKTsKLSAgICB9Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJkZXZpY2VUeXBlOiAiICsgaW90cERldlR5cGUpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZGV2aWNlSWQ6ICAgIiArIGlvdHBEZXZJZCk7Ci0KLSAgICBBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQgPSBuZXcgQXBwbGljYXRpb25DbGllbnQoY2ZnUHJvcHMpOwotICAgIAotICAgIGNsaWVudC5jb25uZWN0KCk7Ci0gICAgCi0gICAgYm9vbGVhbiBzZW5kQ21kID0gdHJ1ZTsKLSAgICBpZiAoc2VuZENtZCkgewotICAgICAgc2VuZENtZChjbGllbnQsIGlvdHBEZXZUeXBlLCBpb3RwRGV2SWQpOwotICAgICAgaWYgKHVzZUdXKSB7Ci0gICAgICAgIHNlbmRDbWQoY2xpZW50LCBjZmdQcm9wcy5nZXRQcm9wZXJ0eSgiY24tZGV2MS10eXBlIiksIGNmZ1Byb3BzLmdldFByb3BlcnR5KCJjbi1kZXYxLWlkIikpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBib29sZWFuIHN1YnNjcmliZVRvRXZlbnRzID0gdHJ1ZTsKLSAgICBpZiAoc3Vic2NyaWJlVG9FdmVudHMpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3Vic2NyaWJpbmcgdG8gZXZlbnRzLi4uIik7Ci0gICAgICBjbGllbnQuc3Vic2NyaWJlVG9EZXZpY2VFdmVudHMoKTsKLSAgICAgIGNsaWVudC5zZXRFdmVudENhbGxiYWNrKG5ldyBFdmVudENhbGxiYWNrKCkgewotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29tbWFuZChDb21tYW5kIGNtZCkgewotICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlJlY2VpdmVkIGV2ZW50OiAlcyAlczolcyAlcyAlcyIsIGV2ZW50LmdldEV2ZW50KCksCi0gICAgICAgICAgICAgICAgICBldmVudC5nZXREZXZpY2VUeXBlKCksIGV2ZW50LmdldERldmljZUlkKCksCi0gICAgICAgICAgICAgICAgICBldmVudC5nZXRGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFBheWxvYWQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfSk7Ci0gICAgICBUaHJlYWQuc2xlZXAoSW50ZWdlci5NQVhfVkFMVUUpOwotICAgIH0KLSAgICAKLSAgICBjbGllbnQuZGlzY29ubmVjdCgpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBpbnQgbXNnTnVtID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kQ21kKEFwcGxpY2F0aW9uQ2xpZW50IGNsaWVudCwgU3RyaW5nIGlvdHBEZXZUeXBlLCBTdHJpbmcgaW90cERldklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgY29tbWFuZCA9ICJjbWRJZC0xIjsKLSAgICBKc29uT2JqZWN0IGpvID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICBqby5hZGRQcm9wZXJ0eSgibXNnTnVtIiwgKyttc2dOdW0pOwotICAgIGpvLmFkZFByb3BlcnR5KCJkZXZpY2VUeXBlQW5kSWQiLCBpb3RwRGV2VHlwZSArICIvIiArIGlvdHBEZXZJZCk7Ci0gICAgam8uYWRkUHJvcGVydHkoImNtZElkIiwgY29tbWFuZCk7Ci0gICAgam8uYWRkUHJvcGVydHkoInN0ciIsICJhLXN0cmluZyIpOwotICAgIGpvLmFkZFByb3BlcnR5KCJudW0iLCAxMjM0NSk7Ci0gICAgSnNvbk9iamVjdCBkYXRhID0gam87Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJTZW5kaW5nICIraW90cERldlR5cGUrIi8iK2lvdHBEZXZJZCsiIGNvbW1hbmQ6ICIrY29tbWFuZCsiIGRhdGE6ICIrZGF0YSk7Ci0gICAgCi0gICAgYm9vbGVhbiBvayA9IGNsaWVudC5wdWJsaXNoQ29tbWFuZChpb3RwRGV2VHlwZSwgaW90cERldklkLCBjb21tYW5kLCBkYXRhKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlbnQ6ICIgKyAob2sgPyAiT0siIDogIk5PVC1PSyIpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFByb3BlcnRpZXMgcHJvcHMsIFN0cmluZy4uLiBrZXlzKSB7Ci0gICAgZm9yIChTdHJpbmcga2V5IDoga2V5cykgewotICAgICAgU3RyaW5nIHZhbCA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICBpZiAodmFsICE9IG51bGwpCi0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBEZXZpY2VTYW1wbGUuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBEZXZpY2VTYW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4MGM5OS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvaW90cC9Jb3RwRGV2aWNlU2FtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5pb3RwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmlvdC5Rb1M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5pb3RwLklvdHBEZXZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7Ci1pbXBvcnQgY29tLmlibS5pb3RmLmNsaWVudC5kZXZpY2UuRGV2aWNlQ2xpZW50OwotaW1wb3J0IGNvbS5pYm0uaW90Zi5kZXZpY2VtZ210LkRldmljZURhdGE7Ci1pbXBvcnQgY29tLmlibS5pb3RmLmRldmljZW1nbXQuZGV2aWNlLk1hbmFnZWREZXZpY2U7Ci0KLS8qKgotICogU2VuZCBkZXZpY2UgZXZlbnRzIGFuZCBzdWJzY3JpYmUgdG8gZGV2aWNlIGNvbW1hbmRzIGFzIGEgcmVnaXN0ZXJlZCBJb1QgZGV2aWNlCi0gKiB1c2luZyBhIHN0YW5kYXJkIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIHNlcnZpY2UgaW5zdGFuY2UuCi0gKiA8UD4KLSAqIFVzZSB7QGxpbmsgSW90cEFwcENsaWVudH0gdG8gcHJpbnQgcHVibGlzaGVkIGV2ZW50cyBhbmQgZ2VuZXJhdGUgYSBjb21tYW5kCi0gKiAoc3RhcnQgdGhpcyBhcHAgYmVmb3JlIHJ1bm5pbmcgSW90cEFwcENsaWVudCkuIAotICogPFA+Ci0gKiBUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXM6Ci0gKiA8VUw+Ci0gKiA8TEk+VXNpbmcgdGhlIElvdHBEZXZpY2UgY29ubmVjdG9yPC9MST4KLSAqIDxMST5Jbml0aWFsaXppbmcgdGhlIElvdHBEZXZpY2UgY29ubmVjdG9yIHVzaW5nIHRoZSBXSW9UUCBBUEkgb2JqZWN0czwvTEk+Ci0gKiA8TEk+UHVibGlzaGluZyBhbmQgc3Vic2NyaWJpbmcgdG8gZGV2aWNlIGV2ZW50cyBhbmQgY29tbWFuZHM8L0xJPgotICogPC9VTD4KLSAqIDxwPgotICogVGhpcyBjb25uZWN0cyB0byB5b3VyIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIHNlcnZpY2UKLSAqIGFzIHRoZSBEZXZpY2UgZGVmaW5lZCBpbiBhIGRldmljZSBjb25maWcgZmlsZS4KLSAqIFRoZSBmaWxlIGZvcm1hdCBpcyB0aGUgc3RhbmRhcmQgb25lIGZvciBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybS4KLSAqCi0gKiA8cD5TZWUge0Bjb2RlIHNjcmlwdHMvY29ubmVjdG9ycy9pb3RwL1JFQURNRX0gZm9yIGluZm9ybWF0aW9uIGFib3V0IGEKLSAqIHByb3RvdHlwZSBkZXZpY2UgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBydW5uaW5nIHRoZSBzYW1wbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBJb3RwRGV2aWNlU2FtcGxlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdXNhZ2UgPSAiW3VzZURldmljZUNsaWVudHx1c2VNYW5hZ2VkRGV2aWNlXSBbdXNlSHR0cF0gPGRldmljZS1jZmctcGF0aD4iOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVzYWdlOiAiICsgdXNhZ2UpOwotICAgICAgICBMaXN0PFN0cmluZz4gYXJnTGlzdCA9IEFycmF5cy5hc0xpc3QoYXJncyk7Ci0gICAgICAgIGJvb2xlYW4gdXNlRGV2aWNlQ2xpZW50ID0gYXJnTGlzdC5jb250YWlucygidXNlRGV2aWNlQ2xpZW50Iik7Ci0gICAgICAgIGJvb2xlYW4gdXNlTWFuYWdlZERldmljZSA9IGFyZ0xpc3QuY29udGFpbnMoInVzZU1hbmFnZWREZXZpY2UiKTsKLSAgICAgICAgYm9vbGVhbiB1c2VJbnRlcm5hbERldmljZUNsaWVudCA9ICEodXNlRGV2aWNlQ2xpZW50IHx8IHVzZU1hbmFnZWREZXZpY2UpOwotICAgICAgICBib29sZWFuIHVzZUh0dHAgPSBhcmdMaXN0LmNvbnRhaW5zKCJ1c2VIdHRwIik7Ci0gICAgICAgIFN0cmluZyBkZXZpY2VDZmdQYXRoID0gYXJnTGlzdC5nZXQoYXJnTGlzdC5zaXplKCkgLSAxKTsKLQotICAgICAgICBEaXJlY3RQcm92aWRlciB0cCA9IG5ldyBEaXJlY3RQcm92aWRlcigpOwotICAgICAgICBUb3BvbG9neSB0b3BvbG9neSA9IHRwLm5ld1RvcG9sb2d5KCJJb3RwRGV2aWNlU2FtcGxlIik7Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0aWVzIGNmZ1Byb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgY2ZnUHJvcHMubG9hZChuZXcgRmlsZVJlYWRlcihuZXcgRmlsZShkZXZpY2VDZmdQYXRoKSkpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGlvdHBPcmcgPSBnZXRQcm9wZXJ0eShjZmdQcm9wcywgIk9yZ2FuaXphdGlvbi1JRCIsICJvcmciKTsKLSAgICAgICAgU3RyaW5nIGlvdHBEZXZUeXBlID0gZ2V0UHJvcGVydHkoY2ZnUHJvcHMsICJEZXZpY2UtVHlwZSIsICJ0eXBlIik7Ci0gICAgICAgIFN0cmluZyBpb3RwRGV2SWQgPSBnZXRQcm9wZXJ0eShjZmdQcm9wcywgIkRldmljZS1JRCIsICJpZCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm9yZzogICIgKyBpb3RwT3JnKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXZpY2VUeXBlOiAiICsgaW90cERldlR5cGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRldmljZUlkOiAgICIgKyBpb3RwRGV2SWQpOwotICAgICAgICAKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb3NxdWl0dG9fcHViIC11IDxhcGktYXV0aC1rZXk+IC1QIDxhcGktcXV0aC10b2tlbj4gLWggIitpb3RwT3JnKyIubWVzc2FnaW5nLmludGVybmV0b2Z0aGluZ3MuaWJtY2xvdWQuY29tIC1wIDE4ODMgLWkgYToiK2lvdHBPcmcrIjphcHBJZDEgLXQgaW90LTIvdHlwZS8iK2lvdHBEZXZUeXBlKyIvaWQvIitpb3RwRGV2SWQrIi9jbWQvY21kLTEvZm10L2pzb24gLW0gJ3t9JyIpOwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vc3F1aXR0b19zdWIgLWQgLXUgPGFwaS1hdXRoLWtleT4gLVAgPGFwaS1xdXRoLXRva2VuPiAtaCAiK2lvdHBPcmcrIi5tZXNzYWdpbmcuaW50ZXJuZXRvZnRoaW5ncy5pYm1jbG91ZC5jb20gLXAgMTg4MyAtaSBhOiIraW90cE9yZysiOmFwcElkMiAtdCBpb3QtMi90eXBlLysvaWQvKy9ldnQvKy9mbXQvKyIpOwotICAgICAgICAKLSAgICAgICAgSW90cERldmljZSBkZXZpY2U7Ci0gICAgICAgIGlmICh1c2VJbnRlcm5hbERldmljZUNsaWVudCkgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgaW50ZXJuYWwgRGV2aWNlQ2xpZW50Iik7Ci0gICAgICAgICAgZGV2aWNlID0gbmV3IElvdHBEZXZpY2UodG9wb2xvZ3ksIGNmZ1Byb3BzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh1c2VEZXZpY2VDbGllbnQpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzaW5nIFdJb1RQIERldmljZUNsaWVudCIpOwotICAgICAgICAgIGRldmljZSA9IG5ldyBJb3RwRGV2aWNlKHRvcG9sb2d5LCBuZXcgRGV2aWNlQ2xpZW50KGNmZ1Byb3BzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodXNlTWFuYWdlZERldmljZSkgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgV0lvVFAgTWFuYWdlZERldmljZSIpOwotICAgICAgICAgIERldmljZURhdGEgZGV2aWNlRGF0YSA9IG5ldyBEZXZpY2VEYXRhLkJ1aWxkZXIoKS5idWlsZCgpOwotICAgICAgICAgIGRldmljZSA9IG5ldyBJb3RwRGV2aWNlKHRvcG9sb2d5LCBuZXcgTWFuYWdlZERldmljZShjZmdQcm9wcywgZGV2aWNlRGF0YSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ3b29wcyIpOwotICAgICAgICAgICAgIAotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgVFN0cmVhbTxkb3VibGVbXT4gcmF3ID0gdG9wb2xvZ3kucG9sbCgoKSAtPiB7Ci0gICAgICAgICAgICBkb3VibGVbXSAgdiA9IG5ldyBkb3VibGVbM107Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZbMF0gPSByLm5leHRHYXVzc2lhbigpICogMTAuMCArIDQwLjA7Ci0gICAgICAgICAgICB2WzFdID0gci5uZXh0R2F1c3NpYW4oKSAqIDEwLjAgKyA1MC4wOwotICAgICAgICAgICAgdlsyXSA9IHIubmV4dEdhdXNzaWFuKCkgKiAxMC4wICsgNjAuMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0sIDMsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICAKLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBqc29uID0gcmF3Lm1hcCh2IC0+IHsKLSAgICAgICAgICAgIEpzb25PYmplY3QgaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJ0ZW1wIiwgdlswXSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJodW1pZGl0eSIsIHZbMV0pOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgib2JqZWN0VGVtcCIsIHZbMl0pOwotICAgICAgICAgICAgcmV0dXJuIGo7Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgaWYgKCF1c2VIdHRwKSB7Ci0gICAgICAgICAgZGV2aWNlLmV2ZW50cyhqc29uLCAic2Vuc29ycyIsIFFvUy5GSVJFX0FORF9GT1JHRVQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHVibGlzaGluZyBldmVudHMgdXNpbmcgSFRUUCIpOwotICAgICAgICAgIGRldmljZS5odHRwRXZlbnRzKGpzb24sICJzZW5zb3JzIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHN1YnNjcmliZSB0byAvIHJlcG9ydCBkZXZpY2UgY21kcyAKLSAgICAgICAgZGV2aWNlLmNvbW1hbmRzKCkuc2luayhqbyAtPiBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkIGNtZDogIiArIGpvKSk7Ci0KLSAgICAgICAgdHAuc3VibWl0KHRvcG9sb2d5KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFByb3BlcnRpZXMgcHJvcHMsIFN0cmluZy4uLiBrZXlzKSB7Ci0gICAgICBmb3IgKFN0cmluZyBrZXkgOiBrZXlzKSB7Ci0gICAgICAgIFN0cmluZyB2YWwgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpCi0gICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBHV0RldmljZVNhbXBsZS5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvSW90cEdXRGV2aWNlU2FtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZWM0ZDkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvSW90cEdXRGV2aWNlU2FtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5pb3RwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmlvdC5Jb3REZXZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5pb3QuUW9TOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90cC5Jb3RwR2F0ZXdheTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLWltcG9ydCBjb20uaWJtLmlvdGYuY2xpZW50LmdhdGV3YXkuR2F0ZXdheUNsaWVudDsKLWltcG9ydCBjb20uaWJtLmlvdGYuZGV2aWNlbWdtdC5EZXZpY2VEYXRhOwotaW1wb3J0IGNvbS5pYm0uaW90Zi5kZXZpY2VtZ210LmdhdGV3YXkuTWFuYWdlZEdhdGV3YXk7Ci0KLS8qKgotICogU2ltaWxhciB0byBJb3RwRGV2aWNlU2FtcGxlIGJ1dCBiZWhhdmluZyBhcyBhIHJlZ2lzdGVyZWQgSW9UIEdhdGV3YXkgZGV2aWNlLgotICogPFA+Ci0gKiBVc2Uge0BsaW5rIElvdHBBcHBDbGllbnR9IHRvIHByaW50IHB1Ymxpc2hlZCBldmVudHMgYW5kIGdlbmVyYXRlIGEgY29tbWFuZAotICogKHN0YXJ0IHRoaXMgYXBwIGJlZm9yZSBydW5uaW5nIElvdHBBcHBDbGllbnQgd2l0aCB0aGUgInVzZUdXIiBvcHRpb24pLiAKLSAqIDxQPgotICogVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzOgotICogPFVMPgotICogPExJPlVzaW5nIHRoZSBJb3RwR2F0ZXdheSBjb25uZWN0b3I8L0xJPgotICogPExJPkluaXRpYWxpemluZyB0aGUgSW90cEdhdGV3YXkgY29ubmVjdG9yIHVzaW5nIHRoZSBXSW9UUCBBUEkgb2JqZWN0czwvTEk+Ci0gKiA8TEk+UHVibGlzaGluZyBhbmQgc3Vic2NyaWJpbmcgdG8gR2F0ZXdheSBkZXZpY2UgZXZlbnRzIGFuZCBjb21tYW5kczwvTEk+Ci0gKiA8TEk+UHVibGlzaGluZyBhbmQgc3Vic2NyaWJpbmcgdG8gY29ubmVjdGVkIGRldmljZSBldmVudHMgYW5kIGNvbW1hbmRzPC9MST4KLSAqIDwvVUw+Ci0gKiA8cD4KLSAqIFRoaXMgY29ubmVjdHMgdG8geW91ciBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBzZXJ2aWNlCi0gKiBhcyB0aGUgR2F0ZXdheSBkZWZpbmVkIGluIGEgZ2F0ZXdheSBjb25maWcgZmlsZS4KLSAqIFRoZSBmaWxlIGZvcm1hdCBpcyB0aGUgc3RhbmRhcmQgb25lIGZvciBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybS4KLSAqCi0gKiA8cD5TZWUge0Bjb2RlIHNjcmlwdHMvY29ubmVjdG9ycy9pb3RwL1JFQURNRX0gZm9yIGluZm9ybWF0aW9uIGFib3V0IGEKLSAqIHByb3RvdHlwZSBnYXRld2F5IGRldmljZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHJ1bm5pbmcgdGhlIHNhbXBsZS4KLSAqLwotcHVibGljIGNsYXNzIElvdHBHV0RldmljZVNhbXBsZSB7Ci0gIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB1c2FnZSA9ICJbdXNlR2F0ZXdheUNsaWVudHx1c2VNYW5hZ2VkR2F0ZXdheV0gW3VzZUh0dHBdIDxkZXZpY2UtY2ZnLXBhdGg+IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVc2FnZTogIiArIHVzYWdlKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGFyZ0xpc3QgPSBBcnJheXMuYXNMaXN0KGFyZ3MpOwotICAgICAgICBib29sZWFuIHVzZUdhdGV3YXlDbGllbnQgPSBhcmdMaXN0LmNvbnRhaW5zKCJ1c2VHYXRld2F5Q2xpZW50Iik7Ci0gICAgICAgIGJvb2xlYW4gdXNlTWFuYWdlZEdhdGV3YXkgPSBhcmdMaXN0LmNvbnRhaW5zKCJ1c2VNYW5hZ2VkR2F0ZXdheSIpOwotICAgICAgICBib29sZWFuIHVzZUludGVybmFsR2F0ZXdheUNsaWVudCA9ICEodXNlR2F0ZXdheUNsaWVudCB8fCB1c2VNYW5hZ2VkR2F0ZXdheSk7Ci0gICAgICAgIGJvb2xlYW4gdXNlSHR0cCA9IGFyZ0xpc3QuY29udGFpbnMoInVzZUh0dHAiKTsKLSAgICAgICAgU3RyaW5nIGRldmljZUNmZ1BhdGggPSBhcmdMaXN0LmdldChhcmdMaXN0LnNpemUoKSAtIDEpOwotCi0gICAgICAgIERpcmVjdFByb3ZpZGVyIHRwID0gbmV3IERpcmVjdFByb3ZpZGVyKCk7Ci0gICAgICAgIFRvcG9sb2d5IHRvcG9sb2d5ID0gdHAubmV3VG9wb2xvZ3koIklvdHBHV0RldmljZVNhbXBsZSIpOwotICAgICAgICAKLSAgICAgICAgUHJvcGVydGllcyBjZmdQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGNmZ1Byb3BzLmxvYWQobmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoZGV2aWNlQ2ZnUGF0aCkpKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBpb3RwT3JnID0gZ2V0UHJvcGVydHkoY2ZnUHJvcHMsICJPcmdhbml6YXRpb24tSUQiLCAib3JnIik7Ci0gICAgICAgIFN0cmluZyBpb3RwR1dEZXZUeXBlID0gZ2V0UHJvcGVydHkoY2ZnUHJvcHMsICJHYXRld2F5LVR5cGUiLCAiRGV2aWNlLVR5cGUiLCAidHlwZSIpOwotICAgICAgICBTdHJpbmcgaW90cEdXRGV2SWQgPSBnZXRQcm9wZXJ0eShjZmdQcm9wcywgIkdhdGV3YXktSUQiLCAiRGV2aWNlLUlEIiwgImlkIik7Ci0gICAgICAgIFN0cmluZyBpb3RwQ25EZXYxVHlwZSA9IGNmZ1Byb3BzLmdldFByb3BlcnR5KCJjbi1kZXYxLXR5cGUiKTsKLSAgICAgICAgU3RyaW5nIGlvdHBDbkRldjFJZCA9IGNmZ1Byb3BzLmdldFByb3BlcnR5KCJjbi1kZXYxLWlkIik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm9yZ0lkOiAgIiArIGlvdHBPcmcpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdXRGV2aWNlVHlwZTogIiArIGlvdHBHV0RldlR5cGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdXRGV2aWNlSWQ6ICAgIiArIGlvdHBHV0RldklkKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbi1kZXYxIERldmljZVR5cGU6ICIgKyBpb3RwQ25EZXYxVHlwZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY24tZGV2MSBEZXZpY2VJZDogICAiICsgaW90cENuRGV2MUlkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR1cgbW9zcXVpdHRvX3B1YiAtdSA8YXBpLWF1dGgta2V5PiAtUCA8YXBpLWF1dGgtdG9rZW4+IC1oICIraW90cE9yZysiLm1lc3NhZ2luZy5pbnRlcm5ldG9mdGhpbmdzLmlibWNsb3VkLmNvbSAtcCAxODgzIC1pIGE6Iitpb3RwT3JnKyI6YXBwSWQxIC10IGlvdC0yL3R5cGUvIitpb3RwR1dEZXZUeXBlKyIvaWQvIitpb3RwR1dEZXZJZCsiL2NtZC9jbWQtMS9mbXQvanNvbiAtbSAne30nIik7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR1cgbW9zcXVpdHRvX3N1YiAtZCAtdSA8YXBpLWF1dGgta2V5PiAtUCA8YXBpLWF1dGgtdG9rZW4+IC1oICIraW90cE9yZysiLm1lc3NhZ2luZy5pbnRlcm5ldG9mdGhpbmdzLmlibWNsb3VkLmNvbSAtcCAxODgzIC1pIGE6Iitpb3RwT3JnKyI6YXBwSWQyIC10IGlvdC0yL3R5cGUvKy9pZC8rL2V2dC8rL2ZtdC8rIik7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiY24tZGV2MSBtb3NxdWl0dG9fcHViIC11IDxhcGktYXV0aC1rZXk+IC1QIDxhcGktcXV0aC10b2tlbj4gLWggIitpb3RwT3JnKyIubWVzc2FnaW5nLmludGVybmV0b2Z0aGluZ3MuaWJtY2xvdWQuY29tIC1wIDE4ODMgLWkgYToiK2lvdHBPcmcrIjphcHBJZDEgLXQgaW90LTIvdHlwZS8iK2lvdHBDbkRldjFUeXBlKyIvaWQvIitpb3RwQ25EZXYxSWQrIi9jbWQvY21kLTEvZm10L2pzb24gLW0gJ3t9JyIpOwotCi0gICAgICAgIElvdHBHYXRld2F5IGd3RGV2aWNlOwotICAgICAgICBpZiAodXNlSW50ZXJuYWxHYXRld2F5Q2xpZW50KSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBpbnRlcm5hbCBHYXRld2F5Q2xpZW50Iik7Ci0gICAgICAgICAgZ3dEZXZpY2UgPSBuZXcgSW90cEdhdGV3YXkodG9wb2xvZ3ksIGNmZ1Byb3BzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh1c2VHYXRld2F5Q2xpZW50KSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBXSW9UUCBHYXRld2F5Q2xpZW50Iik7Ci0gICAgICAgICAgZ3dEZXZpY2UgPSBuZXcgSW90cEdhdGV3YXkodG9wb2xvZ3ksIG5ldyBHYXRld2F5Q2xpZW50KGNmZ1Byb3BzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodXNlTWFuYWdlZEdhdGV3YXkpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzaW5nIFdJb1RQIE1hbmFnZWRHYXRld2F5Iik7Ci0gICAgICAgICAgRGV2aWNlRGF0YSBkZXZpY2VEYXRhID0gbmV3IERldmljZURhdGEuQnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgICAgICAgZ3dEZXZpY2UgPSBuZXcgSW90cEdhdGV3YXkodG9wb2xvZ3ksIG5ldyBNYW5hZ2VkR2F0ZXdheShjZmdQcm9wcywgZGV2aWNlRGF0YSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3b29wcyIpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBkZXZBdHRyTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBkZXZBdHRyTWFwLnB1dChJb3RwR2F0ZXdheS5BVFRSX0RFVklDRV9UWVBFLCBpb3RwQ25EZXYxVHlwZSk7Ci0gICAgICAgIGRldkF0dHJNYXAucHV0KElvdHBHYXRld2F5LkFUVFJfREVWSUNFX0lELCBpb3RwQ25EZXYxSWQpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGNuRGV2MUZxRGV2aWNlSWQgPSBnd0RldmljZS5nZXRJb3REZXZpY2VJZChkZXZBdHRyTWFwKTsKLSAgICAgICAgSW90RGV2aWNlIGNuRGV2MURldmljZSA9IGd3RGV2aWNlLmdldElvdERldmljZShjbkRldjFGcURldmljZUlkKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR1cgZnFEZXZpY2VJZDogIiArIGd3RGV2aWNlLmdldERldmljZUlkKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNuLWRldjEgZnFEZXZpY2VJZDogICIgKyBjbkRldjFGcURldmljZUlkKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJb3REZXZpY2UgY24tZGV2MSBmcURldmljZUlkOiAgIiArIGNuRGV2MURldmljZS5nZXREZXZpY2VJZCgpKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgIFRTdHJlYW08ZG91YmxlW10+IHJhdyA9IHRvcG9sb2d5LnBvbGwoKCkgLT4gewotICAgICAgICAgICAgZG91YmxlW10gIHYgPSBuZXcgZG91YmxlWzNdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB2WzBdID0gci5uZXh0R2F1c3NpYW4oKSAqIDEwLjAgKyA0MC4wOwotICAgICAgICAgICAgdlsxXSA9IHIubmV4dEdhdXNzaWFuKCkgKiAxMC4wICsgNTAuMDsKLSAgICAgICAgICAgIHZbMl0gPSByLm5leHRHYXVzc2lhbigpICogMTAuMCArIDYwLjA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICB9LCAzLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIHN0cmVhbSBvZiBHYXRld2F5IGRldmljZSBldmVudHMKLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBnd0pzb24gPSByYXcubWFwKHYgLT4gewotICAgICAgICAgIEpzb25PYmplY3Qgam8yID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICAgICAgICBqbzIuYWRkUHJvcGVydHkoImd3LWZxRGV2aWNlSWQiLCBnd0RldmljZS5nZXREZXZpY2VJZCgpKTsKLSAgICAgICAgICBqbzIuYWRkUHJvcGVydHkoInRlbXAiLCB2WzBdKTsKLSAgICAgICAgICByZXR1cm4gam8yOwotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIHN0cmVhbSBvZiBhIGNvbm5lY3RlZCBkZXZpY2UncyBldmVudHMKLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBjbkRldjFKc29uID0gcmF3Lm1hcCh2IC0+IHsKLSAgICAgICAgICBKc29uT2JqZWN0IGpvMiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgam8yLmFkZFByb3BlcnR5KCJjbkRldjEtZnFEZXZpY2VJZCIsIGNuRGV2MURldmljZS5nZXREZXZpY2VJZCgpKTsKLSAgICAgICAgICBqbzIuYWRkUHJvcGVydHkoImh1bWlkaXR5IiwgdlsxXSk7Ci0gICAgICAgICAgcmV0dXJuIGpvMjsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKCF1c2VIdHRwKSB7Ci0gICAgICAgICAgZ3dEZXZpY2UuZXZlbnRzKGd3SnNvbiwgImd3LWRldmljZSIsIFFvUy5GSVJFX0FORF9GT1JHRVQpOwotICAgICAgICAgIGd3RGV2aWNlLmV2ZW50c0ZvckRldmljZShjbkRldjFGcURldmljZUlkLCBjbkRldjFKc29uLCAiZ3ctZXZlbnRzLWZvci1jbkRldjEiLCBRb1MuRklSRV9BTkRfRk9SR0VUKTsKLSAgICAgICAgICBjbkRldjFEZXZpY2UuZXZlbnRzKGNuRGV2MUpzb24sICJjbkRldjEtZXZlbnRzIiwgUW9TLkZJUkVfQU5EX0ZPUkdFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQdWJsaXNoaW5nIGV2ZW50cyB1c2luZyBIVFRQIik7Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiR1cgaHR0cEV2ZW50cyBpcyBOWUkiKTsKLSAgICAgICAgICAvLyBnd0RldmljZS5odHRwRXZlbnRzKGpzb24sICJzZW5zb3JzIik7Ci0gICAgICAgICAgLy8gZ3dEZXZpY2UuaHR0cEV2ZW50c0ZvckRldmljZShjbkRldjFGcURldmljZUlkLCBjbkRldjFKc29uLCAiZ3ctZXZlbnRzLWZvci1jbkRldjEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN1YnNjcmliZSB0byAvIHJlcG9ydCBjbWRzIGZvciB0aGUgR1cgYW5kIGFsbCBpdHMgY29ubmVjdGVkIGRldmljZXMKLSAgICAgICAgZ3dEZXZpY2UuY29tbWFuZHNGb3JEZXZpY2UoQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSkuc2luayhqbyAtPiBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkIGFsbC1jbWRzIGNtZDogIiArIGpvKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBzdWJzY3JpYmUgdG8gLyByZXBvcnQganVzdCBHVyBkZXZpY2UgY21kcwotICAgICAgICBnd0RldmljZS5jb21tYW5kcygpLnNpbmsoam8gLT4gU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCBnd0RldmljZSBjbWQ6ICIgKyBqbykpOwotICAgICAgICAKLSAgICAgICAgLy8gc3Vic2NyaWJlIHRvIC8gcmVwb3J0IGp1c3QgY25EZXYxIGRldmljZSBjbWRzCi0gICAgICAgIGd3RGV2aWNlLmNvbW1hbmRzRm9yRGV2aWNlKGNuRGV2MUZxRGV2aWNlSWQpLnNpbmsoam8gLT4gU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCBnd0RldmljZS1mb3ItY25EZXYxIGNtZDogIiArIGpvKSk7Ci0gICAgICAgIGNuRGV2MURldmljZS5jb21tYW5kcygpLnNpbmsoam8gLT4gU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCBjbkRldjEgY21kOiAiICsgam8pKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHN1YnNjcmliZSB0byAvIHJlcG9ydCBqdXN0IGNtZHMgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIHR5cGUKLSAgICAgICAgZ3dEZXZpY2UuY29tbWFuZHNGb3JUeXBlKGlvdHBHV0RldlR5cGUpLnNpbmsoam8gLT4gU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCBmb3ItdHlwZS1nd0RldmljZVR5cGUgY21kOiAiICsgam8pKTsKLSAgICAgICAgZ3dEZXZpY2UuY29tbWFuZHNGb3JUeXBlKGlvdHBDbkRldjFUeXBlKS5zaW5rKGpvIC0+IFN5c3RlbS5vdXQucHJpbnRsbigiUmVjZWl2ZWQgZm9yLXR5cGUtY25EZXYxRGV2aWNlVHlwZSBjbWQ6ICIgKyBqbykpOwotCi0gICAgICAgIHRwLnN1Ym1pdCh0b3BvbG9neSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BzLCBTdHJpbmcuLi4ga2V5cykgewotICAgICAgZm9yIChTdHJpbmcga2V5IDoga2V5cykgewotICAgICAgICBTdHJpbmcgdmFsID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKQotICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvSW90cFF1aWNrc3RhcnQuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBRdWlja3N0YXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDI0MTQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvSW90cFF1aWNrc3RhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuaW90cDsKLQotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmlvdC5Jb3REZXZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5pb3QuUW9TOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90cC5Jb3RwRGV2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwotCi0vKioKLSAqIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIFF1aWNrc3RhcnQgc2FtcGxlLgotICogU3VibWl0cyBhIEpTT04gZGV2aWNlIGV2ZW50IGV2ZXJ5IHNlY29uZCB1c2luZyB0aGUKLSAqIHNhbWUgZm9ybWF0IGFzIHRoZSBRdWlja3N0YXJ0IGRldmljZSBzaW11bGF0b3IsCi0gKiB3aXRoIGtleXMge0Bjb2RlIHRlbXB9LCB7QGNvZGUgaHVtaWRpdHl9ICBhbmQge0Bjb2RlIG9iamVjdFRlbXB9Ci0gKiBhbmQgcmFuZG9tIHZhbHVlcy4KLSAqIDxQPgotICogVGhlIGRldmljZSB0eXBlIGlzIHtAY29kZSBpb3RzYW1wbGVzLWVkZ2VudH0gYW5kIGEgcmFuZG9tCi0gKiBkZXZpY2UgaWRlbnRpZmllciBpcyBnZW5lcmF0ZWQuIEJvdGggYXJlIHByaW50ZWQgb3V0IHdoZW4KLSAqIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMuCi0gKiA8L1A+Ci0gKiBBIFVSTCBpcyBhbHNvIHByaW50ZWQgdGhhdCBhbGxvd3Mgdmlld2luZyBvZiB0aGUgZGF0YQotICogYXMgaXQgcmVjZWl2ZWQgYnkgdGhlIFF1aWNrc3RhcnQgc2VydmljZS4KLSAqCi0gKiA8cD5TZWUge0Bjb2RlIHNjcmlwdHMvY29ubmVjdG9ycy9pb3RwL1JFQURNRX0gZm9yIGluZm9ybWF0aW9uIGFib3V0IHJ1bm5pbmcgdGhlIHNhbXBsZS4KLSAqLwotcHVibGljIGNsYXNzIElvdHBRdWlja3N0YXJ0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotICAgICAgICBEaXJlY3RQcm92aWRlciB0cCA9IG5ldyBEaXJlY3RQcm92aWRlcigpOwotICAgICAgICBUb3BvbG9neSB0b3BvbG9neSA9IHRwLm5ld1RvcG9sb2d5KCJJb3RwUXVpY2tzdGFydCIpOwotICAgICAgICAKLSAgICAgICAgLy8gRGVjbGFyZSBhIGNvbm5lY3Rpb24gdG8gSW9URiBRdWlja3N0YXJ0IHNlcnZpY2UKLSAgICAgICAgU3RyaW5nIGRldmljZUlkID0gInFzIiArIExvbmcudG9IZXhTdHJpbmcobmV3IFJhbmRvbSgpLm5leHRMb25nKCkpOwotICAgICAgICBJb3REZXZpY2UgZGV2aWNlID0gSW90cERldmljZS5xdWlja3N0YXJ0KHRvcG9sb2d5LCBkZXZpY2VJZCk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlF1aWNrc3RhcnQgZGV2aWNlIHR5cGU6IiArIElvdHBEZXZpY2UuUVVJQ0tTVEFSVF9ERVZJQ0VfVFlQRSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUXVpY2tzdGFydCBkZXZpY2UgaWQgIDoiICsgZGV2aWNlSWQpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImh0dHBzOi8vcXVpY2tzdGFydC5pbnRlcm5ldG9mdGhpbmdzLmlibWNsb3VkLmNvbS8jL2RldmljZS8iCi0gICAgICAgICAgICAgKyBkZXZpY2VJZCk7Ci0gICAgICAgICAgICAgCi0gICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOwotICAgICAgICBUU3RyZWFtPGRvdWJsZVtdPiByYXcgPSB0b3BvbG9neS5wb2xsKCgpIC0+IHsKLSAgICAgICAgICAgIGRvdWJsZVtdICB2ID0gbmV3IGRvdWJsZVszXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdlswXSA9IHIubmV4dEdhdXNzaWFuKCkgKiAxMC4wICsgNDAuMDsKLSAgICAgICAgICAgIHZbMV0gPSByLm5leHRHYXVzc2lhbigpICogMTAuMCArIDUwLjA7Ci0gICAgICAgICAgICB2WzJdID0gci5uZXh0R2F1c3NpYW4oKSAqIDEwLjAgKyA2MC4wOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgfSwgMSwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIAotICAgICAgICBUU3RyZWFtPEpzb25PYmplY3Q+IGpzb24gPSByYXcubWFwKHYgLT4gewotICAgICAgICAgICAgSnNvbk9iamVjdCBqID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoInRlbXAiLCB2WzBdKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoImh1bWlkaXR5IiwgdlsxXSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJvYmplY3RUZW1wIiwgdlsyXSk7Ci0gICAgICAgICAgICByZXR1cm4gajsKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBkZXZpY2UuZXZlbnRzKGpzb24sICJzZW5zb3JzIiwgUW9TLkZJUkVfQU5EX0ZPUkdFVCk7Ci0KLSAgICAgICAgdHAuc3VibWl0KHRvcG9sb2d5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvaW90cC9Jb3RwUXVpY2tzdGFydDIuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBRdWlja3N0YXJ0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRlZTkyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBRdWlja3N0YXJ0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuaW90cDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90LlFvUzsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmlvdHAuSW90cERldmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLWltcG9ydCBjb20uaWJtLmlvdGYuY2xpZW50LmRldmljZS5EZXZpY2VDbGllbnQ7Ci1pbXBvcnQgY29tLmlibS5pb3RmLmRldmljZW1nbXQuRGV2aWNlRGF0YTsKLWltcG9ydCBjb20uaWJtLmlvdGYuZGV2aWNlbWdtdC5kZXZpY2UuTWFuYWdlZERldmljZTsKLQotLyoqCi0gKiBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBRdWlja3N0YXJ0IHNhbXBsZS4KLSAqIFN1Ym1pdHMgYSBKU09OIGRldmljZSBldmVudCBldmVyeSBzZWNvbmQgdXNpbmcgdGhlCi0gKiBzYW1lIGZvcm1hdCBhcyB0aGUgUXVpY2tzdGFydCBkZXZpY2Ugc2ltdWxhdG9yLAotICogd2l0aCBrZXlzIHtAY29kZSB0ZW1wfSwge0Bjb2RlIGh1bWlkaXR5fSAgYW5kIHtAY29kZSBvYmplY3RUZW1wfQotICogYW5kIHJhbmRvbSB2YWx1ZXMuCi0gKiA8UD4KLSAqIFRoZSBkZXZpY2UgdHlwZSBpcyB7QGNvZGUgaW90c2FtcGxlcy1lZGdlbnR9IGFuZCBhIHJhbmRvbQotICogZGV2aWNlIGlkZW50aWZpZXIgaXMgZ2VuZXJhdGVkLiBCb3RoIGFyZSBwcmludGVkIG91dCB3aGVuCi0gKiB0aGUgYXBwbGljYXRpb24gc3RhcnRzLgotICogPFA+Ci0gKiBBIFVSTCBpcyBhbHNvIHByaW50ZWQgdGhhdCBhbGxvd3Mgdmlld2luZyBvZiB0aGUgZGF0YQotICogYXMgaXQgcmVjZWl2ZWQgYnkgdGhlIFF1aWNrc3RhcnQgc2VydmljZS4KLSAqIDxQPgotICogVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIHVzaW5nIHRoZSBXSW9UUCBBUEkgdG8gaW5pdGlhbGl6ZSB0aGUgSW90cERldmljZQotICogY29ubmVjdG9yIGFzIHdlbGwgYXMgdGhlIGFiaWxpdHkgdG8gcHVibGlzaCBldmVudHMgdXNpbmcgdGhlIFdJb1RQIEhUVFAgcHJvdG9jb2wuCi0gKgotICogPHA+U2VlIHtAY29kZSBzY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9SRUFETUV9IGZvciBpbmZvcm1hdGlvbiBhYm91dCBydW5uaW5nIHRoZSBzYW1wbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBJb3RwUXVpY2tzdGFydDIgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBhcmdMaXN0ID0gQXJyYXlzLmFzTGlzdChhcmdzKTsKLSAgICAgICAgYm9vbGVhbiB1c2VEZXZpY2VDbGllbnQgPSBhcmdMaXN0LmNvbnRhaW5zKCJ1c2VEZXZpY2VDbGllbnQiKTsKLSAgICAgICAgYm9vbGVhbiB1c2VIdHRwID0gYXJnTGlzdC5jb250YWlucygidXNlSHR0cCIpOwotCi0gICAgICAgIERpcmVjdFByb3ZpZGVyIHRwID0gbmV3IERpcmVjdFByb3ZpZGVyKCk7Ci0gICAgICAgIFRvcG9sb2d5IHRvcG9sb2d5ID0gdHAubmV3VG9wb2xvZ3koIklvdHBRdWlja3N0YXJ0Iik7Ci0gICAgICAgIAotICAgICAgICAvLyBEZWNsYXJlIGEgY29ubmVjdG9yIHRvIElvVFAgUXVpY2tzdGFydCBzZXJ2aWNlLCBpbml0aWFsaXppbmcgd2l0aCBXSW9UUCBBUEkKLSAgICAgICAgU3RyaW5nIGRldmljZUlkID0gInFzIiArIExvbmcudG9IZXhTdHJpbmcobmV3IFJhbmRvbSgpLm5leHRMb25nKCkpOwotICAgICAgICBQcm9wZXJ0aWVzIG9wdGlvbnMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJvcmciLCAicXVpY2tzdGFydCIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJ0eXBlIiwgSW90cERldmljZS5RVUlDS1NUQVJUX0RFVklDRV9UWVBFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eSgiaWQiLCBkZXZpY2VJZCk7Ci0gICAgICAgIElvdHBEZXZpY2UgZGV2aWNlOwotICAgICAgICBpZiAodXNlRGV2aWNlQ2xpZW50KSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBXSW9UUCBEZXZpY2VDbGllbnQiKTsKLSAgICAgICAgICBkZXZpY2UgPSBuZXcgSW90cERldmljZSh0b3BvbG9neSwgbmV3IERldmljZUNsaWVudChvcHRpb25zKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBXSW9UUCBNYW5hZ2VkRGV2aWNlIik7Ci0gICAgICAgICAgRGV2aWNlRGF0YSBkZXZpY2VEYXRhID0gbmV3IERldmljZURhdGEuQnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgICAgICAgZGV2aWNlID0gbmV3IElvdHBEZXZpY2UodG9wb2xvZ3ksIG5ldyBNYW5hZ2VkRGV2aWNlKG9wdGlvbnMsIGRldmljZURhdGEpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJRdWlja3N0YXJ0IGRldmljZSB0eXBlOiIgKyBJb3RwRGV2aWNlLlFVSUNLU1RBUlRfREVWSUNFX1RZUEUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlF1aWNrc3RhcnQgZGV2aWNlIGlkICA6IiArIGRldmljZUlkKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJodHRwczovL3F1aWNrc3RhcnQuaW50ZXJuZXRvZnRoaW5ncy5pYm1jbG91ZC5jb20vIy9kZXZpY2UvIgotICAgICAgICAgICAgICsgZGV2aWNlSWQpOwotICAgICAgICAgICAgIAotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgVFN0cmVhbTxkb3VibGVbXT4gcmF3ID0gdG9wb2xvZ3kucG9sbCgoKSAtPiB7Ci0gICAgICAgICAgICBkb3VibGVbXSAgdiA9IG5ldyBkb3VibGVbM107Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZbMF0gPSByLm5leHRHYXVzc2lhbigpICogMTAuMCArIDQwLjA7Ci0gICAgICAgICAgICB2WzFdID0gci5uZXh0R2F1c3NpYW4oKSAqIDEwLjAgKyA1MC4wOwotICAgICAgICAgICAgdlsyXSA9IHIubmV4dEdhdXNzaWFuKCkgKiAxMC4wICsgNjAuMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0sIDEsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICAKLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBqc29uID0gcmF3Lm1hcCh2IC0+IHsKLSAgICAgICAgICAgIEpzb25PYmplY3QgaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJ0ZW1wIiwgdlswXSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJodW1pZGl0eSIsIHZbMV0pOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgib2JqZWN0VGVtcCIsIHZbMl0pOwotICAgICAgICAgICAgcmV0dXJuIGo7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmICghdXNlSHR0cCkgewotICAgICAgICAgIGRldmljZS5ldmVudHMoanNvbiwgInNlbnNvcnMiLCBRb1MuRklSRV9BTkRfRk9SR0VUKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlB1Ymxpc2hpbmcgZXZlbnRzIHVzaW5nIEhUVFAiKTsKLSAgICAgICAgICBkZXZpY2UuaHR0cEV2ZW50cyhqc29uLCAic2Vuc29ycyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHAuc3VibWl0KHRvcG9sb2d5KTsKLSAgICB9Ci0gfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvSW90cFNlbnNvcnMuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL0lvdHBTZW5zb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZjRiMTIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvSW90cFNlbnNvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuaW90cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90LkhlYXJ0QmVhdDsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmlvdC5Jb3REZXZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5pb3QuUW9TOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90cC5Jb3RwRGV2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RUb3BvbG9neTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LlNlbnNvcnNBZ2dyZWdhdGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLQotLyoqCi0gKiBTYW1wbGUgc2VuZGluZyBzZW5zb3IgZGV2aWNlIGV2ZW50cyB0byBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybS4gPEJSPgotICogU2ltdWxhdGVzIGEgY291cGxlIG9mIGJ1cnN0eSBzZW5zb3JzIGFuZCBzZW5kcyB0aGUgcmVhZGluZ3MgZnJvbSB0aGUgc2Vuc29ycwotICogdG8gSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0gYXMgZGV2aWNlIGV2ZW50cyB3aXRoIGlkIHtAY29kZSBzZW5zb3JzfS4gPEJSPgotICogU3Vic2NyaWJlcyB0byBkZXZpY2UgY29tbWFuZHMgd2l0aCBpZGVudGlmaWVyIHtAY29kZSBkaXNwbGF5fS4KLSAqIDxQPgotICogSW4gYWRkaXRpb24gYSBkZXZpY2UgZXZlbnQgd2l0aCBpZCB7QGNvZGUgaGVhcmJlYXR9IGlzIHNlbnQKLSAqIGV2ZXJ5IG1pbnV0ZS4gVGhpcyBlbnN1cmUgYSBjb25uZWN0aW9uIGF0dGVtcHQgdG8gSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0KLSAqIGlzIG1hZGUgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgYSBidXJzdHkgc2Vuc29yIHRvIGJlY29tZQotICogYWN0aXZlLgotICogPFA+Ci0gKiBUaGlzIHNhbXBsZSByZXF1aXJlcyBhbiBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBzZXJ2aWNlIGFuZCBhIGRldmljZSBjb25maWd1cmF0aW9uLjxCUj4KLSAqIEluIG9yZGVyIHRvIHNlZSBjb21tYW5kcyBzZW5kIGZyb20gSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0KLSAqIHRoZXJlIG11c3QgYmUgYW4gYW5hbHl0aWMgYXBwbGljYXRpb24KLSAqIHRoYXQgc2VuZHMgY29tbWFuZHMgd2l0aCB0aGUgaWRlbnRpZmllciB7QGNvZGUgZGlzcGxheX0uCi0gKiA8L1A+Ci0gKgotICogPHA+U2VlIHtAY29kZSBzY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9SRUFETUV9IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhCi0gKiBwcm90b3R5cGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcnVubmluZyB0aGUgc2FtcGxlLgotICovCi1wdWJsaWMgY2xhc3MgSW90cFNlbnNvcnMgewotCi0gICAgLyoqCi0gICAgICogUnVuIHRoZSBJb3RwU2Vuc29ycyBhcHBsaWNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBUYWtlcyBhIHNpbmdsZSBhcmd1bWVudCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZQotICAgICAqIGRldmljZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbmluZyB0aGUgY29ubmVjdGlvbgotICAgICAqIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhcmdzIE11c3QgY29udGFpbiB0aGUgcGF0aCB0byB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlIElvdHBEZXZpY2UjSW90cERldmljZShvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neSwgRmlsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgZGV2aWNlQ2ZnID0gYXJnc1swXTsKLQotICAgICAgICBEaXJlY3RQcm92aWRlciB0cCA9IG5ldyBEaXJlY3RQcm92aWRlcigpOwotICAgICAgICBEaXJlY3RUb3BvbG9neSB0b3BvbG9neSA9IHRwLm5ld1RvcG9sb2d5KCJJb3RwU2Vuc29ycyIpOwotCi0gICAgICAgIC8vIERlY2xhcmUgYSBjb25uZWN0aW9uIHRvIElvVEYKLSAgICAgICAgSW90RGV2aWNlIGRldmljZSA9IG5ldyBJb3RwRGV2aWNlKHRvcG9sb2d5LCBuZXcgRmlsZShkZXZpY2VDZmcpKTsKLQotICAgICAgICAvLyBTaW11bGF0ZWQgc2Vuc29ycyBmb3IgdGhpcyBkZXZpY2UuCi0gICAgICAgIHNpbXVsYXRlZFNlbnNvcnMoZGV2aWNlLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEhlYXJ0YmVhdAotICAgICAgICBoZWFydEJlYXQoZGV2aWNlLCB0cnVlKTsKLQotICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY29tbWFuZHMgb2YgaWQgImRpc3BsYXkiIGZvciB0aGlzCi0gICAgICAgIC8vIGRldmljZSBhbmQgcHJpbnQgdGhlbSB0byBzdGFuZGFyZCBvdXQKLSAgICAgICAgZGlzcGxheU1lc3NhZ2VzKGRldmljZSwgdHJ1ZSk7Ci0KLSAgICAgICAgdHAuc3VibWl0KHRvcG9sb2d5KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNpbXVsYXRlIHR3byBidXJzdHkgc2Vuc29ycyBhbmQgc2VuZCB0aGUgcmVhZGluZ3MgYXMgSW9URiBkZXZpY2UgZXZlbnRzCi0gICAgICogd2l0aCBhbiBpZGVudGlmaWVyIG9mIHtAY29kZSBzZW5zb3JzfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGV2aWNlCi0gICAgICogICAgICAgICAgICBJb1QgZGV2aWNlCi0gICAgICogQHBhcmFtIHByaW50Ci0gICAgICogICAgICAgICAgICBUcnVlIGlmIHRoZSBkYXRhIHN1Ym1pdHRlZCBhcyBldmVudHMgc2hvdWxkIGFsc28gYmUgcHJpbnRlZCB0bwotICAgICAqICAgICAgICAgICAgc3RhbmRhcmQgb3V0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaW11bGF0ZWRTZW5zb3JzKElvdERldmljZSBkZXZpY2UsIGJvb2xlYW4gcHJpbnQpIHsKLQotICAgICAgICBUU3RyZWFtPEpzb25PYmplY3Q+IHNlbnNvcnMgPSBTZW5zb3JzQWdncmVnYXRlcy5zZW5zb3JzQUIoZGV2aWNlLnRvcG9sb2d5KCkpOwotICAgICAgICBpZiAocHJpbnQpCi0gICAgICAgICAgICBzZW5zb3JzLnByaW50KCk7Ci0KLSAgICAgICAgLy8gU2VuZCB0aGUgZGV2aWNlIHN0cmVhbXMgYXMgSW9URiBkZXZpY2UgZXZlbnRzCi0gICAgICAgIC8vIHdpdGggZXZlbnQgaWRlbnRpZmllciAic2Vuc29ycyIuCi0gICAgICAgIGRldmljZS5ldmVudHMoc2Vuc29ycywgInNlbnNvcnMiLCBRb1MuRklSRV9BTkRfRk9SR0VUKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgaGVhcnQgYmVhdCBkZXZpY2UgZXZlbnQgd2l0aAotICAgICAqIGlkZW50aWZpZXIge0Bjb2RlIGhlYXJ0YmVhdH0gdG8KLSAgICAgKiBlbnN1cmUgdGhlcmUgaXMgc29tZSBpbW1lZGlhdGUgb3V0cHV0IGFuZAotICAgICAqIHRoZSBjb25uZWN0aW9uIHRvIElvVEYgaGFwcGVucyBhcyBzb29uIGFzIHBvc3NpYmxlLgotICAgICAqIEBwYXJhbSBkZXZpY2UgSW9UIGRldmljZQotICAgICAqIEBwYXJhbSBwcmludCB0cnVlIHRvIHByaW50IGdlbmVyYXRlZCBoZWFydGJlYXQgdHVwbGVzIHRvIFN5c3RlbS5vdXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGhlYXJ0QmVhdChJb3REZXZpY2UgZGV2aWNlLCBib29sZWFuIHByaW50KSB7Ci0gICAgICBUU3RyZWFtPEpzb25PYmplY3Q+IGhicyA9IAotICAgICAgICAgIEhlYXJ0QmVhdC5hZGRIZWFydEJlYXQoZGV2aWNlLCAxLCBUaW1lVW5pdC5NSU5VVEVTLCAiaGVhcnRiZWF0Iik7Ci0gICAgICBpZiAocHJpbnQpCi0gICAgICAgIGhicy5wcmludCgpOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIFN1YnNjcmliZSB0byBJb1RQIGRldmljZSBjb21tYW5kcyB3aXRoIGlkZW50aWZpZXIge0Bjb2RlIGRpc3BsYXl9LgotICAgICAqIFN1YnNjcmliaW5nIHRvIGRldmljZSBjb21tYW5kcyByZXR1cm5zIGEgc3RyZWFtIG9mIEpTT04gb2JqZWN0cyB0aGF0Ci0gICAgICogaW5jbHVkZSBhIHRpbWVzdGFtcCAoe0Bjb2RlIHRzbXN9KSwgY29tbWFuZCBpZGVudGlmaWVyICh7QGNvZGUgY29tbWFuZH0pCi0gICAgICogYW5kIHBheWxvYWQgKHtAY29kZSBwYXlsb2FkfSkuIFBheWxvYWQgaXMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljCi0gICAgICogcG9ydGlvbiBvZiB0aGUgY29tbWFuZC4gPEJSPgotICAgICAqIEluIHRoaXMgY2FzZSB0aGUgcGF5bG9hZCBpcyBleHBlY3RlZCB0byBiZSBhIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgYQotICAgICAqIHtAY29kZSBtc2d9IGtleSB3aXRoIGEgc3RyaW5nIGRpc3BsYXkgbWVzc2FnZS4gPEJSPgotICAgICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gY29uc2lzdHMgb2YgdGhlIGRpc3BsYXkgbWVzc2FnZSBzdHJpbmcgZXh0cmFjdGVkIGZyb20KLSAgICAgKiB0aGUgSlNPTiBwYXlsb2FkLgotICAgICAqIDxQPgotICAgICAqIE5vdGUgdG8gcmVjZWl2ZSBjb21tYW5kcyBhIGFuYWx5dGljIGFwcGxpY2F0aW9uIG11c3QgZXhpc3QgdGhhdCBnZW5lcmF0ZXMKLSAgICAgKiB0aGVtIHRocm91Z2ggSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0uCi0gICAgICogPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgZGV2aWNlCi0gICAgICogQHBhcmFtIHByaW50IHRydWUgdG8gcHJpbnQgdGhlIHJlY2VpdmVkIGNvbW1hbmQncyBwYXlsb2FkIHRvIFN5c3RlbS5vdXQuCi0gICAgICogQHJldHVybiB0aGUgc3RyZWFtCi0gICAgICogQHNlZSBJb3REZXZpY2UjY29tbWFuZHMoU3RyaW5nLi4uKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVFN0cmVhbTxTdHJpbmc+IGRpc3BsYXlNZXNzYWdlcyhJb3REZXZpY2UgZGV2aWNlLCBib29sZWFuIHByaW50KSB7Ci0gICAgICAgIC8vIFN1YnNjcmliZSB0byBjb21tYW5kcyBvZiBpZCAiZGlzcGxheSIgZm9yIHRoaXMgZGV2aWNlCi0gICAgICAgIFRTdHJlYW08SnNvbk9iamVjdD4gc3RhdHVzTXNncyA9IGRldmljZS5jb21tYW5kcygiZGlzcGxheSIpOwotCi0gICAgICAgIC8vIFRoZSByZXR1cm5lZCBKU09OIG9iamVjdCBpbmNsdWRlcyBzZXZlcmFsIGZpZWxkcwotICAgICAgICAvLyB0c21zIC0gVGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyAodGhpcyBpcyBnZW5lcmljIHRvIGEgY29tbWFuZCkKLSAgICAgICAgLy8gcGF5bG9hZC5tc2cgLSBTdGF0dXMgbWVzc2FnZSAodGhpcyBpcyBzcGVjaWZpYyB0byB0aGlzIGFwcGxpY2F0aW9uKQotCi0gICAgICAgIC8vIE1hcCB0byBhIFN0cmluZyBvYmplY3QgY29udGFpbmluZyB0aGUgbWVzc2FnZQotICAgICAgICBUU3RyZWFtPFN0cmluZz4gbWVzc2FnZXMgPSBzdGF0dXNNc2dzLm1hcChqIC0+IGouZ2V0QXNKc29uT2JqZWN0KCJwYXlsb2FkIikuZ2V0QXNKc29uUHJpbWl0aXZlKCJtc2ciKS5nZXRBc1N0cmluZygpKTsKLSAgICAgICAgaWYgKHByaW50KQotICAgICAgICAgICAgbWVzc2FnZXMucHJpbnQoKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9pb3RwL3BhY2thZ2UtaW5mby5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZGNmZTkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2lvdHAvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLyoqCi0gKiBTYW1wbGVzIHNob3dpbmcgdXNlIG9mIHRoZSBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBjb25uZWN0b3IKLSAqIHRvIHB1Ymxpc2ggZGV2aWNlIGV2ZW50cyBhbmQgc3Vic2NyaWJlIHRvIGRldmljZQotICogY29tbWFuZHMuCi0gKiAKLSAqIDxwPlRoZSAiUXVpY2tzdGFydCIgc2FtcGxlcyBjb25uZWN0IHRvIHRoZSBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybQotICogdXNpbmcgaXRzIFF1aWNrc3RhcnQgZmVhdHVyZSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgZGV2aWNlIHJlZ2lzdHJhdGlvbi4KLSAqIFdoZW4gdGhlIHNhbXBsZXMgYXJlIHJ1biB0aGV5IHByaW50IG91dCBhIFVSTCB3aGljaCBhbGxvd3MgYSBicm93c2VyCi0gKiB0byBzZWUgdGhlIGRhdGEgYmVpbmcgc2VudCBmcm9tIHRoaXMgc2FtcGxlLgotICogCi0gKiA8cD5UaGUgb3RoZXIgc2FtcGxlcyBjb25uZWN0IHRvIHlvdXIgSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0gc2VydmljZSBpbnN0YW5jZQotICogdXNpbmcgZGV2aWNlIGFuZCBhcHBsaWNhdGlvbiByZWdpc3RyYXRpb25zIHRoYXQgeW91IGhhdmUgY3JlYXRlZCB3aXRoIHlvdXIKLSAqIHNlcnZpY2UgaW5zdGFuY2UuCi0gKiAKLSAqIDxwPlNlZSBlYWNoIHNhbXBsZSdzIEphdmFkb2MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKiAKLSAqIDxwPlNlZSB7QGNvZGUgc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvUkVBRE1FfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgcnVubmluZyB0aGUgc2FtcGxlcy4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuaW90cDsKLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvRGJVdGlscy5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvRGJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDI2NGYxLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9qZGJjL0RiVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmpkYmM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7Ci0KLS8qKgotICogVXRpbGl0aWVzIGZvciB0aGUgc2FtcGxlJ3Mgbm9uLXN0cmVhbWluZyBKREJDIGRhdGFiYXNlIHJlbGF0ZWQgYWN0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIERiVXRpbHMgewotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgSkRCQyB7QGxpbmsgRGF0YVNvdXJjZX0gZm9yIHRoZSBkYXRhYmFzZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgImRiLm5hbWUiIHByb3BlcnR5IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UuCi0gICAgICogRGVmYXVsdHMgdG8gIkpkYmNDb25uZWN0b3JTYW1wbGVEYiIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotICAgICAqIEByZXR1cm4gdGhlIERhdGFTb3VyY2UKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoUHJvcGVydGllcyBwcm9wcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEZXJieUVtYmVkZGVkRGF0YVNvdXJjZShwcm9wcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIHNhbXBsZSdzIGRhdGFiYXNlLgotICAgICAqIDxwPgotICAgICAqIFRhYmxlcyBhcmUgY3JlYXRlZCBhcyBuZWVkZWQgYW5kIHB1cmdlZC4KLSAgICAgKiBAcGFyYW0gZHMgdGhlIERhdGFTb3VyY2UKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXREYihEYXRhU291cmNlIGRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY3JlYXRlVGFibGVzKGRzKTsKLSAgICAgICAgcHVyZ2VUYWJsZXMoZHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQdXJnZSB0aGUgc2FtcGxlJ3MgdGFibGVzCi0gICAgICogQHBhcmFtIGRzIHRoZSBEYXRhU291cmNlCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXJnZVRhYmxlcyhEYXRhU291cmNlIGRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IChDb25uZWN0aW9uIGNuID0gZHMuZ2V0Q29ubmVjdGlvbigpKSB7Ci0gICAgICAgICAgICBTdGF0ZW1lbnQgc3RtdCA9IGNuLmNyZWF0ZVN0YXRlbWVudCgpOwotICAgICAgICAgICAgc3RtdC5leGVjdXRlKCJERUxFVEUgRlJPTSBwZXJzb25zIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNyZWF0ZVRhYmxlcyhEYXRhU291cmNlIGRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IChDb25uZWN0aW9uIGNuID0gZHMuZ2V0Q29ubmVjdGlvbigpKSB7Ci0gICAgICAgICAgICBTdGF0ZW1lbnQgc3RtdCA9IGNuLmNyZWF0ZVN0YXRlbWVudCgpOwotICAgICAgICAgICAgc3RtdC5leGVjdXRlKCJDUkVBVEUgVEFCTEUgcGVyc29ucyAiCi0gICAgICAgICAgICAgICAgICAgICsgIigiCi0gICAgICAgICAgICAgICAgICAgICsgImlkIElOVEVHRVIgTk9UIE5VTEwsIgotICAgICAgICAgICAgICAgICAgICArICJmaXJzdG5hbWUgVkFSQ0hBUig0MCkgTk9UIE5VTEwsIgotICAgICAgICAgICAgICAgICAgICArICJsYXN0bmFtZSBWQVJDSEFSKDQwKSBOT1QgTlVMTCwiCi0gICAgICAgICAgICAgICAgICAgICsgIlBSSU1BUlkgS0VZIChpZCkiCi0gICAgICAgICAgICAgICAgICAgICsgIikiCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkuY29udGFpbnMoImFscmVhZHkgZXhpc3RzIikpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgIH0KLQotICAgcHJpdmF0ZSBzdGF0aWMgRGF0YVNvdXJjZSBjcmVhdGVEZXJieUVtYmVkZGVkRGF0YVNvdXJjZShQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICB7Ci0gICAgICAgU3RyaW5nIGRiTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KCJkYi5uYW1lIiwgIkpkYmNDb25uZWN0b3JTYW1wbGVEYiIpOwotICAgICAgIAotICAgICAgIC8vIEZvciBvdXIgc2FtcGxlLCBhdm9pZCBhIGNvbXBpbGUtdGltZSBkZXBlbmRlbmN5IHRvIHRoZSBqZGJjIGRyaXZlci4KLSAgICAgICAvLyBBdCBydW50aW1lLCByZXF1aXJlIHRoYXQgdGhlIGNsYXNzcGF0aCBjYW4gZmluZCBpdC4KLQotICAgICAgIFN0cmluZyBERVJCWV9EQVRBX1NPVVJDRSA9ICJvcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREYXRhU291cmNlIjsKLSAgIAotICAgICAgIENsYXNzPD8+IG5zRGF0YVNvdXJjZSA9IG51bGw7Ci0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgbnNEYXRhU291cmNlID0gQ2xhc3MuZm9yTmFtZShERVJCWV9EQVRBX1NPVVJDRSk7Ci0gICAgICAgfQotICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGaXggdGhlIHRlc3QgY2xhc3NwYXRoLiAiOwotICAgICAgICAgICBpZiAoU3lzdGVtLmdldGVudigiREVSQllfSE9NRSIpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgIG1zZyArPSAiREVSQllfSE9NRSBub3Qgc2V0LiAiOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIG1zZyArPSAiQ2xhc3Mgbm90IGZvdW5kOiAiK2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLSAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtc2cpOwotICAgICAgIH0KLSAgICAgICBEYXRhU291cmNlIGRzID0gKERhdGFTb3VyY2UpIG5zRGF0YVNvdXJjZS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICAgICBDbGFzc1tdIG1ldGhvZFBhcmFtcyA9IG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9OwotICAgICAgIE1ldGhvZCBkYm5hbWUgPSBuc0RhdGFTb3VyY2UuZ2V0TWV0aG9kKCJzZXREYXRhYmFzZU5hbWUiLCBtZXRob2RQYXJhbXMpOwotICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge2RiTmFtZX07Ci0gICAgICAgZGJuYW1lLmludm9rZShkcywgYXJncyk7Ci0KLSAgICAgICAvLyBjcmVhdGUgdGhlIGRiIGlmIG5lY2Vzc2FyeQotICAgICAgIE1ldGhvZCBjcmVhdGUgPSBuc0RhdGFTb3VyY2UuZ2V0TWV0aG9kKCJzZXRDcmVhdGVEYXRhYmFzZSIsIG1ldGhvZFBhcmFtcyk7Ci0gICAgICAgYXJncyA9IG5ldyBPYmplY3RbXSB7ImNyZWF0ZSJ9OwotICAgICAgIGNyZWF0ZS5pbnZva2UoZHMsIGFyZ3MpOwotCi0gICAgICAgLy8gc2V0IHRoZSB1c2VyCi0gICAgICAgTWV0aG9kIHNldHVzZXIgPSBuc0RhdGFTb3VyY2UuZ2V0TWV0aG9kKCJzZXRVc2VyIiwgbWV0aG9kUGFyYW1zKTsKLSAgICAgICBhcmdzID0gbmV3IE9iamVjdFtdIHsgcHJvcHMuZ2V0UHJvcGVydHkoImRiLnVzZXIiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIpKSB9OwotICAgICAgIHNldHVzZXIuaW52b2tlKGRzLCBhcmdzKTsKLQotICAgICAgIC8vIG9wdGlvbmFsbHkgc2V0IHRoZSBwdwotICAgICAgIE1ldGhvZCBzZXRwdyA9IG5zRGF0YVNvdXJjZS5nZXRNZXRob2QoInNldFBhc3N3b3JkIiwgbWV0aG9kUGFyYW1zKTsKLSAgICAgICBhcmdzID0gbmV3IE9iamVjdFtdIHsgcHJvcHMuZ2V0UHJvcGVydHkoImRiLnBhc3N3b3JkIikgfTsKLSAgICAgICBpZiAoYXJnc1swXSAhPSBudWxsKQotICAgICAgICAgICBzZXRwdy5pbnZva2UoZHMsIGFyZ3MpOwotICAgCi0gICAgICAgcmV0dXJuIGRzOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvUGVyc29uLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvamRiYy9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1NzYyOS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvamRiYy9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuamRiYzsKLQotLyoqCi0gKiBBIFBlcnNvbiBvYmplY3QgZm9yIHRoZSBzYW1wbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzb24gewotICAgIGludCBpZDsKLSAgICBTdHJpbmcgZmlyc3ROYW1lOwotICAgIFN0cmluZyBsYXN0TmFtZTsKLSAgICBQZXJzb24oaW50IGlkLCBTdHJpbmcgZmlyc3QsIFN0cmluZyBsYXN0KSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdDsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3Q7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJpZD0lZCBmaXJzdD0lcyBsYXN0PSVzIiwKLSAgICAgICAgICAgICAgICBpZCwgZmlyc3ROYW1lLCBsYXN0TmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvUGVyc29uRGF0YS5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvUGVyc29uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2YxMjExLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9qZGJjL1BlcnNvbkRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuamRiYzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgbG9hZGluZyB0aGUgc2FtcGxlJ3MgcGVyc29uIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzb25EYXRhIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBwZXJzb24gZGF0YSBmcm9tIHRoZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgInBlcnNvbmRhdGEucGF0aCIKLSAgICAgKiBwcm9wZXJ0eS4KLSAgICAgKiBAcGFyYW0gcHJvcHMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCi0gICAgICogQHJldHVybiB0aGUgbG9hZGVkIHBlcnNvbiBkYXRhCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxQZXJzb24+IGxvYWRQZXJzb25EYXRhKFByb3BlcnRpZXMgcHJvcHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcGF0aG5hbWUgPSBwcm9wcy5nZXRQcm9wZXJ0eSgicGVyc29uZGF0YS5wYXRoIik7Ci0gICAgICAgIExpc3Q8UGVyc29uPiBwZXJzb25zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIFBhdGggcGF0aCA9IG5ldyBGaWxlKHBhdGhuYW1lKS50b1BhdGgoKTsKLSAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKHBhdGgpKSB7Ci0gICAgICAgICAgICBpbnQgbGluZW5vID0gMDsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxpbmVubysrOwotICAgICAgICAgICAgICAgIE9iamVjdFtdIGZpZWxkcyA9IHBhcnNlTGluZShsaW5lLCBsaW5lbm8sIHBhdGhuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGRzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHBlcnNvbnMuYWRkKG5ldyBQZXJzb24oKEludGVnZXIpZmllbGRzWzBdLCAoU3RyaW5nKWZpZWxkc1sxXSwgKFN0cmluZylmaWVsZHNbMl0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGVyc29uczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gcGFyc2VMaW5lKFN0cmluZyBsaW5lLCBpbnQgbGluZW5vLCBTdHJpbmcgcGF0aG5hbWUpIHsKLSAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCIjIikpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAvLyBpZCxmaXJzdE5hbWUsbGFzdE5hbWUKLSAgICAgICAgU3RyaW5nW10gaXRlbXMgPSBsaW5lLnNwbGl0KCIsIik7Ci0gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPCAzKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkYXRhIG9uIGxpbmUgIitsaW5lbm8rIiBpbiAiK3BhdGhuYW1lKTsKLSAgICAgICAgaW50IGlkOwotICAgICAgICB0cnkgewotICAgICAgICAgICBpZCA9IG5ldyBJbnRlZ2VyKGl0ZW1zWzBdKTsKLSAgICAgICAgICAgaWYgKGlkIDwgMSkKLSAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGF0YSBvbiBsaW5lICIrbGluZW5vKyIgaW4gIitwYXRobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgb24gbGluZSAiK2xpbmVubysiIGluICIrcGF0aG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBPYmplY3RbXSBmaWVsZHMgPSBuZXcgT2JqZWN0WzNdOwotICAgICAgICBmaWVsZHNbMF0gPSBpZDsKLSAgICAgICAgZmllbGRzWzFdID0gaXRlbXNbMV0udHJpbSgpOwotICAgICAgICBmaWVsZHNbMl0gPSBpdGVtc1syXS50cmltKCk7Ci0gICAgICAgIHJldHVybiBmaWVsZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIHtAY29kZSBMaXN0PFBlcnNvbj59IHRvIGEge0Bjb2RlIExpc3Q8UGVyc29uSWQ+fQotICAgICAqIEBwYXJhbSBwZXJzb25zIHRoZSBwZXJzb24gbGlzdAotICAgICAqIEByZXR1cm4gdGhlIHBlcnNvbiBpZCBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFBlcnNvbklkPiB0b1BlcnNvbklkcyhMaXN0PFBlcnNvbj4gcGVyc29ucykgewotICAgICAgICByZXR1cm4gcGVyc29ucy5zdHJlYW0oKQotICAgICAgICAgICAgLm1hcChwZXJzb24gLT4gbmV3IFBlcnNvbklkKHBlcnNvbi5pZCkpCi0gICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvamRiYy9QZXJzb25JZC5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvUGVyc29uSWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4YTAyNy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvamRiYy9QZXJzb25JZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5qZGJjOwotCi0vKioKLSAqIEFub3RoZXIgY2xhc3MgY29udGFpbmluZyBhIHBlcnNvbiBpZCBmb3IgdGhlIHNhbXBsZS4KLSAqLwotcHVibGljIGNsYXNzIFBlcnNvbklkIHsKLSAgICBpbnQgaWQ7Ci0gICAgUGVyc29uSWQoaW50IGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoImlkPSVkIiwgaWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9qZGJjL1NpbXBsZVJlYWRlckFwcC5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvU2ltcGxlUmVhZGVyQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNmI0NTkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvU2ltcGxlUmVhZGVyQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5qZGJjOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmpkYmMuSmRiY1N0cmVhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi0vKioKLSAqIEEgc2ltcGxlIEpEQkMgY29ubmVjdG9yIHNhbXBsZSBkZW1vbnN0cmF0aW5nIHN0cmVhbWluZyByZWFkIGFjY2VzcwotICogb2YgYSBkYm1zIHRhYmxlIGFuZCBjcmVhdGluZyBzdHJlYW0gdHVwbGVzIGZyb20gdGhlIHJlc3VsdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZWFkZXJBcHAgewotICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBwcm9wczsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIm1pc3NpbmcgcGF0aG5hbWUgdG8gamRiYy5wcm9wZXJ0aWVzIGZpbGUiKTsKLSAgICAgICAgU2ltcGxlUmVhZGVyQXBwIHJlYWRlciA9IG5ldyBTaW1wbGVSZWFkZXJBcHAoYXJnc1swXSk7Ci0gICAgICAgIHJlYWRlci5ydW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gamRiY1Byb3BzUGF0aCBwYXRobmFtZSB0byBwcm9wZXJ0aWVzIGZpbGUKLSAgICAgKi8KLSAgICBTaW1wbGVSZWFkZXJBcHAoU3RyaW5nIGpkYmNQcm9wc1BhdGgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLmxvYWQoRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIobmV3IEZpbGUoamRiY1Byb3BzUGF0aCkudG9QYXRoKCkpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdG9wb2xvZ3kgZm9yIHRoZSB3cml0ZXIgYXBwbGljYXRpb24gYW5kIHJ1biBpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERpcmVjdFByb3ZpZGVyIHRwID0gbmV3IERpcmVjdFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBidWlsZCB0aGUgYXBwbGljYXRpb24vdG9wb2xvZ3kKLSAgICAgICAgCi0gICAgICAgIFRvcG9sb2d5IHQgPSB0cC5uZXdUb3BvbG9neSgiamRiY1NhbXBsZVdyaXRlciIpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkRCQyBjb25uZWN0b3IKLSAgICAgICAgSmRiY1N0cmVhbXMgbXlEYiA9IG5ldyBKZGJjU3RyZWFtcyh0LAotICAgICAgICAgICAgICAgICgpIC0+IERiVXRpbHMuZ2V0RGF0YVNvdXJjZShwcm9wcyksCi0gICAgICAgICAgICAgICAgZGF0YVNvdXJjZSAtPiBkYXRhU291cmNlLmdldENvbm5lY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBzYW1wbGUgc3RyZWFtIG9mIHR1cGxlcyBjb250YWluaW5nIGEgcGVyc29uIGlkCi0gICAgICAgIExpc3Q8UGVyc29uSWQ+IHBlcnNvbklkTGlzdCA9IFBlcnNvbkRhdGEudG9QZXJzb25JZHMoUGVyc29uRGF0YS5sb2FkUGVyc29uRGF0YShwcm9wcykpOwotICAgICAgICBwZXJzb25JZExpc3QuYWRkKG5ldyBQZXJzb25JZCg5OTk5OSkpOwotICAgICAgICBUU3RyZWFtPFBlcnNvbklkPiBwZXJzb25JZHMgPSB0LmNvbGxlY3Rpb24ocGVyc29uSWRMaXN0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIEZvciBlYWNoIHR1cGxlIG9uIHRoZSBzdHJlYW0sIHJlYWQgaW5mbyBmcm9tIHRoZSBkYiB0YWJsZQotICAgICAgICAvLyB1c2luZyB0aGUgImlkIiwgYW5kIGNyZWF0ZSBhIFBlcnNvbiB0dXBsZSBvbiB0aGUgcmVzdWx0IHN0cmVhbS4KLSAgICAgICAgVFN0cmVhbTxQZXJzb24+IHBlcnNvbnMgPSBteURiLmV4ZWN1dGVTdGF0ZW1lbnQocGVyc29uSWRzLAotICAgICAgICAgICAgICAgICgpIC0+ICJTRUxFQ1QgaWQsIGZpcnN0bmFtZSwgbGFzdG5hbWUgRlJPTSBwZXJzb25zIFdIRVJFIGlkID0gPyIsCi0gICAgICAgICAgICAgICAgKHBlcnNvbklkLHN0bXQpIC0+IHN0bXQuc2V0SW50KDEsIHBlcnNvbklkLmlkKSwKLSAgICAgICAgICAgICAgICAocGVyc29uSWQsclNldCxleGMscmVzdWx0U3RyZWFtKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGZhaWx1cmUgcHJvY2Vzc2luZyB0aGlzIHR1cGxlLiBhbiBlcnJvciB3YXMgbG9nZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIHByb2Nlc3MgaWQ9IitwZXJzb25JZCsiOiAiK2V4Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJTZXQubmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0U3RyZWFtLmFjY2VwdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQZXJzb24oclNldC5nZXRJbnQoImlkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJTZXQuZ2V0U3RyaW5nKCJmaXJzdG5hbWUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclNldC5nZXRTdHJpbmcoImxhc3RuYW1lIikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5rbm93biBwZXJzb24gaWQ9IitwZXJzb25JZC5pZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgLy8gcHJpbnQgb3V0IFBlcnNvbiB0dXBsZXMgYXMgdGhleSBhcmUgcmV0cmlldmVkIAotICAgICAgICBwZXJzb25zLnNpbmsocGVyc29uIC0+IFN5c3RlbS5vdXQucHJpbnRsbigicmV0cmlldmVkIHBlcnNvbjogIitwZXJzb24pKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJ1biB0aGUgYXBwbGljYXRpb24gLyB0b3BvbG9neQotICAgICAgICB0cC5zdWJtaXQodCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2pkYmMvU2ltcGxlV3JpdGVyQXBwLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvamRiYy9TaW1wbGVXcml0ZXJBcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4Yzk3Yi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvamRiYy9TaW1wbGVXcml0ZXJBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuamRiYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5qZGJjLkpkYmNTdHJlYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLQotLyoqCi0gKiBBIHNpbXBsZSBKREJDIGNvbm5lY3RvciBzYW1wbGUgZGVtb25zdHJhdGluZyBzdHJlYW1pbmcgd3JpdGUgYWNjZXNzCi0gKiBvZiBhIGRibXMgdG8gYWRkIHN0cmVhbSB0dXBsZXMgdG8gYSB0YWJsZS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVdyaXRlckFwcCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigibWlzc2luZyBwYXRobmFtZSB0byBqZGJjLnByb3BlcnRpZXMgZmlsZSIpOwotICAgICAgICBTaW1wbGVXcml0ZXJBcHAgd3JpdGVyID0gbmV3IFNpbXBsZVdyaXRlckFwcChhcmdzWzBdKTsKLSAgICAgICAgRGJVdGlscy5pbml0RGIoRGJVdGlscy5nZXREYXRhU291cmNlKHdyaXRlci5wcm9wcykpOwotICAgICAgICB3cml0ZXIucnVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGpkYmNQcm9wc1BhdGggcGF0aG5hbWUgdG8gcHJvcGVydGllcyBmaWxlCi0gICAgICovCi0gICAgU2ltcGxlV3JpdGVyQXBwKFN0cmluZyBqZGJjUHJvcHNQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5sb2FkKEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlKGpkYmNQcm9wc1BhdGgpLnRvUGF0aCgpKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHRvcG9sb2d5IGZvciB0aGUgd3JpdGVyIGFwcGxpY2F0aW9uIGFuZCBydW4gaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEaXJlY3RQcm92aWRlciB0cCA9IG5ldyBEaXJlY3RQcm92aWRlcigpOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgdGhlIGFwcGxpY2F0aW9uL3RvcG9sb2d5Ci0gICAgICAgIAotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koImpkYmNTYW1wbGVXcml0ZXIiKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpEQkMgY29ubmVjdG9yCi0gICAgICAgIEpkYmNTdHJlYW1zIG15RGIgPSBuZXcgSmRiY1N0cmVhbXModCwKLSAgICAgICAgICAgICAgICAoKSAtPiBEYlV0aWxzLmdldERhdGFTb3VyY2UocHJvcHMpLAotICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgLT4gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgc2FtcGxlIHN0cmVhbSBvZiBQZXJzb24gdHVwbGVzCi0gICAgICAgIFRTdHJlYW08UGVyc29uPiBwZXJzb25zID0gdC5jb2xsZWN0aW9uKFBlcnNvbkRhdGEubG9hZFBlcnNvbkRhdGEocHJvcHMpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdyaXRlIHN0cmVhbSB0dXBsZXMgdG8gYSB0YWJsZS4KLSAgICAgICAgbXlEYi5leGVjdXRlU3RhdGVtZW50KHBlcnNvbnMsCi0gICAgICAgICAgICAgICAgKCkgLT4gIklOU0VSVCBJTlRPIHBlcnNvbnMgVkFMVUVTKD8sPyw/KSIsCi0gICAgICAgICAgICAgICAgKHBlcnNvbixzdG10KSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zZXJ0aW5nIGludG8gcGVyc29ucyB0YWJsZTogcGVyc29uICIrcGVyc29uKTsKLSAgICAgICAgICAgICAgICAgICAgc3RtdC5zZXRJbnQoMSwgcGVyc29uLmlkKTsKLSAgICAgICAgICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoMiwgcGVyc29uLmZpcnN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDMsIHBlcnNvbi5sYXN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgLy8gcnVuIHRoZSBhcHBsaWNhdGlvbiAvIHRvcG9sb2d5Ci0gICAgICAgIHRwLnN1Ym1pdCh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvamRiYy9wYWNrYWdlLWluZm8uamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9qZGJjL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg4Yjc3Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9qZGJjL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi0vKioKLSAqIFNhbXBsZXMgc2hvd2luZyB1c2Ugb2YgdGhlCi0gKiA8YSBocmVmPSJ7QGRvY1Jvb3R9L29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvamRiYy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gKiAgICAgSkRCQyBzdHJlYW0gY29ubmVjdG9yPC9hPi4KLSAqIDxwPgotICogU2VlICZsdDtlZGdlbnQtcmVsZWFzZSZndDsvc2NyaXB0cy9jb25uZWN0b3JzL2pkYmMvUkVBRE1FIHRvIHJ1biB0aGUgc2FtcGxlcy4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBzYW1wbGVzIGFyZSBwcm92aWRlZDoKLSAqIDx1bD4KLSAqIDxsaT5TaW1wbGVSZWFkZXJBcHAuamF2YSAtIGEgc2ltcGxlIGRibXMgcmVhZGVyIGFwcGxpY2F0aW9uIHRvcG9sb2d5PC9saT4KLSAqIDxsaT5TaW1wbGVXcml0ZXJBcHAuamF2YSAtIGEgc2ltcGxlIGRibXMgd3JpdGVyIGFwcGxpY2F0aW9uIHRvcG9sb2d5PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmpkYmM7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMva2Fma2EvS2Fma2FDbGllbnQuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9LYWZrYUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDVhNTMwLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9LYWZrYUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2E7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuT3B0aW9uczsKLQotLyoqCi0gKiBEZW1vbnN0cmF0ZSBpbnRlZ3JhdGluZyB3aXRoIHRoZSBBcGFjaGUgS2Fma2EgbWVzc2FnaW5nIHN5c3RlbQotICogPGEgaHJlZj0iaHR0cDovL2thZmthLmFwYWNoZS5vcmciPmh0dHA6Ly9rYWZrYS5hcGFjaGUub3JnPC9hPi4KLSAqIDxwPgotICoge0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMua2Fma2EuS2Fma2FQcm9kdWNlciBLYWZrYVByb2R1Y2VyfSBpcwotICogYSBjb25uZWN0b3IgdXNlZCB0byBjcmVhdGUgYSBicmlkZ2UgYmV0d2VlbiB0b3BvbG9neSBzdHJlYW1zCi0gKiBhbmQgcHVibGlzaGluZyB0byBLYWZrYSB0b3BpY3MuCi0gKiA8cD4KLSAqIHtAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmthZmthLkthZmthQ29uc3VtZXIgS2Fma2FDb25zdW1lcn0gaXMKLSAqIGEgY29ubmVjdG9yIHVzZWQgdG8gY3JlYXRlIGEgYnJpZGdlIGJldHdlZW4gdG9wb2xvZ3kgc3RyZWFtcwotICogYW5kIHN1YnNjcmliaW5nIHRvIEthZmthIHRvcGljcy4KLSAqIDxwPgotICogVGhlIGNsaWVudCBlaXRoZXIgcHVibGlzaGVzIG1lc3NhZ2VzIHRvIGEgdG9waWMgb3IgICAKLSAqIHN1YnNjcmliZXMgdG8gdGhlIHRvcGljIGFuZCByZXBvcnRzIHRoZSBtZXNzYWdlcyByZWNlaXZlZC4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgYSBydW5uaW5nIEthZmthIGNsdXN0ZXIgd2l0aCB0aGUgZm9sbG93aW5nCi0gKiBjaGFyYWN0ZXJpc3RpY3MgaXMgYXNzdW1lZDoKLSAqIDx1bD4KLSAqIDxsaT57QGNvZGUgYm9vdHN0cmFwLnNlcnZlcnM9ImxvY2FsaG9zdDo5MDkyIn08L2xpPgotICogPGxpPntAY29kZSB6b29rZWVwZXIuY29ubmVjdD0ibG9jYWxob3N0OjIxODEifTwvbGk+Ci0gKiA8bGk+a2Fma2EgdG9waWMge0Bjb2RlICJrYWZrYVNhbXBsZVRvcGljIn0gZXhpc3RzPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFNlZSB0aGUgQXBhY2hlIEthZmthIGxpbmsgYWJvdmUgZm9yIGluZm9ybWF0aW9uIGFib3V0IHNldHRpbmcgdXAgYSBLYWZrYQotICogY2x1c3RlciBhcyB3ZWxsIGFzIGNyZWF0aW5nIGEgdG9waWMuCi0gKiA8cD4KLSAqIFRoaXMgbWF5IGJlIGV4ZWN1dGVkIGZyb20gYXM6Ci0gKiA8VUw+Ci0gKiA8TEk+Ci0gKiB7QGNvZGUgamF2YSAtY3Agc2FtcGxlcy9saWIvb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmthZmthLmphcgotICogIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNsaWVudCAtaAotICogfSAtIFJ1biBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gKiA8L0xJPgotICogPC9VTD4KLSAqIDxVTD4KLSAqIDxMST4KLSAqIEFuIGFwcGxpY2F0aW9uIGV4ZWN1dGlvbiB3aXRoaW4geW91ciBJREUgb25jZSB5b3Ugc2V0IHRoZSBjbGFzcyBwYXRoIHRvIGluY2x1ZGUgdGhlIGNvcnJlY3QgamFycy48L0xJPgotICogPC9VTD4KLSAqLwotcHVibGljIGNsYXNzIEthZmthQ2xpZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdXNhZ2UgPSAidXNhZ2U6ICIKLSAgICAgICAgICAgICsgIlxuIiArICJbLXZdIFstaF0iCi0gICAgICAgICAgICArICJcbiIgKyAicHViIHwgc3ViIgotICAgICAgICAgICAgKyAiXG4iICsgIltib290c3RyYXAuc2VydmVycz08dmFsdWU+XSIKLSAgICAgICAgICAgICsgIlxuIiArICJbem9va2VlcGVyLmNvbm5lY3Q9PHZhbHVlPl0iCi0gICAgICAgICAgICArICJcbiIgKyAiW2dyb3VwLmlkPTx2YWx1ZT5dIgotICAgICAgICAgICAgKyAiXG4iICsgIltwdWJjbnQ9PHZhbHVlPl0iCi0gICAgICAgICAgICA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gcHJvY2Vzc0FyZ3MoYXJncyk7Ci0gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgUnVubmVyLnJ1bihvcHRpb25zKTsKLSAgICB9Ci0gICAgIAotICAgIHByaXZhdGUgc3RhdGljIE9wdGlvbnMgcHJvY2Vzc0FyZ3MoU3RyaW5nW10gYXJncykgewotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBpbml0SGFuZGxlcnMob3B0aW9ucyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvcHRpb25zLnByb2Nlc3NBcmdzKGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHVzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoKEJvb2xlYW4pb3B0aW9ucy5nZXQoT1BUX0hFTFApKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odXNhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghKEJvb2xlYW4pb3B0aW9ucy5nZXQoT1BUX1BVQikgJiYgIShCb29sZWFuKW9wdGlvbnMuZ2V0KE9QVF9TVUIpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiTWlzc2luZyBhcmd1bWVudCAnJXMnIG9yICclcycuIiwgT1BUX1BVQiwgT1BUX1NVQikpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHVzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBhbm5vdW5jZU9wdHMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICB9OwotICAgICAgICBpZiAoKEJvb2xlYW4pb3B0aW9ucy5nZXQoT1BUX1ZFUkJPU0UpKQotICAgICAgICAgICAgYW5ub3VuY2VPcHRzID0gb3B0aW9ucy5nZXRBbGwoKS5zdHJlYW0oKS5tYXAoZSAtPiBlLmdldEtleSgpKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwotICAgICAgICBmb3IgKFN0cmluZyBvcHQgOiBhbm5vdW5jZU9wdHMpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9wdGlvbnMuZ2V0KG9wdCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChvcHQudG9Mb3dlckNhc2UoKS5jb250YWlucygicGFzc3dvcmQiKSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiKioqKioiOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgIitvcHQrIj0iK3ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1ZFUkJPU0UgPSAiLXYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX0hFTFAgPSAiLWgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1BVQiA9ICJwdWIiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1NVQiA9ICJzdWIiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX0JPT1RTVFJBUF9TRVJWRVJTID0gImJvb3RzdHJhcC5zZXJ2ZXJzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVF9aT09LRUVQRVJfQ09OTkVDVCA9ICJ6b29rZWVwZXIuY29ubmVjdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRfR1JPVVBfSUQgPSAiZ3JvdXAuaWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1RPUElDID0gInRvcGljIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVF9QVUJfQ05UID0gInB1YmNudCI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0SGFuZGxlcnMoT3B0aW9ucyBvcHRzKSB7Ci0gICAgICAgIC8vIG9wdGlvbnMgZm9yIHdoaWNoIHdlIGhhdmUgYSBkZWZhdWx0Ci0gICAgICAgIG9wdHMuYWRkSGFuZGxlcihPUFRfSEVMUCwgbnVsbCwgZmFsc2UpOwotICAgICAgICBvcHRzLmFkZEhhbmRsZXIoT1BUX1ZFUkJPU0UsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9QVUIsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9TVUIsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9CT09UU1RSQVBfU0VSVkVSUywgdiAtPiB2LCAibG9jYWxob3N0OjkwOTIiKTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9aT09LRUVQRVJfQ09OTkVDVCwgdiAtPiB2LCAibG9jYWxob3N0OjIxODEiKTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9UT1BJQywgdiAtPiB2LCAia2Fma2FTYW1wbGVUb3BpYyIpOwotICAgICAgICBvcHRzLmFkZEhhbmRsZXIoT1BUX1BVQl9DTlQsIHYgLT4gSW50ZWdlci52YWx1ZU9mKHYpLCAtMSk7Ci0KLSAgICAgICAgLy8gb3B0aW9uYWwgb3B0aW9ucyAobm8gZGVmYXVsdCB2YWx1ZSkKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9HUk9VUF9JRCwgdiAtPiB2KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMva2Fma2EvUHVibGlzaGVyQXBwLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMva2Fma2EvUHVibGlzaGVyQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDZhN2QuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL1B1Ymxpc2hlckFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2EuS2Fma2FDbGllbnQuT1BUX0JPT1RTVFJBUF9TRVJWRVJTOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2EuS2Fma2FDbGllbnQuT1BUX1BVQl9DTlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNsaWVudC5PUFRfVE9QSUM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLk1zZ1N1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3lQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMua2Fma2EuS2Fma2FQcm9kdWNlcjsKLQotLyoqCi0gKiBBIEthZmthIHByb2R1Y2VyL3B1Ymxpc2hlciB0b3BvbG9neSBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlckFwcCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUb3BvbG9neVByb3ZpZGVyIHRwOwotICAgIHByaXZhdGUgZmluYWwgT3B0aW9ucyBvcHRpb25zOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRwIHRoZSBUb3BvbG9neVByb3ZpZGVyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqLwotICAgIFB1Ymxpc2hlckFwcChUb3BvbG9neVByb3ZpZGVyIHRwLCBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy50cCA9IHRwOwotICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB0b3BvbG9neSBmb3IgdGhlIHB1Ymxpc2hlciBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBUb3BvbG9neQotICAgICAqLwotICAgIHB1YmxpYyBUb3BvbG9neSBidWlsZEFwcFRvcG9sb2d5KCkgewotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koImthZmthQ2xpZW50UHVibGlzaGVyIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBzYW1wbGUgc3RyZWFtIG9mIHR1cGxlcyB0byBwdWJsaXNoCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBtc2dzID0gdC5wb2xsKG5ldyBNc2dTdXBwbGllcihvcHRpb25zLmdldChPUFRfUFVCX0NOVCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFMLCBUaW1lVW5pdC5TRUNPTkRTKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIEthZmthUHJvZHVjZXIgYnJva2VyIGNvbm5lY3RvcgotICAgICAgICBNYXA8U3RyaW5nLE9iamVjdD4gY29uZmlnID0gbmV3Q29uZmlnKCk7Ci0gICAgICAgIEthZmthUHJvZHVjZXIga2Fma2EgPSBuZXcgS2Fma2FQcm9kdWNlcih0LCAoKSAtPiBjb25maWcpOwotICAgICAgICAKLSAgICAgICAgLy8gUHVibGlzaCB0aGUgc3RyZWFtIHRvIHRoZSB0b3BpYy4gIFRoZSBTdHJpbmcgdHVwbGUgaXMgdGhlIG1lc3NhZ2UgdmFsdWUuCi0gICAgICAgIGthZmthLnB1Ymxpc2gobXNncywgb3B0aW9ucy5nZXQoT1BUX1RPUElDKSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLE9iamVjdD4gbmV3Q29uZmlnKCkgewotICAgICAgICBNYXA8U3RyaW5nLE9iamVjdD4gY29uZmlnID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICAvLyByZXF1aXJlZCBrYWZrYSBjb25maWd1cmF0aW9uIGl0ZW1zCi0gICAgICAgIGNvbmZpZy5wdXQoImJvb3RzdHJhcC5zZXJ2ZXJzIiwgb3B0aW9ucy5nZXQoT1BUX0JPT1RTVFJBUF9TRVJWRVJTKSk7Ci0gICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMva2Fma2EvUkVBRE1FIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1NGY4Yi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMva2Fma2EvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotU2FtcGxlIEthZmthIFB1Ymxpc2hlciBhbmQgU3Vic2NyaWJlciB0b3BvbG9neSBhcHBsaWNhdGlvbnMuCi0KLUJ5IGRlZmF1bHQgdGhlIHNhbXBsZXMgYXNzdW1lIHRoZSBmb2xsb3dpbmcga2Fma2EgYnJva2VyIGNvbmZpZ3VyYXRpb246Ci0tIGJvb3RzdHJhcC5zZXJ2ZXJzPSJsb2NhbGhvc3Q6OTA5MiIKLS0gem9va2VlcGVyLmNvbm5lY3Q9ImxvY2FsaG9zdDoyMTgxIgotLSBrYWZrYSB0b3BpYyAia2Fma2FTYW1wbGVUb3BpYyIgZXhpc3RzCi0tIG5vIGF1dGhlbnRpY2F0aW9uCi0KLVNlZSBodHRwOi8va2Fma2EuYXBhY2hlLm9yZyBmb3IgdGhlIGNvZGUgYW5kIHNldHVwIGluZm9ybWF0aW9uIGZvcgotYSBLYWZrYSBicm9rZXIuCi0KLXNlZSBzY3JpcHRzL2Nvbm5lY3RvcnMva2Fma2EvUkVBRE1FIHRvIHJ1biB0aGVtCi0KLVRoZSBzaW1wbGUgc2FtcGxlCi0tLS0tLS0tLS0tLS0tLS0tLQotCi1TaW1wbGVQdWJsaXNoZXJBcHAuamF2YSAtIGJ1aWxkIGFuZCBydW4gdGhlIHNpbXBsZSBwdWJsaXNoZXIgYXBwbGljYXRpb24gdG9wb2xvZ3kKLVNpbXBsZVN1YnNjcmliZXJBcHAuamF2YSAtIGJ1aWxkIGFuZCBydW4gdGhlIHNpbXBsZSBzdWJzY3JpYmVyIGFwcGxpY2F0aW9uIHRvcG9sb2d5Ci0KLVRoZSBmdWxseSBjb25maWd1cmFibGUgY2xpZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SdW5uZXIuamF2YSAtIGJ1aWxkIGFuZCBydW4gdGhlIHB1Ymxpc2hlciBvciBzdWJzY3JpYmVyCi1QdWJsaXNoZXJBcHAuamF2YSAtIGJ1aWxkIHRoZSBwdWJsaXNoZXIgYXBwbGljYXRpb24gdG9wb2xvZ3kKLVN1YnNjcmliZXJBcHAuamF2YSAtIGJ1aWxkIHRoZSBzdWJzY3JpYmVyIGFwcGxpY2F0aW9uIHRvcG9sb2d5Ci1LYWZrYUNsaWVudC5qYXZhIC0gdGhlIGNsaWVudCdzIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9SdW5uZXIuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9SdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmY2NmYy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMva2Fma2EvUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmthZmthOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNsaWVudC5PUFRfQk9PVFNUUkFQX1NFUlZFUlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNsaWVudC5PUFRfUFVCOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2EuS2Fma2FDbGllbnQuT1BUX1RPUElDOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2EuS2Fma2FDbGllbnQuT1BUX1pPT0tFRVBFUl9DT05ORUNUOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2ZXIuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuRGV2ZWxvcG1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLQotLyoqCi0gKiBCdWlsZCBhbmQgcnVuIHRoZSBwdWJsaXNoZXIgb3Igc3Vic2NyaWJlciBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFJ1bm5lciB7Ci0gICAgLyoqCi0gICAgICogQnVpbGQgYW5kIHJ1biB0aGUgcHVibGlzaGVyIG9yIHN1YnNjcmliZXIgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIG9wdGlvbnMgY29tbWFuZCBsaW5lIG9wdGlvbnMKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bihPcHRpb25zIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzUHViID0gb3B0aW9ucy5nZXQoT1BUX1BVQik7IAotCi0gICAgICAgIC8vIEdldCBhIHRvcG9sb2d5IHJ1bnRpbWUgcHJvdmlkZXIKLSAgICAgICAgRGV2ZWxvcG1lbnRQcm92aWRlciB0cCA9IG5ldyBEZXZlbG9wbWVudFByb3ZpZGVyKCk7Ci0KLSAgICAgICAgVG9wb2xvZ3kgdG9wOwotICAgICAgICBpZiAoaXNQdWIpIHsKLSAgICAgICAgICAgIFB1Ymxpc2hlckFwcCBwdWJsaXNoZXIgPSBuZXcgUHVibGlzaGVyQXBwKHRwLCBvcHRpb25zKTsKLSAgICAgICAgICAgIHRvcCA9IHB1Ymxpc2hlci5idWlsZEFwcFRvcG9sb2d5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBTdWJzY3JpYmVyQXBwIHN1YnNjcmliZXIgPSBuZXcgU3Vic2NyaWJlckFwcCh0cCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICB0b3AgPSBzdWJzY3JpYmVyLmJ1aWxkQXBwVG9wb2xvZ3koKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU3VibWl0IHRoZSBhcHAvdG9wb2xvZ3k7IHNlbmQgb3IgcmVjZWl2ZSB0aGUgbWVzc2FnZXMuCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAiVXNpbmcgS2Fma2EgY2x1c3RlciBhdCBib290c3RyYXAuc2VydmVycz0iCi0gICAgICAgICAgICAgICAgKyBvcHRpb25zLmdldChPUFRfQk9PVFNUUkFQX1NFUlZFUlMpCi0gICAgICAgICAgICAgICAgKyAiIHpvb2tlZXBlci5jb25uZWN0PSIgKyBvcHRpb25zLmdldChPUFRfWk9PS0VFUEVSX0NPTk5FQ1QpCi0gICAgICAgICAgICAgICAgKyAiXG4iICsgKGlzUHViID8gIlB1Ymxpc2hpbmciIDogIlN1YnNjcmliaW5nIikgCi0gICAgICAgICAgICAgICAgKyAiIHRvIHRvcGljICIgKyBvcHRpb25zLmdldChPUFRfVE9QSUMpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25zb2xlIFVSTCBmb3IgdGhlIGpvYjogIgotICAgICAgICAgICAgICAgICsgdHAuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEh0dHBTZXJ2ZXIuY2xhc3MpLmdldENvbnNvbGVVcmwoKSk7Ci0gICAgICAgIHRwLnN1Ym1pdCh0b3ApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL1NpbXBsZVB1Ymxpc2hlckFwcC5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL1NpbXBsZVB1Ymxpc2hlckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGI5NDkyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9TaW1wbGVQdWJsaXNoZXJBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2E7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2ZXIuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuRGV2ZWxvcG1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5rYWZrYS5LYWZrYVByb2R1Y2VyOwotCi0vKioKLSAqIEEgc2ltcGxlIEthZmthIHB1Ymxpc2hlciB0b3BvbG9neSBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVB1Ymxpc2hlckFwcCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRvcGljOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigibWlzc2luZyBwYXRobmFtZSB0byBrYWZrYS5wcm9wZXJ0aWVzIGZpbGUiKTsKLSAgICAgICAgU2ltcGxlUHVibGlzaGVyQXBwIHB1Ymxpc2hlciA9IG5ldyBTaW1wbGVQdWJsaXNoZXJBcHAoYXJnc1swXSk7Ci0gICAgICAgIHB1Ymxpc2hlci5ydW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ga2Fma2FQcm9wc1BhdGggcGF0aG5hbWUgdG8gcHJvcGVydGllcyBmaWxlCi0gICAgICovCi0gICAgU2ltcGxlUHVibGlzaGVyQXBwKFN0cmluZyBrYWZrYVByb3BzUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMubG9hZChGaWxlcy5uZXdCdWZmZXJlZFJlYWRlcihuZXcgRmlsZShrYWZrYVByb3BzUGF0aCkudG9QYXRoKCkpKTsKLSAgICAgICAgdG9waWMgPSBwcm9wcy5nZXRQcm9wZXJ0eSgidG9waWMiKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLE9iamVjdD4gY3JlYXRlS2Fma2FDb25maWcoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBrYWZrYUNvbmZpZyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAga2Fma2FDb25maWcucHV0KCJib290c3RyYXAuc2VydmVycyIsIHByb3BzLmdldCgiYm9vdHN0cmFwLnNlcnZlcnMiKSk7Ci0gICAgICAgIHJldHVybiBrYWZrYUNvbmZpZzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdG9wb2xvZ3kgZm9yIHRoZSBwdWJsaXNoZXIgYXBwbGljYXRpb24gYW5kIHJ1biBpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERldmVsb3BtZW50UHJvdmlkZXIgdHAgPSBuZXcgRGV2ZWxvcG1lbnRQcm92aWRlcigpOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgdGhlIGFwcGxpY2F0aW9uL3RvcG9sb2d5Ci0gICAgICAgIAotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koImthZmthU2FtcGxlUHVibGlzaGVyIik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBLYWZrYSBQcm9kdWNlciBicm9rZXIgY29ubmVjdG9yCi0gICAgICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBrYWZrYUNvbmZpZyA9IGNyZWF0ZUthZmthQ29uZmlnKCk7Ci0gICAgICAgIEthZmthUHJvZHVjZXIga2Fma2EgPSBuZXcgS2Fma2FQcm9kdWNlcih0LCAoKSAtPiBrYWZrYUNvbmZpZyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBzYW1wbGUgc3RyZWFtIG9mIHR1cGxlcyB0byBwdWJsaXNoCi0gICAgICAgIEF0b21pY0ludGVnZXIgY250ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IG1zZ3MgPSB0LnBvbGwoCi0gICAgICAgICAgICAgICAgKCkgLT4gewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiTWVzc2FnZS0lZCBmcm9tICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQuaW5jcmVtZW50QW5kR2V0KCksIFV0aWwuc2ltcGxlVFMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicG9sbCBnZW5lcmF0ZWQgbXNnIHRvIHB1Ymxpc2g6ICIgKyBtc2cpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNnOwotICAgICAgICAgICAgICAgIH0sIDFMLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFB1Ymxpc2ggdGhlIHN0cmVhbSB0byB0aGUgdG9waWMuICBUaGUgU3RyaW5nIHR1cGxlIGlzIHRoZSBtZXNzYWdlIHZhbHVlLgotICAgICAgICBrYWZrYS5wdWJsaXNoKG1zZ3MsIHRvcGljKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJ1biB0aGUgYXBwbGljYXRpb24gLyB0b3BvbG9neQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnNvbGUgVVJMIGZvciB0aGUgam9iOiAiCi0gICAgICAgICAgICAgICAgKyB0cC5nZXRTZXJ2aWNlcygpLmdldFNlcnZpY2UoSHR0cFNlcnZlci5jbGFzcykuZ2V0Q29uc29sZVVybCgpKTsKLSAgICAgICAgdHAuc3VibWl0KHQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL1NpbXBsZVN1YnNjcmliZXJBcHAuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9TaW1wbGVTdWJzY3JpYmVyQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWY0MjQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL1NpbXBsZVN1YnNjcmliZXJBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2E7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2ZXIuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuRGV2ZWxvcG1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNvbnN1bWVyOwotCi0vKioKLSAqIEEgc2ltcGxlIEthZmthIHN1YnNjcmliZXIgdG9wb2xvZ3kgYXBwbGljYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdWJzY3JpYmVyQXBwIHsKLSAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgcHJvcHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdG9waWM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJtaXNzaW5nIHBhdGhuYW1lIHRvIGthZmthLnByb3BlcnRpZXMgZmlsZSIpOwotICAgICAgICBTaW1wbGVTdWJzY3JpYmVyQXBwIHN1YnNjcmliZXIgPSBuZXcgU2ltcGxlU3Vic2NyaWJlckFwcChhcmdzWzBdKTsKLSAgICAgICAgc3Vic2NyaWJlci5ydW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ga2Fma2FQcm9wc1BhdGggcGF0aG5hbWUgdG8gcHJvcGVydGllcyBmaWxlCi0gICAgICovCi0gICAgU2ltcGxlU3Vic2NyaWJlckFwcChTdHJpbmcga2Fma2FQcm9wc1BhdGgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLmxvYWQoRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIobmV3IEZpbGUoa2Fma2FQcm9wc1BhdGgpLnRvUGF0aCgpKSk7Ci0gICAgICAgIHRvcGljID0gcHJvcHMuZ2V0UHJvcGVydHkoInRvcGljIik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTWFwPFN0cmluZyxPYmplY3Q+IGNyZWF0ZUthZmthQ29uZmlnKCkgewotICAgICAgICBNYXA8U3RyaW5nLE9iamVjdD4ga2Fma2FDb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGthZmthQ29uZmlnLnB1dCgiem9va2VlcGVyLmNvbm5lY3QiLCBwcm9wcy5nZXQoInpvb2tlZXBlci5jb25uZWN0IikpOwotICAgICAgICAvLyBmb3IgdGhlIHNhbXBsZSwgYmUgaW5zZW5zaXRpdmUgdG8gb2xkL211bHRpcGxlIGNvbnN1bWVycyBmb3IKLSAgICAgICAgLy8gdGhlIHRvcGljL2dyb3VwSWQgaGFuZ2luZyBhcm91bmQKLSAgICAgICAga2Fma2FDb25maWcucHV0KCJncm91cC5pZCIsIAotICAgICAgICAgICAgICAgICJrYWZrYVNhbXBsZUNvbnN1bWVyXyIgKyBVdGlsLnNpbXBsZVRTKCkucmVwbGFjZUFsbCgiOiIsICIiKSk7Ci0gICAgICAgIHJldHVybiBrYWZrYUNvbmZpZzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdG9wb2xvZ3kgZm9yIHRoZSBzdWJzY3JpYmVyIGFwcGxpY2F0aW9uIGFuZCBydW4gaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEZXZlbG9wbWVudFByb3ZpZGVyIHRwID0gbmV3IERldmVsb3BtZW50UHJvdmlkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBhcHBsaWNhdGlvbi90b3BvbG9neQotICAgICAgICAKLSAgICAgICAgVG9wb2xvZ3kgdCA9IHRwLm5ld1RvcG9sb2d5KCJrYWZrYVNhbXBsZVN1YnNjcmliZXIiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgS2Fma2EgQ29uc3VtZXIgYnJva2VyIGNvbm5lY3RvcgotICAgICAgICBNYXA8U3RyaW5nLE9iamVjdD4ga2Fma2FDb25maWcgPSBjcmVhdGVLYWZrYUNvbmZpZygpOwotICAgICAgICBLYWZrYUNvbnN1bWVyIGthZmthID0gbmV3IEthZmthQ29uc3VtZXIodCwgKCkgLT4ga2Fma2FDb25maWcpOwotICAgICAgICAKLSAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRoZSB0b3BpYyBhbmQgY3JlYXRlIGEgc3RyZWFtIG9mIG1lc3NhZ2VzCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBtc2dzID0ga2Fma2Euc3Vic2NyaWJlKHJlYyAtPiByZWMudmFsdWUoKSwgdG9waWMpOwotICAgICAgICAKLSAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVjZWl2ZWQgbXNncyAtIGp1c3QgcHJpbnQgdGhlbSBvdXQKLSAgICAgICAgbXNncy5zaW5rKHR1cGxlIC0+IFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJbJXNdIHJlY2VpdmVkOiAlcyIsIFV0aWwuc2ltcGxlVFMoKSwgdHVwbGUpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBydW4gdGhlIGFwcGxpY2F0aW9uIC8gdG9wb2xvZ3kKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25zb2xlIFVSTCBmb3IgdGhlIGpvYjogIgotICAgICAgICAgICAgICAgICsgdHAuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEh0dHBTZXJ2ZXIuY2xhc3MpLmdldENvbnNvbGVVcmwoKSk7Ci0gICAgICAgIHRwLnN1Ym1pdCh0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9TdWJzY3JpYmVyQXBwLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMva2Fma2EvU3Vic2NyaWJlckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA1ZjM5Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9TdWJzY3JpYmVyQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmthZmthOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNsaWVudC5PUFRfR1JPVVBfSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNsaWVudC5PUFRfVE9QSUM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNsaWVudC5PUFRfWk9PS0VFUEVSX0NPTk5FQ1Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neVByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5rYWZrYS5LYWZrYUNvbnN1bWVyOwotCi0vKioKLSAqIEEgS2Fma2EgY29uc3VtZXIvc3Vic2NyaWJlciB0b3BvbG9neSBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFN1YnNjcmliZXJBcHAgewotICAgIHByaXZhdGUgZmluYWwgVG9wb2xvZ3lQcm92aWRlciB0cDsKLSAgICBwcml2YXRlIGZpbmFsIE9wdGlvbnMgb3B0aW9uczsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB1bmlxID0gVXRpbC5zaW1wbGVUUygpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRvcCB0aGUgVG9wb2xvZ3lQcm92aWRlciB0byB1c2UuCi0gICAgICogQHBhcmFtIG9wdGlvbnMKLSAgICAgKi8KLSAgICBTdWJzY3JpYmVyQXBwKFRvcG9sb2d5UHJvdmlkZXIgdHAsIE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICB0aGlzLnRwID0gdHA7Ci0gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHRvcG9sb2d5IGZvciB0aGUgc3Vic2NyaWJlciBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBUb3BvbG9neQotICAgICAqLwotICAgIHB1YmxpYyBUb3BvbG9neSBidWlsZEFwcFRvcG9sb2d5KCkgewotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koImthZmthQ2xpZW50U3Vic2NyaWJlciIpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgS2Fma2FDb25zdW1lciBicm9rZXIgY29ubmVjdG9yCi0gICAgICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBjb25maWcgPSBuZXdDb25maWcodCk7Ci0gICAgICAgIEthZmthQ29uc3VtZXIga2Fma2EgPSBuZXcgS2Fma2FDb25zdW1lcih0LCAoKSAtPiBjb25maWcpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBLYWZrYSBjb25zdW1lciBncm91cC5pZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWcuZ2V0KE9QVF9HUk9VUF9JRCkpOwotICAgICAgICAKLSAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRoZSB0b3BpYyBhbmQgY3JlYXRlIGEgc3RyZWFtIG9mIG1lc3NhZ2VzCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBtc2dzID0ga2Fma2Euc3Vic2NyaWJlKHJlYyAtPiByZWMudmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpb3B0aW9ucy5nZXQoT1BUX1RPUElDKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBQcm9jZXNzIHRoZSByZWNlaXZlZCBtc2dzIC0ganVzdCBwcmludCB0aGVtIG91dAotICAgICAgICBtc2dzLnNpbmsodHVwbGUgLT4gU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlslc10gcmVjZWl2ZWQ6ICVzIiwgVXRpbC5zaW1wbGVUUygpLCB0dXBsZSkpKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsT2JqZWN0PiBuZXdDb25maWcoVG9wb2xvZ3kgdCkgewotICAgICAgICBNYXA8U3RyaW5nLE9iamVjdD4gY29uZmlnID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICAvLyByZXF1aXJlZCBrYWZrYSBjb25maWd1cmF0aW9uIGl0ZW1zCi0gICAgICAgIGNvbmZpZy5wdXQoInpvb2tlZXBlci5jb25uZWN0Iiwgb3B0aW9ucy5nZXQoT1BUX1pPT0tFRVBFUl9DT05ORUNUKSk7Ci0gICAgICAgIGNvbmZpZy5wdXQoImdyb3VwLmlkIiwgb3B0aW9ucy5nZXQoT1BUX0dST1VQX0lELCBuZXdHcm91cElkKHQuZ2V0TmFtZSgpKSkpOwotICAgICAgICByZXR1cm4gY29uZmlnOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBuZXdHcm91cElkKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIC8vIGJlIGluc2Vuc2l0aXZlIHRvIG9sZCBjb25zdW1lcnMgZm9yIHRoZSB0b3BpYy9ncm91cElkIGhhbmdpbmcgYXJvdW5kCi0gICAgICAgIFN0cmluZyBncm91cElkID0gbmFtZSArICJfIiArIHVuaXEucmVwbGFjZUFsbCgiOiIsICIiKTsKLSAgICAgICAgcmV0dXJuIGdyb3VwSWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL3BhY2thZ2UtaW5mby5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL2thZmthL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjFkMDUzLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9rYWZrYS9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vKioKLSAqIFNhbXBsZXMgc2hvd2luZyB1c2Ugb2YgdGhlCi0gKiA8YSBocmVmPSJ7QGRvY1Jvb3R9L29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMva2Fma2EvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgotICogICAgIEFwYWNoZSBLYWZrYSBzdHJlYW0gY29ubmVjdG9yPC9hPi4KLSAqIDxwPgotICogU2VlICZsdDtlZGdlbnQtcmVsZWFzZSZndDsvc2NyaXB0cy9jb25uZWN0b3JzL2thZmthL1JFQURNRSB0byBydW4gdGhlIHNhbXBsZXMuCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgc2ltcGxlIHNhbXBsZXMgYXJlIHByb3ZpZGVkOgotICogPHVsPgotICogPGxpPlNpbXBsZVB1Ymxpc2hlckFwcC5qYXZhIC0gYSBzaW1wbGUgcHVibGlzaGVyIGFwcGxpY2F0aW9uIHRvcG9sb2d5PC9saT4KLSAqIDxsaT5TaW1wbGVTdWJzY3JpYmVyQXBwLmphdmEgLSBhIHNpbXBsZSBzdWJzY3JpYmVyIGFwcGxpY2F0aW9uIHRvcG9sb2d5PC9saT4KLSAqIDwvdWw+Ci0gKiBUaGUgcmVtYWluaW5nIGNsYXNzZXMgYXJlIHBhcnQgb2YgYSBzYW1wbGUgdGhhdCBtb3JlIGZ1bGx5IGV4cG9zZXMKLSAqIGNvbnRyb2xsaW5nIHZhcmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb25zLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5rYWZrYTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L01xdHRDbGllbnQuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L01xdHRDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmNmMzNy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9NcXR0Q2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLk9wdGlvbnM7Ci0KLS8qKgotICogRGVtb25zdHJhdGUgaW50ZWdyYXRpbmcgd2l0aCB0aGUgTVFUVCBtZXNzYWdpbmcgc3lzdGVtCi0gKiA8YSBocmVmPSJodHRwOi8vbXF0dC5vcmciPmh0dHA6Ly9tcXR0Lm9yZzwvYT4uCi0gKiA8cD4KLSAqIHtAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLm1xdHQuTXF0dFN0cmVhbXMgTXF0dFN0cmVhbXN9IGlzCi0gKiBhIGNvbm5lY3RvciB1c2VkIHRvIGNyZWF0ZSBhIGJyaWRnZSBiZXR3ZWVuIHRvcG9sb2d5IHN0cmVhbXMKLSAqIGFuZCBhbiBNUVRUIGJyb2tlci4KLSAqIDxwPgotICogVGhlIGNsaWVudCBlaXRoZXIgcHVibGlzaGVzIHNvbWUgbWVzc2FnZXMgdG8gYSBNUVRUIHRvcGljICAKLSAqIG9yIHN1YnNjcmliZXMgdG8gdGhlIHRvcGljIGFuZCByZXBvcnRzIHRoZSBtZXNzYWdlcyByZWNlaXZlZC4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgYSBydW5uaW5nIE1RVFQgYnJva2VyIHdpdGggdGhlIGZvbGxvd2luZwotICogY2hhcmFjdGVyaXN0aWNzIGlzIGFzc3VtZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+dGhlIGJyb2tlcidzIGNvbm5lY3Rpb24gaXMge0Bjb2RlIHRjcDovL2xvY2FsaG9zdDoxODgzfTwvbGk+Ci0gKiA8bGk+dGhlIGJyb2tlciBpcyBjb25maWd1cmVkIGZvciBubyBhdXRoZW50aWNhdGlvbjwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBTZWUgdGhlIE1RVFQgbGluayBhYm92ZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgc2V0dGluZyB1cCBhIE1RVFQgYnJva2VyLgotICogPHA+Ci0gKiBUaGlzIG1heSBiZSBleGVjdXRlZCBhczoKLSAqIDxVTD4KLSAqIDxMST4KLSAqIHtAY29kZSBqYXZhIC1jcCBzYW1wbGVzL2xpYi9vcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5qYXIKLSAqICBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5NcXR0Q2xpZW50IC1oCi0gKiB9IC0gUnVuIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAqIDwvTEk+Ci0gKiA8TEk+Ci0gKiBTcGVjaWZ5IGFic29sdXRlIHBhdGhuYW1lcyBpZiB1c2luZyB0aGUge0Bjb2RlIHRydXN0U3RvcmV9Ci0gKiBvciB7QGNvZGUga2V5U3RvcmV9IGFyZ3VtZW50cy4KLSAqIDwvTEk+Ci0gKiA8TEk+Ci0gKiBBbiBhcHBsaWNhdGlvbiBleGVjdXRpb24gd2l0aGluIHlvdXIgSURFIG9uY2UgeW91IHNldCB0aGUgY2xhc3MgcGF0aCB0byBpbmNsdWRlIHRoZSBjb3JyZWN0IGphcnMuCi0gKiA8L0xJPgotICogPC9VTD4KLSAqLwotcHVibGljIGNsYXNzIE1xdHRDbGllbnQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB1c2FnZSA9ICJ1c2FnZTogIgotICAgICAgICAgICAgKyAiXG4iICsgIlstdl0gWy1oXSIKLSAgICAgICAgICAgICsgIlxuIiArICJwdWIgfCBzdWIiCi0gICAgICAgICAgICArICJcbiIgKyAiW3NlcnZlclVSST08dmFsdWU+XSIKLSAgICAgICAgICAgICsgIlxuIiArICJbY2xpZW50SWQ9PHZhbHVlPl0iCi0gICAgICAgICAgICArICJcbiIgKyAiW2NsZWFuU2Vzc2lvbj08dHJ1ZXxmYWxzZT5dIgotICAgICAgICAgICAgKyAiXG4iICsgIlt0b3BpYz08dmFsdWU+XSBbcW9zPTx2YWx1ZT5dIgotICAgICAgICAgICAgKyAiXG4iICsgIltyZXRhaW5dIgotICAgICAgICAgICAgKyAiXG4iICsgIltwdWJjbnQ9PHZhbHVlPl0iCi0gICAgICAgICAgICArICJcbiIgKyAiW2NuVGltZW91dD08dmFsdWU+XSIKLSAgICAgICAgICAgICsgIlxuIiArICJbYWN0aW9uVGltZW91dE1pbGxpcz08dmFsdWU+XSIKLSAgICAgICAgICAgICsgIlxuIiArICJbaWRsZVRpbWVvdXQ9PHZhbHVlPl0iCi0gICAgICAgICAgICArICJcbiIgKyAiW2lkbGVSZWNvbm5lY3RJbnRlcnZhbD08dmFsdWU+XSIKLSAgICAgICAgICAgICsgIlxuIiArICJbdXNlcklEPTx2YWx1ZT5dIFtwYXNzd29yZD08dmFsdWU+XSIKLSAgICAgICAgICAgICsgIlxuIiArICJbdHJ1c3RTdG9yZT08dmFsdWU+XSBbdHJ1c3RTdG9yZVBhc3N3b3JkPTx2YWx1ZT5dIgotICAgICAgICAgICAgKyAiXG4iICsgIltrZXlTdG9yZT08dmFsdWU+XSBba2V5U3RvcmVQYXNzd29yZD08dmFsdWU+XSIKLSAgICAgICAgICAgIDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBwcm9jZXNzQXJncyhhcmdzKTsKLSAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBSdW5uZXIucnVuKG9wdGlvbnMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBPcHRpb25zIHByb2Nlc3NBcmdzKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgaW5pdEhhbmRsZXJzKG9wdGlvbnMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3B0aW9ucy5wcm9jZXNzQXJncyhhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih1c2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKChCb29sZWFuKW9wdGlvbnMuZ2V0KE9QVF9IRUxQKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHVzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKCEoQm9vbGVhbilvcHRpb25zLmdldChPUFRfUFVCKSAmJiAhKEJvb2xlYW4pb3B0aW9ucy5nZXQoT1BUX1NVQikpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJNaXNzaW5nIGFyZ3VtZW50ICclcycgb3IgJyVzJy4iLCBPUFRfUFVCLCBPUFRfU1VCKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odXNhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3B0aW9ucy5nZXQoT1BUX1BBU1NXT1JEKSAhPSBudWxsKQotICAgICAgICAgICAgb3B0aW9ucy5wdXQoT1BUX1VTRVJfSUQsIG9wdGlvbnMuZ2V0KE9QVF9VU0VSX0lELCBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIpKSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBhbm5vdW5jZU9wdHMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgIE9QVF9VU0VSX0lELAotICAgICAgICAgICAgICAgIE9QVF9QQVNTV09SRCwKLSAgICAgICAgICAgICAgICBPUFRfVFJVU1RfU1RPUkUsCi0gICAgICAgICAgICAgICAgT1BUX1RSVVNUX1NUT1JFX1BBU1NXT1JELAotICAgICAgICAgICAgICAgIE9QVF9LRVlfU1RPUkUsCi0gICAgICAgICAgICAgICAgT1BUX0tFWV9TVE9SRV9QQVNTV09SRAotICAgICAgICB9OwotICAgICAgICBpZiAoKEJvb2xlYW4pb3B0aW9ucy5nZXQoT1BUX1ZFUkJPU0UpKQotICAgICAgICAgICAgYW5ub3VuY2VPcHRzID0gb3B0aW9ucy5nZXRBbGwoKS5zdHJlYW0oKS5tYXAoZSAtPiBlLmdldEtleSgpKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwotICAgICAgICBmb3IgKFN0cmluZyBvcHQgOiBhbm5vdW5jZU9wdHMpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9wdGlvbnMuZ2V0KG9wdCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChvcHQudG9Mb3dlckNhc2UoKS5jb250YWlucygicGFzc3dvcmQiKSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiKioqKioiOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgIitvcHQrIj0iK3ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1ZFUkJPU0UgPSAiLXYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX0hFTFAgPSAiLWgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1BVQiA9ICJwdWIiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1NVQiA9ICJzdWIiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1NFUlZFUl9VUkkgPSAic2VydmVyVVJJIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVF9DTElFTlRfSUQgPSAiY2xpZW50SWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX0NOX1RJTUVPVVRfU0VDID0gImNuVGltZW91dCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRfQUNUSU9OX1RJTUVPVVRfTUlMTElTID0gImFjdGlvblRpbWVvdXRNaWxsaXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1FPUyA9ICJxb3MiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1RPUElDID0gInRvcGljIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVF9DTEVBTl9TRVNTSU9OID0gImNsZWFuU2Vzc2lvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRfUkVUQUlOID0gInJldGFpbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRfVVNFUl9JRCA9ICJ1c2VySUQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1BBU1NXT1JEID0gInBhc3N3b3JkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVF9UUlVTVF9TVE9SRSA9ICJ0cnVzdFN0b3JlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVF9UUlVTVF9TVE9SRV9QQVNTV09SRCA9ICJ0cnVzdFN0b3JlUGFzc3dvcmQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX0tFWV9TVE9SRSA9ICJrZXlTdG9yZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRfS0VZX1NUT1JFX1BBU1NXT1JEID0gImtleVN0b3JlUGFzc3dvcmQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUX1BVQl9DTlQgPSAicHViY250IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVF9JRExFX1RJTUVPVVRfU0VDID0gImlkbGVUaW1lb3V0IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVF9JRExFX1JFQ09OTkVDVF9JTlRFUlZBTF9TRUMgPSAiaWRsZVJlY29ubmVjdEludGVydmFsIjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRIYW5kbGVycyhPcHRpb25zIG9wdHMpIHsKLSAgICAgICAgLy8gb3B0aW9ucyBmb3Igd2hpY2ggd2UgaGF2ZSBhIGRlZmF1bHQKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9IRUxQLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgIG9wdHMuYWRkSGFuZGxlcihPUFRfVkVSQk9TRSwgbnVsbCwgZmFsc2UpOwotICAgICAgICBvcHRzLmFkZEhhbmRsZXIoT1BUX1BVQiwgbnVsbCwgZmFsc2UpOwotICAgICAgICBvcHRzLmFkZEhhbmRsZXIoT1BUX1NVQiwgbnVsbCwgZmFsc2UpOwotICAgICAgICBvcHRzLmFkZEhhbmRsZXIoT1BUX1NFUlZFUl9VUkksIHYgLT4gdiwgInRjcDovL2xvY2FsaG9zdDoxODgzIik7Ci0gICAgICAgIG9wdHMuYWRkSGFuZGxlcihPUFRfVE9QSUMsIHYgLT4gdiwgIm1xdHRTYW1wbGVUb3BpYyIpOwotICAgICAgICBvcHRzLmFkZEhhbmRsZXIoT1BUX1JFVEFJTiwgbnVsbCwgZmFsc2UpOwotICAgICAgICBvcHRzLmFkZEhhbmRsZXIoT1BUX1BVQl9DTlQsIHYgLT4gSW50ZWdlci52YWx1ZU9mKHYpLCAtMSk7Ci0gICAgICAgIG9wdHMuYWRkSGFuZGxlcihPUFRfUU9TLCB2IC0+IEludGVnZXIudmFsdWVPZih2KSwgMCk7Ci0KLSAgICAgICAgLy8gb3B0aW9uYWwgb3B0aW9ucyAobm8gZGVmYXVsdCB2YWx1ZSkKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9DTElFTlRfSUQsIHYgLT4gdik7Ci0gICAgICAgIG9wdHMuYWRkSGFuZGxlcihPUFRfQ05fVElNRU9VVF9TRUMsIHYgLT4gSW50ZWdlci52YWx1ZU9mKHYpKTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9BQ1RJT05fVElNRU9VVF9NSUxMSVMsIHYgLT4gTG9uZy52YWx1ZU9mKHYpKTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9DTEVBTl9TRVNTSU9OLCB2IC0+IEJvb2xlYW4udmFsdWVPZih2KSk7Ci0gICAgICAgIG9wdHMuYWRkSGFuZGxlcihPUFRfVVNFUl9JRCwgdiAtPiB2KTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9QQVNTV09SRCwgdiAtPiB2KTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9UUlVTVF9TVE9SRSwgdiAtPiB2KTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9UUlVTVF9TVE9SRV9QQVNTV09SRCwgdiAtPiB2KTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9LRVlfU1RPUkUsIHYgLT4gdik7Ci0gICAgICAgIG9wdHMuYWRkSGFuZGxlcihPUFRfS0VZX1NUT1JFX1BBU1NXT1JELCB2IC0+IHYpOwotICAgICAgICBvcHRzLmFkZEhhbmRsZXIoT1BUX0lETEVfVElNRU9VVF9TRUMsIHYgLT4gSW50ZWdlci52YWx1ZU9mKHYpKTsKLSAgICAgICAgb3B0cy5hZGRIYW5kbGVyKE9QVF9JRExFX1JFQ09OTkVDVF9JTlRFUlZBTF9TRUMsIHYgLT4gSW50ZWdlci52YWx1ZU9mKHYpKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9QdWJsaXNoZXJBcHAuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L1B1Ymxpc2hlckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmU2Y2U1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L1B1Ymxpc2hlckFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0Lk1xdHRDbGllbnQuT1BUX1BVQl9DTlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0Lk1xdHRDbGllbnQuT1BUX1FPUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfUkVUQUlOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5NcXR0Q2xpZW50Lk9QVF9UT1BJQzsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5tcXR0Lk1xdHRDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5tcXR0Lk1xdHRTdHJlYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5Nc2dTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5UHJvdmlkZXI7Ci0KLS8qKgotICogQSBNUVRUIHB1Ymxpc2hlciB0b3BvbG9neSBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlckFwcCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUb3BvbG9neVByb3ZpZGVyIHRwOwotICAgIHByaXZhdGUgZmluYWwgT3B0aW9ucyBvcHRpb25zOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRwIHRoZSBUb3BvbG9neVByb3ZpZGVyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqLwotICAgIFB1Ymxpc2hlckFwcChUb3BvbG9neVByb3ZpZGVyIHRwLCBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy50cCA9IHRwOwotICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB0b3BvbG9neSBmb3IgdGhlIHB1Ymxpc2hlciBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBUb3BvbG9neQotICAgICAqLwotICAgIHB1YmxpYyBUb3BvbG9neSBidWlsZEFwcFRvcG9sb2d5KCkgewotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koIm1xdHRDbGllbnRQdWJsaXNoZXIiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIHNhbXBsZSBzdHJlYW0gb2YgdHVwbGVzIHRvIHB1Ymxpc2gKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IG1zZ3MgPSB0LnBvbGwobmV3IE1zZ1N1cHBsaWVyKG9wdGlvbnMuZ2V0KE9QVF9QVUJfQ05UKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMUwsIFRpbWVVbml0LlNFQ09ORFMpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgTVFUVCBicm9rZXIgY29ubmVjdG9yCi0gICAgICAgIE1xdHRDb25maWcgY29uZmlnPSBSdW5uZXIubmV3Q29uZmlnKG9wdGlvbnMpOwotICAgICAgICBNcXR0U3RyZWFtcyBtcXR0ID0gbmV3IE1xdHRTdHJlYW1zKHQsICgpIC0+IGNvbmZpZyk7Ci0gICAgICAgIAotICAgICAgICAvLyBQdWJsaXNoIHRoZSBzdHJlYW0gdG8gdGhlIHRvcGljLiAgVGhlIFN0cmluZyB0dXBsZSBpcyB0aGUgbWVzc2FnZSB2YWx1ZS4KLSAgICAgICAgbXF0dC5wdWJsaXNoKG1zZ3MsIG9wdGlvbnMuZ2V0KE9QVF9UT1BJQyksIAotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldChPUFRfUU9TKSwgb3B0aW9ucy5nZXQoT1BUX1JFVEFJTikpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9SRUFETUUgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NjBmNTAuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL21xdHQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotU2FtcGxlIE1RVFQgUHVibGlzaGVyIGFuZCBTdWJzY3JpYmVyIHRvcG9sb2d5IGFwcGxpY2F0aW9ucy4KLQotQnkgZGVmYXVsdCwgdGhlIGZvbGxvd2luZyBNUVRUIGJyb2tlciBjb25maWd1cmF0aW9uIGlzIGFzc3VtZWQ6Ci0tIHRoZSBicm9rZXIncyBjb25uZWN0aW9uIFVSTCBpcyB0Y3A6Ly9sb2NhbGhvc3Q6MTg4MwotLSB0aGUgYnJva2VyIGlzIGNvbmZpZ3VyZWQgZm9yIG5vIGF1dGhlbnRpY2F0aW9uCi0KLVNlZSBodHRwOi8vbXF0dC5vcmcgZm9yIHRoZSBjb2RlIGFuZCBzZXR1cCBpbmZvcm1hdGlvbiBmb3IKLWEgbXF0dCBicm9rZXIuCi0KLXNlZSBzY3JpcHRzL2Nvbm5lY3RvcnMvbXF0dC9SRUFETUUgdG8gcnVuIHRoZW0KLQotVGhlIHNpbXBsZSBzYW1wbGUKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNpbXBsZVB1Ymxpc2hlckFwcC5qYXZhIC0gYnVpbGQgYW5kIHJ1biB0aGUgc2ltcGxlIHB1Ymxpc2hlciBhcHBsaWNhdGlvbiB0b3BvbG9neQotU2ltcGxlU3Vic2NyaWJlckFwcC5qYXZhIC0gYnVpbGQgYW5kIHJ1biB0aGUgc2ltcGxlIHN1YnNjcmliZXIgYXBwbGljYXRpb24gdG9wb2xvZ3kKLQotVGhlIGZ1bGx5IGNvbmZpZ3VyYWJsZSBjbGllbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUnVubmVyLmphdmEgLSBidWlsZCBhbmQgcnVuIHRoZSBwdWJsaXNoZXIgb3Igc3Vic2NyaWJlcgotUHVibGlzaGVyQXBwLmphdmEgLSBidWlsZCB0aGUgcHVibGlzaGVyIGFwcGxpY2F0aW9uIHRvcG9sb2d5Ci1TdWJzY3JpYmVyQXBwLmphdmEgLSBidWlsZCB0aGUgc3Vic2NyaWJlciBhcHBsaWNhdGlvbiB0b3BvbG9neQotTXF0dENsaWVudC5qYXZhIC0gdGhlIGNsaWVudCdzIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L1J1bm5lci5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL21xdHQvUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOWVlNGEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL21xdHQvUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0Lk1xdHRDbGllbnQuT1BUX0FDVElPTl9USU1FT1VUX01JTExJUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfQ0xFQU5fU0VTU0lPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfQ0xJRU5UX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5NcXR0Q2xpZW50Lk9QVF9DTl9USU1FT1VUX1NFQzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfSURMRV9SRUNPTk5FQ1RfSU5URVJWQUxfU0VDOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5NcXR0Q2xpZW50Lk9QVF9JRExFX1RJTUVPVVRfU0VDOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5NcXR0Q2xpZW50Lk9QVF9LRVlfU1RPUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0Lk1xdHRDbGllbnQuT1BUX0tFWV9TVE9SRV9QQVNTV09SRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfUEFTU1dPUkQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0Lk1xdHRDbGllbnQuT1BUX1BVQjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfU0VSVkVSX1VSSTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfVE9QSUM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0Lk1xdHRDbGllbnQuT1BUX1RSVVNUX1NUT1JFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5NcXR0Q2xpZW50Lk9QVF9UUlVTVF9TVE9SRV9QQVNTV09SRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfVVNFUl9JRDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMubXF0dC5NcXR0Q29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRldmVsb3BtZW50LkRldmVsb3BtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLS8qKgotICogQnVpbGQgYW5kIHJ1biB0aGUgcHVibGlzaGVyIG9yIHN1YnNjcmliZXIgYXBwbGljYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5uZXIgewotICAgIAotICAgIC8qKgotICAgICAqIEJ1aWxkIGFuZCBydW4gdGhlIHB1Ymxpc2hlciBvciBzdWJzY3JpYmVyIGFwcGxpY2F0aW9uLgotICAgICAqIEBwYXJhbSBvcHRpb25zIGNvbW1hbmQgbGluZSBvcHRpb25zCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW4oT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBpc1B1YiA9IG9wdGlvbnMuZ2V0KE9QVF9QVUIpOyAKLQotICAgICAgICAvLyBHZXQgYSB0b3BvbG9neSBydW50aW1lIHByb3ZpZGVyCi0gICAgICAgIERldmVsb3BtZW50UHJvdmlkZXIgdHAgPSBuZXcgRGV2ZWxvcG1lbnRQcm92aWRlcigpOwotCi0gICAgICAgIFRvcG9sb2d5IHRvcDsKLSAgICAgICAgaWYgKGlzUHViKSB7Ci0gICAgICAgICAgICBQdWJsaXNoZXJBcHAgcHVibGlzaGVyID0gbmV3IFB1Ymxpc2hlckFwcCh0cCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICB0b3AgPSBwdWJsaXNoZXIuYnVpbGRBcHBUb3BvbG9neSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgU3Vic2NyaWJlckFwcCBzdWJzY3JpYmVyID0gbmV3IFN1YnNjcmliZXJBcHAodHAsIG9wdGlvbnMpOwotICAgICAgICAgICAgdG9wID0gc3Vic2NyaWJlci5idWlsZEFwcFRvcG9sb2d5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5kZWJ1ZyIsICJzc2wiKTsgLy8gb3IgImFsbCI7ICJoZWxwIiBmb3IgZnVsbCBsaXN0Ci0gICAgICAgIAotICAgICAgICAvLyBTdWJtaXQgdGhlIGFwcC90b3BvbG9neTsgc2VuZCBvciByZWNlaXZlIHRoZSBtZXNzYWdlcy4KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICJVc2luZyBNUVRUIGJyb2tlciBhdCAiICsgb3B0aW9ucy5nZXQoT1BUX1NFUlZFUl9VUkkpCi0gICAgICAgICAgICAgICAgKyAiXG4iICsgKGlzUHViID8gIlB1Ymxpc2hpbmciIDogIlN1YnNjcmliaW5nIikKLSAgICAgICAgICAgICAgICArICIgdG8gdG9waWMgIitvcHRpb25zLmdldChPUFRfVE9QSUMpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25zb2xlIFVSTCBmb3IgdGhlIGpvYjogIgotICAgICAgICAgICAgICAgICsgdHAuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEh0dHBTZXJ2ZXIuY2xhc3MpLmdldENvbnNvbGVVcmwoKSk7Ci0gICAgICAgIHRwLnN1Ym1pdCh0b3ApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGEgTXF0dENvbmZpZyBicm9rZXIgY29ubmVjdG9yIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHBhcmFtIG9wdGlvbnMgY29tbWFuZCBsaW5lIG9wdGlvbnMKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25uZWN0b3IgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBNcXR0Q29uZmlnIG5ld0NvbmZpZyhPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgLy8gT25seSB0aGUgc2VydmVyVVJJIGlzIHJlcXVpcmVkLiAgRXZlcnl0aGluZyBlbHNlIGlzIG9wdGlvbmFsLgotICAgICAgICBNcXR0Q29uZmlnIGNvbmZpZyA9IG5ldyBNcXR0Q29uZmlnKG9wdGlvbnMuZ2V0KE9QVF9TRVJWRVJfVVJJKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoT1BUX0NMSUVOVF9JRCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KE9QVF9DTEVBTl9TRVNTSU9OKSAhPSBudWxsKQotICAgICAgICAgICAgY29uZmlnLnNldENsZWFuU2Vzc2lvbihvcHRpb25zLmdldChPUFRfQ0xFQU5fU0VTU0lPTikpOwotICAgICAgICBpZiAob3B0aW9ucy5nZXQoT1BUX0NOX1RJTUVPVVRfU0VDKSAhPSBudWxsKQotICAgICAgICAgICAgY29uZmlnLnNldENvbm5lY3Rpb25UaW1lb3V0KG9wdGlvbnMuZ2V0KE9QVF9DTl9USU1FT1VUX1NFQykpOwotICAgICAgICBpZiAob3B0aW9ucy5nZXQoT1BUX0FDVElPTl9USU1FT1VUX01JTExJUykgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbmZpZy5zZXRBY3Rpb25UaW1lVG9XYWl0TWlsbGlzKG9wdGlvbnMuZ2V0KE9QVF9BQ1RJT05fVElNRU9VVF9NSUxMSVMpKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KE9QVF9JRExFX1RJTUVPVVRfU0VDKSAhPSBudWxsKQotICAgICAgICAgICAgY29uZmlnLnNldElkbGVUaW1lb3V0KG9wdGlvbnMuZ2V0KE9QVF9JRExFX1RJTUVPVVRfU0VDKSk7Ci0gICAgICAgIGlmIChvcHRpb25zLmdldChPUFRfSURMRV9SRUNPTk5FQ1RfSU5URVJWQUxfU0VDKSAhPSBudWxsKQotICAgICAgICAgICAgY29uZmlnLnNldFN1YnNjcmliZXJJZGxlUmVjb25uZWN0SW50ZXJ2YWwob3B0aW9ucy5nZXQoT1BUX0lETEVfUkVDT05ORUNUX0lOVEVSVkFMX1NFQykpOwotICAgICAgICBpZiAob3B0aW9ucy5nZXQoT1BUX1VTRVJfSUQpICE9IG51bGwpCi0gICAgICAgICAgICBjb25maWcuc2V0VXNlck5hbWUob3B0aW9ucy5nZXQoT1BUX1VTRVJfSUQpKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KE9QVF9QQVNTV09SRCkgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbmZpZy5zZXRQYXNzd29yZCgoKFN0cmluZylvcHRpb25zLmdldChPUFRfUEFTU1dPUkQpKS50b0NoYXJBcnJheSgpKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KE9QVF9UUlVTVF9TVE9SRSkgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbmZpZy5zZXRUcnVzdFN0b3JlKG9wdGlvbnMuZ2V0KE9QVF9UUlVTVF9TVE9SRSkpOwotICAgICAgICBpZiAob3B0aW9ucy5nZXQoT1BUX1RSVVNUX1NUT1JFX1BBU1NXT1JEKSAhPSBudWxsKQotICAgICAgICAgICAgY29uZmlnLnNldFRydXN0U3RvcmUob3B0aW9ucy5nZXQoT1BUX1RSVVNUX1NUT1JFX1BBU1NXT1JEKSk7Ci0gICAgICAgIGlmIChvcHRpb25zLmdldChPUFRfS0VZX1NUT1JFKSAhPSBudWxsKQotICAgICAgICAgICAgY29uZmlnLnNldEtleVN0b3JlKG9wdGlvbnMuZ2V0KE9QVF9LRVlfU1RPUkUpKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KE9QVF9LRVlfU1RPUkVfUEFTU1dPUkQpICE9IG51bGwpCi0gICAgICAgICAgICBjb25maWcuc2V0VHJ1c3RTdG9yZShvcHRpb25zLmdldChPUFRfS0VZX1NUT1JFX1BBU1NXT1JEKSk7Ci0gICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9TaW1wbGVQdWJsaXNoZXJBcHAuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L1NpbXBsZVB1Ymxpc2hlckFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzYzOTVhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L1NpbXBsZVB1Ymxpc2hlckFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLm1xdHQuTXF0dENvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLm1xdHQuTXF0dFN0cmVhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2ZXIuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuRGV2ZWxvcG1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi0vKioKLSAqIEEgc2ltcGxlIE1RVFQgcHVibGlzaGVyIHRvcG9sb2d5IGFwcGxpY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUHVibGlzaGVyQXBwIHsKLSAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgcHJvcHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdG9waWM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJtaXNzaW5nIHBhdGhuYW1lIHRvIG1xdHQucHJvcGVydGllcyBmaWxlIik7Ci0gICAgICAgIFNpbXBsZVB1Ymxpc2hlckFwcCBwdWJsaXNoZXIgPSBuZXcgU2ltcGxlUHVibGlzaGVyQXBwKGFyZ3NbMF0pOwotICAgICAgICBwdWJsaXNoZXIucnVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1xdHRQcm9wc1BhdGggcGF0aG5hbWUgdG8gcHJvcGVydGllcyBmaWxlCi0gICAgICovCi0gICAgU2ltcGxlUHVibGlzaGVyQXBwKFN0cmluZyBtcXR0UHJvcHNQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5sb2FkKEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlKG1xdHRQcm9wc1BhdGgpLnRvUGF0aCgpKSk7Ci0gICAgICAgIHRvcGljID0gcHJvcHMuZ2V0UHJvcGVydHkoIm1xdHQudG9waWMiKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBNcXR0Q29uZmlnIGNyZWF0ZU1xdHRDb25maWcoKSB7Ci0gICAgICAgIE1xdHRDb25maWcgbXF0dENvbmZpZyA9IE1xdHRDb25maWcuZnJvbVByb3BlcnRpZXMocHJvcHMpOwotICAgICAgICByZXR1cm4gbXF0dENvbmZpZzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdG9wb2xvZ3kgZm9yIHRoZSBwdWJsaXNoZXIgYXBwbGljYXRpb24gYW5kIHJ1biBpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERldmVsb3BtZW50UHJvdmlkZXIgdHAgPSBuZXcgRGV2ZWxvcG1lbnRQcm92aWRlcigpOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgdGhlIGFwcGxpY2F0aW9uL3RvcG9sb2d5Ci0gICAgICAgIAotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koIm1xdHRTYW1wbGVQdWJsaXNoZXIiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LmRlYnVnIiwgInNzbCIpOyAvLyBvciAiYWxsIjsgImhlbHAiIGZvciBmdWxsIGxpc3QKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIE1RVFQgYnJva2VyIGNvbm5lY3RvcgotICAgICAgICBNcXR0Q29uZmlnIG1xdHRDb25maWcgPSBjcmVhdGVNcXR0Q29uZmlnKCk7Ci0gICAgICAgIE1xdHRTdHJlYW1zIG1xdHQgPSBuZXcgTXF0dFN0cmVhbXModCwgKCkgLT4gbXF0dENvbmZpZyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBzYW1wbGUgc3RyZWFtIG9mIHR1cGxlcyB0byBwdWJsaXNoCi0gICAgICAgIEF0b21pY0ludGVnZXIgY250ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IG1zZ3MgPSB0LnBvbGwoCi0gICAgICAgICAgICAgICAgKCkgLT4gewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiTWVzc2FnZS0lZCBmcm9tICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQuaW5jcmVtZW50QW5kR2V0KCksIFV0aWwuc2ltcGxlVFMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicG9sbCBnZW5lcmF0ZWQgbXNnIHRvIHB1Ymxpc2g6ICIgKyBtc2cpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNnOwotICAgICAgICAgICAgICAgIH0sIDFMLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFB1Ymxpc2ggdGhlIHN0cmVhbSB0byB0aGUgdG9waWMuICBUaGUgU3RyaW5nIHR1cGxlIGlzIHRoZSBtZXNzYWdlIHZhbHVlLgotICAgICAgICBtcXR0LnB1Ymxpc2gobXNncywgdG9waWMsIDAvKnFvcyovLCBmYWxzZS8qcmV0YWluKi8pOwotICAgICAgICAKLSAgICAgICAgLy8gcnVuIHRoZSBhcHBsaWNhdGlvbiAvIHRvcG9sb2d5Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc29sZSBVUkwgZm9yIHRoZSBqb2I6ICIKLSAgICAgICAgICAgICAgICArIHRwLmdldFNlcnZpY2VzKCkuZ2V0U2VydmljZShIdHRwU2VydmVyLmNsYXNzKS5nZXRDb25zb2xlVXJsKCkpOwotICAgICAgICB0cC5zdWJtaXQodCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9TaW1wbGVTdWJzY3JpYmVyQXBwLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9TaW1wbGVTdWJzY3JpYmVyQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTFkOTUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL21xdHQvU2ltcGxlU3Vic2NyaWJlckFwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLm1xdHQuTXF0dENvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLm1xdHQuTXF0dFN0cmVhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2ZXIuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuRGV2ZWxvcG1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi0vKioKLSAqIEEgc2ltcGxlIE1RVFQgc3Vic2NyaWJlciB0b3BvbG9neSBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN1YnNjcmliZXJBcHAgewotICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBwcm9wczsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0b3BpYzsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIm1pc3NpbmcgcGF0aG5hbWUgdG8gbXF0dC5wcm9wZXJ0aWVzIGZpbGUiKTsKLSAgICAgICAgU2ltcGxlU3Vic2NyaWJlckFwcCBzdWJzY3JpYmVyID0gbmV3IFNpbXBsZVN1YnNjcmliZXJBcHAoYXJnc1swXSk7Ci0gICAgICAgIHN1YnNjcmliZXIucnVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1xdHRQcm9wc1BhdGggcGF0aG5hbWUgdG8gcHJvcGVydGllcyBmaWxlCi0gICAgICovCi0gICAgU2ltcGxlU3Vic2NyaWJlckFwcChTdHJpbmcgbXF0dFByb3BzUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMubG9hZChGaWxlcy5uZXdCdWZmZXJlZFJlYWRlcihuZXcgRmlsZShtcXR0UHJvcHNQYXRoKS50b1BhdGgoKSkpOwotICAgICAgICB0b3BpYyA9IHByb3BzLmdldFByb3BlcnR5KCJtcXR0LnRvcGljIik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTXF0dENvbmZpZyBjcmVhdGVNcXR0Q29uZmlnKCkgewotICAgICAgICBNcXR0Q29uZmlnIG1xdHRDb25maWcgPSBNcXR0Q29uZmlnLmZyb21Qcm9wZXJ0aWVzKHByb3BzKTsKLSAgICAgICAgcmV0dXJuIG1xdHRDb25maWc7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHRvcG9sb2d5IGZvciB0aGUgc3Vic2NyaWJlciBhcHBsaWNhdGlvbiBhbmQgcnVuIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGV2ZWxvcG1lbnRQcm92aWRlciB0cCA9IG5ldyBEZXZlbG9wbWVudFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBidWlsZCB0aGUgYXBwbGljYXRpb24vdG9wb2xvZ3kKLSAgICAgICAgCi0gICAgICAgIFRvcG9sb2d5IHQgPSB0cC5uZXdUb3BvbG9neSgibXF0dFNhbXBsZVN1YnNjcmliZXIiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LmRlYnVnIiwgInNzbCIpOyAvLyBvciAiYWxsIjsgImhlbHAiIGZvciBmdWxsIGxpc3QKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIE1RVFQgYnJva2VyIGNvbm5lY3RvcgotICAgICAgICBNcXR0Q29uZmlnIG1xdHRDb25maWcgPSBjcmVhdGVNcXR0Q29uZmlnKCk7Ci0gICAgICAgIE1xdHRTdHJlYW1zIG1xdHQgPSBuZXcgTXF0dFN0cmVhbXModCwgKCkgLT4gbXF0dENvbmZpZyk7Ci0gICAgICAgIAotICAgICAgICAvLyBTdWJzY3JpYmUgdG8gdGhlIHRvcGljIGFuZCBjcmVhdGUgYSBzdHJlYW0gb2YgbWVzc2FnZXMKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IG1zZ3MgPSBtcXR0LnN1YnNjcmliZSh0b3BpYywgMC8qcW9zKi8pOwotICAgICAgICAKLSAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVjZWl2ZWQgbXNncyAtIGp1c3QgcHJpbnQgdGhlbSBvdXQKLSAgICAgICAgbXNncy5zaW5rKHR1cGxlIC0+IFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJbJXNdIHJlY2VpdmVkOiAlcyIsIFV0aWwuc2ltcGxlVFMoKSwgdHVwbGUpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBydW4gdGhlIGFwcGxpY2F0aW9uIC8gdG9wb2xvZ3kKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25zb2xlIFVSTCBmb3IgdGhlIGpvYjogIgotICAgICAgICAgICAgICAgICsgdHAuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEh0dHBTZXJ2ZXIuY2xhc3MpLmdldENvbnNvbGVVcmwoKSk7Ci0gICAgICAgIHRwLnN1Ym1pdCh0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L1N1YnNjcmliZXJBcHAuamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9tcXR0L1N1YnNjcmliZXJBcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwZjc2Ny4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9TdWJzY3JpYmVyQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQuTXF0dENsaWVudC5PUFRfUU9TOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5NcXR0Q2xpZW50Lk9QVF9UT1BJQzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMubXF0dC5NcXR0Q29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMubXF0dC5NcXR0U3RyZWFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5UHJvdmlkZXI7Ci0KLS8qKgotICogQSBNUVRUIHN1YnNjcmliZXIgdG9wb2xvZ3kgYXBwbGljYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJzY3JpYmVyQXBwIHsKLSAgICBwcml2YXRlIGZpbmFsIFRvcG9sb2d5UHJvdmlkZXIgdHA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdG9wIHRoZSBUb3BvbG9neVByb3ZpZGVyIHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqLwotICAgIFN1YnNjcmliZXJBcHAoVG9wb2xvZ3lQcm92aWRlciB0cCwgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgIHRoaXMudHAgPSB0cDsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdG9wb2xvZ3kgZm9yIHRoZSBzdWJzY3JpYmVyIGFwcGxpY2F0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIFRvcG9sb2d5Ci0gICAgICovCi0gICAgcHVibGljIFRvcG9sb2d5IGJ1aWxkQXBwVG9wb2xvZ3koKSB7Ci0gICAgICAgIFRvcG9sb2d5IHQgPSB0cC5uZXdUb3BvbG9neSgibXF0dENsaWVudFN1YnNjcmliZXIiKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIE1RVFQgYnJva2VyIGNvbm5lY3RvcgotICAgICAgICBNcXR0Q29uZmlnIGNvbmZpZyA9IFJ1bm5lci5uZXdDb25maWcob3B0aW9ucyk7Ci0gICAgICAgIE1xdHRTdHJlYW1zIG1xdHQgPSBuZXcgTXF0dFN0cmVhbXModCwgKCkgLT4gY29uZmlnKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgTVFUVCBjbGllbnRJZCAiICsgY29uZmlnLmdldENsaWVudElkKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRoZSB0b3BpYyBhbmQgY3JlYXRlIGEgc3RyZWFtIG9mIG1lc3NhZ2VzCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBtc2dzID0gbXF0dC5zdWJzY3JpYmUob3B0aW9ucy5nZXQoT1BUX1RPUElDKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0KE9QVF9RT1MpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIHJlY2VpdmVkIG1zZ3MgLSBqdXN0IHByaW50IHRoZW0gb3V0Ci0gICAgICAgIG1zZ3Muc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiWyVzXSByZWNlaXZlZDogJXMiLCBVdGlsLnNpbXBsZVRTKCksIHR1cGxlKSkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL21xdHQvcGFja2FnZS1pbmZvLmphdmEgYi9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2MDJlZi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvbXF0dC9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vKioKLSAqIFNhbXBsZXMgc2hvd2luZyB1c2Ugb2YgdGhlCi0gKiA8YSBocmVmPSJ7QGRvY1Jvb3R9L29yZy9hcGFjaGUvZWRnZW50L2Nvbm5lY3RvcnMvbXF0dC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+Ci0gKiAgICAgTVFUVCBzdHJlYW0gY29ubmVjdG9yPC9hPi4KLSAqIDxwPgotICogU2VlICZsdDtlZGdlbnQtcmVsZWFzZSZndDsvc2NyaXB0cy9jb25uZWN0b3JzL21xdHQvUkVBRE1FIHRvIHJ1biB0aGUgc2FtcGxlcy4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBzaW1wbGUgc2FtcGxlcyBhcmUgcHJvdmlkZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+U2ltcGxlUHVibGlzaGVyQXBwLmphdmEgLSBhIHNpbXBsZSBwdWJsaXNoZXIgYXBwbGljYXRpb24gdG9wb2xvZ3k8L2xpPgotICogPGxpPlNpbXBsZVN1YnNjcmliZXJBcHAuamF2YSAtIGEgc2ltcGxlIHN1YnNjcmliZXIgYXBwbGljYXRpb24gdG9wb2xvZ3k8L2xpPgotICogPC91bD4KLSAqIFRoZSByZW1haW5pbmcgY2xhc3NlcyBhcmUgcGFydCBvZiBhIHNhbXBsZSB0aGF0IG1vcmUgZnVsbHkgZXhwb3NlcwotICogY29udHJvbGxpbmcgdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLm1xdHQ7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvb2JkMi9PYmQyU3RyZWFtcy5qYXZhIGIvc2FtcGxlcy9jb25uZWN0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25uZWN0b3JzL29iZDIvT2JkMlN0cmVhbXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhYjIwYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvb2JkMi9PYmQyU3RyZWFtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMub2JkMjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSU5VVEVTOwotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuc3RhdC5SZWdyZXNzaW9uLlNMT1BFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuc3RhdC5TdGF0aXN0aWMuTUFYOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LkNtZC5QSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5lbG0zMjcuQ21kLlZBTFVFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LlBpZHMwMS5BSVJfSU5UQUtFX1RFTVA7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5lbG0zMjcuUGlkczAxLkVOR0lORV9DT09MQU5UX1RFTVA7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5lbG0zMjcuUGlkczAxLlJQTTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmVsbTMyNy5QaWRzMDEuU1BFRUQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5qc29uLkpzb25BbmFseXRpY3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5zZXJpYWwuU2VyaWFsRGV2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5lbG0zMjcuRWxtMzI3U3RyZWFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRXaW5kb3c7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLQotLyoqCi0gKiBTYW1wbGUgT0JELUlJIHN0cmVhbXMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT2JkMlN0cmVhbXMgewotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyZWFtIG9mIHRlbXBlcmF0dXJlIHJlYWRpbmdzIHdoaWNoCi0gICAgICogYXJlIGluY3JlYXNpbmcgb3ZlciB0aGUgbGFzdCBtaW51dGUuCi0gICAgICogCi0gICAgICogUG9sbCB0ZW1wZXJhdHVyZXMgZXZlcnkgZml2ZSBzZWNvbmRzIGFuZAotICAgICAqIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSByZWFkaW5nIGFuZCByYXRlIG9mIGNoYW5nZQotICAgICAqIChzbG9wZSkgb3ZlciB0aGUgbGFzdCBtaW51dGUsIHBhcnRpdGlvbmVkIGJ5IHBhcmFtZXRlcgotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LkNtZCNQSUQgcGlkfS4gRmlsdGVyIHNvIHRoYXQgb25seQotICAgICAqIHRob3NlIHdpdGggYSByYXRlIG9mIGluY3JlYXNlIGdyZWF0ZXIgdGhhbgotICAgICAqIG9yIGVxdWFsIHRvIDEgZGVncmVlIEMvbWludXRlIGlzIHByZXNlbnQgb24gdGhlIHJldHVybmVkIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBUZW1wZXJhdHVyZXMgaW5jbHVkZWQgYXJlCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5lbG0zMjcuUGlkczAxI0FJUl9JTlRBS0VfVEVNUCBBSVJfSU5UQUtFX1RFTVB9IGFuZAotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LlBpZHMwMSNFTkdJTkVfQ09PTEFOVF9URU1QIEVOR0lORV9DT09MQU5UX1RFTVB9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZXZpY2UgU2VyaWFsIGRldmljZSB0aGUgRUxNMzI3IGlzIGNvbm5lY3RlZCB0by4KLSAgICAgKiBAcmV0dXJuIFN0cmVhbSB0aGF0IHdpbGwgY29udGFpbiBwYXJhbWV0ZXJzIHdpdGggaW5jcmVhc2luZyB0ZW1wZXJhdHVyZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUU3RyZWFtPEpzb25PYmplY3Q+IGluY3JlYXNpbmdUZW1wcyhTZXJpYWxEZXZpY2UgZGV2aWNlKSB7Ci0KLSAgICAgICAgVFN0cmVhbTxKc29uQXJyYXk+IHRlbXBzQSA9IEVsbTMyN1N0cmVhbXMucG9sbChkZXZpY2UsIDUsIFNFQ09ORFMsCi0gICAgICAgICAgICAgICAgQUlSX0lOVEFLRV9URU1QLAotICAgICAgICAgICAgICAgIEVOR0lORV9DT09MQU5UX1RFTVApOwotCi0gICAgICAgIFRTdHJlYW08SnNvbk9iamVjdD4gdGVtcHMgPSB0ZW1wc0EuZmxhdE1hcChqZSAtPiBqZSkubWFwKGplIC0+IGplLmdldEFzSnNvbk9iamVjdCgpKTsKLQotICAgICAgICBUV2luZG93PEpzb25PYmplY3QsIEpzb25FbGVtZW50PiB3aW5kb3cgPSB0ZW1wcy5sYXN0KDEsIE1JTlVURVMsIGogLT4gai5nZXQoUElEKSk7Ci0KLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiB0ZW1wZXJhdHVyZVJhdGUgPSBKc29uQW5hbHl0aWNzLmFnZ3JlZ2F0ZSh3aW5kb3csIFBJRCwgVkFMVUUsIE1BWCwgU0xPUEUpOwotCi0gICAgICAgIC8vIEhhdmUgdGhlIHN0cmVhbSBjb250YWluIG9ubHkgdHVwbGVzIHdoZXJlCi0gICAgICAgIC8vIHRoZSByaXNlIGluIHRlbXBlcmF0dXJlcyA+PSAxIGRlZ3JlZSBDL21pbnV0ZQotICAgICAgICB0ZW1wZXJhdHVyZVJhdGUgPSB0ZW1wZXJhdHVyZVJhdGUuZmlsdGVyKGogLT4gewotICAgICAgICAgICAgSnNvbk9iamVjdCB2ID0gZ2V0T2JqZWN0KGosICJ2YWx1ZSIpOwotICAgICAgICAgICAgcmV0dXJuIHYuaGFzKCJTTE9QRSIpICYmIGdldERvdWJsZSh2LCAiU0xPUEUiKSA+PSAxLjA7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiB0ZW1wZXJhdHVyZVJhdGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmVhbSBjb250YWluaW5nIHZlaGljbGUgc3BlZWQgKGttL2gpCi0gICAgICogYW5kIGVuZ2luZSByZXZzIChycG0pLgotICAgICAqIAotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZWxtMzI3LlBpZHMwMSNTUEVFRCBTcGVlZH0KLSAgICAgKiBhbmQge0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5lbG0zMjcuUGlkczAxI1JQTSBlbmdpbmUgcmV2c30KLSAgICAgKiBhcmUgcG9sbGVkIGV2ZXJ5IDIwMG1zIGFuZCByZXR1cm5lZCBhcyBhIHN0cmVhbQotICAgICAqIGNvbnRhaW5pbmcgSlNPTiBvYmplY3RzIHdpdGgga2V5cyB7QGNvZGUgc3BlZWR9Ci0gICAgICogYW5kIHtAY29kZSBycG19LgotICAgICAqIAotICAgICAqIFRoZSB0d28gcmVhZGluZ3MgbWF5IG5vdCBiZSBleGFjdGx5IGNvbnNpc3RlbnQgd2l0aAotICAgICAqIGVhY2ggb3RoZXIgYXMgdGhlcmUgYXJlIGZldGNoZWQgc2VxdWVudGlhbGx5IGZyb20KLSAgICAgKiB0aGUgRUxNMzI3LiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGV2aWNlIFNlcmlhbCBkZXZpY2UgdGhlIEVMTTMyNyBpcyBjb25uZWN0ZWQgdG8uCi0gICAgICogQHJldHVybiBTdHJlYW0gdGhhdCB3aWxsIGNvbnRhaW4gc3BlZWQgYW5kIGVuZ2luZSByZXZvbHV0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRTdHJlYW08SnNvbk9iamVjdD4gdGFjaChTZXJpYWxEZXZpY2UgZGV2aWNlKSB7Ci0KLSAgICAgICAgVFN0cmVhbTxKc29uQXJyYXk+IHJwbVNwZWVkID0gRWxtMzI3U3RyZWFtcy5wb2xsKGRldmljZSwgMjAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsCi0gICAgICAgICAgICAgICAgU1BFRUQsIFJQTSk7Ci0KLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiB0YWNoID0gcnBtU3BlZWQubWFwKGphIC0+IHsKLSAgICAgICAgICAgIEpzb25PYmplY3QgaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRvdWJsZSBzcGVlZCA9IGdldERvdWJsZShqYS5nZXQoMCksIFZBTFVFKTsKLSAgICAgICAgICAgIGRvdWJsZSBycG0gPSBnZXREb3VibGUoamEuZ2V0KDEpLCBWQUxVRSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJzcGVlZCIsIHNwZWVkKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoInJwbSIsIHJwbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gajsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIHRhY2g7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHNpbXBsaWZ5IGFjY2Vzc2luZyBhIEpTT04gb2JqZWN0LgotICAgICAqIEBwYXJhbSBqc29uIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9iamVjdCB0byBiZSBnb3QuCi0gICAgICogQHBhcmFtIGtleSBLZXkgb2YgdGhlIG9iamVjdCB0byBiZSBnb3QuCi0gICAgICogQHJldHVybiBKU09OIG9iamVjdCB3aXRoIGtleSB7QGNvZGUga2V5fSBmcm9tIHtAY29kZSBqc29ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpzb25PYmplY3QgZ2V0T2JqZWN0KEpzb25PYmplY3QganNvbiwgU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4ganNvbi5nZXRBc0pzb25PYmplY3Qoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBzaW1wbGlmeSBhY2Nlc3NpbmcgYSBudW1iZXIgYXMgYSBkb3VibGUuCi0gICAgICogQHBhcmFtIGpzb24gSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGUgbnVtYmVyIHRvIGJlIGdvdC4KLSAgICAgKiBAcGFyYW0ga2V5IEtleSBvZiB0aGUgbnVtYmVyIHRvIGJlIGdvdC4KLSAgICAgKiBAcmV0dXJuIE51bWJlciB3aXRoIGtleSB7QGNvZGUga2V5fSBmcm9tIHtAY29kZSBqc29ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXREb3VibGUoSnNvbkVsZW1lbnQganNvbiwgU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4ganNvbi5nZXRBc0pzb25PYmplY3QoKS5nZXQoa2V5KS5nZXRBc0RvdWJsZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9wYWNrYWdlLWluZm8uamF2YSBiL3NhbXBsZXMvY29ubmVjdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29ubmVjdG9ycy9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzNmQ5Mi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Nvbm5lY3RvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2Nvbm5lY3RvcnMvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS8qKgotICogR2VuZXJhbCBzdXBwb3J0IGZvciBjb25uZWN0b3Igc2FtcGxlcy4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnM7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb25zb2xlL2J1aWxkLmdyYWRsZSBiL3NhbXBsZXMvY29uc29sZS9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNzk1ZmMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25zb2xlL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgLy8gTi5CLiBjb21tb24gZGVwZW5kZW5jaWVzIGFyZSBzZXQgaW4gcm9vdCBidWlsZC5ncmFkbGUKLQotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29uc29sZTpzZXJ2ZXInCi0KLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29uc29sZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvY29uc29sZS9Db25zb2xlV2F0ZXJEZXRlY3Rvci5qYXZhIGIvc2FtcGxlcy9jb25zb2xlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25zb2xlL0NvbnNvbGVXYXRlckRldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNjY3NWMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25zb2xlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25zb2xlL0NvbnNvbGVXYXRlckRldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29uc29sZTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQubWV0cmljcy5NZXRyaWNzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kZXZlbG9wbWVudC5EZXZlbG9wbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuQ291bnRlcjsKLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5NZXRyaWNSZWdpc3RyeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7Ci0KLS8qKgotICogCi0gKiBEZW1vbnN0cmF0ZXMgc29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgdGhlIGNvbnNvbGUuCi0gKiA8UD4KLSAqIFRoZSB0b3BvbG9neSBncmFwaCBpbiB0aGUgY29uc29sZSBjdXJyZW50bHkgYWxsb3dzIGZvciAzIGRpc3RpbmN0ICJ2aWV3cyIgb2YgdGhlIHRvcG9sb2d5OgotICogPHVsPgotICogPGxpPlN0YXRpYyBmbG93PC9saT4KLSAqIDxsaT5UdXBsZSBjb3VudDwvbGk+Ci0gKiA8bGk+T3BsZXQga2luZDwvbGk+Ci0gKiA8L3VsPgotICogPFA+Ci0gKiBTZWxlY3RpbmcgYW55IG9mIHRoZXNlLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgIlN0YXRpYyBmbG93IiwgYWRkcyBhIGxlZ2VuZCB0byB0aGUgdG9wb2xvZ3kgd2hpY2gKLSAqIGFsbG93cyB0aGUgdXNlciB0byBpZGVudGlmeSBlbGVtZW50cyBvZiB0aGUgdmlldy4KLSAqIDwvUD4KLSAqIDxQPiBUaGUgIlN0YXRpYyBmbG93IiB2aWV3IHNob3dzIHRoZSB0b29sb2d5IGluIGFuIHVuY2hhbmdpbmcgc3RhdGUgLSB0aGF0IGlzIGlmIHR1cGxlIGNvdW50cyBhcmUgYXZhaWxhYmxlIHRoZQotICogbGluZXMgKGNvbm5lY3Rpb25zKSByZXByZXNlbnRpbmcgdGhlIGVkZ2VzIG9mIHRoZSB0b3BvbG9neSBhcmUgbm90IHVwZGF0ZWQsIG5vciBhcmUgdGhlIGNpcmNsZXMgKHJlcHJlc2VudGluZyB0aGUgdmVydGljZXMpIGRpbWVuc2lvbnMgdXBkYXRlZC4gIAotICogVGhlIHB1cnBvc2Ugb2YgdGhpcyB2aWV3IGlzIHRvIGdpdmUgdGhlIHVzZXIgYW4gaW5kaWNhdGlvbiBvZiB0aGUgdG9wb2xvZ3kgbWFwIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSAqIDwvUD4KLSAqIDxQPgotICogVGhlICJPcGxldCBraW5kIiB2aWV3IGNvbG9ycyB0aGUgb3BsZXRzIG9yIHZlcnRpY2VzIGRpc3BsYXllZCBpbiB0aGUgdG9wb2xvZ3kgZ3JhcGggKHRoZSBjaXJjbGVzKSBieSB0aGVpcgotICogY29ycmVzcG9uZGluZyBPcGxldCBraW5kLgotICogPC9QPgotICogPFA+Ci0gKiBJZiAiVHVwbGUgY291bnQiIGlzIHNlbGVjdGVkIHRoZSBsZWdlbmQgcmVmbGVjdHMgcmFuZ2VzIG9mIHR1cGxlIGNvdW50cyBtZWFzdXJlZCBzaW5jZSB0aGUgYXBwbGljYXRpb24gd2FzIHN0YXJ0ZWQuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIE5vdGU6IFRoZSBEZXZlbG9wbWVudFByb3ZpZGVyIGNsYXNzIG92ZXJyaWRlcyB0aGUgc3VibWl0IG1ldGhvZCBvZiB0aGUgRGlyZWN0UHJvdmlkZXIgY2xhc3MKLSAqIGFuZCBhZGRzIGEgTWV0cmljcyBjb3VudGVyIHRvIHRoZSBzdWJtaXR0ZWQgdG9wb2xvZ3kuCi0gKiBJZiBhIGNvdW50ZXIgaXMgbm90IGFkZGVkIHRvIHRoZSB0b3BvbG9neSAob3IgdG8gYW4gaW5kaXZpZHVhbCBvcGxldCksIHRoZSAiVHVwbGUgY291bnQiIHZpZXcgc2VsZWN0aW9uIGlzIG5vdCBlbmFibGVkLgotICogPC9QPgotICogCi0gKiA8UD4KLSAqIEluIHRoZSBsb3dlciBoYWxmIG9mIHRoZSBlZGdlbnQgY29uc29sZSBpcyBhIGNoYXJ0IGRpc3BsYXlpbmcgbWV0cmljcywgaWYgYXZhaWxhYmxlLiAgSW4gdGhpcyBleGFtcGxlIG1ldHJpY3MKLSAqIGFyZSBhdmFpbGFibGUgc2luY2UgdGhlIERldmVsb3BtZW50UHJvdmlkZXIgY2xhc3MgaXMgYmVpbmcgdXNlZC4gIE5vdGUgdGhhdCB0aGUgRGV2ZWxvcG1lbnRQcm92aWRlciBjbGFzcyBhZGRzIGEgTWV0cmljcyBjb3VudGVyCi0gKiB0byBhbGwgb3BsZXRzIGluIHRoZSB0b3BvbG9neSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGNlcnRhaW4gb3BsZXQgdHlwZXMuICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbgotICogYWJvdXQgaG93IG1ldHJpY3MgYXJlIGFkZGVkIHRvIGEgdG9wb2xvZ3ksIHNlZSB0aGUgZGV0YWlscyBpbiB0aGUgb3JnLmFwYWNoZS5lZGdlbnQubWV0cmljcy5NZXRyaWNzIGNsYXNzIGFuZCB0aGUgY291bnRlciBtZXRob2QuCi0gKiA8YnI+Ci0gKiBBIGNvdW50ZXIgY2FuIGJlIGFkZGVkIHRvIGFuIGluZGl2aWR1YWwgb3BsZXQsIGFuZCBub3QgdGhlIGVudGlyZSB0b3BvbG9neS4gIEZvciBhbiBleGFtcGxlIG9mIHRoaXMKLSAqIHNlZSB0aGUgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy51dGlscy5tZXRyaWNzLkRldmVsb3BtZW50TWV0cmljc1NhbXBsZS4KLSAqIDwvUD4KLSAqIDxQPgotICogVGhlIG9yZy5hcGFjaGUuZWRnZW50Lm1ldHJpYy5NZXRyaWNzIGNsYXNzIGFsc28gcHJvdmlkZXMgYSByYXRlIG1ldGVyLiAgUmF0ZSBtZXRlcnMgbXVzdCBiZSBhZGRlZCB0byBpbmRpdmlkdWFsIG9wbGV0cyBhbmQgYXJlIG5vdCBjdXJyZW50bHkKLSAqIGF2YWlsYWJsZSBmb3IgdGhlIGVudGlyZSB0b3BvbG9neS4KLSAqIDwvUD4KLQotICogPFA+Ci0gKiBUaGUgbWV0cmljcyBjaGFydCBkaXNwbGF5ZWQgaXMgYSBiYXIgY2hhcnQgYnkgZGVmYXVsdC4gIElmIGEgcmF0ZSBtZXRlciBpcyBhZGRlZCB0byBhbiBvcGxldCBpdCB3aWxsIGJlIGRpc3BsYXllZAotICogYXMgYSBsaW5lIGNoYXJ0IG92ZXIgdGhlIGxhc3QgMjAgbWVhc3VyZXMgKHRoZSBpbnRlcnZhbCB0byByZWZyZXNoIHRoZSBsaW5lIGNoYXJ0IGlzIGV2ZXJ5IDIgMS8yIHNlY29uZHMpLgotICogSWYgYSBjb3VudGVyIGlzIGFkZGVkIHRvIGEgc2luZ2xlIG9wbGV0LCB0aGUgdHVwbGUgY291bnQgY2FuIGFsc28gYmUgZGlzcGxheWVkIGFzIGEgbGluZSBjaGFydC4KLSAqIDwvUD4KLSAqIAotICogPFA+Ci0gKiBDb25zb2xlV2F0ZXJEZXRlY3RvciBzY2VuYXJpbzoKLSAqIEEgY291bnR5IGFnZW5jeSBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhlIHNhZmV0eSBvZiByZXNpZGVudHMgd2VsbCB3YXRlci4gIEVhY2ggd2VsbCB0aGV5IG1vbml0b3IgaGFzIGZvdXIgZGlmZmVyZW50IAotICogc2Vuc29yIHR5cGVzOgotICogPHVsPgotICogPGxpPlRlbXBlcmF0dXJlPC9saT4KLSAqIDxsaT5BY2lkaXR5PC9saT4KLSAqIDxsaT5FY29saTwvbGk+Ci0gKiA8bGk+TGVhZDwvbGk+Ci0gKiA8L3VsPgotICogPFA+Ci0gKiBUaGlzIGFwcGxpY2F0aW9uIHRvcG9sb2d5IG1vbml0b3JzIDMgd2VsbHM6Ci0gKiA8dWw+Ci0gKiA8bGk+Ci0gKiBFYWNoIHdlbGwgdGhhdCBpcyB0byBiZSBtZWFzdXJlZCBpcyBhZGRlZCB0byB0aGUgdG9wb2xvZ3kuICBUaGUgdG9wb2xvZ3kgcG9sbHMgZWFjaCBzZW5zb3IgZm9yIGVhY2ggd2VsbCBhcyBhIHVuaXQuICAKLSAqIEFsbCB0aGUgc2Vuc29yIHJlYWRpbmdzIGZvciBhIHNpbmdsZSB3ZWxsIGFyZSAndW5pb25lZCcgaW50byBhIHNpbmdsZSBUU3RyZWFtJmx0O0pzb25PYmplY3QmZ3Q7LgotICogPC9saT4KLSAqIDxsaT4KLSAqIE5vdywgZWFjaCB3ZWxsIGhhcyBhIHNpbmdsZSBzdHJlYW0gd2l0aCBlYWNoIG9mIHRoZSBzZW5zb3JzIHJlYWRpbmdzIGFzIGEgcHJvcGVydHkgd2l0aCBhIG5hbWUgYW5kIHZhbHVlIGluIHRoZSBKc29uT2JqZWN0LiAgCi0gKiBFYWNoIHdlbGwncyBzZW5zb3JzIGFyZSB0aGVuIGNoZWNrZWQgdG8gc2VlIGlmIHRoZWlyIHZhbHVlcyBhcmUgaW4gYW4gYWNjZXB0YWJsZSByYW5nZS4gIFRoZSBmaWx0ZXIgb3BsZXQgaXMgdXNlZCB0byBjaGVjayBlYWNoIHNlbnNvcidzIHJhbmdlLiAgCi0gKiBJZiBhbnkgb2YgdGhlIHNlbnNvcidzIHJlYWRpbmdzIGFyZSBvdXQgb2YgdGhlIGFjY2VwdGFibGUgcmFuZ2UgdGhlIHR1cGxlIGlzIHBhc3NlZCBhbG9uZy4gVGhvc2UgdGhhdCBhcmUgd2l0aGluIGFuIGFjY2VwdGFibGUgcmFuZ2UgCi0gKiBhcmUgZGlzY2FyZGVkLgotICogPC9saT4KLSAqIDxsaT4KLSAqIElmIHRoZSB0dXBsZXMgaW4gdGhlIHN0cmVhbSBmb3IgdGhlIHdlbGwgYXJlIG91dCBvZiByYW5nZSB0aGV5IGFyZSB0aGVuIHBhc3NlZCB0byB0aGUgc3BsaXQgb3BsZXQuIFRoZSBzcGxpdCBvcGxldCBicmVha3MgdGhlIHNpbmdsZQotICogVFN0cmVhbSZsdDtKc29uT2JqZWN0Jmd0OyBpbnRvIGluZGl2aWR1YWwgc3RyZWFtcyBmb3IgZWFjaCBzZW5zb3IgdHlwZSBmb3IgdGhlIHdlbGwuICAKLSAqIDwvbGk+Ci0gKiA8bGk+Ci0gKiBXZWxsMSBhbmQgV2VsbDMncyB0ZW1wZXJhdHVyZSBzZW5zb3Igc3RyZWFtcyBoYXZlIHJhdGUgbWV0ZXJzIHBsYWNlZCBvbiB0aGVtLiAgVGhpcyB3aWxsIGJlIHVzZWQgdG8gY29tcGFyZSB0aGUgcmF0ZSBvZiB0dXBsZXMgZmxvd2luZyB0aHJvdWdoIHRoZXNlCi0gKiBzdHJlYW1zIHRoYXQgYXJlIGEgcmVzdWx0IG9mIG91dCBvZiByYW5nZSByZWFkaW5ncyBmb3IgV2VsbDEgYW5kIFdlbGwzIHJlc3BlY3RpdmVseS4KLSAqIDwvbGk+Ci0gKiA8bGk+Ci0gKiBFYWNoIHN0cmVhbSB0aGF0IGlzIHByb2R1Y2VkIGZyb20gdGhlIHNwbGl0IHByaW50cyBvdXQgdGhlIHZhbHVlIGZvciB0aGUgc2Vuc29yIHJlYWRpbmcgdGhhdCBpdCBpcyBtb25pdG9yaW5nIGFsb25nIHdpdGggdGhlIHdlbGxJZC4KLSAqIDwvbGk+Ci0gKiA8L3VsPgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29uc29sZVdhdGVyRGV0ZWN0b3IgewotCi0JLyoqCi0JICogSHlwb3RoZXRpY2FsIHZhbHVlcyBmb3IgYWxsIHRoZSBzZW5zb3IgdHlwZXM6IHRlbXAsIGFjaWRpdHksIGVjb2xpIGFuZCBMZWFkCi0JICovCi0Jc3RhdGljIGludCBURU1QX0FMRVJUX01JTiA9IDQ5OwotCXN0YXRpYyBpbnQgVEVNUF9BTEVSVF9NQVggPSA4MTsKLQlzdGF0aWMgaW50IFRFTVBfUkFORE9NX0xPVyA9IDQwOwotCXN0YXRpYyBpbnQgVEVNUF9SQU5ET01fSElHSCA9IDkwOwotCXN0YXRpYyBTdHJpbmcgVEVNUF9BTEVSVF9UQUcgPSAiVEVNUCBvdXQgb2YgcmFuZ2UiOwotCQotCXN0YXRpYyBpbnQgQUNJRElUWV9BTEVSVF9NSU4gPSA0OwotCXN0YXRpYyBpbnQgQUNJRElUWV9BTEVSVF9NQVggPSA5OwotCXN0YXRpYyBpbnQgQUNJRElUWV9SQU5ET01fTE9XID0gMTsKLQlzdGF0aWMgaW50IEFDSURJVFlfUkFORE9NX0hJR0ggPSAxMTsKLQlzdGF0aWMgU3RyaW5nIEFDSURJVFlfQUxFUlRfVEFHID0gIkFDSURJVFkgb3V0IG9mIHJhbmdlIjsKLQkKLQlzdGF0aWMgaW50IEVDT0xJX0FMRVJUID0gMTsKLQlzdGF0aWMgaW50IEVDT0xJX1JBTkRPTV9MT1cgPSAwOwotCXN0YXRpYyBpbnQgRUNPTElfUkFORE9NX0hJR0ggPSAzOwotCXN0YXRpYyBTdHJpbmcgRUNPTElfQUxFUlRfVEFHID0gIkVDT0xJIG91dCBvZiByYW5nZSI7Ci0KLQlzdGF0aWMgaW50IExFQURfQUxFUlRfTUFYID0gMTA7Ci0Jc3RhdGljIGludCBMRUFEX1JBTkRPTV9MT1cgPSAwOwotCXN0YXRpYyBpbnQgTEVBRF9SQU5ET01fSElHSCA9IDE1OwotCXN0YXRpYyBTdHJpbmcgTEVBRF9BTEVSVF9UQUcgPSAiTEVBRCBvdXQgb2YgcmFuZ2UiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25zb2xlV2F0ZXJEZXRlY3Rvci5jbGFzcyk7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRGlyZWN0UHJvdmlkZXIgZHAgPSBuZXcgRGV2ZWxvcG1lbnRQcm92aWRlcigpOwotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKGRwLmdldFNlcnZpY2VzKCkuZ2V0U2VydmljZShIdHRwU2VydmVyLmNsYXNzKS5nZXRDb25zb2xlVXJsKCkpOwotCQkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcigiY29uc29sZVVybC50eHQiLCAiVVRGLTgiKTsKLSAgICAgICAgICAgIHdyaXRlci5wcmludGxuKGRwLmdldFNlcnZpY2VzKCkuZ2V0U2VydmljZShIdHRwU2VydmVyLmNsYXNzKS5nZXRDb25zb2xlVXJsKCkpOwotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gY2F1Z2h0IiwgZSk7Ci0gICAgICAgIH0KLQkJCi0JCVRvcG9sb2d5IHdlbGxUb3BvbG9neSA9IGRwLm5ld1RvcG9sb2d5KCJDb25zb2xlV2F0ZXJEZXRlY3RvciIpOwotCQkKLQkJVFN0cmVhbTxKc29uT2JqZWN0PiB3ZWxsMSA9IHdhdGVyRGV0ZWN0b3Iod2VsbFRvcG9sb2d5LCAxKTsKLQkJVFN0cmVhbTxKc29uT2JqZWN0PiB3ZWxsMiA9IHdhdGVyRGV0ZWN0b3Iod2VsbFRvcG9sb2d5LCAyKTsKLQkJVFN0cmVhbTxKc29uT2JqZWN0PiB3ZWxsMyA9IHdhdGVyRGV0ZWN0b3Iod2VsbFRvcG9sb2d5LCAzKTsKLQkJCQkKLQkJVFN0cmVhbTxKc29uT2JqZWN0PiBmaWx0ZXJlZFJlYWRpbmdzMSA9IGFsZXJ0RmlsdGVyKHdlbGwxLCAxLCBmYWxzZSk7Ci0JCVRTdHJlYW08SnNvbk9iamVjdD4gZmlsdGVyZWRSZWFkaW5nczIgPSBhbGVydEZpbHRlcih3ZWxsMiwgMiwgdHJ1ZSk7Ci0JCVRTdHJlYW08SnNvbk9iamVjdD4gZmlsdGVyZWRSZWFkaW5nczMgPSBhbGVydEZpbHRlcih3ZWxsMywgMywgZmFsc2UpOwotCQkKLQkJTGlzdDxUU3RyZWFtPEpzb25PYmplY3Q+PiBpbmRpdmlkdWFsQWxlcnRzMSA9IHNwbGl0QWxlcnQoZmlsdGVyZWRSZWFkaW5nczEsIDEpOwotCQkKLQkJLy8gUHV0IGEgcmF0ZSBtZXRlciBvbiB3ZWxsMSdzIHRlbXBlcmF0dXJlIHNlbnNvciBvdXRwdXQKLQkJTWV0cmljcy5yYXRlTWV0ZXIoaW5kaXZpZHVhbEFsZXJ0czEuZ2V0KDApKTsKLQkJaW5kaXZpZHVhbEFsZXJ0czEuZ2V0KDApLnRhZyhURU1QX0FMRVJUX1RBRywgIndlbGwxIikuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIiArIGZvcm1hdEFsZXJ0T3V0cHV0KHR1cGxlLCAiMSIsICJ0ZW1wIikpKTsKLQkJaW5kaXZpZHVhbEFsZXJ0czEuZ2V0KDEpLnRhZyhBQ0lESVRZX0FMRVJUX1RBRywgIndlbGwxIikuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oZm9ybWF0QWxlcnRPdXRwdXQodHVwbGUsICIxIiwgImFjaWRpdHkiKSkpOwotCQlpbmRpdmlkdWFsQWxlcnRzMS5nZXQoMikudGFnKEVDT0xJX0FMRVJUX1RBRywgIndlbGwxIikuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oZm9ybWF0QWxlcnRPdXRwdXQodHVwbGUsICIxIiwgImVjb2xpIikpKTsKLQkJaW5kaXZpZHVhbEFsZXJ0czEuZ2V0KDMpLnRhZyhMRUFEX0FMRVJUX1RBRywgIndlbGwxIikuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oZm9ybWF0QWxlcnRPdXRwdXQodHVwbGUsICIxIiwgImxlYWQiKSkpOwotCQkKLQkJTGlzdDxUU3RyZWFtPEpzb25PYmplY3Q+PiBpbmRpdmlkdWFsQWxlcnRzMiA9IHNwbGl0QWxlcnQoZmlsdGVyZWRSZWFkaW5nczIsIDIpOwotCQkKLQkgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBhbGVydDBXZWxsMiA9IGluZGl2aWR1YWxBbGVydHMyLmdldCgwKTsKLQkJYWxlcnQwV2VsbDIgID0gTWV0cmljcy5jb3VudGVyKGFsZXJ0MFdlbGwyKTsKLQkJYWxlcnQwV2VsbDIudGFnKCJ3ZWxsMiIsICJ0ZW1wIik7Ci0JCQotCQlUU3RyZWFtPEpzb25PYmplY3Q+IGFsZXJ0MVdlbGwyID0gaW5kaXZpZHVhbEFsZXJ0czIuZ2V0KDEpOwotCQlhbGVydDFXZWxsMiAgPSBNZXRyaWNzLmNvdW50ZXIoYWxlcnQxV2VsbDIpOwotCQlhbGVydDFXZWxsMi50YWcoIndlbGwyIiwgImFjaWRpdHkiKTsKLQkJCi0JCVRTdHJlYW08SnNvbk9iamVjdD4gYWxlcnQyV2VsbDIgPSBpbmRpdmlkdWFsQWxlcnRzMi5nZXQoMik7Ci0JCWFsZXJ0MldlbGwyICA9IE1ldHJpY3MuY291bnRlcihhbGVydDJXZWxsMik7Ci0JCWFsZXJ0MldlbGwyLnRhZygid2VsbDIiLCAiZWNvbGkiKTsKLQkJCi0JCVRTdHJlYW08SnNvbk9iamVjdD4gYWxlcnQzV2VsbDIgPSBpbmRpdmlkdWFsQWxlcnRzMi5nZXQoMyk7Ci0JCWFsZXJ0M1dlbGwyICA9IE1ldHJpY3MuY291bnRlcihhbGVydDNXZWxsMik7Ci0JCWFsZXJ0M1dlbGwyLnRhZygid2VsbDIiLCAibGVhZCIpOwkKLQotCQlMaXN0PFRTdHJlYW08SnNvbk9iamVjdD4+IGluZGl2aWR1YWxBbGVydHMzID0gc3BsaXRBbGVydChmaWx0ZXJlZFJlYWRpbmdzMywgMyk7Ci0JCQotCQkvLyBQdXQgYSByYXRlIG1ldGVyIG9uIHdlbGwzJ3MgdGVtcGVyYXR1cmUgc2Vuc29yIG91dHB1dAotCQlNZXRyaWNzLnJhdGVNZXRlcihpbmRpdmlkdWFsQWxlcnRzMy5nZXQoMCkpOwotCQlpbmRpdmlkdWFsQWxlcnRzMy5nZXQoMCkudGFnKFRFTVBfQUxFUlRfVEFHLCAid2VsbDMiKS5zaW5rKHR1cGxlIC0+IFN5c3RlbS5vdXQucHJpbnRsbihmb3JtYXRBbGVydE91dHB1dCh0dXBsZSwgIjMiLCAidGVtcCIpKSk7Ci0JCWluZGl2aWR1YWxBbGVydHMzLmdldCgxKS50YWcoQUNJRElUWV9BTEVSVF9UQUcsICJ3ZWxsMyIpLnNpbmsodHVwbGUgLT4gU3lzdGVtLm91dC5wcmludGxuKGZvcm1hdEFsZXJ0T3V0cHV0KHR1cGxlLCAiMyIsICJhY2lkaXR5IikpKTsKLQkJaW5kaXZpZHVhbEFsZXJ0czMuZ2V0KDIpLnRhZyhFQ09MSV9BTEVSVF9UQUcsICJ3ZWxsMyIpLnNpbmsodHVwbGUgLT4gU3lzdGVtLm91dC5wcmludGxuKGZvcm1hdEFsZXJ0T3V0cHV0KHR1cGxlLCAiMyIsICJlY29saSIpKSk7Ci0JCWluZGl2aWR1YWxBbGVydHMzLmdldCgzKS50YWcoTEVBRF9BTEVSVF9UQUcsICJ3ZWxsMyIpLnNpbmsodHVwbGUgLT4gU3lzdGVtLm91dC5wcmludGxuKGZvcm1hdEFsZXJ0T3V0cHV0KHR1cGxlLCAiMyIsICJsZWFkIikpKTsKLQkJCi0JCWRwLnN1Ym1pdCh3ZWxsVG9wb2xvZ3kpOwotCi0JCXdoaWxlICh0cnVlKSB7Ci0JICAgICAgICAgICAgTWV0cmljUmVnaXN0cnkgbWV0cmljUmVnaXN0cnkgPSBkcC5nZXRTZXJ2aWNlcygpLmdldFNlcnZpY2UoTWV0cmljUmVnaXN0cnkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBTb3J0ZWRNYXA8U3RyaW5nLCBDb3VudGVyPiBjb3VudGVycyA9IG1ldHJpY1JlZ2lzdHJ5LmdldENvdW50ZXJzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU2V0PEVudHJ5PFN0cmluZywgQ291bnRlcj4+IHZhbHVlcyA9IGNvdW50ZXJzLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBDb3VudGVyPiBlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAJCWlmIChlLmdldFZhbHVlKCkuZ2V0Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAJCSAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bnRlciBPcDoiICsgZS5nZXRLZXkoKSArICIgaGFzIGEgdHVwbGUgY291bnQgb2YgemVybyEiKTsKLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKLSAgICAgICAgCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIFRTdHJlYW0mbHQ7SnNvbk9iamVjdCZndDsgZm9yIGVhY2ggc2Vuc29yIHJlYWRpbmcgZm9yIGVhY2ggd2VsbC4gVW5pb25zIGFsbCB0aGUgVFN0cmVhbSZsdDtKc29uT2JqZWN0Jmd0OyBpbnRvIGEKLQkgKiBzaW5nbGUgb25lIHJlcHJlc2VudGluZyBhbGwgcmVhZGluZ3Mgb24gdGhlIHdlbGwuCi0JICogQHBhcmFtIHRvcG9sb2d5IFRvcG9sb2d5IHByb3ZpZGluZyB0aGUgdHVwbGVzIGZvciB0aGUgc2Vuc29ycwotCSAqIEBwYXJhbSB3ZWxsSWQgSWQgb2YgdGhlIHdlbGwgc2VuZGluZyB0aGUgbWVhc3VyZW1lbnRzCi0JICogQHJldHVybiBUU3RyZWFtJmx0O0pzb25PYmplY3QmZ3Q7IGNvbnRhaW5pbmcgYSBtZWFzdXJlbWVudCBmcm9tIGVhY2ggc2Vuc29yIHR5cGUuCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBUU3RyZWFtJmx0O0pzb25PYmplY3QmZ3Q7IGZyb20gcG9sbGluZyB0aGUgZm91ciBzZW5zb3IgdHlwZXMgYXMgVFN0cmVhbSZsdDtJbnRlZ2VyJmd0OwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVFN0cmVhbTxKc29uT2JqZWN0PiB3YXRlckRldGVjdG9yKFRvcG9sb2d5IHRvcG9sb2d5LCBpbnQgd2VsbElkKSB7Ci0JCVJhbmRvbSByTnVtID0gbmV3IFJhbmRvbSgpOwotCQlUU3RyZWFtPEludGVnZXI+IHRlbXAgPSB0b3BvbG9neS5wb2xsKCgpIC0+IHJOdW0ubmV4dEludChURU1QX1JBTkRPTV9ISUdIIC0gVEVNUF9SQU5ET01fTE9XKSArIFRFTVBfUkFORE9NX0xPVywgMSwgVGltZVVuaXQuU0VDT05EUyk7Ci0JCVRTdHJlYW08SW50ZWdlcj4gYWNpZGl0eSA9IHRvcG9sb2d5LnBvbGwoKCkgLT4gck51bS5uZXh0SW50KEFDSURJVFlfUkFORE9NX0hJR0ggLSBBQ0lESVRZX1JBTkRPTV9MT1cpICsgQUNJRElUWV9SQU5ET01fTE9XLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsgCi0JCVRTdHJlYW08SW50ZWdlcj4gZWNvbGkgPSB0b3BvbG9neS5wb2xsKCgpIC0+IHJOdW0ubmV4dEludChFQ09MSV9SQU5ET01fSElHSCAtIEVDT0xJX1JBTkRPTV9MT1cpICsgRUNPTElfUkFORE9NX0xPVywgMSwgVGltZVVuaXQuU0VDT05EUyk7Ci0JCVRTdHJlYW08SW50ZWdlcj4gbGVhZCA9IHRvcG9sb2d5LnBvbGwoKCkgLT4gck51bS5uZXh0SW50KExFQURfUkFORE9NX0hJR0ggLSBMRUFEX1JBTkRPTV9MT1cpICsgTEVBRF9SQU5ET01fTE9XLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsKLQkJVFN0cmVhbTxJbnRlZ2VyPiBpZCA9IHRvcG9sb2d5LnBvbGwoKCkgLT4gd2VsbElkLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsKLQkJCi0JCS8vIGFkZCB0YWdzIHRvIGVhY2ggc2Vuc29yCi0JCXRlbXAudGFnKCJ0ZW1wZXJhdHVyZSIsICJ3ZWxsIiArIHdlbGxJZCk7Ci0JCWFjaWRpdHkudGFnKCJhY2lkaXR5IiwgIndlbGwiICsgd2VsbElkKTsKLQkJZWNvbGkudGFnKCJlY29saSIsICJ3ZWxsIiArIHdlbGxJZCk7Ci0JCWxlYWQudGFnKCJsZWFkIiwgIndlbGwiICsgd2VsbElkKTsKLQkJaWQudGFnKCJ3ZWxsIiArIHdlbGxJZCk7Ci0JCQotCQlUU3RyZWFtPEpzb25PYmplY3Q+IHRlbXBPYmogPSB0ZW1wLm1hcCh0IC0+IHsKLQkJCUpzb25PYmplY3Qgak9iaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0JCQlqT2JqLmFkZFByb3BlcnR5KCJ0ZW1wIiwgdCk7Ci0JCQlyZXR1cm4gak9iajsKLQkJfSk7Ci0JCQotCQlUU3RyZWFtPEpzb25PYmplY3Q+IGFjaWRpdHlPYmogPSBhY2lkaXR5Lm1hcChhIC0+IHsKLQkJCUpzb25PYmplY3Qgak9iaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0JCQlqT2JqLmFkZFByb3BlcnR5KCJhY2lkaXR5IiwgYSk7Ci0JCQlyZXR1cm4gak9iajsKLQkJfSk7Ci0KLQkJVFN0cmVhbTxKc29uT2JqZWN0PiBlY29saU9iaiA9IGVjb2xpLm1hcChlIC0+IHsKLQkJCUpzb25PYmplY3Qgak9iaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0JCQlqT2JqLmFkZFByb3BlcnR5KCJlY29saSIsIGUpOwotCQkJcmV0dXJuIGpPYmo7Ci0JCX0pOwotCQkKLQkJVFN0cmVhbTxKc29uT2JqZWN0PiBsZWFkT2JqID0gbGVhZC5tYXAobCAtPiB7Ci0JCQlKc29uT2JqZWN0IGpPYmogPSBuZXcgSnNvbk9iamVjdCgpOwotCQkJak9iai5hZGRQcm9wZXJ0eSgibGVhZCIsIGwpOwotCQkJcmV0dXJuIGpPYmo7Ci0JCX0pOwotCi0JCVRTdHJlYW08SnNvbk9iamVjdD4gaWRPYmogPSBpZC5tYXAoaSAtPiB7Ci0JCQlKc29uT2JqZWN0IGpPYmogPSBuZXcgSnNvbk9iamVjdCgpOwotCQkJak9iai5hZGRQcm9wZXJ0eSgiaWQiLCBpKTsKLQkJCXJldHVybiBqT2JqOwotCQl9KTsKLQotCQkvLyBBcnJheUFzTGlzdAotCQlIYXNoU2V0PFRTdHJlYW08SnNvbk9iamVjdD4+IHNldCA9IG5ldyBIYXNoU2V0IDxUU3RyZWFtPEpzb25PYmplY3Q+PigpOwotCQlzZXQuYWRkKGFjaWRpdHlPYmopOwotCQlzZXQuYWRkKGFjaWRpdHlPYmopOwotCQlzZXQuYWRkKGVjb2xpT2JqKTsKLQkJc2V0LmFkZChsZWFkT2JqKTsKLQkJc2V0LmFkZChpZE9iaik7Ci0JCQotCQlUU3RyZWFtPEpzb25PYmplY3Q+IGFsbFJlYWRpbmdzID0gdGVtcE9iai51bmlvbihzZXQpOwotCi0JCXJldHVybiBhbGxSZWFkaW5nczsKLQl9Ci0JCi0JLyoqCi0JICogTG9vayB0aHJvdWdoIHRoZSBzdHJlYW0gYW5kIGNoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIG1lYXN1cmVtZW50cyBjYXVzZSBjb25jZXJuLgotCSAqIE9ubHkgYSBUU3RyZWFtIHRoYXQgaGFzIG9uZSBvciBtb3JlIG9mIHRoZSByZWFkaW5ncyBhdCAiYWxlcnQiIGxldmVsIGFyZSBwYXNzZWQgdGhyb3VnaAotCSAqIEBwYXJhbSByZWFkaW5nc0RldGVjdG9yIFRoZSBUU3RyZWFtJmx0O0pzb25PYmplY3QmZ3Q7IHRoYXQgcmVwcmVzZW50cyBhbGwgb2YgdGhlIGRpZmZlcmVudCBzZW5zb3IgcmVhZGluZ3MgZm9yIHRoZSB3ZWxsCi0JICogQHBhcmFtIHdlbGxJZCBUaGUgaWQgb2YgdGhlIHdlbGwKLQkgKiBAcGFyYW0gc2ltdWxhdGVOb3JtYWwgTWFrZSB0aGlzIHN0cmVhbSBzaW11bGF0ZSBhbGwgcmVhZGluZ3Mgd2l0aGluIHRoZSBub3JtYWwgcmFuZ2UsIGFuZCB0aGVyZWZvcmUgd2lsbCBub3QgcGFzcyB0aHJvdWdoIHRoZSBmaWx0ZXIKLQkgKiBAcmV0dXJuIFRTdHJlYW0mbHQ7SnNvbk9iamVjdCZndDsgdGhhdCBjb250YWluIHJlYWRpbmdzIHRoYXQgY291bGQgY2F1c2UgY29uY2Vybi4gIE5vdGU6IGlmIGFueSByZWFkaW5nIGlzIG91dCBvZiByYW5nZSB0aGUgdHVwbGUgCi0JICogd2lsbCBiZSByZXR1cm5lZAotCSAqLwotCQotCXB1YmxpYyBzdGF0aWMgVFN0cmVhbTxKc29uT2JqZWN0PiBhbGVydEZpbHRlcihUU3RyZWFtPEpzb25PYmplY3Q+IHJlYWRpbmdzRGV0ZWN0b3IsIGludCB3ZWxsSWQsIGJvb2xlYW4gc2ltdWxhdGVOb3JtYWwpIHsKLQkJcmVhZGluZ3NEZXRlY3RvciA9IHJlYWRpbmdzRGV0ZWN0b3IuZmlsdGVyKHIgLT4gewotCQkJaWYgKHNpbXVsYXRlTm9ybWFsID09IHRydWUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUpzb25FbGVtZW50IHRlbXBFbGVtZW50ID0gci5nZXQoInRlbXAiKTsKLQkJCWlmICh0ZW1wRWxlbWVudCAhPSBudWxsKSB7CQkJCi0JCQkJaW50IHRlbXAgPSB0ZW1wRWxlbWVudC5nZXRBc0ludCgpOwotCQkJCXJldHVybiAodGVtcCA8PSBURU1QX0FMRVJUX01JTiB8fCB0ZW1wID49IFRFTVBfQUxFUlRfTUFYKTsKLQkJCX0KLQkJCQotCQkJSnNvbkVsZW1lbnQgYWNpZEVsZW1lbnQgPSByLmdldCgiYWNpZGl0eSIpOwotCQkJaWYgKGFjaWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgYWNpZCA9IGFjaWRFbGVtZW50LmdldEFzSW50KCk7Ci0JCQkJcmV0dXJuICAoYWNpZCA8PSBBQ0lESVRZX0FMRVJUX01JTiB8fCBhY2lkID49IEFDSURJVFlfQUxFUlRfTUFYKTsKLQkJCX0KLQkJCQotCQkJSnNvbkVsZW1lbnQgZWNvbGlFbGVtZW50ID0gci5nZXQoImVjb2xpIik7Ci0JCQlpZiAoZWNvbGlFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgZWNvbGkgPSBlY29saUVsZW1lbnQuZ2V0QXNJbnQoKTsKLQkJCQlyZXR1cm4gZWNvbGkgPj0gRUNPTElfQUxFUlQ7Ci0JCQl9Ci0JCQkKLQkJCUpzb25FbGVtZW50IGxlYWRFbGVtZW50ID0gci5nZXQoImxlYWQiKTsKLQkJCWlmIChsZWFkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaW50IGxlYWQgPSBsZWFkRWxlbWVudC5nZXRBc0ludCgpOwotCQkJCXJldHVybiBsZWFkID49IExFQURfQUxFUlRfTUFYOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHJlYWRpbmdzRGV0ZWN0b3I7Ci0JfQotCS8qKgotCSAqIFNwbGl0cyB0aGUgaW5jb21pbmcgVFN0cmVhbSZsdDtKc29uT2JqZWN0Jmd0OyBpbnRvIGluZGl2aWR1YWwgVFN0cmVhbXMgYmFzZWQgb24gdGhlIHNlbnNvciB0eXBlCi0JICogQHBhcmFtIGFsZXJ0U3RyZWFtIFRoZSBUU3RyZWFtJmx0O0pzb25PYmplY3QmZ3Q7IHRoYXQgd2Uga25vdyBoYXMgc29tZSBvdXQgb2YgcmFuZ2UgY29uZGl0aW9uIC0gaXQgY291bGQgYmUgdGVtcCwgYWNpZGl0eSwgZWNvbGkgb3IgbGVhZCAKLQkgKiAtIG9yIGFsbCBvZiB0aGVtCi0JICogQHBhcmFtIHdlbGxJZCBUaGUgaWQgb2YgdGhlIHdlbGwgdGhhdCBoYXMgdGhlIG91dCBvZiByYW5nZSByZWFkaW5ncwotCSAqIEByZXR1cm4gTGlzdCZsdDtUU3RyZWFtJmx0O0pzb25PYmplY3QmZ3Q7Jmd0OyAtIG9uZSBmb3IgZWFjaCBzZW5zb3IuICAgCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFRTdHJlYW08SnNvbk9iamVjdD4+IHNwbGl0QWxlcnQoVFN0cmVhbTxKc29uT2JqZWN0PiBhbGVydFN0cmVhbSwgaW50IHdlbGxJZCkgewotCQkKLQkJTGlzdDxUU3RyZWFtPEpzb25PYmplY3Q+PiBhbGxTdHJlYW1zID0gYWxlcnRTdHJlYW0uc3BsaXQoNSwgdHVwbGUgLT4gewotICAgICAgICAgICAgaWYgKHR1cGxlLmdldCgidGVtcCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlKc29uT2JqZWN0IHRlbXBPYmogPSBuZXcgSnNvbk9iamVjdCgpOwotCQlpbnQgdGVtcCA9IHR1cGxlLmdldCgidGVtcCIpLmdldEFzSW50KCk7Ci0gICAgICAgICAgICAJaWYgKHRlbXAgPD0gVEVNUF9BTEVSVF9NSU4gfHwgdGVtcCA+PSBURU1QX0FMRVJUX01BWCkgewotICAgICAgICAgICAgCQl0ZW1wT2JqLmFkZFByb3BlcnR5KCJ0ZW1wIiwgdGVtcCk7Ci0gICAgICAgICAgICAJCXJldHVybiAwOwotICAgICAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgICAgICAJCXJldHVybiAtMTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR1cGxlLmdldCgiYWNpZGl0eSIpICE9IG51bGwpewotICAgICAgICAgICAgCUpzb25PYmplY3QgYWNpZE9iaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICAgIAlpbnQgYWNpZCA9IHR1cGxlLmdldCgiYWNpZGl0eSIpLmdldEFzSW50KCk7Ci0gICAgICAgICAgICAJaWYgKGFjaWQgPD0gQUNJRElUWV9BTEVSVF9NSU4gfHwgYWNpZCA+PSBBQ0lESVRZX0FMRVJUX01BWCkgewotICAgICAgICAgICAgCQlhY2lkT2JqLmFkZFByb3BlcnR5KCJhY2lkaXR5IiwgYWNpZCk7Ci0gICAgICAgICAgICAJCXJldHVybiAxOwotICAgICAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgICAgICAJCXJldHVybiAtMTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR1cGxlLmdldCgiZWNvbGkiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJSnNvbk9iamVjdCBlY29saU9iaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICAJaW50IGVjb2xpID0gdHVwbGUuZ2V0KCJlY29saSIpLmdldEFzSW50KCk7Ci0gICAgICAgICAgICAJaWYgKGVjb2xpID49IEVDT0xJX0FMRVJUKSB7Ci0gICAgICAgICAgICAJCWVjb2xpT2JqLmFkZFByb3BlcnR5KCJlY29saSIsIGVjb2xpKTsKLSAgICAgICAgICAgIAkJcmV0dXJuIDI7Ci0gICAgICAgICAgICAJfSBlbHNlIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIC0xOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHVwbGUuZ2V0KCJsZWFkIikgIT0gbnVsbCkgewotICAgICAgICAgICAgCUpzb25PYmplY3QgbGVhZE9iaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICAJaW50IGxlYWQgPSB0dXBsZS5nZXQoImxlYWQiKS5nZXRBc0ludCgpOwotICAgICAgICAgICAgCWlmIChsZWFkID49IExFQURfQUxFUlRfTUFYKSB7Ci0gICAgICAgICAgICAJCWxlYWRPYmouYWRkUHJvcGVydHkoImxlYWQiLCBsZWFkKTsKLSAgICAgICAgICAgIAkJcmV0dXJuIDM7Ci0gICAgICAgICAgICAJfSBlbHNlIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIC0xOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAJIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JCQotCQlyZXR1cm4gYWxsU3RyZWFtczsKLQl9Ci0JCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgb3V0cHV0IG9mIHRoZSBhbGVydCwgY29udGFpbmluZyB0aGUgd2VsbCBpZCwgc2Vuc29yIHR5cGUgYW5kIHZhbHVlIG9mIHRoZSBzZW5zb3IKLQkgKiBAcGFyYW0gYWxlcnRPYmogVGhlIHR1cGxlIHRoYXQgY29udGFpbnMgb3V0IG9mIHJhbmdlIHJlYWRpbmdzCi0JICogQHBhcmFtIHdlbGxJZCBUaGUgaWQgb2YgdGhlIHdlbGwKLQkgKiBAcGFyYW0gYWxlcnRUeXBlIFRoZSB0eXBlIG9mIHNlbnNvciB0aGF0IGhhcyB0aGUgcG9zc2libGUgYWxlcnQgb24gaXQKLQkgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSB3ZWxsSWQsIHNlbnNvciB0eXBlIGFuZCBzZW5zb3IgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRBbGVydE91dHB1dChKc29uT2JqZWN0IGFsZXJ0T2JqLCBTdHJpbmcgd2VsbElkLCBTdHJpbmcgYWxlcnRUeXBlKSB7Ci0JCXJldHVybiAiV2VsbCIgKyB3ZWxsSWQgKyAiIGFsZXJ0LCAiICsgYWxlcnRUeXBlICsgIiB2YWx1ZSBpcyAiICsgYWxlcnRPYmouZ2V0KGFsZXJ0VHlwZSkuZ2V0QXNJbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2NvbnNvbGUvSHR0cFNlcnZlclNhbXBsZS5qYXZhIGIvc2FtcGxlcy9jb25zb2xlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25zb2xlL0h0dHBTZXJ2ZXJTYW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4NWU1Ny4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2NvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2NvbnNvbGUvSHR0cFNlcnZlclNhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25zb2xlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2ZXIuSHR0cFNlcnZlcjsKLQotcHVibGljIGNsYXNzIEh0dHBTZXJ2ZXJTYW1wbGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgIHsKLQotICAgICAgICB0cnkgewotICAgICAgICBIdHRwU2VydmVyIHNlcnZlciA9IEh0dHBTZXJ2ZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgc2VydmVyLnN0YXJ0U2VydmVyKCk7Ci0gICAgICAgIFN0cmluZyBjb25zb2xlUGF0aCA9IHNlcnZlci5nZXRDb25zb2xlVXJsKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUG9pbnQgeW91ciBicm93c2VyIHRvIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbnNvbGVQYXRoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2NvbnNvbGUvcGFja2FnZS1pbmZvLmphdmEgYi9zYW1wbGVzL2NvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL2NvbnNvbGUvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZWFjODIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9jb25zb2xlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9jb25zb2xlL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8qKgotICogU2FtcGxlcyBzaG93aW5nIHVzZSBvZiB0aGUgQ29uc29sZSB3ZWIgYXBwbGljYXRpb24uCi0gKiBUaGUgZm9sbG93aW5nIHNpbXBsZSBzYW1wbGVzIGFyZSBwcm92aWRlZDoKLSAqIDx1bD4KLSAqIDxsaT5Db25zb2xlV2F0ZXJEZXRlY3Rvci5qYXZhIC0gYSBzaW1wbGUgYXBwbGljYXRpb24gdG9wb2xvZ3kgZGVtb25zdHJhdGluZyBmZWF0dXJlcyBvZiB0aGUgY29uc29sZSBsaWtlIHZpZXdpbmcgdGhlIHRvcG9sb2d5IGJ5Ci0gKiBTdHJlYW0gdGFncywgT3BsZXQga2luZCBhbmQgVHVwbGUgY291bnQuICBBIERldmVsb3BtZW50UHJvdmlkZXIgaXMgdXNlZCB3aGljaCBhdXRvbWF0aWNhbGx5IGFkZHMgYSBNZXRyaWNzIGNvdW50ZXIgdG8gdGhlIHRvcG9sb2d5LgotICogPC9saT4KLSAqIDxsaT5IdHRwU2VydmVyU2FtcGxlLmphdmEgLSBhIDxpPnZlcnk8L2k+IHNpbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGp1c3QgYnJpbmdzIHVwIHRoZSBFZGdlbnQgY29uc29sZSAtIHdpdGggbm8gam9icy48L2xpPgotICogPC91bD4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbnNvbGU7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zY2VuYXJpb3MvYnVpbGQuZ3JhZGxlIGIvc2FtcGxlcy9zY2VuYXJpb3MvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDViNDU5Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2NlbmFyaW9zL2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1zb3VyY2VTZXRzIHsKLSAgbWFpbiB7Ci0gICAgamF2YSB7Ci0gICAgICBpZiAoU3lzdGVtLmVudi5QSTRKX0xJQiA9PSBudWxsKSB7Ci0gICAgICAgIGV4Y2x1ZGUgIioqL3NjZW5hcmlvcy9pb3RwL3JhbmdlL3NlbnNvci8qKiIKLSAgICAgICAgbG9nZ2VyLmxpZmVjeWNsZSAnUEk0Sl9MSUIgZXYgbm90IHNldC4gT21pdHRpbmcgc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yLy4nCi0gICAgICB9IAotICAgIH0KLSAgfQotfQotCi1kZXBlbmRlbmNpZXMgewotICAvLyBOLkIuIGNvbW1vbiBkZXBlbmRlbmNpZXMgYXJlIHNldCBpbiByb290IGJ1aWxkLmdyYWRsZQotCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphbmFseXRpY3M6bWF0aDMnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpzYW1wbGVzOmNvbm5lY3RvcnMnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpwcm92aWRlcnM6aW90JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczppb3QnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpjb25uZWN0b3JzOmlvdHAnCi0gIAotICAvLyBOLkIuIHBpNEogaXMgc3RyaWN0bHkgTEdQTCBhbmQgaGVuY2UgaW5jb21wYXRpYmxlIHdpdGggQVNGIGxpY2Vuc2luZy4KLSAgLy8gVXNlcnMgd2lsbCBoYXZlIHRvIGRvd25sb2FkIGl0IHRoZW1zZWx2ZXMgYW5kIGJ1aWxkIHRoZSBzYW1wbGUuCi0gIC8vIGFkZFByb2plY3RFeHREZXBlbmRlbmN5ICdjb21waWxlJywgJ2NvbS5waTRqOnBpNGotY29yZToxLjAnCi0gIGlmIChTeXN0ZW0uZW52LlBJNEpfTElCICE9IG51bGwpIHsKLSAgICAvLyBhZGRQcm9qZWN0RXh0RGVwZW5kZW5jeSAnY29tcGlsZScsIGZpbGVzKCIkU3lzdGVtLmVudi5QSTRKX0xJQi9waTRqLWNvcmUuamFyIikKLSAgICBjb21waWxlIGZpbGVzKCIkU3lzdGVtLmVudi5QSTRKX0xJQi9waTRqLWNvcmUuamFyIikKLSAgfQotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvSW90cEZ1bGxTY2VuYXJpby5qYXZhIGIvc2FtcGxlcy9zY2VuYXJpb3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3NjZW5hcmlvcy9pb3RwL0lvdHBGdWxsU2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkMzdkOS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvSW90cEZ1bGxTY2VuYXJpby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuc2NlbmFyaW9zLmlvdHA7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90cC5Jb3RwRGV2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5pb3QuSW90UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmlvdHAuSW90cFNlbnNvcnM7Ci0KLS8qKgotICogU2FtcGxlIElvdFByb3ZpZGVyIHNjZW5hcmlvIHVzaW5nIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtLgotICogPEJSPgotICogSW90UHJvdmlkZXIgd2l0aCB0aHJlZSByZWdpc3RlcmVkIGFwcGxpY2F0aW9ucyB0aGF0Ci0gKiBhcmUgbm90IHN0YXJ0ZWQgYnV0IGNhbiBiZSBzdGFydGVkIGJ5IGEgYSByZW1vdGUKLSAqIGFwcGxpY2F0aW9uIHNlbmRpbmcgZGV2aWNlIGNvbW1hbmRzIHRocm91Z2gKLSAqIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtLgotICogPFA+Ci0gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHtAbGluayBJb3RwU2Vuc29yc30gYXBwbGljYXRpb24KLSAqIGJ1dCBleGVjdXRpbmcgYXMgdGhyZWUgc2VwYXJhdGUgYXBwbGljYXRpb25zIHVzaW5nCi0gKiB7QGxpbmsgSW90UHJvdmlkZXJ9IHJhdGhlciB0aGFuIHRoZSBsb3dlciBsZXZlbAotICoge0BsaW5rIG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kaXJlY3QuRGlyZWN0UHJvdmlkZXJ9LgotICogCi0gKiA8L1A+Ci0gKiAKLSAqIEBzZWUgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kubWJlYW5zLkFwcGxpY2F0aW9uU2VydmljZU1YQmVhbgotICogQHNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9L29yZy9hcGFjaGUvZWRnZW50L3RvcG9sb2d5L21iZWFucy9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kubWJlYW5zPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSW90cEZ1bGxTY2VuYXJpbyB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUnVuIHRoZSBJb3RwRnVsbFNjZW5hcmlvIGFwcGxpY2F0aW9uLgotICAgICAqIAotICAgICAqIFRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMgdGhlIHBhdGggdG8gdGhlCi0gICAgICogZGV2aWNlIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWluaW5nIHRoZSBjb25uZWN0aW9uCi0gICAgICogYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZ3MgTXVzdCBjb250YWluIHRoZSBwYXRoIHRvIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiBAc2VlIElvdHBEZXZpY2UjSW90cERldmljZShvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neSwgRmlsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGRldmljZUNmZyA9IGFyZ3NbMF07Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYW4gSW90UHJvdmlkZXIgdGhhdCB3aWxsIHVzZQotICAgICAgICAvLyBhbiBJb3RwRGV2aWNlIGFzIHRoZSBjb25uZWN0aXZpdHkgdG8KLSAgICAgICAgLy8gdGhlIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIG1lc3NhZ2UgaHViLgotICAgICAgICBJb3RQcm92aWRlciBwcm92aWRlciA9IG5ldyBJb3RQcm92aWRlcigKLSAgICAgICAgICAgICAgICB0b3BvbG9neSAtPiBuZXcgSW90cERldmljZSh0b3BvbG9neSwgbmV3IEZpbGUoZGV2aWNlQ2ZnKSkpOwotICAgICAgICAgICAgICAKLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhyZWUgYXBwbGljYXRpb25zCi0gICAgICAgIHJlZ2lzdGVySGVhcnRiZWF0KHByb3ZpZGVyKTsgICAgICAgCi0gICAgICAgIHJlZ2lzdGVyU2Vuc29ycyhwcm92aWRlcik7Ci0gICAgICAgIHJlZ2lzdGVyRGlzcGxheShwcm92aWRlcik7Ci0gICAgICAgIAotICAgICAgICAvLyBTdGFydCB0aGlzIHByb3ZpZGVyCi0gICAgICAgIC8vIHRoZSB0aHJlZSBhcHBsaWNhdGlvbnMgd2lsbCBub3Qgc3RhcnQKLSAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVySGVhcnRiZWF0KElvdFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgIHByb3ZpZGVyLnJlZ2lzdGVyVG9wb2xvZ3koIkhlYXJ0YmVhdCIsCi0gICAgICAgICAgICAgICAgKGlvdERldmljZSxjb25maWcpIC0+IElvdHBTZW5zb3JzLmhlYXJ0QmVhdChpb3REZXZpY2UsIHRydWUpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyU2Vuc29ycyhJb3RQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBwcm92aWRlci5yZWdpc3RlclRvcG9sb2d5KCJTZW5zb3JzIiwKLSAgICAgICAgICAgICAgICAoaW90RGV2aWNlLGNvbmZpZykgLT4gSW90cFNlbnNvcnMuc2ltdWxhdGVkU2Vuc29ycyhpb3REZXZpY2UsIHRydWUpKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRGlzcGxheShJb3RQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBwcm92aWRlci5yZWdpc3RlclRvcG9sb2d5KCJEaXNwbGF5IiwKLSAgICAgICAgICAgICAgICAoaW90RGV2aWNlLGNvbmZpZykgLT4gSW90cFNlbnNvcnMuZGlzcGxheU1lc3NhZ2VzKGlvdERldmljZSwgdHJ1ZSkpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2NlbmFyaW9zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9zY2VuYXJpb3MvaW90cC9yYW5nZS9zZW5zb3IvSW90cFJhbmdlU2Vuc29yLmphdmEgYi9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL0lvdHBSYW5nZVNlbnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzViZTMzLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2NlbmFyaW9zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9zY2VuYXJpb3MvaW90cC9yYW5nZS9zZW5zb3IvSW90cFJhbmdlU2Vuc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuc2NlbmFyaW9zLmlvdHAucmFuZ2Uuc2Vuc29yOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5zdGF0LlN0YXRpc3RpYy5NQVg7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5zdGF0LlN0YXRpc3RpYy5NRUFOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuc3RhdC5TdGF0aXN0aWMuTUlOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuc3RhdC5TdGF0aXN0aWMuU1REREVWOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuanNvbi5Kc29uQW5hbHl0aWNzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90LklvdERldmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmlvdC5Rb1M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5pb3RwLklvdHBEZXZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24uU3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFRvcG9sb2d5OwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFdpbmRvdzsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLWltcG9ydCBjb20ucGk0ai5pby5ncGlvLlBpbjsKLWltcG9ydCBjb20ucGk0ai5pby5ncGlvLlJhc3BpUGluOwotCi1wdWJsaWMgY2xhc3MgSW90cFJhbmdlU2Vuc29yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQaW4gZWNob1BpbiA9IFJhc3BpUGluLkdQSU9fMDU7IC8vIFBJNEogY3VzdG9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXJpbmcgKHBpbiAxOCBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUlBpMikKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQaW4gdHJpZ1BpbiA9IFJhc3BpUGluLkdQSU9fMDQ7IC8vIFBJNEogY3VzdG9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXJpbmcgKHBpbiAxNiBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUlBpMikKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQaW4gbGVkUGluID0gUmFzcGlQaW4uR1BJT18wMTsgLy8gUEk0SiBjdXN0b20gbnVtYmVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChwaW4gMTIgb24gUlBpMikKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9wZXIgVXNhZ2UgaXM6XG4gICAiICsgIiAgIGphdmEgcHJvZ3JhbSBkZXZpY2UuY2ZnIHNlbnNvcklzU2ltdWxhdGVkIExFRElzU2ltdWxhdGVkXG4iCi0gICAgICAgICAgICAgICAgICAgICsgIkV4YW1wbGU6IFxuIgotICAgICAgICAgICAgICAgICAgICArICIgICBqYXZhIC1jcCAkRURHRU5UL2J1aWxkL2Rpc3RyaWJ1dGlvbnMvamF2YTgvc2FtcGxlcy9saWIvZWRnZW50LnNhbXBsZXMuc2NlbmFyaW9zLmphciBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnNjZW5hcmlvcy5pb3RwLnJhbmdlLnNlbnNvci5Jb3RwUmFuZ2VTZW5zb3IgZGV2aWNlLmNmZyBmYWxzZSB0cnVlIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkZXZpY2VDZmcgPSBhcmdzWzBdOwotICAgICAgICBCb29sZWFuIHNpbXVsYXRlZFJhbmdlID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oYXJnc1sxXSk7Ci0gICAgICAgIEJvb2xlYW4gc2ltdWxhdGVkTEVEID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oYXJnc1syXSk7Ci0KLSAgICAgICAgRGlyZWN0UHJvdmlkZXIgdHAgPSBuZXcgRGlyZWN0UHJvdmlkZXIoKTsKLSAgICAgICAgRGlyZWN0VG9wb2xvZ3kgdG9wb2xvZ3kgPSB0cC5uZXdUb3BvbG9neSgiSW90cFJhbmdlU2Vuc29yIik7Ci0KLSAgICAgICAgSW90RGV2aWNlIGRldmljZSA9IGdldElvdERldmljZShkZXZpY2VDZmcsIHRvcG9sb2d5KTsKLQotICAgICAgICAvLyBIQy1TUjA0IFJhbmdlIHNlbnNvciBmb3IgdGhpcyBkZXZpY2UuCi0gICAgICAgIHJhbmdlU2Vuc29yKGRldmljZSwgc2ltdWxhdGVkUmFuZ2UsIHRydWUpOwotCi0gICAgICAgIC8vIEluIGFkZGl0aW9uIGNyZWF0ZSBhIGhlYXJ0IGJlYXQgZXZlbnQgdG8KLSAgICAgICAgLy8gZW5zdXJlIHRoZXJlIGlzIHNvbWUgaW1tZWRpYXRlIG91dHB1dCBhbmQKLSAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gdG8gSW9URiBoYXBwZW5zIGFzIHNvb24gYXMgcG9zc2libGUuCi0gICAgICAgIFRTdHJlYW08RGF0ZT4gaGIgPSB0b3BvbG9neS5wb2xsKCgpIC0+IG5ldyBEYXRlKCksIDEsIFRpbWVVbml0Lk1JTlVURVMpOwotCi0gICAgICAgIC8vIENvbnZlcnQgdG8gSlNPTgotICAgICAgICBUU3RyZWFtPEpzb25PYmplY3Q+IGhiaiA9IGhiLm1hcChkIC0+IHsKLSAgICAgICAgICAgIEpzb25PYmplY3QgaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJ3aGVuIiwgZC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoImhlYXJiZWF0IiwgZC5nZXRUaW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuIGo7Ci0gICAgICAgIH0pOwotICAgICAgICBoYmoucHJpbnQoKTsKLSAgICAgICAgZGV2aWNlLmV2ZW50cyhoYmosICJoZWFydGJlYXQiLCBRb1MuRklSRV9BTkRfRk9SR0VUKTsKLQotICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY29tbWFuZHMgb2YgaWQgImRpc3BsYXkiIGZvciB0aGlzCi0gICAgICAgIC8vIGRldmljZSBhbmQgcHJpbnQgdGhlbSB0byBzdGFuZGFyZCBvdXQKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IHN0YXR1c01zZ3MgPSBkaXNwbGF5TWVzc2FnZXMoZGV2aWNlKTsKLSAgICAgICAgc3RhdHVzTXNncy5wcmludCgpOwotCi0gICAgICAgIC8vIEZsYXNoIGFuIExFRCBmb3IgMXNlY29uZCB3aGVuIHdlIHJlY2VpdmUgY29tbWFuZHMgZnJvbSBJb1RGCi0gICAgICAgIGlmICghc2ltdWxhdGVkTEVEKSB7Ci0gICAgICAgICAgICBMRUQgbGVkID0gbmV3IExFRChsZWRQaW4pOwotICAgICAgICAgICAgc3RhdHVzTXNncy5zaW5rKGogLT4gbGVkLmZsYXNoKDEwMDApKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXR1c01zZ3Muc2luayhqIC0+IFN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKlNpbXVsYXRlZCBMRUQgRmxhc2ghKioqKioqKiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRwLnN1Ym1pdCh0b3BvbG9neSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIGFuIElvdERldmljZSBiYXNlZCBvbiB0aGUgZGV2aWNlIGNvbmZpZyBwYXJhbWV0ZXIuIElmIHRoZSB0eXBlIGlzCi0gICAgICogInF1aWNrc3RhcnQiIHRoZW4gd2UgYWxzbyBvdXRwdXQgdGhlIFVSTCB0byB2aWV3IHRoZSBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIElvdERldmljZSBnZXRJb3REZXZpY2UoU3RyaW5nIGRldmljZUNmZywgRGlyZWN0VG9wb2xvZ3kgdG9wb2xvZ3kpIHsKLSAgICAgICAgSW90RGV2aWNlIGRldmljZTsKLQotICAgICAgICBpZiAoZGV2aWNlQ2ZnLmVxdWFsc0lnbm9yZUNhc2UoInF1aWNrc3RhcnQiKSkgewotICAgICAgICAgICAgLy8gRGVjbGFyZSBhIGNvbm5lY3Rpb24gdG8gSW9URiBRdWlja3N0YXJ0IHNlcnZpY2UKLSAgICAgICAgICAgIFN0cmluZyBkZXZpY2VJZCA9ICJxcyIgKyBMb25nLnRvSGV4U3RyaW5nKG5ldyBSYW5kb20oKS5uZXh0TG9uZygpKTsKLSAgICAgICAgICAgIGRldmljZSA9IElvdHBEZXZpY2UucXVpY2tzdGFydCh0b3BvbG9neSwgZGV2aWNlSWQpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlF1aWNrc3RhcnQgZGV2aWNlIHR5cGU6IiArIElvdHBEZXZpY2UuUVVJQ0tTVEFSVF9ERVZJQ0VfVFlQRSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlF1aWNrc3RhcnQgZGV2aWNlIGlkICA6IiArIGRldmljZUlkKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaHR0cHM6Ly9xdWlja3N0YXJ0LmludGVybmV0b2Z0aGluZ3MuaWJtY2xvdWQuY29tLyMvZGV2aWNlLyIgKyBkZXZpY2VJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBEZWNsYXJlIGEgY29ubmVjdGlvbiB0byBJb1RGCi0gICAgICAgICAgICBkZXZpY2UgPSBuZXcgSW90cERldmljZSh0b3BvbG9neSwgbmV3IEZpbGUoZGV2aWNlQ2ZnKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGV2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbm5lY3QgdG8gYW4gSEMtU1IwNCBSYW5nZSBTZW5zb3IKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGV2aWNlCi0gICAgICogICAgICAgICAgICBJb1RGIGRldmljZQotICAgICAqIEBwYXJhbSBwcmludAotICAgICAqICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgZGF0YSBzdWJtaXR0ZWQgYXMgZXZlbnRzIHNob3VsZCBhbHNvIGJlIHByaW50ZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHN0YW5kYXJkIG91dC4KLSAgICAgKiBAcGFyYW0gc2ltdWxhdGVkCi0gICAgICogICAgICAgICAgICBib29sZWFuIGZsYWcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmFuZ2VTZW5zb3IoSW90RGV2aWNlIGRldmljZSwgYm9vbGVhbiBzaW11bGF0ZWQsIGJvb2xlYW4gcHJpbnQpIHsKLQotICAgICAgICBTdXBwbGllcjxEb3VibGU+IHNlbnNvcjsKLQotICAgICAgICBpZiAoc2ltdWxhdGVkKSB7Ci0gICAgICAgICAgICBzZW5zb3IgPSBuZXcgU2ltdWxhdGVkUmFuZ2VTZW5zb3IoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlbnNvciA9IG5ldyBSYW5nZVNlbnNvcihlY2hvUGluLCB0cmlnUGluKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRTdHJlYW08RG91YmxlPiBkaXN0YW5jZVJlYWRpbmdzID0gZGV2aWNlLnRvcG9sb2d5KCkucG9sbChzZW5zb3IsIDEsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICBkaXN0YW5jZVJlYWRpbmdzLnByaW50KCk7Ci0KLSAgICAgICAgLy8gZmlsdGVyIG91dCBiYWQgcmVhZGluZ3MgdGhhdCBhcmUgb3V0IG9mIHRoZSBzZW5zb3IncyA0bSByYW5nZQotICAgICAgICBkaXN0YW5jZVJlYWRpbmdzID0gZGlzdGFuY2VSZWFkaW5ncy5maWx0ZXIoaiAtPiBqIDwgNDAwLjApOwotCi0gICAgICAgIFRTdHJlYW08SnNvbk9iamVjdD4gc2Vuc29ySlNPTiA9IGRpc3RhbmNlUmVhZGluZ3MubWFwKHYgLT4gewotICAgICAgICAgICAgSnNvbk9iamVjdCBqID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoIm5hbWUiLCAicmFuZ2VTZW5zb3IiKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoInJlYWRpbmciLCB2KTsKLSAgICAgICAgICAgIHJldHVybiBqOwotICAgICAgICB9KTsKLQotICAgICAgICAvLyBDcmVhdGUgYSB3aW5kb3cgb24gdGhlIHN0cmVhbSBvZiB0aGUgbGFzdCAxMCByZWFkaW5ncyBwYXJ0aXRpb25lZAotICAgICAgICAvLyBieSBzZW5zb3IgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIG9ubHkgaGF2ZSBvbmUgcmFuZ2Ugc2Vuc29yIHNvIHRoZXJlCi0gICAgICAgIC8vIHdpbGwgYmUgb25lIHBhcnRpdGlvbi4KLSAgICAgICAgVFdpbmRvdzxKc29uT2JqZWN0LCBKc29uRWxlbWVudD4gc2Vuc29yV2luZG93ID0gc2Vuc29ySlNPTi5sYXN0KDEwLCBqIC0+IGouZ2V0KCJuYW1lIikpOwotCi0gICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgd2luZG93cyBjYWxjdWxhdGluZyB0aGUgbWluLCBtYXgsIG1lYW4gYW5kIHN0YW5kYXJkCi0gICAgICAgIC8vIGRldmlhdGlvbgotICAgICAgICAvLyBhY3Jvc3MgZWFjaCB3aW5kb3cgaW5kZXBlbmRlbnRseS4KLSAgICAgICAgc2Vuc29ySlNPTiA9IEpzb25BbmFseXRpY3MuYWdncmVnYXRlKHNlbnNvcldpbmRvdywgIm5hbWUiLCAicmVhZGluZyIsIE1JTiwgTUFYLCBNRUFOLCBTVERERVYpOwotCi0gICAgICAgIC8vIEZpbHRlciBzbyB0aGF0IG9ubHkgd2hlbiB0aGUgbWVhbiBzZW5zb3IgcmVhZGluZyBpcyB0aGF0IGFuIG9iamVjdCBpcwotICAgICAgICAvLyBjbG9zZXIgdGhhbiAzMGNtIHNlbmQgZGF0YS4KLSAgICAgICAgc2Vuc29ySlNPTiA9IHNlbnNvckpTT04KLSAgICAgICAgICAgICAgICAuZmlsdGVyKGogLT4gTWF0aC5hYnMoai5nZXQoInJlYWRpbmciKS5nZXRBc0pzb25PYmplY3QoKS5nZXQoIk1FQU4iKS5nZXRBc0RvdWJsZSgpKSA8IDMwLjApOwotCi0gICAgICAgIGlmIChwcmludCkKLSAgICAgICAgICAgIHNlbnNvckpTT04ucHJpbnQoKTsKLQotICAgICAgICAvLyBTZW5kIHRoZSBkZXZpY2Ugc3RyZWFtcyBhcyBJb1RGIGRldmljZSBldmVudHMKLSAgICAgICAgLy8gd2l0aCBldmVudCBpZGVudGlmaWVyICJzZW5zb3JzIi4KLSAgICAgICAgZGV2aWNlLmV2ZW50cyhzZW5zb3JKU09OLCAic2Vuc29ycyIsIFFvUy5GSVJFX0FORF9GT1JHRVQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YnNjcmliZSB0byBJb1RGIGRldmljZSBjb21tYW5kcyB3aXRoIGlkZW50aWZpZXIge0Bjb2RlIGRpc3BsYXl9LgotICAgICAqIFN1YnNjcmliaW5nIHRvIGRldmljZSBjb21tYW5kcyByZXR1cm5zIGEgc3RyZWFtIG9mIEpTT04gb2JqZWN0cyB0aGF0Ci0gICAgICogaW5jbHVkZSBhIHRpbWVzdGFtcCAoe0Bjb2RlIHRzbXN9KSwgY29tbWFuZCBpZGVudGlmaWVyICh7QGNvZGUgY29tbWFuZH0pCi0gICAgICogYW5kIHBheWxvYWQgKHtAY29kZSBwYXlsb2FkfSkuIFBheWxvYWQgaXMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljCi0gICAgICogcG9ydGlvbiBvZiB0aGUgY29tbWFuZC4gPEJSPgotICAgICAqIEluIHRoaXMgY2FzZSB0aGUgcGF5bG9hZCBpcyBleHBlY3RlZCB0byBiZSBhIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgYQotICAgICAqIHtAY29kZSBtc2d9IGtleSB3aXRoIGEgc3RyaW5nIGRpc3BsYXkgbWVzc2FnZS4gPEJSPgotICAgICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gY29uc2lzdHMgb2YgdGhlIGRpc3BsYXkgbWVzc2FnZSBzdHJpbmcgZXh0cmFjdGVkIGZyb20KLSAgICAgKiB0aGUgSlNPTiBwYXlsb2FkLgotICAgICAqIDxQPgotICAgICAqIE5vdGUgdG8gcmVjZWl2ZSBjb21tYW5kcyBhIGFuYWx5dGljIGFwcGxpY2F0aW9uIG11c3QgZXhpc3QgdGhhdCBnZW5lcmF0ZXMKLSAgICAgKiB0aGVtIHRocm91Z2ggSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0uCi0gICAgICogPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSBJb1RGIGRldmljZQotICAgICAqIEByZXR1cm4gSlNPTiBvYmplY3QgaW5jbHVkZXMgdHNtcyh0aW1lc3RhbXApIGFuZCBwYXlsb2FkLm1zZyhzdGF0dXMpCi0gICAgICoKLSAgICAgKiBAc2VlIElvdERldmljZSNjb21tYW5kcyhTdHJpbmcuLi4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUU3RyZWFtPFN0cmluZz4gZGlzcGxheU1lc3NhZ2VzKElvdERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGNvbW1hbmRzIG9mIGlkICJzdGF0dXMiIGZvciB0aGlzIGRldmljZQotICAgICAgICBUU3RyZWFtPEpzb25PYmplY3Q+IHN0YXR1c01zZ3MgPSBkZXZpY2UuY29tbWFuZHMoImRpc3BsYXkiKTsKLQotICAgICAgICAvLyBUaGUgcmV0dXJuZWQgSlNPTiBvYmplY3QgaW5jbHVkZXMgc2V2ZXJhbCBmaWVsZHMKLSAgICAgICAgLy8gdHNtcyAtIFRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgKHRoaXMgaXMgZ2VuZXJpYyB0byBhIGNvbW1hbmQpCi0gICAgICAgIC8vIHBheWxvYWQubXNnIC0gU3RhdHVzIG1lc3NhZ2UgKHRoaXMgaXMgc3BlY2lmaWMgdG8gdGhpcyBhcHBsaWNhdGlvbikKLQotICAgICAgICAvLyBNYXAgdG8gYSBTdHJpbmcgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKLSAgICAgICAgcmV0dXJuIHN0YXR1c01zZ3MubWFwKGogLT4gai5nZXRBc0pzb25PYmplY3QoInBheWxvYWQiKS5nZXRBc0pzb25QcmltaXRpdmUoIm1zZyIpLmdldEFzU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc2NlbmFyaW9zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9zY2VuYXJpb3MvaW90cC9yYW5nZS9zZW5zb3IvTEVELmphdmEgYi9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL0xFRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDUwN2Q5Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvc2NlbmFyaW9zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy9zY2VuYXJpb3MvaW90cC9yYW5nZS9zZW5zb3IvTEVELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5zY2VuYXJpb3MuaW90cC5yYW5nZS5zZW5zb3I7Ci0KLWltcG9ydCBjb20ucGk0ai5pby5ncGlvLkdwaW9Db250cm9sbGVyOwotaW1wb3J0IGNvbS5waTRqLmlvLmdwaW8uR3Bpb0ZhY3Rvcnk7Ci1pbXBvcnQgY29tLnBpNGouaW8uZ3Bpby5HcGlvUGluRGlnaXRhbE91dHB1dDsKLWltcG9ydCBjb20ucGk0ai5pby5ncGlvLlBpbjsKLWltcG9ydCBjb20ucGk0ai5pby5ncGlvLlBpblN0YXRlOwotCi1wdWJsaWMgY2xhc3MgTEVEIHsKLSAgICBwcml2YXRlIGZpbmFsIEdwaW9Db250cm9sbGVyIGdwaW8gPSBHcGlvRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgR3Bpb1BpbkRpZ2l0YWxPdXRwdXQgcGluOwotCi0gICAgcHVibGljIExFRChQaW4gcGluKSB7Ci0gICAgICAgIHRoaXMucGluID0gZ3Bpby5wcm92aXNpb25EaWdpdGFsT3V0cHV0UGluKHBpbiwgIkxFRCIsIFBpblN0YXRlLkhJR0gpOwotICAgICAgICB0aGlzLnBpbi5zZXRTaHV0ZG93bk9wdGlvbnModHJ1ZSwgUGluU3RhdGUuTE9XKTsKLSAgICAgICAgdGhpcy5waW4ubG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb24oKSB7Ci0gICAgICAgIHRoaXMucGluLmhpZ2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvZmYoKSB7Ci0gICAgICAgIHRoaXMucGluLmxvdygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRvZ2dsZSgpIHsKLSAgICAgICAgdGhpcy5waW4udG9nZ2xlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmxhc2gobG9uZyBtcykgewotICAgICAgICB0aGlzLnBpbi5wdWxzZShtcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zY2VuYXJpb3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3NjZW5hcmlvcy9pb3RwL3JhbmdlL3NlbnNvci9SRUFETUUubWQgYi9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL1JFQURNRS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyM2NjNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgZWRnZW50LklvVEZSYW5nZVNlbnNvcgotCi1TZWUgdGhlIFJlY2lwZSB0aGlzIHdhcyBjcmVhdGVkIGZvciBbaGVyZV0oaHR0cHM6Ly9kZXZlbG9wZXIuaWJtLmNvbS9yZWNpcGVzL3R1dG9yaWFscy9hcGFjaGUtcXVhcmtzLW9uLXBpLXRvLXdhdHNvbi1pb3QtZm91bmRhdGlvbi8pLiAgSWYgdGhhdCBsaW5rIGRvZXNuJ3Qgd29yaywgdHJ5IFtoZXJlXShodHRwczovL2RldmVsb3Blci5pYm0uY29tL3JlY2lwZXMvdHV0b3JpYWxzL2FwYWNoZS1lZGdlbnQtb24tcGktdG8td2F0c29uLWlvdC1mb3VuZGF0aW9uLykuIAotCi0jIyBSZXF1aXJlbWVudHM6IAotKiBZb3UgbXVzdCBoYXZlIFBpNEogaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UgKGlmIHlvdSBhcmUgcnVubmluZyBvdXRzaWRlIG9mIGEgUmFzcGJlcnJ5IFBpLCB5b3Ugd2lsbCBoYXZlIHRvIGRvd25sb2FkIHRoZSBKQVJzIGFuZCBpbmNsdWRlIHRoZW0gaW4geW91ciBjbGFzc3BhdGgpCi0qIFlvdSBtdXN0IGhhdmUgRWRnZW50IGRvd25sb2FkZWQgYW5kIGJ1aWx0Ci0qIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBhbiBIQy1TUjA0IFJhbmdlIHNlbnNvciBob29rZWQgdXAgd2l0aCB5b3VyIEVjaG9QaW4gc2V0IHRvIHBpbiAxOCBhbmQgeW91ciBUcmlwUGluIGF0IHBpbiAxNiAoc2VlIHRoZXNlIGluc3RydWN0aW9ucyBvbiBoYXJkd2FyZSBzZXR1cDogaHR0cDovL3d3dy5tb2RteXBpLmNvbS9ibG9nL2hjLXNyMDQtdWx0cmFzb25pYy1yYW5nZS1zZW5zb3Itb24tdGhlLXJhc3BiZXJyeS1waSkuIFRvIHVzZSBhIHNpbXVsYXRlZCBzZW5zb3IsIHBhc3MgaW4gdHJ1ZSBhcyB5b3VyIHNlY29uZCBhcmd1bWVudC4gCi0qIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBhbiBMRUQgaG9va2VkIHVwIHRvIHBpbiAxMiAoU2VlIHRoZXNlIGluc3RydWN0aW9ucyB0byBzZXQgdXAgYW4gTEVELCBob3dldmVyIHVzZSBwaW4gMTIgYXMgeW91ciBjb250cm9sIHBpbjogaHR0cHM6Ly9wcm9qZWN0cy5kcm9nb24ubmV0L3Jhc3BiZXJyeS1waS9ncGlvLWV4YW1wbGVzL3R1eC1jcm9zc2luZy9ncGlvLWV4YW1wbGVzLTEtYS1zaW5nbGUtbGVkLykuIFRvIHVzZSBhIHNpbXVsYXRlZCBMRUQsIHBhc3MgaW4gdHJ1ZSBhcyB5b3VyIHRoaXJkIGFyZ3VtZW50LiAKLSogWW91IHdpbGwgbmVlZCB0byBoYXZlIHlvdXIgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBXYXRzb24gSW9URiBhbmQgYSBkZXZpY2UuY2ZnIGZpbGUsIG9yIHlvdSBjYW4gdXNlIGEgcXVpY2tzdGFydCB2ZXJzaW9uIGJ5IHBhc3NpbmcgaW4gInF1aWNrc3RhcnQiIGFzIHlvdXIgZmlyc3QgYXJndW1lbnQuCi0gCi1UbyBjb21waWxlLCBleHBvcnQgeW91ciBFZGdlbnQgaW5zdGFsbCBhbmQgUEk0SiBsaWJyYXJpZXMgKG9uIFJhc3BiZXJyeSBQaSwgdGhlIGRlZmF1bHQgUGk0SiBsb2NhdGlvbiBpcyBgL29wdC9waTRqL2xpYmApOgotCi1gJCBFREdFTlQ9PGVkZ2VudC1yb290LWRpcj5gCi0KLWAkIGV4cG9ydCBQSTRKX0xJQj08UGk0Si1saWJzPiAgIyBkaXJlY3Rvcnkgd2hlcmUgcGk0ai1jb3JlLmphciByZXNpZGVzYAotCi1gJCBjZCAkRURHRU5UYAotCi1gJCAuL2dyYWRsZXcgICMgYnVpbGRzIHRoZSByYW5nZSBzZW5zb3Igc2FtcGxlIG9ubHkgaWYgdGhlIFBJNEpfTElCIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldGAKLQotVG8gcnVuOiAKLSAKLWAkIENQPSRFREdFTlQvYnVpbGQvZGlzdHJpYnV0aW9ucy9qYXZhOC9zYW1wbGVzL2xpYi9lZGdlbnQuc2FtcGxlcy5zY2VuYXJpb3MuamFyYAotCi1gJCBNQUlOPW9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuc2NlbmFyaW9zLmlvdHAucmFuZ2Uuc2Vuc29yLklvdHBSYW5nZVNlbnNvcmAKLQotCi1gJCBqYXZhIC1jcCAkQ1AgJE1BSU4gPGRldmljZSBjZmcgZmlsZT4gPHNpbXVsYXRlZFNlbnNvcj8+IDxzaW11bGF0ZWRMRUQ/PmAKLQotVG8gcnVuIHdpdGggYSBkZXZpY2UuY2ZnIGZpbGUsIHJhbmdlIHNlbnNvciwgYW5kIExFRDoKLQotYCQgamF2YSAtY3AgJENQICRNQUlOIGRldmljZS5jZmcgZmFsc2UgZmFsc2VgCi0KLVRvIHJ1biBpbiBmdWxseSBzaW11bGF0ZWQgbW9kZSAobm8gc2Vuc29ycyBhbmQgdXNpbmcgSW9URiBxdWlja3N0YXJ0KTogCi0KLWAkIGphdmEgLWNwICRDUCAkTUFJTiBxdWlja3N0YXJ0IHRydWUgdHJ1ZWAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL1JhbmdlU2Vuc29yLmphdmEgYi9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL1JhbmdlU2Vuc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzQ5YmMuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zY2VuYXJpb3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3NjZW5hcmlvcy9pb3RwL3JhbmdlL3NlbnNvci9SYW5nZVNlbnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnNjZW5hcmlvcy5pb3RwLnJhbmdlLnNlbnNvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLlN1cHBsaWVyOwotCi1pbXBvcnQgY29tLnBpNGouaW8uZ3Bpby5HcGlvQ29udHJvbGxlcjsKLWltcG9ydCBjb20ucGk0ai5pby5ncGlvLkdwaW9GYWN0b3J5OwotaW1wb3J0IGNvbS5waTRqLmlvLmdwaW8uR3Bpb1BpbkRpZ2l0YWxJbnB1dDsKLWltcG9ydCBjb20ucGk0ai5pby5ncGlvLkdwaW9QaW5EaWdpdGFsT3V0cHV0OwotaW1wb3J0IGNvbS5waTRqLmlvLmdwaW8uUGluOwotCi1wdWJsaWMgY2xhc3MgUmFuZ2VTZW5zb3IgaW1wbGVtZW50cyBTdXBwbGllcjxEb3VibGU+IHsKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBEb3VibGUgU1BFRURfT0ZfU09VTkQgPSAzNDAuMjk7IC8vIHNwZWVkIG9mIHNvdW5kCi0gICAgcHJpdmF0ZSBmaW5hbCBHcGlvUGluRGlnaXRhbElucHV0IGVjaG9QaW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBHcGlvUGluRGlnaXRhbE91dHB1dCB0cmlnUGluOwotICAgIHByaXZhdGUgZmluYWwgaW50IE1BWF9DWUNMRVMgPSAzMDAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgR3Bpb0NvbnRyb2xsZXIgZ3BpbyA9IEdwaW9GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0KLSAgICBwdWJsaWMgUmFuZ2VTZW5zb3IoUGluIGVjaG9QaW4sIFBpbiB0cmlnUGluKSB7Ci0gICAgICAgIHRoaXMuZWNob1BpbiA9IGdwaW8ucHJvdmlzaW9uRGlnaXRhbElucHV0UGluKGVjaG9QaW4pOwotICAgICAgICB0aGlzLnRyaWdQaW4gPSBncGlvLnByb3Zpc2lvbkRpZ2l0YWxPdXRwdXRQaW4odHJpZ1Bpbik7Ci0gICAgICAgIHRoaXMudHJpZ1Bpbi5sb3coKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdldCB0aGUgZGlzdGFuY2UgaW4gY20uIERpc3RhbmNlIGlzICh0aW1lT2ZTaWduYWwgKiBTcGVlZE9mU291bmQpIC8gMgotICAgICAqIChkaXZpZGUgYnkgMTAwMDAgaXMgZm9yIHVuaXRzKQotICAgICAqLwotICAgIHB1YmxpYyBEb3VibGUgZ2V0RGlzdGFuY2UoKSB7Ci0gICAgICAgIHRyaWdnZXJTZW5zb3IoKTsKLQotICAgICAgICBsb25nIHJlYm91bmRUaW1lTWljcm9TZWNvbmRzID0gZ2V0U2lnbmFsRHVyYXRpb24oKTsKLSAgICAgICAgRG91YmxlIGRpc3RhbmNlID0gcmVib3VuZFRpbWVNaWNyb1NlY29uZHMgKiBTUEVFRF9PRl9TT1VORCAvICgyICogMTAwMDApOyAvLyBnaXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbQotICAgICAgICByZXR1cm4gZGlzdGFuY2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTZW5kIHNpZ25hbCBmb3IgMTAgbWljcm9zZWNvbmRzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRyaWdnZXJTZW5zb3IoKSB7Ci0gICAgICAgIHRoaXMudHJpZ1Bpbi5oaWdoKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMCwgMTAwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudHJpZ1Bpbi5sb3coKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1lYXN1cmUgc2lnbmFsIGR1cmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIGdldFNpZ25hbER1cmF0aW9uKCkgewotICAgICAgICBpbnQgY3ljbGVzID0gMDsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwotCi0gICAgICAgIHdoaWxlICh0aGlzLmVjaG9QaW4uaXNMb3coKSAmJiBjeWNsZXMgPCBNQVhfQ1lDTEVTKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGl0ZXJhdGUgdGhyb3VnaCBNQVhfQ1lDTEVTIHRpbWVzIGJlZm9yZSBnaXZpbmcgdXAKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgICAgICAgICBjeWNsZXMrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGN5Y2xlcyA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKHRoaXMuZWNob1Bpbi5pc0hpZ2goKSAmJiBjeWNsZXMgPCBNQVhfQ1lDTEVTKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGl0ZXJhdGUgdGhyb3VnaCBNQVhfQ1lDTEVTIHRpbWVzIGJlZm9yZSBnaXZpbmcgdXAKLSAgICAgICAgICAgIGN5Y2xlcysrOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgICAgIGxvbmcgbWljcm9TZWNvbmRzID0gKGxvbmcpIE1hdGguY2VpbCgoZW5kIC0gc3RhcnQpIC8gMTAwMC4wKTsKLSAgICAgICAgcmV0dXJuIG1pY3JvU2Vjb25kczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRG91YmxlIGdldCgpIHsKLSAgICAgICAgcmV0dXJuIGdldERpc3RhbmNlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL1NpbXVsYXRlZFJhbmdlU2Vuc29yLmphdmEgYi9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL1NpbXVsYXRlZFJhbmdlU2Vuc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjhmMjIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zY2VuYXJpb3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3NjZW5hcmlvcy9pb3RwL3JhbmdlL3NlbnNvci9TaW11bGF0ZWRSYW5nZVNlbnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuc2NlbmFyaW9zLmlvdHAucmFuZ2Uuc2Vuc29yOwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLlN1cHBsaWVyOwotCi1wdWJsaWMgY2xhc3MgU2ltdWxhdGVkUmFuZ2VTZW5zb3IgaW1wbGVtZW50cyBTdXBwbGllcjxEb3VibGU+IHsKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBSYW5kb20gcmFuZDsKLQotICAgIHB1YmxpYyBTaW11bGF0ZWRSYW5nZVNlbnNvcigpIHsKLSAgICAgICAgcmFuZCA9IG5ldyBSYW5kb20oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRG91YmxlIGdldCgpIHsKLSAgICAgICAgRG91YmxlIGRpc3RhbmNlID0gMjAgKyByYW5kLm5leHREb3VibGUoKSAqIDIwOwotICAgICAgICByZXR1cm4gZGlzdGFuY2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL2RldmljZS5jZmcgYi9zYW1wbGVzL3NjZW5hcmlvcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvc2NlbmFyaW9zL2lvdHAvcmFuZ2Uvc2Vuc29yL2RldmljZS5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWJkNmEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9zY2VuYXJpb3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3NjZW5hcmlvcy9pb3RwL3JhbmdlL3NlbnNvci9kZXZpY2UuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1vcmcgPSA8b3JnLW5hbWU+Ci10eXBlID0gPGRldmljZS10eXBlPgotaWQgPSA8ZGV2aWNlLWlkPgotYXV0aC1tZXRob2QgPSB0b2tlbgotYXV0aC10b2tlbiA9IDxhdXRoLXRva2VuPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9idWlsZC5ncmFkbGUgYi9zYW1wbGVzL3RvcG9sb2d5L2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4YTJiNi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RvcG9sb2d5L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1kZXBlbmRlbmNpZXMgewotICAvLyBOLkIuIGNvbW1vbiBkZXBlbmRlbmNpZXMgYXJlIHNldCBpbiByb290IGJ1aWxkLmdyYWRsZQotCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphbmFseXRpY3M6bWF0aDMnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpydW50aW1lOmpvYnJlZ2lzdHJ5JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6c2FtcGxlczp1dGlscycKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvQ29tYmluaW5nU3RyZWFtc1Byb2Nlc3NpbmdSZXN1bHRzLmphdmEgYi9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9Db21iaW5pbmdTdHJlYW1zUHJvY2Vzc2luZ1Jlc3VsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2ZTVkNC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9Db21iaW5pbmdTdHJlYW1zUHJvY2Vzc2luZ1Jlc3VsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy50b3BvbG9neTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRldmVsb3BtZW50LkRldmVsb3BtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnV0aWxzLnNlbnNvci5IZWFydE1vbml0b3JTZW5zb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLQotLyoqCi0gKiBBcHBseWluZyBkaWZmZXJlbnQgcHJvY2Vzc2luZyBhZ2FpbnN0IGEgc2V0IG9mIHN0cmVhbXMgYW5kIGNvbWJpbmluZyB0aGUKLSAqIHJlc3VsdGluZyBzdHJlYW1zIGludG8gYSBzaW5nbGUgc3RyZWFtLgotICoKLSAqICBAc2VlIEhlYXJ0TW9uaXRvclNlbnNvcgotICovCi1wdWJsaWMgY2xhc3MgQ29tYmluaW5nU3RyZWFtc1Byb2Nlc3NpbmdSZXN1bHRzIHsKLSAgICAvKioKLSAgICAgKiBQb2xscyBhIHNpbXVsYXRlZCBoZWFydCBtb25pdG9yIHRvIHBlcmlvZGljYWxseSBvYnRhaW4gYmxvb2QgcHJlc3N1cmUgcmVhZGluZ3MuCi0gICAgICogU3BsaXRzIHRoZSByZWFkaW5ncyBieSBibG9vZCBwcmVzc3VyZSBjYXRlZ29yeSBpbnRvIHNlcGFyYXRlIHN0cmVhbXMuCi0gICAgICogQXBwbGllcyBkaWZmZXJlbnQgcHJvY2Vzc2luZyBvbiBlYWNoIHN0cmVhbSB0byBnZW5lcmF0ZSBhbGVydCBzdHJlYW1zLgotICAgICAqIENvbWJpbmVzIHRoZSBhbGVydCBzdHJlYW1zIGludG8gYSBzaW5nbGUgc3RyZWFtIGFuZCBwcmludHMgdGhlIGFsZXJ0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgYXJndW1lbnRzCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBIZWFydE1vbml0b3JTZW5zb3IgbW9uaXRvciA9IG5ldyBIZWFydE1vbml0b3JTZW5zb3IoKTsKLQotICAgICAgICBEaXJlY3RQcm92aWRlciBkcCA9IG5ldyBEZXZlbG9wbWVudFByb3ZpZGVyKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRwLmdldFNlcnZpY2VzKCkuZ2V0U2VydmljZShIdHRwU2VydmVyLmNsYXNzKS5nZXRDb25zb2xlVXJsKCkpOwotCi0gICAgICAgIFRvcG9sb2d5IHRvcCA9IGRwLm5ld1RvcG9sb2d5KCJoZWFydE1vbml0b3IiKTsKLQotICAgICAgICAvLyBHZW5lcmF0ZSBhIHN0cmVhbSBvZiBoZWFydCBtb25pdG9yIHJlYWRpbmdzCi0gICAgICAgIFRTdHJlYW08TWFwPFN0cmluZywgSW50ZWdlcj4+IHJlYWRpbmdzID0gdG9wCi0gICAgICAgICAgICAgICAgLnBvbGwobW9uaXRvciwgMSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKQotICAgICAgICAgICAgICAgIC5maWx0ZXIodHVwbGUgLT4gdHVwbGUuZ2V0KCJTeXN0b2xpYyIpID4gNTAgJiYgdHVwbGUuZ2V0KCJEaWFzdG9saWMiKSA+IDMwKQotICAgICAgICAgICAgICAgIC5maWx0ZXIodHVwbGUgLT4gdHVwbGUuZ2V0KCJTeXN0b2xpYyIpIDwgMjAwICYmIHR1cGxlLmdldCgiRGlhc3RvbGljIikgPCAxMzApOwotCi0gICAgICAgIC8vIFNwbGl0IHRoZSBzdHJlYW0gYnkgYmxvb2QgcHJlc3N1cmUgY2F0ZWdvcnkKLSAgICAgICAgTGlzdDxUU3RyZWFtPE1hcDxTdHJpbmcsIEludGVnZXI+Pj4gY2F0ZWdvcmllcyA9IHJlYWRpbmdzLnNwbGl0KDYsIHR1cGxlIC0+IHsKLSAgICAgICAgICAgIGludCBzID0gdHVwbGUuZ2V0KCJTeXN0b2xpYyIpOwotICAgICAgICAgICAgaW50IGQgPSB0dXBsZS5nZXQoIkRpYXN0b2xpYyIpOwotICAgICAgICAgICAgaWYgKHMgPCAxMjAgJiYgZCA8IDgwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm9ybWFsCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChzID49IDEyMCAmJiBzIDw9IDEzOSkgfHwgKGQgPj0gODAgJiYgZCA8PSA4OSkpIHsKLSAgICAgICAgICAgICAgICAvLyBQcmVoeXBlcnRlbnNpb24KLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHMgPj0gMTQwICYmIHMgPD0gMTU5KSB8fCAoZCA+PSA5MCAmJiBkIDw9IDk5KSkgewotICAgICAgICAgICAgICAgIC8vIEhpZ2ggQmxvb2QgUHJlc3N1cmUgKEh5cGVydGVuc2lvbikgU3RhZ2UgMQotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgfSBlbHNlIGlmICgocyA+PSAxNjAgJiYgcyA8PSAxNzkpIHx8IChkID49IDEwMCAmJiBkIDw9IDEwOSkpIHsKLSAgICAgICAgICAgICAgICAvLyBIaWdoIEJsb29kIFByZXNzdXJlIChIeXBlcnRlbnNpb24pIFN0YWdlIDIKLSAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocyA+PSAxODAgJiYgZCA+PSAxMTApICB7Ci0gICAgICAgICAgICAgICAgLy8gSHlwZXJ0ZW5zaXZlIENyaXNpcwotICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBHZXQgZWFjaCBpbmRpdmlkdWFsIHN0cmVhbQotICAgICAgICBUU3RyZWFtPE1hcDxTdHJpbmcsIEludGVnZXI+PiBub3JtYWwgPSBjYXRlZ29yaWVzLmdldCgwKS50YWcoIm5vcm1hbCIpOwotICAgICAgICBUU3RyZWFtPE1hcDxTdHJpbmcsIEludGVnZXI+PiBwcmVoeXBlcnRlbnNpb24gPSBjYXRlZ29yaWVzLmdldCgxKS50YWcoInByZWh5cGVydGVuc2lvbiIpOwotICAgICAgICBUU3RyZWFtPE1hcDxTdHJpbmcsIEludGVnZXI+PiBoeXBlcnRlbnNpb25fc3RhZ2UxID0gY2F0ZWdvcmllcy5nZXQoMikudGFnKCJoeXBlcnRlbnNpb25fc3RhZ2UxIik7Ci0gICAgICAgIFRTdHJlYW08TWFwPFN0cmluZywgSW50ZWdlcj4+IGh5cGVydGVuc2lvbl9zdGFnZTIgPSBjYXRlZ29yaWVzLmdldCgzKS50YWcoImh5cGVydGVuc2lvbl9zdGFnZTIiKTsKLSAgICAgICAgVFN0cmVhbTxNYXA8U3RyaW5nLCBJbnRlZ2VyPj4gaHlwZXJ0ZW5zaXZlID0gY2F0ZWdvcmllcy5nZXQoNCkudGFnKCJoeXBlcnRlbnNpdmUiKTsKLQotICAgICAgICAvLyBQZXJmb3JtIGFuYWx5dGljcyBvbiBlYWNoIHN0cmVhbSBhbmQgZ2VuZXJhdGUgYWxlcnRzIGZvciBlYWNoIGJsb29kIHByZXNzdXJlIGNhdGVnb3J5Ci0KLSAgICAgICAgLy8gQ2F0ZWdvcnk6IE5vcm1hbAotICAgICAgICBUU3RyZWFtPFN0cmluZz4gbm9ybWFsQWxlcnRzID0gbm9ybWFsCi0gICAgICAgICAgICAgICAgLmZpbHRlcih0dXBsZSAtPiB0dXBsZS5nZXQoIlN5c3RvbGljIikgPiA4MCAmJiB0dXBsZS5nZXQoIkRpYXN0b2xpYyIpID4gNTApCi0gICAgICAgICAgICAgICAgLnRhZygibm9ybWFsIikKLSAgICAgICAgICAgICAgICAubWFwKHR1cGxlIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJBbGwgaXMgbm9ybWFsLiBCUCBpcyAiICsgdHVwbGUuZ2V0KCJTeXN0b2xpYyIpICsgIi8iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZS5nZXQoIkRpYXN0b2xpYyIpICsgIi5cbiI7IH0pCi0gICAgICAgICAgICAgICAgLnRhZygibm9ybWFsIik7Ci0KLSAgICAgICAgLy8gQ2F0ZWdvcnk6IFByZWh5cGVydGVuc2lvbiBjYXRlZ29yeQotICAgICAgICBUU3RyZWFtPFN0cmluZz4gcHJlaHlwZXJ0ZW5zaW9uQWxlcnRzID0gcHJlaHlwZXJ0ZW5zaW9uCi0gICAgICAgICAgICAgICAgLm1hcCh0dXBsZSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiQXQgaGlnaCByaXNrIGZvciBkZXZlbG9waW5nIGh5cGVydGVuc2lvbi4gQlAgaXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUuZ2V0KCJTeXN0b2xpYyIpICsgIi8iICsgdHVwbGUuZ2V0KCJEaWFzdG9saWMiKSArICIuXG4iOyB9KQotICAgICAgICAgICAgICAgIC50YWcoInByZWh5cGVydGVuc2lvbiIpOwotCi0gICAgICAgIC8vIENhdGVnb3J5OiBIaWdoIEJsb29kIFByZXNzdXJlIChIeXBlcnRlbnNpb24pIFN0YWdlIDEKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IGh5cGVydGVuc2lvbl9zdGFnZTFBbGVydHMgPSBoeXBlcnRlbnNpb25fc3RhZ2UxCi0gICAgICAgICAgICAgICAgLm1hcCh0dXBsZSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiTW9uaXRvciBjbG9zZWx5LCBwYXRpZW50IGhhcyBoaWdoIGJsb29kIHByZXNzdXJlLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUCBpcyAiICsgdHVwbGUuZ2V0KCJTeXN0b2xpYyIpICsgIi8iICsgdHVwbGUuZ2V0KCJEaWFzdG9saWMiKSArICIuXG4iOyB9KQotICAgICAgICAgICAgICAgIC50YWcoImh5cGVydGVuc2lvbl9zdGFnZTEiKQotICAgICAgICAgICAgICAgIC5tb2RpZnkodHVwbGUgLT4gIkhpZ2ggQmxvb2QgUHJlc3N1cmUgKEh5cGVydGVuc2lvbikgU3RhZ2UgMVxuIiArIHR1cGxlKQotICAgICAgICAgICAgICAgIC50YWcoImh5cGVydGVuc2lvbl9zdGFnZTEiKTsKLQotICAgICAgICAvLyBDYXRlZ29yeTogSGlnaCBCbG9vZCBQcmVzc3VyZSAoSHlwZXJ0ZW5zaW9uKSBTdGFnZSAyCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBoeXBlcnRlbnNpb25fc3RhZ2UyQWxlcnRzID0gaHlwZXJ0ZW5zaW9uX3N0YWdlMgotICAgICAgICAgICAgICAgIC5maWx0ZXIodHVwbGUgLT4gdHVwbGUuZ2V0KCJTeXN0b2xpYyIpID49IDE3MCAmJiB0dXBsZS5nZXQoIkRpYXN0b2xpYyIpID49IDEwNSkKLSAgICAgICAgICAgICAgICAudGFnKCJoeXBlcnRlbnNpb25fc3RhZ2UyIikKLSAgICAgICAgICAgICAgICAucGVlayh0dXBsZSAtPgotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJQOiAiICsgdHVwbGUuZ2V0KCJTeXN0b2xpYyIpICsgIi8iICsgdHVwbGUuZ2V0KCJEaWFzdG9saWMiKSkpCi0gICAgICAgICAgICAgICAgLm1hcCh0dXBsZSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiV2FybmluZyEgTW9uaXRvciBjbG9zZWx5LCBwYXRpZW50IGlzIGF0IHJpc2sgb2YgYSBoeXBlcnRlbnNpdmUgY3Jpc2lzIVxuIjsgfSkKLSAgICAgICAgICAgICAgICAudGFnKCJoeXBlcnRlbnNpb25fc3RhZ2UyIikKLSAgICAgICAgICAgICAgICAubW9kaWZ5KHR1cGxlIC0+ICJIaWdoIEJsb29kIFByZXNzdXJlIChIeXBlcnRlbnNpb24pIFN0YWdlIDJcbiIgKyB0dXBsZSkKLSAgICAgICAgICAgICAgICAudGFnKCJoeXBlcnRlbnNpb25fc3RhZ2UyIik7Ci0KLSAgICAgICAgLy8gQ2F0ZWdvcnk6IEh5cGVydGVuc2l2ZSBDcmlzaXMKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IGh5cGVydGVuc2l2ZUFsZXJ0cyA9IGh5cGVydGVuc2l2ZQotICAgICAgICAgICAgICAgIC5maWx0ZXIodHVwbGUgLT4gdHVwbGUuZ2V0KCJTeXN0b2xpYyIpID49IDE4MCkKLSAgICAgICAgICAgICAgICAudGFnKCJoeXBlcnRlbnNpdmUiKQotICAgICAgICAgICAgICAgIC5wZWVrKHR1cGxlIC0+Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQlA6ICIgKyB0dXBsZS5nZXQoIlN5c3RvbGljIikgKyAiLyIgKyB0dXBsZS5nZXQoIkRpYXN0b2xpYyIpKSkKLSAgICAgICAgICAgICAgICAubWFwKHR1cGxlIC0+IHsgcmV0dXJuICJFbWVyZ2VuY3khIFNlZSB0byBwYXRpZW50IGltbWVkaWF0ZWx5IVxuIjsgfSkKLSAgICAgICAgICAgICAgICAudGFnKCJoeXBlcnRlbnNpdmUiKQotICAgICAgICAgICAgICAgIC5tb2RpZnkodHVwbGUgLT4gdHVwbGUudG9VcHBlckNhc2UoKSkKLSAgICAgICAgICAgICAgICAudGFnKCJoeXBlcnRlbnNpdmUiKQotICAgICAgICAgICAgICAgIC5tb2RpZnkodHVwbGUgLT4gIkh5cGVydGVuc2l2ZSBDcmlzaXMhISFcbiIgKyB0dXBsZSkKLSAgICAgICAgICAgICAgICAudGFnKCJoeXBlcnRlbnNpdmUiKTsKLQotICAgICAgICAvLyBBZGRpdGlvbmFsIHByb2Nlc3NpbmcgZm9yIHRoZXNlIHN0cmVhbXMgY291bGQgZ28gaGVyZS4gSW4gdGhpcyBjYXNlLCB1bmlvbiB0d28gc3RyZWFtcwotICAgICAgICAvLyB0byBvYnRhaW4gYSBzaW5nbGUgc3RyZWFtIGNvbnRhaW5pbmcgYWxlcnRzIGZyb20gdGhlIG5vcm1hbCBhbmQgcHJlaHlwZXJ0ZW5zaW9uIGFsZXJ0IHN0cmVhbXMuCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBub3JtYWxBbmRQcmVoeXBlcnRlbnNpb25BbGVydHMgPSBub3JtYWxBbGVydHMudW5pb24ocHJlaHlwZXJ0ZW5zaW9uQWxlcnRzKTsKLQotICAgICAgICAvLyBTZXQgb2Ygc3RyZWFtcyBjb250YWluaW5nIGFsZXJ0cyBmcm9tIHRoZSBvdGhlciBjYXRlZ29yaWVzCi0gICAgICAgIFNldDxUU3RyZWFtPFN0cmluZz4+IG90aGVyQWxlcnRzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBvdGhlckFsZXJ0cy5hZGQoaHlwZXJ0ZW5zaW9uX3N0YWdlMUFsZXJ0cyk7Ci0gICAgICAgIG90aGVyQWxlcnRzLmFkZChoeXBlcnRlbnNpb25fc3RhZ2UyQWxlcnRzKTsKLSAgICAgICAgb3RoZXJBbGVydHMuYWRkKGh5cGVydGVuc2l2ZUFsZXJ0cyk7Ci0KLSAgICAgICAgLy8gVW5pb24gYSBzdHJlYW0gd2l0aCBhIHNldCBvZiBzdHJlYW1zIHRvIG9idGFpbiBhIHNpbmdsZSBzdHJlYW0gY29udGFpbmluZyBhbGVydHMgZnJvbQotICAgICAgICAvLyBhbGwgYWxlcnQgc3RyZWFtcwotICAgICAgICBUU3RyZWFtPFN0cmluZz4gYWxsQWxlcnRzID0gbm9ybWFsQW5kUHJlaHlwZXJ0ZW5zaW9uQWxlcnRzLnVuaW9uKG90aGVyQWxlcnRzKTsKLQotICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIHN0cmVhbSBieSBwcmludGluZyBvdXQgYWxlcnRzIGZyb20gYWxsIGNhdGVnb3JpZXMKLSAgICAgICAgYWxsQWxlcnRzLnNpbmsodHVwbGUgLT4gU3lzdGVtLm91dC5wcmludGxuKHR1cGxlKSk7Ci0KLSAgICAgICAgZHAuc3VibWl0KHRvcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvRGV2ZWxvcG1lbnRNZXRyaWNzU2FtcGxlLmphdmEgYi9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9EZXZlbG9wbWVudE1ldHJpY3NTYW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmMDhkYy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9EZXZlbG9wbWVudE1ldHJpY3NTYW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5OwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQubWV0cmljcy5NZXRyaWNzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kZXZlbG9wbWVudC5EZXZlbG9wbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLXB1YmxpYyBjbGFzcyBEZXZlbG9wbWVudE1ldHJpY3NTYW1wbGUgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERldmVsb3BtZW50UHJvdmlkZXIgZHRwID0gbmV3IERldmVsb3BtZW50UHJvdmlkZXIoKTsKLSAgICAgICAgRGV2ZWxvcG1lbnRQcm92aWRlciBkdHAyID0gbmV3IERldmVsb3BtZW50UHJvdmlkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIFRvcG9sb2d5IHQgPSBkdHAubmV3VG9wb2xvZ3koIkRldmVsb3BtZW50TWV0cmljc1NhbXBsZSIpOwotICAgICAgICBUb3BvbG9neSB0MiA9IGR0cDIubmV3VG9wb2xvZ3koImFub3RoZXIgb25lIik7Ci0gICAgICAgIAotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgUmFuZG9tIHIyID0gbmV3IFJhbmRvbSgpOwotICAgICAgICBUU3RyZWFtPERvdWJsZT4gZ2F1c3NpYW4gPSB0LnBvbGwoKCkgLT4gci5uZXh0R2F1c3NpYW4oKSwgMSwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIAotICAgICAgICBUU3RyZWFtPERvdWJsZT4gZ2F1c3NpYW4yID0gdDIucG9sbCgoKSAtPiByMi5uZXh0R2F1c3NpYW4oKSwgMSwgVGltZVVuaXQuU0VDT05EUyk7Ci0KLSAgICAgICAgLy8gQSBmaWx0ZXIKLSAgICAgICAgZ2F1c3NpYW4gPSBnYXVzc2lhbi5maWx0ZXIoZyAtPiBnID4gMC41KTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1lYXN1cmUgdHVwbGUgYXJyaXZhbCByYXRlIGFmdGVyIGZpbHRlcmluZwotICAgICAgICBnYXVzc2lhbiA9IE1ldHJpY3MucmF0ZU1ldGVyKGdhdXNzaWFuKTsKLQotICAgICAgICAvLyBBIHRyYW5zZm9ybWF0aW9uCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICBUU3RyZWFtPFN0cmluZz4gZ3MgPSBnYXVzc2lhbi5tYXAoZyAtPiAiRzoiICsgZyArICI6Iik7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICBUU3RyZWFtPFN0cmluZz4gZ3MyID0gZ2F1c3NpYW4yLm1hcChnIC0+ICJHOiIgKyBnICsgIjoiKTsKLSAgICAgICAgCi0gICAgICAgIGR0cC5zdWJtaXQodCk7Ci0gICAgICAgIGR0cDIuc3VibWl0KHQyKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkdHAyLmdldFNlcnZpY2VzKCkuZ2V0U2VydmljZShIdHRwU2VydmVyLmNsYXNzKS5nZXRDb25zb2xlVXJsKCkpOwotICAgICAgICAKLSAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAwMDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3RvcG9sb2d5L0RldmVsb3BtZW50U2FtcGxlLmphdmEgYi9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9EZXZlbG9wbWVudFNhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDNlOGRhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3RvcG9sb2d5L0RldmVsb3BtZW50U2FtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5OwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRldmVsb3BtZW50LkRldmVsb3BtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLQotcHVibGljIGNsYXNzIERldmVsb3BtZW50U2FtcGxlIHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGV2ZWxvcG1lbnRQcm92aWRlciBkdHAgPSBuZXcgRGV2ZWxvcG1lbnRQcm92aWRlcigpOwotICAgICAgICAKLSAgICAgICAgVG9wb2xvZ3kgdCA9IGR0cC5uZXdUb3BvbG9neSgiRGV2ZWxvcG1lbnRTYW1wbGUiKTsKLSAgICAgICAgCi0gICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOwotICAgICAgICAKLSAgICAgICAgVFN0cmVhbTxEb3VibGU+IGQgID0gdC5wb2xsKCgpIC0+IHIubmV4dEdhdXNzaWFuKCksIDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgCi0gICAgICAgIGQuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50KCIuIikpOwotICAgICAgICAKLSAgICAgICAgZHRwLnN1Ym1pdCh0KTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkdHAuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEh0dHBTZXJ2ZXIuY2xhc3MpLmdldENvbnNvbGVVcmwoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvRGV2ZWxvcG1lbnRTYW1wbGVKb2JNWEJlYW4uamF2YSBiL3NhbXBsZXMvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3RvcG9sb2d5L0RldmVsb3BtZW50U2FtcGxlSm9iTVhCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTQzMDkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvRGV2ZWxvcG1lbnRTYW1wbGVKb2JNWEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3k7Ci0KLWltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRldmVsb3BtZW50LkRldmVsb3BtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLQotcHVibGljIGNsYXNzIERldmVsb3BtZW50U2FtcGxlSm9iTVhCZWFuIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGV2ZWxvcG1lbnRQcm92aWRlciBkdHAgPSBuZXcgRGV2ZWxvcG1lbnRQcm92aWRlcigpOwotICAgICAgICAKLSAgICAgICAgVG9wb2xvZ3kgdCA9IGR0cC5uZXdUb3BvbG9neSgiRGV2ZWxvcG1lbnRTYW1wbGVKb2JNWEJlYW4iKTsKLSAgICAgICAgCi0gICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOwotICAgICAgICAKLSAgICAgICAgVFN0cmVhbTxEb3VibGU+IGQgID0gdC5wb2xsKCgpIC0+IHIubmV4dEdhdXNzaWFuKCksIDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgCi0gICAgICAgIGQuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50KCIuIikpOwotICAgICAgICAKLSAgICAgICAgZHRwLnN1Ym1pdCh0KTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkdHAuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEh0dHBTZXJ2ZXIuY2xhc3MpLmdldENvbnNvbGVVcmwoKSk7Ci0gICAgICAgIAotICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2J1Zi5hcHBlbmQoRGV2ZWxvcG1lbnRQcm92aWRlci5KTVhfRE9NQUlOKTsKLSAgICAgICAgc2J1Zi5hcHBlbmQoIjppbnRlcmZhY2U9Iik7Ci0gICAgICAgIHNidWYuYXBwZW5kKE9iamVjdE5hbWUucXVvdGUoIm9yZy5hcGFjaGUuZWRnZW50LmV4ZWN1dGlvbi5tYmVhbnMuSm9iTVhCZWFuIikpOwotICAgICAgICBzYnVmLmFwcGVuZCgiLHR5cGU9Iik7Ci0gICAgICAgIHNidWYuYXBwZW5kKE9iamVjdE5hbWUucXVvdGUoImpvYiIpKTsKLSAgICAgICAgc2J1Zi5hcHBlbmQoIiwqIik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvb2tpbmcgZm9yIE1CZWFucyBvZiB0eXBlIGpvYjogIiArIHNidWYudG9TdHJpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBPYmplY3ROYW1lIGpvYk9iak5hbWUgPSBuZXcgT2JqZWN0TmFtZShzYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICBTZXQ8T2JqZWN0SW5zdGFuY2U+IGpvYkluc3RhbmNlcyA9IG1CZWFuU2VydmVyLnF1ZXJ5TUJlYW5zKGpvYk9iak5hbWUsIG51bGwpOwotICAgICAgICBJdGVyYXRvcjxPYmplY3RJbnN0YW5jZT4gam9iSXRlcmF0b3IgPSBqb2JJbnN0YW5jZXMuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoam9iSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAlPYmplY3RJbnN0YW5jZSBqb2JJbnN0YW5jZSA9IGpvYkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgCU9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IGpvYkluc3RhbmNlLmdldE9iamVjdE5hbWUoKTsKLQotICAgICAgICAJU3RyaW5nIGpvYklkID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsICJJZCIpOwotICAgICAgICAJU3RyaW5nIGpvYk5hbWUgPSAoU3RyaW5nKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUob2JqZWN0TmFtZSwgIk5hbWUiKTsKLSAgICAgICAgCVN0cmluZyBqb2JDdXJTdGF0ZSA9IChTdHJpbmcpIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAiQ3VycmVudFN0YXRlIik7Ci0gICAgICAgIAlTdHJpbmcgam9iTmV4dFN0YXRlID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsICJOZXh0U3RhdGUiKTsKLSAgICAgICAgICAgIFN0cmluZyBqb2JIZWFsdGggPSAoU3RyaW5nKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUob2JqZWN0TmFtZSwgIkhlYWx0aCIpOwotICAgICAgICAgICAgU3RyaW5nIGpvYkxhc3RFcnJvciA9IChTdHJpbmcpIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAiTGFzdEVycm9yIik7Ci0gICAgICAgIAkKLSAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgYSBqb2Igd2l0aCBKb2JJZDogIiArIGpvYklkICsgIiBOYW1lOiAiICsgam9iTmFtZSArIAotICAgICAgICAgICAgICAgICAgICAiIEN1cnJlbnRTdGF0ZTogIiArIGpvYkN1clN0YXRlICsgIiBOZXh0U3RhdGU6ICIgKyBqb2JOZXh0U3RhdGUgKyAKLSAgICAgICAgICAgICAgICAgICAgIiBIZWFsdGg6ICIgKyBqb2JIZWFsdGggKyAiIExhc3RFcnJvcjogXCIiICsgam9iTGFzdEVycm9yICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9IZWxsb0VkZ2VudC5qYXZhIGIvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvSGVsbG9FZGdlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyMTE3OS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9IZWxsb0VkZ2VudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLS8qKgotICogSGVsbG8gRWRnZW50IFRvcG9sb2d5IHNhbXBsZS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb0VkZ2VudCB7Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAiSGVsbG8gRWRnZW50ISIgYXMgdHdvIHR1cGxlcy4KLSAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGFyZ3VtZW50cwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBEaXJlY3RQcm92aWRlciBkcCA9IG5ldyBEaXJlY3RQcm92aWRlcigpOwotCi0gICAgICAgIFRvcG9sb2d5IHRvcCA9IGRwLm5ld1RvcG9sb2d5KCk7Ci0KLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IGhlbGxvU3RyZWFtID0gdG9wLnN0cmluZ3MoIkhlbGxvIiwgIkVkZ2VudCEiKTsKLQotICAgICAgICBoZWxsb1N0cmVhbS5wcmludCgpOwotCi0gICAgICAgIGRwLnN1Ym1pdCh0b3ApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3RvcG9sb2d5L0pvYkV2ZW50c1NhbXBsZS5qYXZhIGIvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvSm9iRXZlbnRzU2FtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MmFkNTQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvSm9iRXZlbnRzU2FtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmV4ZWN1dGlvbi5Kb2I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZXhlY3V0aW9uLnNlcnZpY2VzLkpvYlJlZ2lzdHJ5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnJ1bnRpbWUuam9icmVnaXN0cnkuSm9iRXZlbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnJ1bnRpbWUuam9icmVnaXN0cnkuSm9iUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwotCi0vKioKLSAqIERlbW9uc3RyYXRlcyBqb2IgbW9uaXRvcmluZyB1c2luZyB0aGUge0BsaW5rIEpvYlJlZ2lzdHJ5U2VydmljZX0gc2VydmljZS4KLSAqIDxwPgotICogVGhlIGV4YW1wbGUgc3RhcnRzIGEgc3lzdGVtIG1vbml0b3JpbmcgYXBwbGljYXRpb24sIHRoZW4gY29uY3VycmVudGx5IAotICogc3VibWl0cyB0d28gam9icy4KLSAqIFRoZSBqb2IgbW9uaXRvcmluZyBhcHBsaWNhdGlvbiBnZW5lcmF0ZXMgam9iIGV2ZW50IHR1cGxlcyB3aGVuIGpvYnMgCi0gKiBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHJlZ2lzdHJ5LCBvciB3aGVuIGEgam9iIGdldHMgdXBkYXRlZC4gCi0gKiBUdXBsZXMgYXJlIHB1c2hlZCB0byBhIHNpbmssIHdoaWNoIHByaW50cyB0aGVtIG9udG8gdGhlIHN5c3RlbSBvdXRwdXQuPC9wPgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhlIG9yaWdpbmFsIGpvYiBldmVudHMgc3RyZWFtIHByb2Nlc3NpbmcgaXMgZXhlY3V0ZWQgYnkgdGhlCi0gKiBKb2JSZWdpc3RyeVNlcnZpY2UgZXZlbnQge0BsaW5rcGxhaW4gCi0gKiBKb2JSZWdpc3RyeVNlcnZpY2UjYWRkTGlzdGVuZXIob3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24uQmlDb25zdW1lcikgbGlzdGVuZXJzfQotICogaW52b2tlciB0aHJlYWQuIAotICogSXQgaXMgY29uc2lkZXJlZCBnb29kIHByYWN0aWNlIHRvIGlzb2xhdGUgdGhlIGV2ZW50IHNvdXJjZSBmcm9tIHRoZSByZXN0IAotICogb2YgdGhlIGdyYXBoLCBpbiBvcmRlciBmb3IgdGhlIHByb2Nlc3Npbmcgb2YgdHVwbGVzIHRvIGJlIGV4ZWN1dGVkIGJ5IGEKLSAqIGRpZmZlcmVudCB0aHJlYWQuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSm9iRXZlbnRzU2FtcGxlIHsKLSAgICBwcml2YXRlIGZpbmFsIERpcmVjdFByb3ZpZGVyIGRwOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBKb2JFdmVudHNTYW1wbGUgc2FtcGxlID0gbmV3IEpvYkV2ZW50c1NhbXBsZSgpOwotICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgyKTsKLQotICAgICAgICAvLyBNb25pdG9yaW5nIGFwcAotICAgICAgICBzYW1wbGUuc3RhcnRKb2JNb25pdG9yQXBwKCk7Ci0KLSAgICAgICAgLy8gQXN5bmNocm9ub3VzbHkgc3RhcnQgdHdvIGFwcGxpY2F0aW9ucwotICAgICAgICBleGVjdXRvci5zY2hlZHVsZShzYW1wbGUucnVuTW9uaXRvcmVkQXBwKCJNb25pdG9yZWRBcHAxIiksIDMwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgZXhlY3V0b3Iuc2NoZWR1bGUoc2FtcGxlLnJ1bk1vbml0b3JlZEFwcCgiTW9uaXRvcmVkQXBwMiIpLCAzMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgIH0KLQotICAgIEpvYkV2ZW50c1NhbXBsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmRwID0gbmV3IERpcmVjdFByb3ZpZGVyKCk7Ci0gICAgICAgIEpvYlJlZ2lzdHJ5LmNyZWF0ZUFuZFJlZ2lzdGVyKGRwLmdldFNlcnZpY2VzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY2xhcmVzIGFuZCBzdWJtaXRzIGEgbW9uaXRvcmVkIGFwcGxpY2F0aW9uLgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCBpbmxpbmUgc2xlZXBzIGFyZSBpbnRyb2R1Y2VkIHRvIHNpbXVsYXRlIHRoZSB0aW1pbmcgCi0gICAgICogb2YgYSByZWFsLWxpZmUgYXBwbGljYXRpb24gbGlmZWN5Y2xlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIGFwcGxpY2F0aW9uIG5hbWUKLSAgICAgKi8KLSAgICB2b2lkIG1vbml0b3JlZChTdHJpbmcgbmFtZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBEZWNsYXJlIHRvcG9sb2d5Ci0gICAgICAgIFRvcG9sb2d5IHQgPSBkcC5uZXdUb3BvbG9neShuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOwotICAgICAgICBUU3RyZWFtPERvdWJsZT4gZCAgPSB0LnBvbGwoKCkgLT4gci5uZXh0R2F1c3NpYW4oKSwgMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICBkLnNpbmsodHVwbGUgLT4gU3lzdGVtLm91dC5wcmludCgiLiIpKTsKLQotICAgICAgICAvLyBTdWJtaXQgam9iIGFmdGVyIDIgc2Vjb25kcwotICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7Ci0gICAgICAgIEZ1dHVyZTxKb2I+IGYgPSBkcC5zdWJtaXQodCk7Ci0gICAgICAgIEpvYiBqb2IgPSBmLmdldCgpOwotICAgICAgICAKLSAgICAgICAgLy8gUnVuIGZvciA1IHNlY29uZHMsIHRoZW4gY2xvc2Ugam9iCi0gICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKLSAgICAgICAgam9iLnN0YXRlQ2hhbmdlKEpvYi5BY3Rpb24uQ0xPU0UpOwotCi0gICAgICAgIC8vIFVucmVnaXN0ZXIgam9iIGFmdGVyIDIgc2Vjb25kcwotICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7Ci0gICAgICAgIHByb3ZpZGVyKCkuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEpvYlJlZ2lzdHJ5U2VydmljZS5jbGFzcykucmVtb3ZlSm9iKGpvYi5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb25pdG9yaW5nIGFwcGxpY2F0aW9uIGdlbmVyYXRlcyB0dXBsZXMgb24gam9iIHJlZ2lzdHJhdGlvbnMsIHJlbW92YWxzLCAKLSAgICAgKiBhbmQgb24gcmVnaXN0ZXJlZCBqb2IgdXBkYXRlcy4KLSAgICAgKi8KLSAgICBKb2Igc3RhcnRKb2JNb25pdG9yQXBwKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBUb3BvbG9neSB0b3BvbG9neSA9IGRwLm5ld1RvcG9sb2d5KCJKb2JNb25pdG9yQXBwIik7Ci0KLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBqb2JFdmVudHMgPSBKb2JFdmVudHMuc291cmNlKAotICAgICAgICAgICAgICAgIHRvcG9sb2d5LCAKLSAgICAgICAgICAgICAgICAoZXZUeXBlLCBqb2IpIC0+IHsgcmV0dXJuIEpvYkV2ZW50c1NhbXBsZS53cmFwKGV2VHlwZSwgam9iKTsgfSk7Ci0KLSAgICAgICAgam9iRXZlbnRzLnNpbmsodHVwbGUgLT4gewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih0dXBsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgIEZ1dHVyZTxKb2I+IGYgPSBkcC5zdWJtaXQodG9wb2xvZ3kpOwotICAgICAgICByZXR1cm4gZi5nZXQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEpzb25PYmplY3Qgd3JhcHBpbmcgYSBKb2JSZWdpc3RyeVNlcnZpY2UgZXZlbnQgdHlwZSBhbmQgCi0gICAgICogSm9iIGluZm8uCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2VHlwZSB0aGUgZXZlbnQgdHlwZQotICAgICAqIEBwYXJhbSBqb2IgdGhlIGpvYgotICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgZGF0YQotICAgICAqLwotICAgIHN0YXRpYyBKc29uT2JqZWN0IHdyYXAoSm9iUmVnaXN0cnlTZXJ2aWNlLkV2ZW50VHlwZSBldlR5cGUsIEpvYiBqb2IpIHsKLSAgICAgICAgSnNvbk9iamVjdCB2YWx1ZSA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgIHZhbHVlLmFkZFByb3BlcnR5KCJ0aW1lIiwgKE51bWJlcilTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIHZhbHVlLmFkZFByb3BlcnR5KCJldmVudCIsIGV2VHlwZS50b1N0cmluZygpKTsKLSAgICAgICAgSnNvbk9iamVjdCBvYmogPSBuZXcgSnNvbk9iamVjdCgpOwotICAgICAgICBvYmouYWRkUHJvcGVydHkoImlkIiwgam9iLmdldElkKCkpOwotICAgICAgICBvYmouYWRkUHJvcGVydHkoIm5hbWUiLCBqb2IuZ2V0TmFtZSgpKTsKLSAgICAgICAgb2JqLmFkZFByb3BlcnR5KCJzdGF0ZSIsIGpvYi5nZXRDdXJyZW50U3RhdGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgb2JqLmFkZFByb3BlcnR5KCJuZXh0U3RhdGUiLCBqb2IuZ2V0TmV4dFN0YXRlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIG9iai5hZGRQcm9wZXJ0eSgiaGVhbHRoIiwgam9iLmdldEhlYWx0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICBvYmouYWRkUHJvcGVydHkoImxhc3RFcnJvciIsIGpvYi5nZXRMYXN0RXJyb3IoKSk7Ci0gICAgICAgIHZhbHVlLmFkZCgiam9iIiwgb2JqKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgRGlyZWN0UHJvdmlkZXIgcHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBkcDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBSdW5uYWJsZSBydW5Nb25pdG9yZWRBcHAoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvcmVkKG5hbWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9Kb2JFeGVjdXRpb24uamF2YSBiL3NhbXBsZXMvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3RvcG9sb2d5L0pvYkV4ZWN1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUzOTQ5Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3RvcG9sb2d5L0pvYkV4ZWN1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5OwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZXhlY3V0aW9uLkpvYjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLS8qKgotICogVXNpbmcgdGhlIEpvYiBBUEkgdG8gZ2V0L3NldCBhIGpvYidzIHN0YXRlLgotICovCi1wdWJsaWMgY2xhc3MgSm9iRXhlY3V0aW9uIHsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgSk9CX0xJRkVfTUlMTElTID0gMTAwMDA7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIFdBSVRfQUZURVJfQ0xPU0UgPSAyMDAwOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGlyZWN0UHJvdmlkZXIgdHAgPSBuZXcgRGlyZWN0UHJvdmlkZXIoKTsKLQotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koIkpvYkV4ZWN1dGlvbiIpOwotCi0gICAgICAgIC8vIFNvdXJjZQotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgVFN0cmVhbTxEb3VibGU+IGdhdXNzaWFuID0gdC5wb2xsKCgpIC0+IHIubmV4dEdhdXNzaWFuKCksIDEsIFRpbWVVbml0LlNFQ09ORFMpOwotCi0gICAgICAgIC8vIFBlZWsKLSAgICAgICAgZ2F1c3NpYW4gPSBnYXVzc2lhbi5wZWVrKGcgLT4gU3lzdGVtLm91dC5wcmludGxuKCJSOiIgKyBnKSk7Ci0gIAotICAgICAgICAvLyBUcmFuc2Zvcm0gdG8gc3RyaW5ncwotICAgICAgICBUU3RyZWFtPFN0cmluZz4gZ3NQZXJpb2RpYyA9IGdhdXNzaWFuLm1hcChnIC0+ICJHOiIgKyBnICsgIjoiKTsKLSAgICAgICAgZ3NQZXJpb2RpYy5wcmludCgpOwotICAKLSAgICAgICAgLy8gU3VibWl0IGpvYiBhbmQgcG9sbCBpdHMgc3RhdHVzIGZvciBhIHdoaWxlCi0gICAgICAgIEZ1dHVyZTxKb2I+IGZ1dHVyZUpvYiA9IHRwLnN1Ym1pdCh0KTsKLSAgICAgICAgUmVwb3J0ZXIgcmVwb3J0ZXIgPSBuZXcgUmVwb3J0ZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpvYiBqb2IgPSBmdXR1cmVKb2IuZ2V0KCk7Ci0gICAgICAgICAgICByZXBvcnRlci5zdGFydChqb2IpOwotCi0gICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgam9iIHRvIGNvbXBsZXRlCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGpvYi5jb21wbGV0ZShKT0JfTElGRV9NSUxMSVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgam9iIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgam9iIGFib3J0ZWQgYnkgdGhyb3dpbmcgZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGpvYiB0byBjb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBqb2IgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xvc2luZyB0aGUgam9iLi4uIik7Ci0gICAgICAgICAgICAgICAgam9iLnN0YXRlQ2hhbmdlKEpvYi5BY3Rpb24uQ0xPU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTbGVlcCBhZnRlciBqb2IgY2xvc2UgZm9yICIgKyBXQUlUX0FGVEVSX0NMT1NFICsgIiBtcyIpOwotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFdBSVRfQUZURVJfQ0xPU0UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkludGVycnVwdGVkISIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgcmVwb3J0ZXIuc3RvcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFJlcG9ydGVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEpvYiBqb2I7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgVGhyZWFkIHJ1bm5lcjsKLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqb2IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSm9iIHN0YXRlIGlzOiBjdXJyZW50PSIgKyBqb2IuZ2V0Q3VycmVudFN0YXRlKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuZXh0PSIgKyBqb2IuZ2V0TmV4dFN0YXRlKCkpOwotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXBvcnRlciBpbnRlcnJ1cHRlZCIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBzdGFydChKb2Igam9iKSB7Ci0gICAgICAgICAgICB0aGlzLmpvYiA9IGpvYjsKLSAgICAgICAgICAgIHJ1bm5lciA9IEV4ZWN1dG9ycy5kZWZhdWx0VGhyZWFkRmFjdG9yeSgpLm5ld1RocmVhZCh0aGlzKTsKLSAgICAgICAgICAgIHJ1bm5lci5zZXROYW1lKCJSZXBvcnRlciIpOwotICAgICAgICAgICAgcnVubmVyLnNldERhZW1vbihmYWxzZSk7Ci0gICAgICAgICAgICBydW5uZXIuc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBzdG9wKCkgewotICAgICAgICAgICAgcnVubmVyLmludGVycnVwdCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvUGVyaW9kaWNTb3VyY2UuamF2YSBiL3NhbXBsZXMvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3RvcG9sb2d5L1BlcmlvZGljU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMTNiODQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvUGVyaW9kaWNTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi0vKioKLSAqIFBlcmlvZGljIHBvbGxpbmcgb2Ygc291cmNlIGRhdGEuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGVyaW9kaWNTb3VyY2UgewotICAgIC8qKgotICAgICAqIFNob3dzIHBvbGxpbmcgYSBkYXRhIHNvdXJjZSB0byBwZXJpb2RpY2FsbHkgb2J0YWluIGEgdmFsdWUuCi0gICAgICogUG9sbHMgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBmb3IgYSBuZXcgdmFsdWUgZXZlcnkgc2Vjb25kCi0gICAgICogYW5kIHRoZW4gcHJpbnRzIG91dCB0aGUgcmF3IHZhbHVlIGFuZCBhIGZpbHRlcmVkIGFuZCB0cmFuc2Zvcm1lZCBzdHJlYW0uCi0gICAgICogQHBhcmFtIGFyZ3MgY29tbWFuZCBhcmd1bWVudHMKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGlyZWN0UHJvdmlkZXIgdHAgPSBuZXcgRGlyZWN0UHJvdmlkZXIoKTsKLQotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koIlBlcmlvZGljU291cmNlIik7Ci0KLSAgICAgICAgLy8gU2luY2UgdGhpcyBpcyB0aGUgRGlyZWN0IHByb3ZpZGVyIHRoZSBncmFwaCBjYW4gYWNjZXNzCi0gICAgICAgIC8vIG9iamVjdHMgY3JlYXRlZCB3aGlsZSB0aGUgdG9wb2xvZ3kgaXMgYmVpbmcgZGVmaW5lZAotICAgICAgICAvLyAoaW4gdGhpcyBjYXNlIHRoZSBSYW5kb20gb2JqZWN0IHIpLgotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgVFN0cmVhbTxEb3VibGU+IGdhdXNzaWFuID0gdC5wb2xsKCgpIC0+IHIubmV4dEdhdXNzaWFuKCksIDEsIFRpbWVVbml0LlNFQ09ORFMpOwotCi0gICAgICAgIC8vIFBlZWsgYXQgdGhlIHZhbHVlIG9uIHRoZSBTdHJlYW0gcHJpbnRpbmcgaXQgdG8gU3lzdGVtLm91dAotICAgICAgICBnYXVzc2lhbiA9IGdhdXNzaWFuLnBlZWsoZyAtPiBTeXN0ZW0ub3V0LnByaW50bG4oIlI6IiArIGcpKTsKLQotICAgICAgICAvLyBBIGZpbHRlcgotICAgICAgICBnYXVzc2lhbiA9IGdhdXNzaWFuLmZpbHRlcihnIC0+IGcgPiAwLjUpOwotCi0gICAgICAgIC8vIEEgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IGdzID0gZ2F1c3NpYW4ubWFwKGcgLT4gIkc6IiArIGcgKyAiOiIpOwotICAgICAgICBncy5wcmludCgpOwotCi0gICAgICAgIHRwLnN1Ym1pdCh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9TZW5zb3JzQWdncmVnYXRlcy5qYXZhIGIvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvU2Vuc29yc0FnZ3JlZ2F0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2MGVjZi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9TZW5zb3JzQWdncmVnYXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3k7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLnN0YXQuU3RhdGlzdGljLk1BWDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLm1hdGgzLnN0YXQuU3RhdGlzdGljLk1FQU47Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5zdGF0LlN0YXRpc3RpYy5NSU47Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuZWRnZW50LmFuYWx5dGljcy5tYXRoMy5zdGF0LlN0YXRpc3RpYy5TVERERVY7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3MubWF0aDMuanNvbi5Kc29uQW5hbHl0aWNzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRldmVsb3BtZW50LkRldmVsb3BtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnV0aWxzLnNlbnNvci5TaW11bGF0ZWRTZW5zb3JzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFdpbmRvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5Ub3BvbG9neTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLQotLyoqCi0gKiBBZ2dyZWdhdGlvbiBvZiBzZW5zb3IgcmVhZGluZ3MuCi0gKiAKLSAqIERlbW9uc3RyYXRlcyBwYXJ0aXRpb25lZCBhZ2dyZWdhdGlvbiBhbmQgZmlsdGVyaW5nIG9mIHNpbXVsYXRlZCBzZW5zb3JzCi0gKiB0aGF0IGFyZSBidXJzdHkgaW4gbmF0dXJlLCBzbyB0aGF0IG9ubHkgaW50ZXJtaXR0ZW50bHkKLSAqIGlzIHRoZSBkYXRhIG91dHB1dCB0byB7QGNvZGUgU3lzdGVtLm91dH0uCi0gKiA8UD4KLSAqIFRoZSB0d28gc2Vuc29ycyBhcmUgcmVhZCBhcyBpbmRlcGVuZGVudCBzdHJlYW1zIGJ1dCBjb21iaW5lZAotICogaW50byBhIHNpbmdsZSBzdHJlYW0gYW5kIHRoZW4gYWdncmVnYXRlZCBhY3Jvc3MgdGhlIGxhc3QgNTAgcmVhZGluZ3MKLSAqIHVzaW5nIHdpbmRvd3MuIFRoZSB3aW5kb3cgaXMgcGFydGl0aW9uZWQgYnkgdGhlIHNlbnNvciBuYW1lCi0gKiBzbyB0aGF0IGVhY2ggc2Vuc29yIHdpbGwgaGF2ZSBpdHMgb3duIGluZGVwZW5kZW50IHdpbmRvdy4KLSAqIFRoaXMgcGFydGl0aW9uaW5nIGlzIGF1dG9tYXRpYyBzbyB0aGF0IHRoZSBzYW1lIGNvZGUgd291bGQKLSAqIHdvcmsgaWYgcmVhZGluZ3MgZnJvbSBvbmUgaHVuZHJlZCBkaWZmZXJlbnQgc2Vuc29ycyB3ZXJlCi0gKiBvbiB0aGUgc2FtZSBzdHJlYW0sIGlzIGl0IGp1c3QgZHJpdmVuIGJ5IGEga2V5IGZ1bmN0aW9uLgotICogPEJSPgotICogVGhlIHdpbmRvd3MgYXJlIHRoZW4gYWdncmVnYXRlZCB1c2luZyBBcGFjaGUgQ29tbW9uIE1hdGgKLSAqIHByb3ZpZGVkIHN0YXRpc3RpY3MgYW5kIHRoZSBmaW5hbCBzdHJlYW0gZmlsdGVyZWQgc28KLSAqIHRoYXQgaXQgd2lsbCBvbmx5IGNvbnRhaW4gdmFsdWVzIHdoZW4gZWFjaCBzZW5zb3IgCi0gKiBpcyAoaW5kZXBlbmRlbnRseSkgb3V0IG9mIHJhbmdlLgotICogPC9QPgotICoKLSAqIEBzZWUgU2ltdWxhdGVkU2Vuc29ycyNidXJzdHlTZW5zb3IoVG9wb2xvZ3ksIFN0cmluZykKLSAqLwotcHVibGljIGNsYXNzIFNlbnNvcnNBZ2dyZWdhdGVzIHsKLQkKLSAgICAvKioKLSAgICAgKiBSdW4gYSB0b3BvbG9neSB3aXRoIHR3byBidXJzdHkgc2Vuc29ycyBwcmludGluZyB0aGVtIHRvIHN0YW5kYXJkIG91dC4KLSAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGFyZ3VtZW50cwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiU2Vuc29yc0FnZ3JlZ2F0ZXM6IE91dHB1dCB3aWxsIGJlIHJhbmRvbWx5IGludGVybWl0dGVudCwgYmUgcGF0aWVudCEiKTsKLQotICAgICAgICBEaXJlY3RQcm92aWRlciB0cCA9IG5ldyBEZXZlbG9wbWVudFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBUb3BvbG9neSB0b3BvbG9neSA9IHRwLm5ld1RvcG9sb2d5KCJTZW5zb3JzUmVhZGluZ0FnZ3JlZ2F0ZXMiKTsKLSAgICAgICAgCi0gICAgICAgIFRTdHJlYW08SnNvbk9iamVjdD4gc2Vuc29ycyA9IHNlbnNvcnNBQih0b3BvbG9neSk7Ci0gICAgICAgIAotICAgICAgICBzZW5zb3JzLnByaW50KCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIENvbnNvbGUgVVJMIGZvciB0aGUgam9iOiAiCi0gICAgICAgICAgICArIHRwLmdldFNlcnZpY2VzKCkuZ2V0U2VydmljZShIdHRwU2VydmVyLmNsYXNzKS5nZXRDb25zb2xlVXJsKCkpOwotCi0gICAgICAgIHRwLnN1Ym1pdCh0b3BvbG9neSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHN0cmVhbSBjb250YWluaW5nIHR3byBhZ2dyZWdhdGVzIGZyb20gdHdvIGJ1cnN0eQotICAgICAqIHNlbnNvcnMgQSBhbmQgQiB0aGF0IG9ubHkgcHJvZHVjZXMgb3V0cHV0IHdoZW4gdGhlIHNlbnNvcnMKLSAgICAgKiAoaW5kZXBlbmRlbnRseSkgYXJlIGhhdmluZyBhIGJ1cnN0IHBlcmlvZCBvdXQgb2YgdGhlaXIgbm9ybWFsIHJhbmdlLgotICAgICAqIEBwYXJhbSB0b3BvbG9neSBUb3BvbG9neSB0byBhZGQgdGhlIHN1Yi1ncmFwaCB0by4KLSAgICAgKiBAcmV0dXJuIFN0cmVhbSBjb250YWluaW5nIHR3byBhZ2dyZWdhdGVzIGZyb20gdHdvIGJ1cnN0eQotICAgICAqIHNlbnNvcnMgQSBhbmQgQgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVFN0cmVhbTxKc29uT2JqZWN0PiBzZW5zb3JzQUIoVG9wb2xvZ3kgdG9wb2xvZ3kpIHsKLSAgICAJCi0gICAgCS8vIFNpbXVsYXRlIHR3byBzZW5zb3JzLCBBIGFuZCBCLCBib3RoIHJhbmRvbWx5IGJ1cnN0eQotICAgICAgICBUU3RyZWFtPEpzb25PYmplY3Q+IHNlbnNvckEgPSBTaW11bGF0ZWRTZW5zb3JzLmJ1cnN0eVNlbnNvcih0b3BvbG9neSwgIkEiKTsKLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBzZW5zb3JCID0gU2ltdWxhdGVkU2Vuc29ycy5idXJzdHlTZW5zb3IodG9wb2xvZ3ksICJCIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDb21iaW5lIHRoZSBzZW5zb3IgcmVhZGluZ3MgaW50byBhIHNpbmdsZSBzdHJlYW0KLSAgICAgICAgVFN0cmVhbTxKc29uT2JqZWN0PiBzZW5zb3JzID0gc2Vuc29yQS51bmlvbihzZW5zb3JCKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIHdpbmRvdyBvbiB0aGUgc3RyZWFtIG9mIHRoZSBsYXN0IDUwIHJlYWRpbmdzIHBhcnRpdGlvbmVkCi0gICAgICAgIC8vIGJ5IHNlbnNvciBuYW1lLiBJbiB0aGlzIGNhc2UgdHdvIGluZGVwZW5kZW50IHdpbmRvd3MgYXJlIGNyZWF0ZWQgKGZvciBhIGFuZCBiKQotICAgICAgICBUV2luZG93PEpzb25PYmplY3QsSnNvbkVsZW1lbnQ+IHNlbnNvcldpbmRvdyA9IHNlbnNvcnMubGFzdCg1MCwgaiAtPiBqLmdldCgibmFtZSIpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgd2luZG93cyBjYWxjdWxhdGluZyB0aGUgbWluLCBtYXgsIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgotICAgICAgICAvLyBhY3Jvc3MgZWFjaCB3aW5kb3cgaW5kZXBlbmRlbnRseS4KLSAgICAgICAgc2Vuc29ycyA9IEpzb25BbmFseXRpY3MuYWdncmVnYXRlKHNlbnNvcldpbmRvdywgIm5hbWUiLCAicmVhZGluZyIsIE1JTiwgTUFYLCBNRUFOLCBTVERERVYpOwotICAgICAgICAKLSAgICAgICAgLy8gRmlsdGVyIHNvIHRoYXQgb25seSB3aGVuIHRoZSBzZW5zb3IgaXMgYmV5b25kIDIuMCAoYWJzb2x1dGUpIGlzIGEgcmVhZGluZyBzZW50LgotICAgICAgICBzZW5zb3JzID0gc2Vuc29ycy5maWx0ZXIoaiAtPiBNYXRoLmFicyhqLmdldCgicmVhZGluZyIpLmdldEFzSnNvbk9iamVjdCgpLmdldCgiTUVBTiIpLmdldEFzRG91YmxlKCkpID4gMi4wKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzZW5zb3JzOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvU2ltcGxlRmlsdGVyVHJhbnNmb3JtLmphdmEgYi9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9TaW1wbGVGaWx0ZXJUcmFuc2Zvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkMzhiOS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9TaW1wbGVGaWx0ZXJUcmFuc2Zvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmV4ZWN1dGlvbi5Kb2I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRmlsdGVyVHJhbnNmb3JtIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBEaXJlY3RQcm92aWRlciB0cCA9IG5ldyBEaXJlY3RQcm92aWRlcigpOwotCi0gICAgICAgIFRvcG9sb2d5IHQgPSB0cC5uZXdUb3BvbG9neSgiU2ltcGxlRmlsdGVyVHJhbnNmb3JtIik7Ci0KLSAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgIFRTdHJlYW08RG91YmxlPiBnYXVzc2lhbiA9IHQuZ2VuZXJhdGUoKCkgLT4gci5uZXh0R2F1c3NpYW4oKSk7Ci0KLSAgICAgICAgLy8gdGVzdGluZyBQZWVrIQotICAgICAgICBnYXVzc2lhbiA9IGdhdXNzaWFuLnBlZWsoZyAtPiBTeXN0ZW0ub3V0LnByaW50bG4oIlI6IiArIGcpKTsKLQotICAgICAgICAvLyBBIGZpbHRlcgotICAgICAgICBnYXVzc2lhbiA9IGdhdXNzaWFuLmZpbHRlcihnIC0+IGcgPiAwLjUpOwotCi0gICAgICAgIC8vIEEgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IGdzID0gZ2F1c3NpYW4ubWFwKGcgLT4gIkc6IiArIGcgKyAiOiIpOwotICAgICAgICBncy5wcmludCgpOwotCi0gICAgICAgIC8vIFN1Ym1pdCB0aGUgam9iLCB0aGVuIGNsb3NlIGl0IGFmdGVyIGEgd2hpbGUgCi0gICAgICAgIEZ1dHVyZTxKb2I+IGZ1dHVyZUpvYiA9IHRwLnN1Ym1pdCh0KTsKLSAgICAgICAgSm9iIGpvYiA9IGZ1dHVyZUpvYi5nZXQoKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoNSkpOwotICAgICAgICBqb2Iuc3RhdGVDaGFuZ2UoSm9iLkFjdGlvbi5DTE9TRSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvU3BsaXRXaXRoRW51bVNhbXBsZS5qYXZhIGIvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvU3BsaXRXaXRoRW51bVNhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU5MDc0Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3RvcG9sb2d5L1NwbGl0V2l0aEVudW1TYW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogPHA+Ci0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIDxwPgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy50b3BvbG9neTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25zb2xlLnNlcnZlci5IdHRwU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kZXZlbG9wbWVudC5EZXZlbG9wbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLXB1YmxpYyBjbGFzcyBTcGxpdFdpdGhFbnVtU2FtcGxlIHsKLQotICAgIHB1YmxpYyBlbnVtIExvZ1NldmVyaXR5RW51bSB7Ci0KLSAgICAgICAgQUxFUlQoMSksIENSSVRJQ0FMKDIpLCBFUlJPUigzKSwgV0FSTklORyg0KSwgTk9USUNFKDUpLCBJTkZPKDYpLCBERUJVRyg3KTsKLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29kZTsKLQotICAgICAgICBMb2dTZXZlcml0eUVudW0oZmluYWwgaW50IGNvZGUpIHsKLSAgICAgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGV2ZWxvcG1lbnRQcm92aWRlciBkdHAgPSBuZXcgRGV2ZWxvcG1lbnRQcm92aWRlcigpOwotCi0gICAgICAgIFRvcG9sb2d5IHQgPSBkdHAubmV3VG9wb2xvZ3koIlNwbGl0V2l0aEVudW1TYW1wbGUiKTsKLQotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLQotICAgICAgICBMb2dTZXZlcml0eUVudW1bXSB2YWx1ZXMgPSBMb2dTZXZlcml0eUVudW0udmFsdWVzKCk7Ci0gICAgICAgIFRTdHJlYW08U3RyaW5nPiBkID0gdC5wb2xsKCgpIC0+IHZhbHVlc1tyLm5leHRJbnQodmFsdWVzLmxlbmd0aCldLnRvU3RyaW5nKCkrICJfTG9nIiwgNTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotCi0gICAgICAgIEVudW1NYXA8TG9nU2V2ZXJpdHlFbnVtLCBUU3RyZWFtPFN0cmluZz4+IGNhdGVnb3JpZXMgPSBkCi0gICAgICAgICAgICAuc3BsaXQoTG9nU2V2ZXJpdHlFbnVtLmNsYXNzLCBlIC0+IExvZ1NldmVyaXR5RW51bS52YWx1ZU9mKGUuc3BsaXQoIl8iKVswXSkpOwotCi0gICAgICAgIFRTdHJlYW08U3RyaW5nPiB3YXJuU3RyZWFtID0gY2F0ZWdvcmllcy5nZXQoTG9nU2V2ZXJpdHlFbnVtLldBUk5JTkcpLnRhZygiV0FSTiIpOwotICAgICAgICBUU3RyZWFtPFN0cmluZz4gZXJyb3JTdHJlYW0gPSBjYXRlZ29yaWVzLmdldChMb2dTZXZlcml0eUVudW0uRVJST1IpLnRhZygiRVJST1IiKTsKLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IGluZm9TdHJlYW0gPSBjYXRlZ29yaWVzLmdldChMb2dTZXZlcml0eUVudW0uSU5GTykudGFnKCJJTkZPIik7Ci0KLSAgICAgICAgd2FyblN0cmVhbS5zaW5rKGRhdGEgLT4gU3lzdGVtLm91dC5wcmludGxuKCJ3YXJuU3RyZWFtID0gIiArIGRhdGEpKTsKLSAgICAgICAgZXJyb3JTdHJlYW0uc2luayhkYXRhIC0+IFN5c3RlbS5vdXQucHJpbnRsbigiZXJyb3JTdHJlYW0gPSAiICsgZGF0YSkpOwotICAgICAgICBpbmZvU3RyZWFtLnNpbmsoZGF0YSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oImluZm9TdHJlYW0gPSAiICsgZGF0YSkpOwotCi0gICAgICAgIGR0cC5zdWJtaXQodCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGR0cC5nZXRTZXJ2aWNlcygpLmdldFNlcnZpY2UoSHR0cFNlcnZlci5jbGFzcykuZ2V0Q29uc29sZVVybCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9TdHJlYW1UYWdzLmphdmEgYi9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9TdHJlYW1UYWdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjNmYTkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvU3RyZWFtVGFncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29uc29sZS5zZXJ2ZXIuSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGV2ZWxvcG1lbnQuRGV2ZWxvcG1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi0vKioKLSAqIElsbHVzdHJhdGVzIHRhZ2dpbmcgVFN0cmVhbXMgd2l0aCBzdHJpbmcgbGFiZWxzLgotICovCi1wdWJsaWMgY2xhc3MgU3RyZWFtVGFncyB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERldmVsb3BtZW50UHJvdmlkZXIgZHRwID0gbmV3IERldmVsb3BtZW50UHJvdmlkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIFRvcG9sb2d5IHQgPSBkdHAubmV3VG9wb2xvZ3koIlN0cmVhbVRhZ3MiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRhZyB0aGUgc291cmNlIHN0cmVhbSB3aXRoIAotICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgVFN0cmVhbTxEb3VibGU+IGQgID0gdC5wb2xsKCgpIC0+IChyLm5leHREb3VibGUoKSAqIDMpLCAKLSAgICAgICAgICAgICAgICAxMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykudGFnKCJkb3RzIiwgImhhc2hlcyIsICJhdHMiKTsKLQotICAgICAgICBMaXN0PFRTdHJlYW08RG91YmxlPj4gc3BsaXRzID0gZC5zcGxpdCgzLCB0dXBsZSAtPiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR1cGxlLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNwbGl0cy5nZXQoMCkudGFnKCJkb3RzIikuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50KCIuIikpOwotICAgICAgICBzcGxpdHMuZ2V0KDEpLnRhZygiaGFzaGVzIikuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50KCIjIikpOwotICAgICAgICBzcGxpdHMuZ2V0KDIpLnRhZygiYXRzIikuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50KCJAIikpOwotICAgICAgICAKLSAgICAgICAgZHRwLnN1Ym1pdCh0KTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkdHAuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEh0dHBTZXJ2ZXIuY2xhc3MpLmdldENvbnNvbGVVcmwoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdG9wb2xvZ3kvVGVybWluYXRlQWZ0ZXJOVHVwbGVzLmphdmEgYi9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9UZXJtaW5hdGVBZnRlck5UdXBsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1YjNkMC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy90b3BvbG9neS9UZXJtaW5hdGVBZnRlck5UdXBsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQucHJvdmlkZXJzLmRpcmVjdC5EaXJlY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UU3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi0vKioKLSAqIFRoaXMgYXBwbGljYXRpb24gc2ltdWxhdGVzIGEgY3Jhc2ggYW5kIHRlcm1pbmF0ZXMgdGhlIEpWTSBhZnRlciBwcm9jZXNzaW5nCi0gKiBhIHByZXNldCBudW1iZXIgb2YgdHVwbGVzLiBUaGlzIGFwcGxpY2F0aW9uIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIAotICogbW9uaXRvcmluZyBzY3JpcHQgdG8gZGVtb25zdHJhdGUgdGhlIHJlc3RhcnQgb2YgYSBKVk0gd2hpY2ggaGFzIHRlcm1pbmF0ZWQKLSAqIGJlY2F1c2Ugb2YgYW4gRWRnZW50IGFwcGxpY2F0aW9uIGNyYXNoLgotICovCi1wdWJsaWMgY2xhc3MgVGVybWluYXRlQWZ0ZXJOVHVwbGVzIHsKLSAgICAvKiogVGhlIGFwcGxpY2F0aW9uIHdpbGwgdGVybWluYXRlIHRoZSBKVk0gYWZ0ZXIgdGhpcyB0dXBsZSBjb3VudCAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFUk1JTkFURV9DT1VOVCA9IDE1OwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERpcmVjdFByb3ZpZGVyIHRwID0gbmV3IERpcmVjdFByb3ZpZGVyKCk7Ci0KLSAgICAgICAgVG9wb2xvZ3kgdCA9IHRwLm5ld1RvcG9sb2d5KCJQZXJpb2RpY1NvdXJjZSIpOwotCi0gICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgdGhlIERpcmVjdCBwcm92aWRlciB0aGUgZ3JhcGggY2FuIGFjY2VzcwotICAgICAgICAvLyBvYmplY3RzIGNyZWF0ZWQgd2hpbGUgdGhlIHRvcG9sb2d5IGlzIGJlaW5nIGRlZmluZWQKLSAgICAgICAgLy8gKGluIHRoaXMgY2FzZSB0aGUgUmFuZG9tIG9iamVjdCByKS4KLSAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgIFRTdHJlYW08RG91YmxlPiBnYXVzc2lhbiA9IHQucG9sbCgoKSAtPiByLm5leHRHYXVzc2lhbigpLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsKLQotICAgICAgICAvLyBQcm9ncmFtIHRlcm1pbmF0aW9uCi0gICAgICAgIEF0b21pY0ludGVnZXIgY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKLSAgICAgICAgZ2F1c3NpYW4gPSBnYXVzc2lhbi5wZWVrKGcgLT4gewotICAgICAgICAgICAgaWYgKGNvdW50LmluY3JlbWVudEFuZEdldCgpID49IFRFUk1JTkFURV9DT1VOVCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIEpWTSB0ZXJtaW5hdGVzIGFmdGVyIHByb2Nlc3NpbmcgIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgVEVSTUlOQVRFX0NPVU5UICsgIiB0dXBsZXMiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gUGVlayBhdCB0aGUgdmFsdWUgb24gdGhlIFN0cmVhbSBwcmludGluZyBpdCB0byBTeXN0ZW0ub3V0Ci0gICAgICAgIGdhdXNzaWFuID0gZ2F1c3NpYW4ucGVlayhnIC0+IFN5c3RlbS5vdXQucHJpbnRsbigiUjoiICsgZykpOwotCi0gICAgICAgIHRwLnN1Ym1pdCh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3V0aWxzL2J1aWxkLmdyYWRsZSBiL3NhbXBsZXMvdXRpbHMvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzBhMDZkLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdXRpbHMvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICAvLyBOLkIuIGNvbW1vbiBkZXBlbmRlbmNpZXMgYXJlIHNldCBpbiByb290IGJ1aWxkLmdyYWRsZQotCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzp1dGlsczptZXRyaWNzJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YW5hbHl0aWNzOm1hdGgzJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YW5hbHl0aWNzOnNlbnNvcnMnCi0KLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL21ldHJpY3MvUGVyaW9kaWNTb3VyY2VXaXRoTWV0cmljcy5qYXZhIGIvc2FtcGxlcy91dGlscy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdXRpbHMvbWV0cmljcy9QZXJpb2RpY1NvdXJjZVdpdGhNZXRyaWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODNlM2UuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy91dGlscy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdXRpbHMvbWV0cmljcy9QZXJpb2RpY1NvdXJjZVdpdGhNZXRyaWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy51dGlscy5tZXRyaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50Lm1ldHJpY3MuTWV0cmljczsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5tZXRyaWNzLk1ldHJpY3NTZXR1cDsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5wcm92aWRlcnMuZGlyZWN0LkRpcmVjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5NZXRyaWNSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIFBlcmlvZGljU291cmNlV2l0aE1ldHJpY3MgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGlyZWN0UHJvdmlkZXIgdHAgPSBuZXcgRGlyZWN0UHJvdmlkZXIoKTsKLQotICAgICAgICBUb3BvbG9neSB0ID0gdHAubmV3VG9wb2xvZ3koIlBlcmlvZGljU291cmNlIik7Ci0KLSAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgIFRTdHJlYW08RG91YmxlPiBnYXVzc2lhbiA9IHQucG9sbCgoKSAtPiByLm5leHRHYXVzc2lhbigpLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsKLQotICAgICAgICAvLyBUZXN0aW5nIFBlZWsKLSAgICAgICAgZ2F1c3NpYW4gPSBnYXVzc2lhbi5wZWVrKGcgLT4gU3lzdGVtLm91dC5wcmludGxuKCJSOiIgKyBnKSk7Ci0KLSAgICAgICAgLy8gTWVhc3VyZSB0aGUgdHVwbGUgY291bnQgZm9yIHRoZSBnYXVzc2lhbiBUU3RyZWFtCi0gICAgICAgIGdhdXNzaWFuID0gTWV0cmljcy5jb3VudGVyKGdhdXNzaWFuKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEEgZmlsdGVyCi0gICAgICAgIGdhdXNzaWFuID0gZ2F1c3NpYW4uZmlsdGVyKGcgLT4gZyA+IDAuNSk7Ci0KLSAgICAgICAgLy8gTWVhc3VyZSB0dXBsZSBhcnJpdmFsIHJhdGUgYWZ0ZXIgZmlsdGVyaW5nCi0gICAgICAgIGdhdXNzaWFuID0gTWV0cmljcy5yYXRlTWV0ZXIoZ2F1c3NpYW4pOwotCi0gICAgICAgIC8vIEEgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgVFN0cmVhbTxTdHJpbmc+IGdzID0gZ2F1c3NpYW4ubWFwKGcgLT4gIkc6IiArIGcgKyAiOiIpOwotICAgICAgICBncy5wcmludCgpOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIG1ldHJpY3Mgc2VydmljZQotICAgICAgICBNZXRyaWNSZWdpc3RyeSBtZXRyaWNzID0gbmV3IE1ldHJpY1JlZ2lzdHJ5KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBTdGFydCBtZXRyaWNzIEpNWCByZXBvcnRlcgotICAgICAgICBNZXRyaWNzU2V0dXAud2l0aFJlZ2lzdHJ5KHRwLmdldFNlcnZpY2VzKCksIG1ldHJpY3MpLnN0YXJ0Sk1YUmVwb3J0ZXIoCi0gICAgICAgICAgICAgICAgUGVyaW9kaWNTb3VyY2VXaXRoTWV0cmljcy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIFN1Ym1pdCB0aGUgdG9wb2xvZ3kKLSAgICAgICAgdHAuc3VibWl0KHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL21ldHJpY3MvU3BsaXRXaXRoTWV0cmljcy5qYXZhIGIvc2FtcGxlcy91dGlscy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdXRpbHMvbWV0cmljcy9TcGxpdFdpdGhNZXRyaWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDQ0NDQuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy91dGlscy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdXRpbHMvbWV0cmljcy9TcGxpdFdpdGhNZXRyaWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy51dGlscy5tZXRyaWNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbnNvbGUuc2VydmVyLkh0dHBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQubWV0cmljcy5NZXRyaWNzOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kZXZlbG9wbWVudC5EZXZlbG9wbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLS8qKgotICogSW5zdHJ1bWVudHMgYSB0b3BvbG9neSB3aXRoIGEgdHVwbGUgY291bnRlciBvbiBhIHNwZWNpZmllZCBzdHJlYW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTcGxpdFdpdGhNZXRyaWNzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEZXZlbG9wbWVudFByb3ZpZGVyIGR0cCA9IG5ldyBEZXZlbG9wbWVudFByb3ZpZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBUb3BvbG9neSB0ID0gZHRwLm5ld1RvcG9sb2d5KFNwbGl0V2l0aE1ldHJpY3MuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOwotICAgICAgICAKLSAgICAgICAgVFN0cmVhbTxJbnRlZ2VyPiBkICA9IHQucG9sbCgoKSAtPiAoaW50KShyLm5leHRHYXVzc2lhbigpICogMy4wKSwgCi0gICAgICAgICAgICAgICAgMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotCi0gICAgICAgIExpc3Q8VFN0cmVhbTxJbnRlZ2VyPj4gc3BsaXRzID0gZC5zcGxpdCgzLCB0dXBsZSAtPiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR1cGxlLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8qIAotICAgICAgICAgKiBJbnNlcnQgYSBtZXRyaWMgY291bnRlciBmb3IgdGhlIHplcm9lcyBzdHJlYW0uICBOb3RlIHRoYXQgdGhlIAotICAgICAgICAgKiBEZXZlbG9wbWVudFByb3ZpZGVyIHN1Ym1pdHRlciB3aWxsIGluc2VydCBtZXRyaWMgY291bnRlcnMgYXQgCi0gICAgICAgICAqIHN1Ym1pdCB0aW1lIG9uIHRoZSBvdXRwdXQgb2YgZWFjaCBvcGxldCwgaW5jbHVkaW5nIHRoZSBjb3VudGVyCi0gICAgICAgICAqIGV4cGxpY2l0bHkgaW5zZXJ0ZWQgYmVsb3cuCi0gICAgICAgICAqLwotICAgICAgICBNZXRyaWNzLmNvdW50ZXIoc3BsaXRzLmdldCgwKSkuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50KCIuIikpOwotCi0gICAgICAgIHNwbGl0cy5nZXQoMSkuc2luayh0dXBsZSAtPiBTeXN0ZW0ub3V0LnByaW50KCIjIikpOwotICAgICAgICBzcGxpdHMuZ2V0KDIpLnNpbmsodHVwbGUgLT4gU3lzdGVtLm91dC5wcmludCgiQCIpKTsKLSAgICAgICAgCi0gICAgICAgIGR0cC5zdWJtaXQodCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkdHAuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEh0dHBTZXJ2ZXIuY2xhc3MpLmdldENvbnNvbGVVcmwoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy91dGlscy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdXRpbHMvc2Vuc29yL0hlYXJ0TW9uaXRvclNlbnNvci5qYXZhIGIvc2FtcGxlcy91dGlscy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdXRpbHMvc2Vuc29yL0hlYXJ0TW9uaXRvclNlbnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjliNGNhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL3NlbnNvci9IZWFydE1vbml0b3JTZW5zb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnV0aWxzLnNlbnNvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmZ1bmN0aW9uLlN1cHBsaWVyOwotCi0vKioKLSAqIFN0cmVhbXMgb2Ygc2ltdWxhdGVkIGhlYXJ0IG1vbml0b3Igc2Vuc29ycy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWFydE1vbml0b3JTZW5zb3IgaW1wbGVtZW50cyBTdXBwbGllcjxNYXA8U3RyaW5nLEludGVnZXI+PiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgLy8gSW5pdGlhbCBibG9vZCBwcmVzc3VyZQotICAgIHB1YmxpYyBJbnRlZ2VyIGN1cnJlbnRTeXN0b2xpYyA9IDExNTsKLSAgICBwdWJsaWMgSW50ZWdlciBjdXJyZW50RGlhc3RvbGljID0gNzU7Ci0gICAgUmFuZG9tIHJhbmQ7Ci0KLSAgICBwdWJsaWMgSGVhcnRNb25pdG9yU2Vuc29yKCkgewotICAgICAgICByYW5kID0gbmV3IFJhbmRvbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV2ZXJ5IGNhbGwgdG8gdGhpcyBtZXRob2QgcmV0dXJucyBhIG1hcCBjb250YWluaW5nIGEgcmFuZG9tIHN5c3RvbGljCi0gICAgICogcHJlc3N1cmUgYW5kIGEgcmFuZG9tIGRpYXN0b2xpYyBwcmVzc3VyZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0KCkgewotICAgICAgICAvLyBDaGFuZ2UgdGhlIGN1cnJlbnQgcHJlc3N1cmUgYnkgc29tZSByYW5kb20gYW1vdW50IGJldHdlZW4gLTIgYW5kIDIKLSAgICAgICAgSW50ZWdlciBuZXdTeXN0b2xpYyA9IHJhbmQubmV4dEludCgyICsgMSArIDIpIC0gMiArIGN1cnJlbnRTeXN0b2xpYzsKLSAgICAgICAgY3VycmVudFN5c3RvbGljID0gbmV3U3lzdG9saWM7Ci0KLSAgICAgICAgSW50ZWdlciBuZXdEaWFzdG9saWMgPSByYW5kLm5leHRJbnQoMiArIDEgKyAyKSAtIDIgKyBjdXJyZW50RGlhc3RvbGljOwotICAgICAgICBjdXJyZW50RGlhc3RvbGljID0gbmV3RGlhc3RvbGljOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IHByZXNzdXJlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICAgICAgcHJlc3N1cmVzLnB1dCgiU3lzdG9saWMiLCBjdXJyZW50U3lzdG9saWMpOwotICAgICAgICBwcmVzc3VyZXMucHV0KCJEaWFzdG9saWMiLCBjdXJyZW50RGlhc3RvbGljKTsKLSAgICAgICAgcmV0dXJuIHByZXNzdXJlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3V0aWxzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy91dGlscy9zZW5zb3IvUGVyaW9kaWNSYW5kb21TZW5zb3IuamF2YSBiL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL3NlbnNvci9QZXJpb2RpY1JhbmRvbVNlbnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2FhMjBmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL3NlbnNvci9QZXJpb2RpY1JhbmRvbVNlbnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnV0aWxzLnNlbnNvcjsKLQotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubWF0aDMudXRpbC5QYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLS8qKgotICogQSBmYWN0b3J5IG9mIHNpbXBsZSBwZXJpb2RpYyByYW5kb20gc2Vuc29yIHJlYWRpbmcgc3RyZWFtcy4KLSAqIDxwPgotICogVGhlIGdlbmVyYXRlZCB7QGxpbmsgVFN0cmVhbX0gaGFzIGEge0Bjb2RlIG9yZy5hcGFjaGUuY29tbW9ucy5tYXRoMy51dGlscy5QYWlyfQotICogdHVwbGUgdHlwZSB3aGVyZSB7QGxpbmsgUGFpciNnZXRGaXJzdCgpfSB0aGUgcmVhZGluZydzIG1zZWNUaW1lc3RhbXAKLSAqIGFuZCB7QGxpbmsgUGFpciNnZXRTZWNvbmQoKX0gaXMgdGhlIHNlbnNvciB2YWx1ZSByZWFkaW5nLgotICogPHA+Ci0gKiBUaGUgc2Vuc29yIHJlYWRpbmcgdmFsdWVzIGFyZSByYW5kb21seSBnZW5lcmF0ZWQgdmlhIHtAbGluayBSYW5kb219Ci0gKiBhbmQgaGF2ZSB0aGUgdmFsdWUgZGlzdHJpYnV0aW9ucywgYXMgZGVmaW5lZCBieSB7QGNvZGUgUmFuZG9tfS4KLSAqIDxwPgotICogRWFjaCBzdHJlYW0gaGFzIGl0cyBvd24ge0Bjb2RlIFJhbmRvbX0gb2JqZWN0IGluc3RhbmNlLgotICovCi1wdWJsaWMgY2xhc3MgUGVyaW9kaWNSYW5kb21TZW5zb3IgewotICAgIHByaXZhdGUgTG9uZyBzZWVkOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyByYW5kb20gcGVyaW9kaWMgc2Vuc29yIGZhY3RvcnkgY29uZmlndXJlZAotICAgICAqIHRvIHVzZSB7QGxpbmsgUmFuZG9tI1JhbmRvbSgpfS4gCi0gICAgICovCi0gICAgcHVibGljIFBlcmlvZGljUmFuZG9tU2Vuc29yKCkgewotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgcmFuZG9tIHBlcmlvZGljIHNlbnNvciBmYWN0b3J5IGNvbmZpZ3VyZWQKLSAgICAgKiB0byB1c2Uge0BsaW5rIFJhbmRvbSNSYW5kb20obG9uZyl9LiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VlZCBzZWVkIHRvIHVzZSB3aGVuIGNyZWF0aW5nIG5ldyBzZW5zb3Igc3RyZWFtcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGVyaW9kaWNSYW5kb21TZW5zb3IobG9uZyBzZWVkKSB7Ci0gICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2VlZCB0byBiZSB1c2VkIGJ5IHN1YnNlcXVlbnRseSBjcmVhdGVkIHNlbnNvciBzdHJlYW1zLgotICAgICAqIEBwYXJhbSBzZWVkIHRoZSBzZWVkIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VlZChsb25nIHNlZWQpIHsKLSAgICAgICAgdGhpcy5zZWVkID0gc2VlZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBSYW5kb20gbmV3UmFuZG9tKCkgewotICAgICAgICBpZiAoc2VlZCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5kb20oc2VlZCk7Ci0gICAgICAgIHJldHVybiBuZXcgUmFuZG9tKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHBlcmlvZGljIHNlbnNvciBzdHJlYW0gd2l0aCByZWFkaW5ncyBmcm9tIHtAbGluayBSYW5kb20jbmV4dEdhdXNzaWFuKCl9LgotICAgICAqIEBwYXJhbSB0IHRoZSB0b3BvbG9neSB0byBhZGQgdGhlIHNlbnNvciBzdHJlYW0gdG8KLSAgICAgKiBAcGFyYW0gcGVyaW9kTXNlYyBob3cgZnJlcXVlbnRseSB0byBnZW5lcmF0ZSBhIHJlYWRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBzZW5zb3IgdmFsdWUgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIFRTdHJlYW08UGFpcjxMb25nLERvdWJsZT4+IG5ld0dhdXNzaWFuKFRvcG9sb2d5IHQsIGxvbmcgcGVyaW9kTXNlYykgewotICAgICAgICBSYW5kb20gciA9IG5ld1JhbmRvbSgpOwotICAgICAgICByZXR1cm4gdC5wb2xsKCgpIC0+IG5ldyBQYWlyPExvbmcsRG91YmxlPihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgci5uZXh0R2F1c3NpYW4oKSksIAotICAgICAgICAgICAgICAgIHBlcmlvZE1zZWMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwZXJpb2RpYyBzZW5zb3Igc3RyZWFtIHdpdGggcmVhZGluZ3MgZnJvbSB7QGxpbmsgUmFuZG9tI25leHREb3VibGUoKX0uCi0gICAgICogQHBhcmFtIHQgdGhlIHRvcG9sb2d5IHRvIGFkZCB0aGUgc2Vuc29yIHN0cmVhbSB0bwotICAgICAqIEBwYXJhbSBwZXJpb2RNc2VjIGhvdyBmcmVxdWVudGx5IHRvIGdlbmVyYXRlIGEgcmVhZGluZwotICAgICAqIEByZXR1cm4gdGhlIHNlbnNvciB2YWx1ZSBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgVFN0cmVhbTxQYWlyPExvbmcsRG91YmxlPj4gbmV3RG91YmxlKFRvcG9sb2d5IHQsIGxvbmcgcGVyaW9kTXNlYykgewotICAgICAgICBSYW5kb20gciA9IG5ld1JhbmRvbSgpOwotICAgICAgICByZXR1cm4gdC5wb2xsKCgpIC0+IG5ldyBQYWlyPExvbmcsRG91YmxlPihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgci5uZXh0RG91YmxlKCkpLCAKLSAgICAgICAgICAgICAgICBwZXJpb2RNc2VjLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcGVyaW9kaWMgc2Vuc29yIHN0cmVhbSB3aXRoIHJlYWRpbmdzIGZyb20ge0BsaW5rIFJhbmRvbSNuZXh0RmxvYXQoKX0uCi0gICAgICogQHBhcmFtIHQgdGhlIHRvcG9sb2d5IHRvIGFkZCB0aGUgc2Vuc29yIHN0cmVhbSB0bwotICAgICAqIEBwYXJhbSBwZXJpb2RNc2VjIGhvdyBmcmVxdWVudGx5IHRvIGdlbmVyYXRlIGEgcmVhZGluZwotICAgICAqIEByZXR1cm4gdGhlIHNlbnNvciB2YWx1ZSBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgVFN0cmVhbTxQYWlyPExvbmcsRmxvYXQ+PiBuZXdGbG9hdChUb3BvbG9neSB0LCBsb25nIHBlcmlvZE1zZWMpIHsKLSAgICAgICAgUmFuZG9tIHIgPSBuZXdSYW5kb20oKTsKLSAgICAgICAgcmV0dXJuIHQucG9sbCgoKSAtPiBuZXcgUGFpcjxMb25nLEZsb2F0PihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgci5uZXh0RmxvYXQoKSksIAotICAgICAgICAgICAgICAgIHBlcmlvZE1zZWMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwZXJpb2RpYyBzZW5zb3Igc3RyZWFtIHdpdGggcmVhZGluZ3MgZnJvbSB7QGxpbmsgUmFuZG9tI25leHRMb25nKCl9LgotICAgICAqIEBwYXJhbSB0IHRoZSB0b3BvbG9neSB0byBhZGQgdGhlIHNlbnNvciBzdHJlYW0gdG8KLSAgICAgKiBAcGFyYW0gcGVyaW9kTXNlYyBob3cgZnJlcXVlbnRseSB0byBnZW5lcmF0ZSBhIHJlYWRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBzZW5zb3IgdmFsdWUgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIFRTdHJlYW08UGFpcjxMb25nLExvbmc+PiBuZXdMb25nKFRvcG9sb2d5IHQsIGxvbmcgcGVyaW9kTXNlYykgewotICAgICAgICBSYW5kb20gciA9IG5ld1JhbmRvbSgpOwotICAgICAgICByZXR1cm4gdC5wb2xsKCgpIC0+IG5ldyBQYWlyPExvbmcsTG9uZz4oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIHIubmV4dExvbmcoKSksIAotICAgICAgICAgICAgICAgIHBlcmlvZE1zZWMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwZXJpb2RpYyBzZW5zb3Igc3RyZWFtIHdpdGggcmVhZGluZ3MgZnJvbSB7QGxpbmsgUmFuZG9tI25leHRJbnQoKX0uCi0gICAgICogQHBhcmFtIHQgdGhlIHRvcG9sb2d5IHRvIGFkZCB0aGUgc2Vuc29yIHN0cmVhbSB0bwotICAgICAqIEBwYXJhbSBwZXJpb2RNc2VjIGhvdyBmcmVxdWVudGx5IHRvIGdlbmVyYXRlIGEgcmVhZGluZwotICAgICAqIEByZXR1cm4gdGhlIHNlbnNvciB2YWx1ZSBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgVFN0cmVhbTxQYWlyPExvbmcsSW50ZWdlcj4+IG5ld0ludGVnZXIoVG9wb2xvZ3kgdCwgbG9uZyBwZXJpb2RNc2VjKSB7Ci0gICAgICAgIFJhbmRvbSByID0gbmV3UmFuZG9tKCk7Ci0gICAgICAgIHJldHVybiB0LnBvbGwoKCkgLT4gbmV3IFBhaXI8TG9uZyxJbnRlZ2VyPihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgci5uZXh0SW50KCkpLCAKLSAgICAgICAgICAgICAgICBwZXJpb2RNc2VjLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcGVyaW9kaWMgc2Vuc29yIHN0cmVhbSB3aXRoIHJlYWRpbmdzIGZyb20ge0BsaW5rIFJhbmRvbSNuZXh0SW50KGludCl9LgotICAgICAqIEBwYXJhbSB0IHRoZSB0b3BvbG9neSB0byBhZGQgdGhlIHNlbnNvciBzdHJlYW0gdG8KLSAgICAgKiBAcGFyYW0gcGVyaW9kTXNlYyBob3cgZnJlcXVlbnRseSB0byBnZW5lcmF0ZSBhIHJlYWRpbmcKLSAgICAgKiBAcGFyYW0gYm91bmQgdGhlIHVwcGVyIGJvdW5kIChleGNsdXNpdmUpLiBNdXN0IGJlIHBvc2l0aXZlLgotICAgICAqIEByZXR1cm4gdGhlIHNlbnNvciB2YWx1ZSBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgVFN0cmVhbTxQYWlyPExvbmcsSW50ZWdlcj4+IG5ld0ludGVnZXIoVG9wb2xvZ3kgdCwgbG9uZyBwZXJpb2RNc2VjLCBpbnQgYm91bmQpIHsKLSAgICAgICAgUmFuZG9tIHIgPSBuZXdSYW5kb20oKTsKLSAgICAgICAgcmV0dXJuIHQucG9sbCgoKSAtPiBuZXcgUGFpcjxMb25nLEludGVnZXI+KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCByLm5leHRJbnQoYm91bmQpKSwgCi0gICAgICAgICAgICAgICAgcGVyaW9kTXNlYywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHBlcmlvZGljIHNlbnNvciBzdHJlYW0gd2l0aCByZWFkaW5ncyBmcm9tIHtAbGluayBSYW5kb20jbmV4dEJvb2xlYW4oKX0uCi0gICAgICogQHBhcmFtIHQgdGhlIHRvcG9sb2d5IHRvIGFkZCB0aGUgc2Vuc29yIHN0cmVhbSB0bwotICAgICAqIEBwYXJhbSBwZXJpb2RNc2VjIGhvdyBmcmVxdWVudGx5IHRvIGdlbmVyYXRlIGEgcmVhZGluZwotICAgICAqIEByZXR1cm4gdGhlIHNlbnNvciB2YWx1ZSBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgVFN0cmVhbTxQYWlyPExvbmcsQm9vbGVhbj4+IG5ld0Jvb2xlYW4oVG9wb2xvZ3kgdCwgbG9uZyBwZXJpb2RNc2VjKSB7Ci0gICAgICAgIFJhbmRvbSByID0gbmV3UmFuZG9tKCk7Ci0gICAgICAgIHJldHVybiB0LnBvbGwoKCkgLT4gbmV3IFBhaXI8TG9uZyxCb29sZWFuPihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgci5uZXh0Qm9vbGVhbigpKSwgCi0gICAgICAgICAgICAgICAgcGVyaW9kTXNlYywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHBlcmlvZGljIHNlbnNvciBzdHJlYW0gd2l0aCByZWFkaW5ncyBmcm9tIHtAbGluayBSYW5kb20jbmV4dEJ5dGVzKGJ5dGVbXSl9LgotICAgICAqIEBwYXJhbSB0IHRoZSB0b3BvbG9neSB0byBhZGQgdGhlIHNlbnNvciBzdHJlYW0gdG8KLSAgICAgKiBAcGFyYW0gcGVyaW9kTXNlYyBob3cgZnJlcXVlbnRseSB0byBnZW5lcmF0ZSBhIHJlYWRpbmcKLSAgICAgKiBAcGFyYW0gbkJ5dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gZWFjaCByZWFkaW5nIHR1cGxlCi0gICAgICogQHJldHVybiB0aGUgc2Vuc29yIHZhbHVlIHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBUU3RyZWFtPFBhaXI8TG9uZyxieXRlW10+PiBuZXdCeXRlcyhUb3BvbG9neSB0LCBsb25nIHBlcmlvZE1zZWMsIGludCBuQnl0ZXMpIHsKLSAgICAgICAgUmFuZG9tIHIgPSBuZXdSYW5kb20oKTsKLSAgICAgICAgcmV0dXJuIHQucG9sbCgoKSAtPiB7IGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW25CeXRlc107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm5leHRCeXRlcyhieXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhaXI8TG9uZyxieXRlW10+KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBieXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgCi0gICAgICAgICAgICAgICAgcGVyaW9kTXNlYywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL3NlbnNvci9TaW1wbGVTaW11bGF0ZWRTZW5zb3IuamF2YSBiL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL3NlbnNvci9TaW1wbGVTaW11bGF0ZWRTZW5zb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzMDZjYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL3V0aWxzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy91dGlscy9zZW5zb3IvU2ltcGxlU2ltdWxhdGVkU2Vuc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy51dGlscy5zZW5zb3I7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuYW5hbHl0aWNzLnNlbnNvcnMuUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24uU3VwcGxpZXI7Ci0KLS8qKgotICogQSBzaW1wbGUgc2ltdWxhdGVkIHNlbnNvci4KLSAqIDxwPgotICogVGhlIHNlbnNvciBzdGFydHMgb2ZmIHdpdGggYW4gaW5pdGlhbCB2YWx1ZS4KLSAqIEVhY2ggY2FsbCB0byB7QGxpbmsgI2dldCgpfSBjaGFuZ2VzIHRoZSBjdXJyZW50IHZhbHVlIGJ5Ci0gKiBhIHJhbmRvbSBhbW91bnQgYmV0d2VlbiBwbHVzL21pbnVzIHtAY29kZSBkZWx0YUZhY3Rvcn0uCi0gKiBUaGUgbmV3IGN1cnJlbnQgdmFsdWUgaXMgbGltaXRlZCB0byBhIHtAY29kZSByYW5nZX0KLSAqIGFuZCB0aGVuIHJvdW5kZWQgdG8gMSBmcmFjdGlvbmFsIGRpZ2l0LiAKLSAqIFNlZSB7QGxpbmsgI3NldE51bWJlckZyYWN0aW9uYWxEaWdpdHMoaW50KX0uCi0gKiA8L3A+PHA+Ci0gKiBTYW1wbGUgdXNlOgotICogPHByZT57QGNvZGUKLSAqIFRvcG9sb2d5IHQgPSAuLi47Ci0gKiAvLyBhIG1pbGVzLXBlci1nYWxsb24gc2Vuc29yCi0gKiBTaW1wbGVTaW11bGF0ZWRTZW5zb3IgYXZnTXBnU2Vuc29yID0gbmV3IFNpbXBsZVNpbXVsYXRlZFNlbnNvcigxMC41LCAwLjQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlczxEb3VibGU+LmNsb3NlZCg3LjAsMTQuMCkpOwotICogVFN0cmVhbTxEb3VibGU+IGF2Z01wZyA9IHQucG9sbChhdmdNcGdTZW5zb3IsIDEsIFRpbWVVbml0LlNFQ09ORFMpOwotICogCi0gKiAvLyBhbiBpbnRlZ2VyIHZhbHVlZCBzZW5zb3IKLSAqIFNpbXBsZVNpbXVsYXRlZFNlbnNvciBkb3VibGVTZW5zb3IgPSBuZXcgU2ltcGxlU2ltdWxhdGVkU2Vuc29yKCk7Ci0gKiBUU3RyZWFtPEludGVnZXI+IGludFNlbnNvciA9IHQucG9sbCgoKSAtPiBkb3VibGVTZW5zb3IuZ2V0KCkuaW50VmFsdWUoKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVGltZVVuaXQuU0VDT05EUyk7Ci0gKiB9PC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTaW11bGF0ZWRTZW5zb3IgaW1wbGVtZW50cyBTdXBwbGllcjxEb3VibGU+IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwcml2YXRlIGludCBudW1GcmFjRGlnaXRzOwotICAgIHByaXZhdGUgdm9sYXRpbGUgRGVjaW1hbEZvcm1hdCBkZjsKLSAgICBwcml2YXRlIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOwotICAgIHByaXZhdGUgZmluYWwgUmFuZ2U8RG91YmxlPiByYW5nZTsKLSAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBkZWx0YUZhY3RvcjsKLSAgICBwcml2YXRlIGRvdWJsZSBjdXJyZW50VmFsdWU7Ci0gICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzZW5zb3IuCi0gICAgICogPHA+Ci0gICAgICogU2FtZSBhcyB7QGNvZGUgU2ltcGxlU2ltdWxhdGVkU2Vuc29yKDAuMCwgMS4wLCBudWxsKX07Ci0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBTaW1wbGVTaW11bGF0ZWRTZW5zb3IoKSB7Ci0gICAgICAgIHRoaXMoMC4wLCAxLjAsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzZW5zb3IuCi0gICAgICogPHA+Ci0gICAgICogU2FtZSBhcyB7QGNvZGUgU2ltcGxlU2ltdWxhdGVkU2Vuc29yKGluaXRpYWxWYWx1ZSwgMS4wLCBudWxsKX07Ci0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIGluaXRpYWwgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltcGxlU2ltdWxhdGVkU2Vuc29yKGRvdWJsZSBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgdGhpcyhpbml0aWFsVmFsdWUsIDEuMCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNlbnNvci4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBTYW1lIGFzIHtAY29kZSBTaW1wbGVTaW11bGF0ZWRTZW5zb3IoaW5pdGlhbFZhbHVlLCBkZWx0YUZhY3RvciwgbnVsbCl9OwotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gaW5pdGlhbFZhbHVlIHRoZSBpbml0aWFsIHZhbHVlLgotICAgICAqIEBwYXJhbSBkZWx0YUZhY3RvciBtYXhpbXVtIHBsdXMvbWludXMgY2hhbmdlIG9uIGVhY2gge0Bjb2RlIGdldCgpfS4KLSAgICAgKiAgICAgICAgICAgICAgZS5nLiwgMS4wIHRvIGxpbWl0IGNoYW5nZSB0byArLy0gMS4wLgotICAgICAqICAgICAgICAgICAgICBNdXN0IGJlICZndDsgMC4wCi0gICAgICovCi0gICAgcHVibGljIFNpbXBsZVNpbXVsYXRlZFNlbnNvcihkb3VibGUgaW5pdGlhbFZhbHVlLCBkb3VibGUgZGVsdGFGYWN0b3IpIHsKLSAgICAgICAgdGhpcyhpbml0aWFsVmFsdWUsIGRlbHRhRmFjdG9yLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2Vuc29yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIGluaXRpYWwgdmFsdWUuICBNdXN0IGJlIHdpdGhpbiByYW5nZS4KLSAgICAgKiBAcGFyYW0gZGVsdGFGYWN0b3IgbWF4aW11bSBwbHVzL21pbnVzIGNoYW5nZSBvbiBlYWNoIHtAbGluayAjZ2V0KCl9LgotICAgICAqICAgICAgICAgICAgICBlLmcuLCAxLjAgdG8gbGltaXQgY2hhbmdlIHRvICsvLSAxLjAuCi0gICAgICogICAgICAgICAgICAgIE11c3QgYmUgJmd0OyAwLjAKLSAgICAgKiBAcGFyYW0gcmFuZ2UgbWF4aW11bSBzZW5zb3IgdmFsdWUgcmFuZ2UuIFVubGltaXRlZCBpZiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBTaW1wbGVTaW11bGF0ZWRTZW5zb3IoZG91YmxlIGluaXRpYWxWYWx1ZSwKLSAgICAgICAgICAgIGRvdWJsZSBkZWx0YUZhY3RvciwgUmFuZ2U8RG91YmxlPiByYW5nZSkgewotICAgICAgICBpZiAocmFuZ2UhPW51bGwgJiYgIXJhbmdlLmNvbnRhaW5zKGluaXRpYWxWYWx1ZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbml0aWFsVmFsdWUiKTsKLSAgICAgICAgaWYgKGRlbHRhRmFjdG9yIDw9IDAuMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlbHRhRmFjdG9yIik7Ci0gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gaW5pdGlhbFZhbHVlOwotICAgICAgICB0aGlzLmRlbHRhRmFjdG9yID0gZGVsdGFGYWN0b3I7Ci0gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsKLSAgICAgICAgc2V0TnVtYmVyRnJhY3Rpb25hbERpZ2l0cygxKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IG51bWJlciBvZiBmcmFjdGlvbmFsIGRpZ2l0cyB0byByb3VuZCBzZW5zb3IgdmFsdWVzIHRvLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgY2xhc3Mgb2ZmZXJzIHJvdW5kaW5nIGFzIGEgY29udmVuaWVuY2UgYW5kIGJlY2F1c2UKLSAgICAgKiBhbmNlc3RvcnMgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBoYWQgc3VjaCBhIHNjaGVtZS4KLSAgICAgKiA8L3A+Ci0gICAgICogQHBhcmFtIG51bUZyYWNEaWdpdHMgIGlmICZsdDs9IDAsIG5vIHJvdW5kaW5nIHdpbGwgYmUgcGVyZm9ybWVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyRnJhY3Rpb25hbERpZ2l0cyhpbnQgbnVtRnJhY0RpZ2l0cykgewotICAgICAgICB0aGlzLm51bUZyYWNEaWdpdHMgPSBudW1GcmFjRGlnaXRzOwotICAgICAgICBpZiAobnVtRnJhY0RpZ2l0cyA8PSAwKSB7Ci0gICAgICAgICAgICBkZiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgZnJhY1BhdHRlcm4gPSAiIjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhY0RpZ2l0czsgaSsrKQotICAgICAgICAgICAgICAgIGZyYWNQYXR0ZXJuICs9ICIjIjsKLSAgICAgICAgICAgIGRmID0gbmV3IERlY2ltYWxGb3JtYXQoIiMuIitmcmFjUGF0dGVybik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzIHNldHRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyRnJhY3Rpb25hbERpZ2l0cygpIHsKLSAgICAgICAgcmV0dXJuIG51bUZyYWNEaWdpdHM7Ci0gICAgfQotICAgIAotICAgIC8qKiBHZXQgdGhlIHJhbmdlIHNldHRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBSYW5nZTxEb3VibGU+IGdldFJhbmdlKCkgewotICAgICAgICByZXR1cm4gcmFuZ2U7Ci0gICAgfQotICAgIAotICAgIC8qKiBHZXQgdGhlIGRlbHRhRmFjdG9yIHNldHRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RGVsdGFGYWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBkZWx0YUZhY3RvcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqIEdldCB0aGUgbmV4dCBzZW5zb3IgdmFsdWUgYXMgZGVzY3JpYmVkIGluIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEb3VibGUgZ2V0KCkgewotICAgICAgICBkb3VibGUgZGVsdGEgPSAyICogci5uZXh0RG91YmxlKCkgLSAxLjA7IC8vIGJldHdlZW4gLTEuMCBhbmQgMS4wCi0gICAgICAgIGRvdWJsZSBuZXh0VmFsdWUgPSBjdXJyZW50VmFsdWUgKyBkZWx0YSAqIGRlbHRhRmFjdG9yOwotICAgICAgICBpZiAocmFuZ2UhPW51bGwgJiYgIXJhbmdlLmNvbnRhaW5zKG5leHRWYWx1ZSkpIHsKLSAgICAgICAgICAgIG5leHRWYWx1ZSA9IG5leHRWYWx1ZSA+IGN1cnJlbnRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgPyByYW5nZS51cHBlckVuZHBvaW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogcmFuZ2UubG93ZXJFbmRwb2ludCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZiAhPSBudWxsKQotICAgICAgICAgICAgbmV4dFZhbHVlID0gRG91YmxlLnZhbHVlT2YoZGYuZm9ybWF0KG5leHRWYWx1ZSkpOwotICAgICAgICBjdXJyZW50VmFsdWUgPSBuZXh0VmFsdWU7Ci0gICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy91dGlscy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdXRpbHMvc2Vuc29yL1NpbXVsYXRlZFNlbnNvcnMuamF2YSBiL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL3NlbnNvci9TaW11bGF0ZWRTZW5zb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODU2ZmYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy91dGlscy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3NhbXBsZXMvdXRpbHMvc2Vuc29yL1NpbXVsYXRlZFNlbnNvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudXRpbHMuc2Vuc29yOwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLQotLyoqCi0gKiBTdHJlYW1zIG9mIHNpbXVsYXRlZCBzZW5zb3JzLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXVsYXRlZFNlbnNvcnMgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc3RyZWFtIG9mIHNpbXVsYXRlZCBidXJzdHkgc2Vuc29yIHJlYWRpbmdzLgotICAgICAqIAotICAgICAqIFNpbXVsYXRpb24gb2YgcmVhZGluZyBhIHNlbnNvciBldmVyeSAxMDBtcyB3aXRoIHRoZSByZWFkaW5ncwotICAgICAqIGdlbmVyYWxseSBmYWxsaW5nIGJlbG93IDIuMCAoYWJzb2x1dGUpIGJ1dCByYW5kb21seSBoYXZlCi0gICAgICogcHJvbG9uZ2VkIGJ1cnN0cyBvZiBoaWdoZXIgdmFsdWVzLgotICAgICAqIAotICAgICAqIEVhY2ggdHVwbGUgaXMgYSBKU09OIG9iamVjdCBjb250YWluaW5nOgotICAgICAqIDxVTD4KLSAgICAgKiA8TEk+e0Bjb2RlIG5hbWV9IC0gTmFtZSBvZiB0aGUgc2Vuc29yIGZyb20ge0Bjb2RlIG5hbWV9LjwvTEk+Ci0gICAgICogPExJPntAY29kZSByZWFkaW5nfSAtIFZhbHVlLjwvTEk+Ci0gICAgICogPC9VTD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9wb2xvZ3kgVG9wb2xvZ3kgdG8gYmUgYWRkZWQgdG8uCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgc2Vuc29yIGluIHRoZSBKU09OIG91dHB1dC4KLSAgICAgKiBAcmV0dXJuIFN0cmVhbSBjb250YWluaW5nIGJ1cnN0eSBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVFN0cmVhbTxKc29uT2JqZWN0PiBidXJzdHlTZW5zb3IoVG9wb2xvZ3kgdG9wb2xvZ3ksIFN0cmluZyBuYW1lKSB7Ci0KLSAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7Ci0KLSAgICAgICAgVFN0cmVhbTxEb3VibGU+IHNlbnNvciA9IHRvcG9sb2d5LnBvbGwoKCkgLT4gci5uZXh0R2F1c3NpYW4oKSwgMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotCi0gICAgICAgIGJvb2xlYW5bXSBhYm5vcm1hbCA9IG5ldyBib29sZWFuWzFdOwotICAgICAgICBpbnRbXSBjb3VudCA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGRvdWJsZVtdIGRlbHRhID0gbmV3IGRvdWJsZVsxXTsKLSAgICAgICAgc2Vuc29yID0gc2Vuc29yLm1vZGlmeSh0IC0+IHsKLSAgICAgICAgICAgIGlmIChhYm5vcm1hbFswXSB8fCByLm5leHRJbnQoMTAwKSA8IDQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFibm9ybWFsWzBdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhWzBdID0gMC41ICsgMiAqIHIubmV4dEdhdXNzaWFuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50WzBdID0gNSArIHIubmV4dEludCgyMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFibm9ybWFsWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY291bnRbMF0tLTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRbMF0gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgYWJub3JtYWxbMF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdCArIGRlbHRhWzBdOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHQ7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNlbnNvciA9IHNlbnNvci5maWx0ZXIodCAtPiBNYXRoLmFicyh0KSA+IDEuNSk7Ci0KLSAgICAgICAgcmV0dXJuIHNlbnNvci5tYXAodCAtPiB7Ci0gICAgICAgICAgICBKc29uT2JqZWN0IGogPSBuZXcgSnNvbk9iamVjdCgpOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgibmFtZSIsIG5hbWUpOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgicmVhZGluZyIsIHQpOwotICAgICAgICAgICAgcmV0dXJuIGo7Ci0gICAgICAgIH0pOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL3V0aWxzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvc2FtcGxlcy91dGlscy9zZW5zb3IvU2ltdWxhdGVkVGVtcGVyYXR1cmVTZW5zb3IuamF2YSBiL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL3NlbnNvci9TaW11bGF0ZWRUZW1wZXJhdHVyZVNlbnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ5Y2U4Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvdXRpbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC9zYW1wbGVzL3V0aWxzL3NlbnNvci9TaW11bGF0ZWRUZW1wZXJhdHVyZVNlbnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudXRpbHMuc2Vuc29yOwotCi1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3Muc2Vuc29ycy5SYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5hbmFseXRpY3Muc2Vuc29ycy5SYW5nZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZnVuY3Rpb24uU3VwcGxpZXI7Ci0KLS8qKgotICogQSBTaW11bGF0ZWQgdGVtcGVyYXR1cmUgc2Vuc29yLgotICogPHA+Ci0gKiBUaGUgc2Vuc29yIHN0YXJ0cyBvZmYgd2l0aCBhbiBpbml0aWFsIHZhbHVlLgotICogRWFjaCBjYWxsIHRvIHtAbGluayAjZ2V0KCl9IGNoYW5nZXMgdGhlIGN1cnJlbnQgdmFsdWUgYnkKLSAqIGEgcmFuZG9tIGFtb3VudCBiZXR3ZWVuIHBsdXMvbWludXMgYSB7QGNvZGUgZGVsdGFGYWN0b3J9LgotICogVGhlIG5ldyBjdXJyZW50IHZhbHVlIGlzIGxpbWl0ZWQgdG8gYSB7QGNvZGUgdGVtcFJhbmdlfQotICogYW5kIHRoZW4gcm91bmRlZCB0byAxIGZyYWN0aW9uYWwgZGlnaXQuCi0gKiA8L3A+PHA+Ci0gKiBObyB0ZW1wZXJhdHVyZSBzY2FsZSBpcyBpbXBsaWVkIChlLmcuLCBGYWhyZW5oZWl0LCBLZWx2aW4sIC4uLikuCi0gKiBUaGUge0Bjb2RlIGRvdWJsZX0gdGVtcGVyYXR1cmUgdmFsdWVzIGFyZSBzaW1wbHkgZ2VuZXJhdGVkIGFzIGRlc2NyaWJlZC4KLSAqIFRoZSB1c2VyIG9mIHRoZSBjbGFzcyBkZWNpZGVzIGhvdyB0byBpbnRlcnByZXQgdGhlbS4KLSAqIDwvcD48cD4KLSAqIFNhbXBsZSB1c2U6Ci0gKiA8cHJlPntAY29kZQotICogVG9wb2xvZ3kgdCA9IC4uLjsKLSAqIFNpbXVsYXRlZFRlbXBlcmF0dXJlU2Vuc29yIHRlbXBTZW5zb3IgPSBuZXcgU2ltdWxhdGVkVGVtcGVyYXR1cmVTZW5zb3IoKTsKLSAqIFRTdHJlYW08RG91YmxlPiB0ZW1wID0gdC5wb2xsKHRlbXBTZW5zb3IsIDEsIFRpbWVVbml0LlNFQ09ORFMpOwotICogfTwvcHJlPgotICogQHNlZSBTaW1wbGVTaW11bGF0ZWRTZW5zb3IKLSAqLwotcHVibGljIGNsYXNzIFNpbXVsYXRlZFRlbXBlcmF0dXJlU2Vuc29yIGltcGxlbWVudHMgU3VwcGxpZXI8RG91YmxlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTaW1wbGVTaW11bGF0ZWRTZW5zb3Igc2Vuc29yOwotICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdGVtcGVyYXR1cmUgc2Vuc29yLgotICAgICAqIDxwPgotICAgICAqIFNhbWUgYXMge0Bjb2RlIFNpbXVsYXRlZFRlbXBlcmF0dXJlU2Vuc29yKDgwLjAsIAotICAgICAqICAgICAgICAgICAgICBSYW5nZXMuY2xvc2VkKDI4LjAsIDExMi4wKSwgMS4wKX0KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlc2UgZGVmYXVsdCB2YWx1ZXMgcm91Z2hseSBjb3JyZXNwb25kIHRvIG5vcm1hbCBhaXIgdGVtcGVyYXR1cmUKLSAgICAgKiBpbiB0aGUgRmFocmVuaGVpdCBzY2FsZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFNpbXVsYXRlZFRlbXBlcmF0dXJlU2Vuc29yKCkgewotICAgICAgICB0aGlzKDgwLjAsIFJhbmdlcy5jbG9zZWQoMjguMCwgMTEyLjApLCAxLjApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB0ZW1wZXJhdHVyZSBzZW5zb3IuCi0gICAgICogPHA+Ci0gICAgICogTm8gdGVtcGVyYXR1cmUgc2NhbGUgaXMgaW1wbGllZC4KLSAgICAgKiA8L3A+IAotICAgICAqIEBwYXJhbSBpbml0aWFsVGVtcCB0aGUgaW5pdGlhbCB0ZW1wZXJhdHVyZS4gIE11c3QgYmUgd2l0aGluIHRlbXBSYW5nZS4KLSAgICAgKiBAcGFyYW0gdGVtcFJhbmdlIG1heGltdW0gc2Vuc29yIHZhbHVlIHJhbmdlCi0gICAgICogQHBhcmFtIGRlbHRhRmFjdG9yIG1heGltdW0gcGx1cy9taW51cyBjaGFuZ2Ugb24gZWFjaCB7QGNvZGUgZ2V0KCl9LgotICAgICAqICAgICAgICAgICAgICBlLmcuLCAxLjAgdG8gbGltaXQgY2hhbmdlIHRvICsvLSAxLjAuCi0gICAgICogICAgICAgICAgICAgIE11c3QgYmUgJmd0OyAwLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltdWxhdGVkVGVtcGVyYXR1cmVTZW5zb3IoZG91YmxlIGluaXRpYWxUZW1wLAotICAgICAgICAgICAgUmFuZ2U8RG91YmxlPiB0ZW1wUmFuZ2UsIGRvdWJsZSBkZWx0YUZhY3RvcikgewotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHRlbXBSYW5nZSwgInRlbXBSYW5nZSIpOwotICAgICAgICBpZiAoIXRlbXBSYW5nZS5jb250YWlucyhpbml0aWFsVGVtcCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbml0aWFsVGVtcCIpOwotICAgICAgICBpZiAoZGVsdGFGYWN0b3IgPD0gMC4wKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVsdGFGYWN0b3IiKTsKLSAgICAgICAgc2Vuc29yID0gbmV3IFNpbXBsZVNpbXVsYXRlZFNlbnNvcihpbml0aWFsVGVtcCwgZGVsdGFGYWN0b3IsIHRlbXBSYW5nZSk7Ci0gICAgfQotICAgIAotICAgIC8qKiBHZXQgdGhlIHRlbXBSYW5nZSBzZXR0aW5nCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFuZ2U8RG91YmxlPiBnZXRUZW1wUmFuZ2UoKSB7Ci0gICAgICAgIHJldHVybiBzZW5zb3IuZ2V0UmFuZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIEdldCB0aGUgZGVsdGFGYWN0b3Igc2V0dGluZwotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREZWx0YUZhY3RvcigpIHsKLSAgICAgICAgcmV0dXJuIHNlbnNvci5nZXREZWx0YUZhY3RvcigpOwotICAgIH0KLSAgICAKLSAgICAvKiogR2V0IHRoZSBuZXh0IHNlbnNvciB2YWx1ZS4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRG91YmxlIGdldCgpIHsKLSAgICAgICAgcmV0dXJuIHNlbnNvci5nZXQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zY3JpcHRzLy5wcm9qZWN0IGIvc2NyaXB0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThkNTI0OS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+c2NyaXB0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvUkVBRE1FIGIvc2NyaXB0cy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MjUzMTcuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1TY3JpcHRzIGZvciBydW5uaW5nIHRoZSBzYW1wbGVzLgotCi1UaGUgc291cmNlIGNvZGUgZm9yIHRoZSBzYW1wbGVzIGlzIGluIHRoZSA8ZWRnZW50LXJlbGVhc2U+L3NhbXBsZXMgZGlyZWN0b3J5LgotCi1UaGUgc2FtcGxlcyBjYW4gYmUgcnVuIHZpYSBieSB0aGVpciBydW4qLnNoCi1zaGVsbCBzY3JpcHRzIGZyb20gdGhpcyBkaXJlY3RvcnkuICBlLmcuLAotCi0kIC4vcnVuaGVsbG9lZGdlbnQuc2gKLQotTm90ZTogT24gV2luZG93cywgdXNlIGFuIGVudmlyb25tZW50IGxpa2UgQ3lnd2luIAotdG8gcnVuIHRoZXNlIGxpbnV4IHNoZWxsIHNjcmlwdHMuCi0KLVNlZSB0aGUgUkVBRE1FIGZpbGVzIGluIHRoZSBjb25uZWN0b3JzIGRpcmVjdG9yeQotZm9yIGluZm9ybWF0aW9uIGFib3V0IHJ1bm5pbmcgdGhvc2Ugc2FtcGxlcy4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvYXBwcy9zZW5zb3JBbmFseXRpY3MvUkVBRE1FIGIvc2NyaXB0cy9hcHBzL3NlbnNvckFuYWx5dGljcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMGI1MDQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9hcHBzL3NlbnNvckFuYWx5dGljcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1TZW5zb3IgQW5hbHl0aWNzIHNhbXBsZSBhcHBsaWNhdGlvbi4KLQotVGhlIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBhIG1vcmUgY29tcGxldGUgc2FtcGxlIHRoYXQgaW5jbHVkZXMKLXNvbWUgY29tbW9uIHRoZW1lcy4KLQotVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgYXBwbGljYXRpb24gY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSAKLTxlZGdlbnQtcmVsZWFzZT4vPHRhcmdldD4vc2FtcGxlcy9zcmMgZGlyZWN0b3J5LgotCi1Vc2U6Ci0KLVNlZSB0aGUgU2Vuc29yQW5hbHl0aWNzIHNhbXBsZSBsaW5rIGluIDxlZGdlbnQtcmVsZWFzZT4vZG9jcy9qYXZhZG9jL292ZXJ2aWV3LXN1bW1hcnkuaHRtbAotZm9yIGZ1bGwgaW5mb3JtYXRpb24gb24gY29uZmlndXJpbmcgYW5kIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uCi1hbmQgb2JzZXJ2aW5nIGl0cyBiZWhhdmlvci4gIEluIHBhcnRpY3VsYXIsIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLWNvbm5lY3RzIHRvIE1RVFQgc2VydmVyIHVybCAidGNwOi8vbG9jYWxob3N0OjE4ODMiLgotCi0jIHJ1biB0aGUgYXBwbGljYXRpb24KLSMgdGhlIGFwcGxpY2F0aW9uIHJ1bnMgZm9yZXZlciBwcmludGluZyBvdXQgYW5kIHB1Ymxpc2hpbmcgaW5mb3JtYXRpb24KLSQgLi9ydW5TZW5zb3JBbmFseXRpY3Muc2gKLQotIyBXYXRjaCBhbmQgcmVwb3J0IHRoZSBkZXZpY2UncyBNUVRUIGV2ZW50IHRvcGljcwotJCAuL3J1bkRldmljZUNvbW1zLnNoIHdhdGNoCi0KLSMgUHVibGlzaCBhIGNvbW1hbmQgdG8gY2hhbmdlIGEgc2Vuc29yMSB0aHJlc2hvbGQKLSQgLi9ydW5EZXZpY2VDb21tcy5zaCBzZW5kIHNlbnNvcjEuc2V0MWh6TWVhblJhbmdlVGhyZXNob2xkICJbMTI1Li4xMjddIgotCi0jIFB1Ymxpc2ggYSBjb21tYW5kIHRlbGxpbmcgdGhlIGRldmljZSB0byBwdWJsaXNoIGVhY2ggb3V0bGllciBldmVudCBhcyB0aGV5IG9jY3VyCi0kIC4vcnVuRGV2aWNlQ29tbXMuc2ggc2VuZCBzZW5zb3IxLnNldFB1Ymxpc2gxaHpPdXRzaWRlUmFuZ2UgdHJ1ZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9hcHBzL3NlbnNvckFuYWx5dGljcy9ydW5EZXZpY2VDb21tcy5zaCBiL3NjcmlwdHMvYXBwcy9zZW5zb3JBbmFseXRpY3MvcnVuRGV2aWNlQ29tbXMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxYTBkZDQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9hcHBzL3NlbnNvckFuYWx5dGljcy9ydW5EZXZpY2VDb21tcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotZWRnZW50PS4uLy4uLy4uCi0KLSMgUnVucyB0aGUgRGV2aWNlQ29tbXMgY2xpZW50Ci0jCi0jIC4vcnVuRGV2aWNlQ29tbXMuc2ggd2F0Y2ggfCBzZW5kIDxjb21tYW5kTGFiZWw+IDxjb21tYW5kQXJnPgotIwotIyBubyBjaGVja2luZyBpcyBkb25lIGZvciB0aGUgdmFsaWRpdHkgb2YgY29tbWFuZExhYmVsIG9yIGNvbW1hbmRBcmcKLQotZXhwb3J0IENMQVNTUEFUSD0ke2VkZ2VudH0vc2FtcGxlcy9saWIvZWRnZW50LnNhbXBsZXMuYXBwcy5qYXIKLQotamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMubXF0dC5EZXZpY2VDb21tc0FwcCBzZW5zb3JBbmFseXRpY3MucHJvcGVydGllcyAkKgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9hcHBzL3NlbnNvckFuYWx5dGljcy9ydW5TZW5zb3JBbmFseXRpY3Muc2ggYi9zY3JpcHRzL2FwcHMvc2Vuc29yQW5hbHl0aWNzL3J1blNlbnNvckFuYWx5dGljcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTQxMWI3YS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2FwcHMvc2Vuc29yQW5hbHl0aWNzL3J1blNlbnNvckFuYWx5dGljcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotZWRnZW50PS4uLy4uLy4uCi0KLSMgUnVucyB0aGUgU2Vuc29yQW5hbHl0aWNzIHNhbXBsZSBhcHBsaWNhdGlvbgotIwotIyAuL3J1blNlbnNvckFuYWx5dGljcy5zaAotCi1leHBvcnQgQ0xBU1NQQVRIPSR7ZWRnZW50fS9zYW1wbGVzL2xpYi9lZGdlbnQuc2FtcGxlcy5hcHBzLmphcgotCi1qYXZhIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuYXBwcy5zZW5zb3JBbmFseXRpY3MuU2Vuc29yQW5hbHl0aWNzQXBwbGljYXRpb24gc2Vuc29yQW5hbHl0aWNzLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYXBwcy9zZW5zb3JBbmFseXRpY3Mvc2Vuc29yQW5hbHl0aWNzLnByb3BlcnRpZXMgYi9zY3JpcHRzL2FwcHMvc2Vuc29yQW5hbHl0aWNzL3NlbnNvckFuYWx5dGljcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTFlODEyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvYXBwcy9zZW5zb3JBbmFseXRpY3Mvc2Vuc29yQW5hbHl0aWNzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jIEFwcGxpY2F0aW9uIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotIwotIyBUaGUgZGVmYXVsdCB0b3BvbG9neSBwcm92aWRlciBpcyBEaXJlY3RQcm92aWRlci4KLXRvcG9sb2d5LnByb3ZpZGVyPW9yZy5hcGFjaGUuZWRnZW50LnByb3ZpZGVycy5kZXZlbG9wbWVudC5EZXZlbG9wbWVudFByb3ZpZGVyCi0jCi1hcHBsaWNhdGlvbi5uYW1lPVNlbnNvckFuYWx5dGljcwotIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgQXBwbGljYXRpb24gc3RyZWFtIGxvZ2dpbmcgY29uZmlndXJhdGlvbgotIyBXaGVyZSB0aGUgYXBwIHB1dHMgaXRzIHN0cmVhbSBsb2dzLiAgCi0jIFRoZSBkaXJlY3Rvcnkgd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIHRvcG9sb2d5Ci0jIHJ1bnMgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgotYXBwbGljYXRpb24ubG9nLmRpcj0vdG1wL1NlbnNvckFuYWx5dGljcy9sb2dzCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBBcHBsaWNhdGlvbiAicmFuZ2VzIiAtIGUuZy4sIGZvciB0aHJlc2hvbGQgZGV0ZWN0aW9ucwotIyBTcGVjaWZ5IHZhbHVlcyBnZW5lcmF0ZWQgYnkgUmFuZ2UudG9TdHJpbmcoKToKLSMgIDxsb3dlckJvdW5kVHlwZT48bG93ZXJCb3VuZD4uLjx1cHBlckJvdW5kPjx1cHBlckJvdW5kVHlwZT4KLSMgIHdoZXJlCi0jICAgICAgbG93ZXJCb3VuZFR5cGUgaXMgIlsiIGluY2x1c2l2ZSBvciAiKCIgZXhjbHVzaXZlCi0jICAgICAgdXBwZXJCb3VuZFR5cGUgaXMgIl0iIGluY2x1c2l2ZSBvciAiKSIgZXhjbHVzaXZlCi0jICAgICAgbG93ZXJCb3VuZCBvciB1cHBlckJvdW5kIGlzICIqIiBmb3Igb3BlbiByYW5nZXMsCi0jICAgICAgICAgZS5nLiwgWyouLjUwXSAgZm9yICJhdE1vc3QiIDUwCi0jCi1zZW5zb3IxLnJhbmdlLm91dHNpZGUxaHpNZWFuUmFuZ2U9WzEyNC4uMTI5XQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgTVFUVCBEZXZpY2UgYW5kIENvbm5lY3RvciBjb25maWd1cmF0aW9uIGluZm8uCi0jCi0jIE1RVFQgRGV2aWNlIC0tIFNlZSBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLm1xdHQuZGV2aWNlLk1xdHREZXZpY2UgZm9yIGFsbAotIyBvZiB0aGUgcHJvcGVydGllcy4KLSMKLSMgQW4gb3B0aW9uYWwgdG9waWMgcHJlZml4LiAgSXQgY2FuIGJlIHVzZWQgdG8gaXNvbGF0ZSB1c2VycyBvciBhcHBsaWNhdGlvbnMKLSMgaW4gc2hhcmVkIE1RVFQgYnJva2VyIGNvbmZpZ3VyYXRpb25zLiAgQnkgZGVmYXVsdCBpdCBpcyBpbmNvcnBvcmF0ZWQKLSMgaW50byBkZXZpY2UgdG9waWNzIGFuZCB0aGUgTVFUVCBjbGllbnRJZC4KLSMgSWYgeW91IHVzZSBhIHB1YmxpYyBNUVRUIGJyb2tlciB5b3UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoZSB0b3BpYwotIyBwcmVmaXggc28gaXQgaXMgc3RpbGwgdW5pcXVlIGZvciB5b3UgYnV0IGRvZXNuJ3QgaW5jbHVkZSB0aGUKLSMgdXNlciBuYW1lIG9yIGFwcGxpY2F0aW9uIG5hbWUuCi1tcXR0RGV2aWNlLnRvcGljLnByZWZpeD1pYm0ueHl6enktc3RyZWFtcy5zYW1wbGVzL3VzZXIve3VzZXIubmFtZX0ve2FwcGxpY2F0aW9uLm5hbWV9LwotIwotIyBUaGUgZGV2aWNlIGlkIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBkZXZpY2UncyBldmVudHMgYW5kIGNvbW1hbmRzCi0jIGluIHRoZSBNUVRUIHRvcGljIG5hbWVzcGFjZS4KLSMgQnkgZGVmYXVsdCBpdCBhbHNvIGdldHMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIE1RVFQgY2xpZW50SWQgdmFsdWUuCi1tcXR0RGV2aWNlLmlkPTAxMjM0NQotIwotIyBUaGUgTVFUVCBjbGllbnRJZC4gIE9ubHkgb25lIGluc3RhbmNlIG9mIGEgTXF0dERldmljZSBjYW4gY29ubmVjdAotIyB0byB0aGUgTVFUVCBicm9rZXIgd2l0aCBhIGdpdmVuIGNsaWVudElkLgotI21xdHREZXZpY2UubXF0dC5jbGllbnRJZD17bXF0dERldmljZS50b3BpYy5wcmVmaXh9aWQve21xdHREZXZpY2UuaWR9Ci0jCi0jIE1RVFQgQ29ubmVjdG9yICBTZWUgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5tcXR0Lk1xdHRDb25maWcuZnJvbVByb3BlcnRpZXMoKQotIwotIyBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIGZvciBhIGxvY2FsIE1RVFQgYnJva2VyLgotIyBTZWUgbW9zcXVpdHRvLm9yZyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGRvd25sb2FkaW5nIGEgTVFUVCBicm9rZXIuCi0jIE9yIHVzZSBzb21lIG90aGVyIE1RVFQgYnJva2VyIGF2YWlsYWJsZSBpbiB5b3VyIGVudmlyb25tZW50LgotbXF0dC5zZXJ2ZXJVUkxzPXRjcDovL2xvY2FsaG9zdDoxODgzCi0jCi0jIEFsdGVybmF0aXZlbHksIHRoZXJlIGFyZSBzb21lIHB1YmxpYyBNUVRUIGJyb2tlcnMgYXZhaWxhYmxlIHRvIGV4cGVyaW1lbnQgd2l0aC4KLSMgVGhlaXIgYXZhaWxhYmlsaXR5IHN0YXR1cyBpc24ndCBndWFyYW50ZWVkLiAgSWYgeW91J3JlIHVuYWJsZSB0byBjb25uZWN0Ci0jIHRvIHRoZSBicm9rZXIsIGl0J3MgbGlrZWx5IHRoYXQgaXQgaXNuJ3QgdXAgb3IgeW91ciBmaXJld2FsbHMgZG9uJ3QKLSMgYWxsb3cgeW91IHRvIGNvbm5lY3QuICBETyBOT1QgUFVCTElTSCBBTllUSElORyBTRU5TSVRJVkUgLSBhbnlvbmUKLSMgY2FuIGJlIGxpc3RpbmcuCi0jbXF0dC5zZXJ2ZXJVUkxzPXRjcDovL2lvdC5lY2xpcHNlLm9yZzoxODgzCi0jbXF0dC5zZXJ2ZXJVUkxzPXRjcDovL3Rlc3QubW9zcXVpdHRvLm9yZzoxODgzCi0jCi0jIGRlZmF1bHQgdXNlcm5hbWUgaXMgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKSB2YWx1ZQotI21xdHQudXNlck5hbWU9eHl6enkKLSNtcXR0LnBhc3N3b3JkPW15TW9zcXVpdHRvUHcKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFBhdHRlcm5zIGZvciBpZGVudGlmeWluZyB3aGljaCBzdHJlYW1zIHRvIHRyYWNlIHRvIFN5c3RlbS5vdXQKLSMgVG8gZW5hYmxlIHVzZSBpbmNsdWRlLmNzdiBhbmQvb3IgaW5jbHVkZXMucmVnZXguCi0jIFRvIGV4Y2x1ZGUgYW4gb3RoZXJ3aXNlIGluY2x1ZGVkIGZpbGUsIHVzZSBleGNsdWRlcy5jc3YgYW5kL29yIGV4Y2x1ZGVzLnJlZ2V4Ci0jCi0jIFNvbWUgdHJhY2luZyBsYWJlbHMKLSMgc2Vuc29yMS5yYXcxa2h6LHNlbnNvcjEuajFraHosc2Vuc29yMS5qMWh6U3RhdHMsc2Vuc29yMS5vdXRzaWRlMWh6TWVhblJhbmdlKiwKLSMgc2Vuc29yMS5wZXJpb2RpY0xhc3ROKgotIwotI3N0cmVhbS50cmFjaW5nLmluY2x1ZGVzLmNzdj1zZW5zb3IxLmoxaHpTdGF0cwotc3RyZWFtLnRyYWNpbmcuaW5jbHVkZXMucmVnZXg9c2Vuc29yMS5vdXRzaWRlMWh6TWVhblJhbmdlLioKLSNzdHJlYW0udHJhY2luZy5leGNsdWRlcy5yZWdleD0uKgotI3N0cmVhbS50cmFjaW5nLmV4Y2x1ZGVzLmNzdj1zZW5zb3IxLnJhdzFraHoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9maWxlL1JFQURNRSBiL3NjcmlwdHMvY29ubmVjdG9ycy9maWxlL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2MjlkMC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2Nvbm5lY3RvcnMvZmlsZS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1TYW1wbGUgRmlsZSBTdHJlYW1zIGNvbm5lY3RvciB0b3BvbG9neSBhcHBsaWNhdGlvbnMuCi0KLVRoZSBmaWxlIHdyaXRlciBhcHBsaWNhdGlvbiB3cml0ZXMgYSBzdHJlYW0ncyB0dXBsZXMgdG8gZmlsZXMuCi0KLVRoZSBmaWxlIHJlYWRlciBhcHBsaWNhdGlvbiB3YXRjaGVzIGEgZGlyZWN0b3J5IGZvciBmaWxlcyBhbmQgcmVhZHMgdGhlaXIKLWNvbnRlbnRzIGludG8gYSBzdHJlYW0gb2YgdHVwbGVzLgotCi1UaGUgc291cmNlIGNvZGUgZm9yIHRoZSBzYW1wbGVzIGlzIGluIHRoZSA8ZWRnZW50LXJlbGVhc2U+L3NhbXBsZXMgZGlyZWN0b3J5LgotCi1Vc2U6Ci0KLSMgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBmb3IgdGhlIHNhbXBsZSB0byB1c2UKLSQgbWtkaXIgL3RtcC9maWxlU2FtcGxlCi0KLSMgcnVuIHRoZSBzYW1wbGUgZmlsZSB3YXRjaGVyIC8gcmVhZGVyCi0jIHRoZSByZWFkZXIgcnVucyBmb3JldmVyIHByaW50aW5nIG91dCBjb250ZW50IGZyb20gZmlsZXMgcmVhZAotJCAuL3J1bmZpbGVzYW1wbGUuc2ggcmVhZGVyIC90bXAvZmlsZVNhbXBsZQotCi0jIHJ1biB0aGUgc2FtcGxlIGZpbGUgd3JpdGVyCi0jIHRoZSB3cml0ZXIgcnVucyBmb3JldmVyIHByaW50aW5nIG91dCBlYWNoIGdlbmVyYXRlZCB0dXBsZQotJCAuL3J1bmZpbGVzYW1wbGUuc2ggd3JpdGVyIC90bXAvZmlsZVNhbXBsZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL2ZpbGUvcnVuZmlsZXNhbXBsZS5zaCBiL3NjcmlwdHMvY29ubmVjdG9ycy9maWxlL3J1bmZpbGVzYW1wbGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0YjJkYzEuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2ZpbGUvcnVuZmlsZXNhbXBsZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotZWRnZW50PS4uLy4uLy4uCi0KLSMgUnVucyB0aGUgRmlsZSBjb25uZWN0b3Igc2FtcGxlCi0jCi0jIC4vcnVuZmlsZXNhbXBsZS5zaCB3cml0ZXIKLSMgLi9ydW5maWxlc2FtcGxlLnNoIHJlYWRlcgotCi1zYW1wbGVkaXI9L3RtcC9maWxlQ29ubmVjdG9yU2FtcGxlCi1pZiBbICEgLWUgJHNhbXBsZWRpciBdOyB0aGVuCi0gICAgbWtkaXIgJHNhbXBsZWRpcgotZmkgCi0KLWV4cG9ydCBDTEFTU1BBVEg9JHtlZGdlbnR9L3NhbXBsZXMvbGliL2VkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuamFyCi0KLWFwcD0kMTsgc2hpZnQKLWlmIFsgIiRhcHAiID09ICJ3cml0ZXIiIF07IHRoZW4KLSAgICBqYXZhIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5maWxlLkZpbGVXcml0ZXJBcHAgJHNhbXBsZWRpcgotZWxpZiBbICIkYXBwIiA9PSAicmVhZGVyIiBdOyB0aGVuCi0gICAgamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuZmlsZS5GaWxlUmVhZGVyQXBwICRzYW1wbGVkaXIKLWVsc2UKLSAgICBlY2hvICJ1bnJlY29nbml6ZWQgbW9kZSAnJGFwcCciCi0gICAgZWNobyAidXNhZ2U6ICQwICd3cml0ZXJ8cmVhZGVyJyIKLSAgICBleGl0IDEKLWZpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9SRUFETUUgYi9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjY2IyZjguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotCi0jICMjIyMjIyMjIyMKLSMgVGhlICJRdWlja3N0YXJ0IiBzYW1wbGVzIGNvbm5lY3QgdG8gdGhlIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtCi0jIHVzaW5nIHRoZSBRdWlja3N0YXJ0IGZlYXR1cmUgdGhhdCBkb2VzIG5vdCByZXF1aXJlIGRldmljZSByZWdpc3RyYXRpb24uCi0jIFdoZW4gdGhlIHNhbXBsZXMgYXJlIHJ1biB0aGV5IHByaW50IG91dCBhIFVSTCB3aGljaCBhbGxvd3MgYSBicm93c2VyCi0jIHRvIHNlZSB0aGUgZGF0YSBiZWluZyBzZW50IGZyb20gdGhpcyBzYW1wbGUuCi0jCi0jIElvdHBRdWlja3N0YXJ0MiBkZW1vbnN0cmF0ZXMgdXNpbmcgdGhlIFdJb1RQIEFQSSB0byBpbml0aWFsaXplIHRoZSBJb3RwRGV2aWNlCi0jIGNvbm5lY3RvciBhcyB3ZWxsIGFzIHRoZSBhYmlsaXR5IHRvIHB1Ymxpc2ggZXZlbnRzIHVzaW5nIHRoZSBXSW9UUCBIVFRQIHByb3RvY29sLgotCi1Jb3RwUXVpY2tzdGFydCAgLSAuL3J1bnF1aWNrc3RhcnQuc2gKLUlvdHBRdWlja3N0YXJ0MiAtIC4vcnVucXVpY2tzdGFydDIuc2ggW3VzZUh0dHBdCi0KLSMgIyMjIyMjIyMjIwotIyBJb3RwU2Vuc29ycyBjb25uZWN0cyB0byB5b3VyIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIHNlcnZpY2UKLSMgYXMgdGhlIGRldmljZSBkZWZpbmVkIGluIHlvdXIgZGV2aWNlIGNvbmZpZyBmaWxlLgotIwotIyBBIHByb3RvdHlwZSBjb25maWcgZmlsZSBmb3IgeW91ciBXSW9UUCByZWdpc3RlcmVkIGRldmljZSBpbmZvcm1hdGlvbiAKLSMgaXMgcHJvdmlkZWQgaW4gZGV2aWNlLmNmZy4KLQotSW90cFNlbnNvcnMgICAgIC0gLi9ydW5pb3RzZW5zb3JzLnNoIGRldmljZS1jZmctcGF0aAotCi0jICMjIyMjIyMjIyMKLSMgSW90cERldmljZVNhbXBsZSBhbmQgSW90cEdhdGV3YXlTYW1wbGUKLSMgY29ubmVjdCB0byB5b3VyIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIHNlcnZpY2UuCi0jIFRoZXkgcHVibGlzaCBkZXZpY2UgZXZlbnRzIGFuZCBwcmludCBvdXQgcmVjZWl2ZWQgZGV2aWNlIGNvbW1hbmRzLgotIyBVc2UgSW90cEFwcENsaWVudCB0byBwcmludCBvdXQgdGhlIGdlbmVyYXRlZCBkZXZpY2UgZXZlbnRzIGFuZAotIyB0byBnZW5lcmF0ZSB0aGUgZGV2aWNlIGNvbW1hbmRzLgotIwotIyBQcm90b3R5cGUgY29uZmlnIGZpbGVzIGZvciB5b3VyIFdJb1RQIHJlZ2lzdGVyZWQgZGV2aWNlLCBnYXRld2F5LAotIyBhbmQgYXBwbGljYXRpb24gY2xpZW50IGluZm9ybWF0aW9uIGFyZSBwcm92aWRlZCBpbgotIyBpb3RwLWRldmljZS1zYW1wbGUuY2ZnLCBpb3RwLWd3ZGV2aWNlLXNhbXBsZS5jZmcgYW5kIGlvdHAtYXBwLWNsaWVudC5jZmcKLQotSW90cERldmljZVNhbXBsZSAgLSAuL3J1bi1pb3RwLWRldmljZS1zYW1wbGUuc2ggW3VzZURldmljZUNsaWVudHx1c2VNYW5hZ2VkRGV2aWNlXSBbdXNlSHR0cF0gPGRldmljZS1jZmctcGF0aD4KLUlvdHBHYXRld2F5U2FtcGxlIC0gLi9ydW4taW90cC1nd2RldmljZS1zYW1wbGUuc2ggW3VzZUdhdGV3YXlDbGllbnR8dXNlTWFuYWdlZEdhdGV3YXldIFt1c2VIdHRwXSA8ZGV2aWNlLWNmZy1wYXRoPgotSW90cEFwcENsaWVudCAgICAgLSAuL3J1bi1pb3RwLWNsaWVudC1hcHAuc2ggW3VzZUdXXSA8YXBwLWNmZy1wYXRoPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL2RldmljZS5jZmcgYi9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9kZXZpY2UuY2ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzY3MjkyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL2RldmljZS5jZmcKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVtkZXZpY2VdCi1vcmcgPQotdHlwZSA9IAotaWQgPSAKLWF1dGgtbWV0aG9kID0gdG9rZW4KLWF1dGgtdG9rZW4gPSAKLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvaW90cC1hcHAtY2xpZW50LmNmZyBiL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL2lvdHAtYXBwLWNsaWVudC5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3N2U2YjUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvaW90cC1hcHAtY2xpZW50LmNmZworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgSW90cEFwcFNhbXBsZSBhcHAKLQotW2FwcGxpY2F0aW9uXQotIyBXSW9UUCBkZWZpbmVkIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotCi1Pcmdhbml6YXRpb24tSUQgPSAKLWlkID0gCi1BdXRoZW50aWNhdGlvbi1NZXRob2QgPSBhcGlrZXkKLUFQSS1LZXkgPSAKLUF1dGhlbnRpY2F0aW9uLVRva2VuID0gCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSW5wdXQgZm9yIHRoZSBzYW1wbGUgYXBwLCBub3QgV0lvVFAgQXBwIHByb3BzCi0KLSMgTm9uLWdhdGV3YXkgbW9kZSB0YXJnZXQgcmVnaXN0ZXJlZCBkZXZpY2UKLSMgQ29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSB0aGUgaW90cC1kZXZpY2Utc2FtcGxlLmNmZyBmaWxlCi1kZXZpY2VUeXBlID0gCi1kZXZpY2VJZCA9IAotCi0jIEdhdGV3YXkgbW9kZSB0YXJnZXQgcmVnaXN0ZXJlZCBnYXRld2F5IGRldmljZSBhbmQgdGhlIGNvbm5lY3RlZCBkZXZpY2UKLSMgQ29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSB0aGUgaW90cC1nd2RldmljZS1zYW1wbGUuY2ZnIGZpbGUgCi1nd0RldmljZVR5cGUgPSAKLWd3RGV2aWNlSWQgPSAKLWNuLWRldjEtdHlwZSA9IG15Q25EZXYxVHlwZQotY24tZGV2MS1pZCA9IG15Q25EZXYxSWQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL2lvdHAtZGV2aWNlLXNhbXBsZS5jZmcgYi9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9pb3RwLWRldmljZS1zYW1wbGUuY2ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJhZWZiLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL2lvdHAtZGV2aWNlLXNhbXBsZS5jZmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgSW90cERldmljZVNhbXBsZQotCi1bZGV2aWNlXQotIyBXSW9UUCBkZWZpbmVkIElvVCBkZXZpY2UgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCi0KLU9yZ2FuaXphdGlvbi1JRCA9IAotRGV2aWNlLVR5cGUgPSAKLURldmljZS1JRCA9IAotQXV0aGVudGljYXRpb24tTWV0aG9kID0gdG9rZW4KLUF1dGhlbnRpY2F0aW9uLVRva2VuID0gCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9pb3RwLWd3ZGV2aWNlLXNhbXBsZS5jZmcgYi9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9pb3RwLWd3ZGV2aWNlLXNhbXBsZS5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDVmY2MuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvaW90cC1nd2RldmljZS1zYW1wbGUuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIElvdHBHV0RldmljZVNhbXBsZQotCi1bZGV2aWNlXQotIyBXSW9UUCBkZWZpbmVkIElvVCBHYXRld2F5IGRldmljZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKLQotT3JnYW5pemF0aW9uLUlEID0gCi1HYXRld2F5LVR5cGUgPSAKLUdhdGV3YXktSUQgPSAKLUF1dGhlbnRpY2F0aW9uLU1ldGhvZCA9IHRva2VuCi1BdXRoZW50aWNhdGlvbi1Ub2tlbiA9IAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIElucHV0IGZvciB0aGUgc2FtcGxlIGFwcCwgbm90IFdJb1RQIGRldmljZSBwcm9wcwotCi0jIGEgdHlwZSBhbmQgaWQgZm9yIGEgZGV2aWNlIGNvbm5lY3RlZCB0byB0aGUgZ2F0ZXdheSAtIHBpY2sgYW55dGhpbmcKLWNuLWRldjEtdHlwZSA9IG15Q25EZXYxVHlwZQotY24tZGV2MS1pZCA9IG15Q25EZXYxSWQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bi1pb3RwLWFwcC1jbGllbnQuc2ggYi9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9ydW4taW90cC1hcHAtY2xpZW50LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTUwMmU1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bi1pb3RwLWFwcC1jbGllbnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWVkZ2VudD0uLi8uLi8uLgotCi0jIFJ1bnMgSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0gSW90cEFwcENsaWVudCBzYW1wbGUuCi0jCi0jIHJ1bi1pb3RwLWFwcC1jbGllbnQuc2ggW3VzZUdXXSA8YXBwLWNmZy1wYXRoPiAgIyBzZWUgaW90cC1hcHAtY2xpZW50LmNmZwotIwotIyBDb25uZWN0cyB0byBXSW9UUCBhbmQgc2VuZHMgZGV2aWNlIGNvbW1hbmRzIHRvIHRoZSAKLSMgSW90cERldmljZVNhbXBsZSBvciBJb3RwR1dEZXZpY2VTYW1wbGUgZGV2aWNlIHNhbXBsZXMuCi0jCi0jIFRoaXMgY29ubmVjdHMgdG8geW91ciBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBzZXJ2aWNlCi0jIGFzIHRoZSBBcHBsaWNhdGlvbiBkZWZpbmVkIGluIGEgYXBwbGljYXRpb24gY29uZmlnIGZpbGUuCi0jIFRoZSBmaWxlIGZvcm1hdCBpcyB0aGUgc3RhbmRhcmQgb25lIGZvciBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybS4KLSMKLSMgTm90ZSwgdGhlIGNvbmZpZyBmaWxlIGFsc28gY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGlzIGFwcGxpY2F0aW9uLgotIyBBIHNhbXBsZSBpb3QtYXBwLWNsaWVudC5jZmcgaXMgaW4gdGhlIHNjcmlwdHMvY29ubmVjdG9ycy9pb3RwIGRpcmVjdG9yeS4KLQotCi1leHBvcnQgQ0xBU1NQQVRIPSR7ZWRnZW50fS9zYW1wbGVzL2xpYi9lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmphcgotCi0jIGh0dHBzOi8vZ2l0aHViLmNvbS9pYm0td2F0c29uLWlvdC9pb3QtamF2YS90cmVlL21hc3RlciNtaWdyYXRpb24tZnJvbS1yZWxlYXNlLTAxNS10by0wMjEKLSMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoZSBwcmUtMC4yLjEgV0lvVFAgY2xpZW50IGJlaGF2aW9yLgotIwotI1VTRV9PTERfRVZFTlRfRk9STUFUPS1EY29tLmlibS5pb3RmLmVuYWJsZUN1c3RvbUZvcm1hdD1mYWxzZQotCi1WTV9PUFRTPSR7VVNFX09MRF9FVkVOVF9GT1JNQVR9Ci0KLWphdmEgJHtWTV9PUFRTfSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuaW90cC5Jb3RwQXBwQ2xpZW50ICQqIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvcnVuLWlvdHAtZGV2aWNlLXNhbXBsZS5zaCBiL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bi1pb3RwLWRldmljZS1zYW1wbGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1ZWI2ZmMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvcnVuLWlvdHAtZGV2aWNlLXNhbXBsZS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotZWRnZW50PS4uLy4uLy4uCi0KLSMgUnVucyBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBJb3RwRGV2aWNlU2FtcGxlIHNhbXBsZS4KLSMKLSMgcnVuLWlvdHAtZGV2aWNlLXNhbXBsZS5zaCBbdXNlRGV2aWNlQ2xpZW50fHVzZU1hbmFnZWREZXZpY2VdIFt1c2VIdHRwXSA8ZGV2aWNlLWNmZy1wYXRoPiAgIyBzZWUgaW90cC1kZXZpY2Utc2FtcGxlLmNmZwotIwotIyBDb25uZWN0cyB0byBXSW9UUCBhbmQgc2VuZHMgZGV2aWNlIGV2ZW50cyBhbmQgcmVjZWl2ZXMgZGV2aWNlIGNvbW1hbmRzLgotIwotIyBUaGlzIGNvbm5lY3RzIHRvIHlvdXIgSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0gc2VydmljZQotIyBhcyB0aGUgRGV2aWNlIGRlZmluZWQgaW4gYSBkZXZpY2UgY29uZmlnIGZpbGUuCi0jIFRoZSBmaWxlIGZvcm1hdCBpcyB0aGUgc3RhbmRhcmQgb25lIGZvciBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybS4KLSMKLSMgTm90ZSwgdGhlIGNvbmZpZyBmaWxlIGFsc28gY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGlzIGFwcGxpY2F0aW9uLgotIyBBIHNhbXBsZSBpb3QtZGV2aWNlLXNhbXBsZS5jZmcgaXMgaW4gdGhlIHNjcmlwdHMvY29ubmVjdG9ycy9pb3RwIGRpcmVjdG9yeS4KLQotZXhwb3J0IENMQVNTUEFUSD0ke2VkZ2VudH0vc2FtcGxlcy9saWIvZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5qYXIKLQotIyBodHRwczovL2dpdGh1Yi5jb20vaWJtLXdhdHNvbi1pb3QvaW90LWphdmEvdHJlZS9tYXN0ZXIjbWlncmF0aW9uLWZyb20tcmVsZWFzZS0wMTUtdG8tMDIxCi0jIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGUgcHJlLTAuMi4xIFdJb1RQIGNsaWVudCBiZWhhdmlvci4KLSMKLSNVU0VfT0xEX0VWRU5UX0ZPUk1BVD0tRGNvbS5pYm0uaW90Zi5lbmFibGVDdXN0b21Gb3JtYXQ9ZmFsc2UKLQotVk1fT1BUUz0ke1VTRV9PTERfRVZFTlRfRk9STUFUfQotCi1qYXZhICR7Vk1fT1BUU30gb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmlvdHAuSW90cERldmljZVNhbXBsZSAkKiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bi1pb3RwLWd3ZGV2aWNlLXNhbXBsZS5zaCBiL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bi1pb3RwLWd3ZGV2aWNlLXNhbXBsZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWViYTVkYy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9ydW4taW90cC1nd2RldmljZS1zYW1wbGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWVkZ2VudD0uLi8uLi8uLgotCi0jIFJ1bnMgSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0gSW90cEdXRGV2aWNlU2FtcGxlIHNhbXBsZS4KLSMKLSMgcnVuLWlvdHAtZ3dkZXZpY2Utc2FtcGxlLnNoIFt1c2VHYXRld2F5Q2xpZW50fHVzZU1hbmFnZWRHYXRld2F5XSBbdXNlSHR0cF0gPGRldmljZS1jZmctcGF0aD4gICMgc2VlIGlvdHAtZ3dkZXZpY2Utc2FtcGxlLmNmZwotIwotIyBDb25uZWN0cyB0byBXSW9UUCBhbmQgc2VuZHMgR2F0ZXdheSBhbmQgY29ubmVjdGVkIGRldmljZSBldmVudHMgYW5kIHJlY2VpdmVzIGRldmljZSBjb21tYW5kcy4KLSMKLSMgVGhpcyBjb25uZWN0cyB0byB5b3VyIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIHNlcnZpY2UKLSMgYXMgdGhlIEdhdGV3YXkgZGVmaW5lZCBpbiBhIGdhdGV3YXkgY29uZmlnIGZpbGUuCi0jIFRoZSBmaWxlIGZvcm1hdCBpcyB0aGUgc3RhbmRhcmQgb25lIGZvciBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybS4KLSMgCi0jIE5vdGUsIHRoZSBjb25maWcgZmlsZSBhbHNvIGNvbnRhaW5zIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KLSMgQSBzYW1wbGUgaW90LWd3ZGV2aWNlLXNhbXBsZS5jZmcgaXMgaW4gdGhlIHNjcmlwdHMvY29ubmVjdG9ycy9pb3RwIGRpcmVjdG9yeS4KLQotCi1leHBvcnQgQ0xBU1NQQVRIPSR7ZWRnZW50fS9zYW1wbGVzL2xpYi9lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmphcgotCi0jIGh0dHBzOi8vZ2l0aHViLmNvbS9pYm0td2F0c29uLWlvdC9pb3QtamF2YS90cmVlL21hc3RlciNtaWdyYXRpb24tZnJvbS1yZWxlYXNlLTAxNS10by0wMjEKLSMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoZSBwcmUtMC4yLjEgV0lvVFAgY2xpZW50IGJlaGF2aW9yLgotIwotI1VTRV9PTERfRVZFTlRfRk9STUFUPS1EY29tLmlibS5pb3RmLmVuYWJsZUN1c3RvbUZvcm1hdD1mYWxzZQotCi1WTV9PUFRTPSR7VVNFX09MRF9FVkVOVF9GT1JNQVR9Ci0KLWphdmEgJHtWTV9PUFRTfSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuaW90cC5Jb3RwR1dEZXZpY2VTYW1wbGUgJCogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9ydW5pb3RwcXVpY2tzdGFydC5zaCBiL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bmlvdHBxdWlja3N0YXJ0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmM5ZWJiLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bmlvdHBxdWlja3N0YXJ0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1lZGdlbnQ9Li4vLi4vLi4KLQotIyBSdW5zIElCTSBXYXRzb24gSW9UIFBsYWZvcm0gUXVpY2tzdGFydCBzYW1wbGUuCi0jCi0jIHJ1bmlvdHBxdWlja3N0YXJ0LnNoCi0jCi0jIFRoaXMgY29ubmVjdG9ycyB0byB0aGUgUXVjaWtzdGFydCBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBzZXJ2aWNlCi0jIHdoaWNoIHJlcXVpcmVzIG5vIHJlZ2lzdHJhdGlvbiBhdCBhbGwuCi0jCi0jIFRoZSBhcHBsaWNhdGlvbiBwcmludHMgb3V0IGEgVVJMIHdoaWNoIGFsbG93cyBhIGJyb3dzZXIKLSMgdG8gc2VlIHRoZSBkYXRhIGJlaW5nIHNlbnQgZnJvbSB0aGlzIHNhbXBsZSB0bwotIyBJQk0gV2F0c29uIElvVCBQbGFmb3JtIFF1aWNrc3RhcnQgc2FtcGxlLgotCi1leHBvcnQgQ0xBU1NQQVRIPSR7ZWRnZW50fS9zYW1wbGVzL2xpYi9lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmphcgotCi0jIGh0dHBzOi8vZ2l0aHViLmNvbS9pYm0td2F0c29uLWlvdC9pb3QtamF2YS90cmVlL21hc3RlciNtaWdyYXRpb24tZnJvbS1yZWxlYXNlLTAxNS10by0wMjEKLSMgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdG8gdXNlIHRoZSBwcmUtMC4yLjEgV0lvVFAgY2xpZW50IGJlaGF2aW9yLgotIwotI1VTRV9PTERfRVZFTlRfRk9STUFUPS1EY29tLmlibS5pb3RmLmVuYWJsZUN1c3RvbUZvcm1hdD1mYWxzZQotCi1WTV9PUFRTPSR7VVNFX09MRF9FVkVOVF9GT1JNQVR9Ci0KLWphdmEgJHtWTV9PUFRTfSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuaW90cC5Jb3RwUXVpY2tzdGFydApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvcnVuaW90cHF1aWNrc3RhcnQyLnNoIGIvc2NyaXB0cy9jb25uZWN0b3JzL2lvdHAvcnVuaW90cHF1aWNrc3RhcnQyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YTFmZjlmLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bmlvdHBxdWlja3N0YXJ0Mi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotZWRnZW50PS4uLy4uLy4uCi0KLSMgUnVucyBJQk0gV2F0c29uIElvVCBQbGFmb3JtIFF1aWNrc3RhcnQgc2FtcGxlLgotIwotIyBydW5pb3RwcXVpY2tzdGFydDIuc2gKLSMKLSMgVGhpcyBjb25uZWN0cyB0byB0aGUgUXVpY2tzdGFydCBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBzZXJ2aWNlCi0jIHdoaWNoIHJlcXVpcmVzIG5vIHJlZ2lzdHJhdGlvbiBhdCBhbGwuCi0jCi0jIFRoZSBhcHBsaWNhdGlvbiBwcmludHMgb3V0IGEgVVJMIHdoaWNoIGFsbG93cyBhIGJyb3dzZXIKLSMgdG8gc2VlIHRoZSBkYXRhIGJlaW5nIHNlbnQgZnJvbSB0aGlzIHNhbXBsZSB0bwotIyBJQk0gV2F0c29uIElvVCBQbGF0Zm9ybSBRdWlja3N0YXJ0IHNhbXBsZS4KLQotZXhwb3J0IENMQVNTUEFUSD0ke2VkZ2VudH0vc2FtcGxlcy9saWIvZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5qYXIKLQotIyBodHRwczovL2dpdGh1Yi5jb20vaWJtLXdhdHNvbi1pb3QvaW90LWphdmEvdHJlZS9tYXN0ZXIjbWlncmF0aW9uLWZyb20tcmVsZWFzZS0wMTUtdG8tMDIxCi0jIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIHRvIHVzZSB0aGUgcHJlLTAuMi4xIFdJb1RQIGNsaWVudCBiZWhhdmlvci4KLSMKLSNVU0VfT0xEX0VWRU5UX0ZPUk1BVD0tRGNvbS5pYm0uaW90Zi5lbmFibGVDdXN0b21Gb3JtYXQ9ZmFsc2UKLQotVk1fT1BUUz0ke1VTRV9PTERfRVZFTlRfRk9STUFUfQotCi1qYXZhICR7Vk1fT1BUU30gb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmlvdHAuSW90cFF1aWNrc3RhcnQyICQqCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm5lY3RvcnMvaW90cC9ydW5pb3Rwc2Vuc29ycy5zaCBiL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bmlvdHBzZW5zb3JzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNzEyNDk1Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY29ubmVjdG9ycy9pb3RwL3J1bmlvdHBzZW5zb3JzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1lZGdlbnQ9Li4vLi4vLi4KLQotIyBSdW5zIElCTSBXYXRzb24gSW9UIFBsYWZvcm0gc2FtcGxlLgotIwotIyBydW5pb3Rwc2Vuc29ycy5zaCBwYXRoL2RldmljZS5jZmcKLSMKLSMgZS5nLiBydW5pb3Rwc2Vuc29ycy5zaCAkSE9NRS9kZXZpY2UuY2ZnCi0jCi0jIFRoaXMgY29ubmVjdG9ycyB0byB5b3VyIElCTSBXYXRzb24gSW9UIFBsYXRmb3JtIHNlcnZpY2UKLSMgYXMgdGhlIGRldmljZSBkZWZpbmVkIGluIHRoZSBkZXZpY2UuY2ZnLgotIyBUaGUgZm9ybWF0IG9mIGRldmljZS5jZmcgaXMgdGhlIHN0YW5kYXJkIG9uZSBmb3IKLSMgSUJNIFdhdHNvbiBJb1QgUGxhdGZvcm0gYW5kIGEgc2FtcGxlIGlzIGluIHRoaXMgZGlyZWN0b3J5Ci0jIChvbWl0dGluZyB2YWx1ZXMgZm9yIHRoZSBhdXRob3JpemF0aW9uIHRva2VucykuCi0KLWV4cG9ydCBDTEFTU1BBVEg9JHtlZGdlbnR9L3NhbXBsZXMvbGliL2VkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuamFyCi0KLSMgaHR0cHM6Ly9naXRodWIuY29tL2libS13YXRzb24taW90L2lvdC1qYXZhL3RyZWUvbWFzdGVyI21pZ3JhdGlvbi1mcm9tLXJlbGVhc2UtMDE1LXRvLTAyMQotIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byB1c2UgdGhlIHByZS0wLjIuMSBXSW9UUCBjbGllbnQgYmVoYXZpb3IuCi0jCi0jVVNFX09MRF9FVkVOVF9GT1JNQVQ9LURjb20uaWJtLmlvdGYuZW5hYmxlQ3VzdG9tRm9ybWF0PWZhbHNlCi0KLVZNX09QVFM9JHtVU0VfT0xEX0VWRU5UX0ZPUk1BVH0KLQotamF2YSAke1ZNX09QVFN9IG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5pb3RwLklvdHBTZW5zb3JzICQxCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm5lY3RvcnMvamRiYy9SRUFETUUgYi9zY3JpcHRzL2Nvbm5lY3RvcnMvamRiYy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMmUwMmUuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2pkYmMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotU2FtcGxlIEpEQkMgY29ubmVjdG9yIGRibXMgd3JpdGVyIGFuZCByZWFkZXIgdG9wb2xvZ3kgYXBwbGljYXRpb25zLgotCi1UaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gaXMgYXNzdW1lZDoKLS0gQXBhY2hlIERlcmJ5IGlzIGluc3RhbGxlZCBhbmQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERFUkJZX0hPTUUgaXMgc2V0Ci0KLVRoZSB3cml0ZXIgaXMgYSBzaW1wbGUgSkRCQyBjb25uZWN0b3Igc2FtcGxlIGRlbW9uc3RyYXRpbmcKLXN0cmVhbWluZyB3cml0ZSBhY2Nlc3Mgb2YgYSBkYm1zIHRvIGFkZCBzdHJlYW0gdHVwbGVzIHRvIGEgdGFibGUuCi0KLVRoZSByZWFkZXIgaXMgYSBzaW1wbGUgSkRCQyBjb25uZWN0b3Igc2FtcGxlIGRlbW9uc3RyYXRpbmcKLXN0cmVhbWluZyByZWFkIGFjY2VzcyBvZiBhIGRibXMgdGFibGUgYW5kIGNyZWF0aW5nIHN0cmVhbQotdHVwbGVzIGZyb20gdGhlIHJlc3VsdHMuCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHNhbXBsZXMgaXMgaW4gdGhlIDxlZGdlbnQtcmVsZWFzZT4vc2FtcGxlcyBkaXJlY3RvcnkuCi0KLVJ1bm5pbmcgdGhlIHNpbXBsZSBzYW1wbGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTW9kaWZ5IHRoZSBqZGJjLnByb3BlcnRpZXMgZmlsZSBpZiByZXF1aXJlZC4KLQotIyBydW4gdGhlIHNpbXBsZSBzYW1wbGUgd3JpdGVyCi0jIHRoZSB3cml0ZXIgcnVucyBicmllZmx5IGFuZCBwcmludHMgb3V0IGFkZGl0aW9ucyB0byB0aGUgdGFibGUKLSQgLi9ydW5qZGJjc2FtcGxlLnNoIHdyaXRlcgotSW5zZXJ0aW5nIGludG8gcGVyc29ucyB0YWJsZTogcGVyc29uIGlkPTEgZmlyc3Q9Sm9obiBsYXN0PURvZQotSW5zZXJ0aW5nIGludG8gcGVyc29ucyB0YWJsZTogcGVyc29uIGlkPTIgZmlyc3Q9SmFuZSBsYXN0PURvZQotSW5zZXJ0aW5nIGludG8gcGVyc29ucyB0YWJsZTogcGVyc29uIGlkPTMgZmlyc3Q9QmlsbHkgbGFzdD1NY0RvZQotJAotCi0jIHJ1biB0aGUgc2ltcGxlIHNhbXBsZSByZWFkZXIKLSMgdGhlIHJlYWRlciBydW5zIGJyaWVmbHkgYW5kIHByaW50cyBvdXQgcmV0cmlldmVkIGluZm8KLSQgLi9ydW5qZGJjc2FtcGxlLnNoIHJlYWRlcgotcmV0cmlldmVkIHBlcnNvbjogaWQ9MSBmaXJzdD1Kb2huIGxhc3Q9RG9lCi1yZXRyaWV2ZWQgcGVyc29uOiBpZD0yIGZpcnN0PUphbmUgbGFzdD1Eb2UKLXJldHJpZXZlZCBwZXJzb246IGlkPTMgZmlyc3Q9QmlsbHkgbGFzdD1NY0RvZQotVW5rbm93biBwZXJzb24gaWQ9OTk5OTkKLSQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9qZGJjL2pkYmMucHJvcGVydGllcyBiL3NjcmlwdHMvY29ubmVjdG9ycy9qZGJjL2pkYmMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhMTk2YS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2Nvbm5lY3RvcnMvamRiYy9qZGJjLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNkYi5uYW1lPSAgICAgICMgZGVmYXVsdHMgdG8gIkpkYmNDb25uZWN0b3JTYW1wbGVEYiIKLSNkYi51c2VyPSAgICAgICMgZGVmYXVsdHMgdG8gU3lzdGVtLmdldFByb3BlcnRpZXMoInVzZXIubmFtZSIpCi0jZGIucGFzc3dvcmQ9ICAjIGRlZmF1bHRzIHRvIG5vIHBhc3N3b3JkCi1wZXJzb25kYXRhLnBhdGg9cGVyc29uZGF0YS50eHQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9qZGJjL3BlcnNvbmRhdGEudHh0IGIvc2NyaXB0cy9jb25uZWN0b3JzL2pkYmMvcGVyc29uZGF0YS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMzdjNDQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2pkYmMvcGVyc29uZGF0YS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgaWQsZmlyc3ROYW1lLGxhc3ROYW1lCi0xLEpvaG4sRG9lCi0yLEphbmUsRG9lCi0zLEJpbGx5LE1jRG9lCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm5lY3RvcnMvamRiYy9ydW5qZGJjc2FtcGxlLnNoIGIvc2NyaXB0cy9jb25uZWN0b3JzL2pkYmMvcnVuamRiY3NhbXBsZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDZkOGYwNC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2Nvbm5lY3RvcnMvamRiYy9ydW5qZGJjc2FtcGxlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1lZGdlbnQ9Li4vLi4vLi4KLQotIyBSdW5zIHRoZSBTYW1wbGUgSkRCQyBXcml0ZXIgb3IgUmVhZGVyCi0jCi0jIC4vcnVuamRiY3NhbXBsZS5zaCB3cml0ZXIKLSMgLi9ydW5qZGJjc2FtcGxlLnNoIHJlYWRlcgotCi1pZiBbIC16ICIkREVSQllfSE9NRSIgXTsgdGhlbgotICAgIGVjaG8gIlwkREVSQllfSE9NRSBub3QgZGVmaW5lZC4iCi0gICAgZXhpdCAxOwotZmkKLWlmIFsgISAtZiAkREVSQllfSE9NRS9saWIvZGVyYnkuamFyIF07IHRoZW4KLSAgICBlY2hvICJcJERFUkJZX0hPTUUvbGliL2RlcmJ5LmphcjogZmlsZSBub3QgZm91bmQiCi0gICAgZXhpdCAxOwotZmkKLQotZXhwb3J0IENMQVNTUEFUSD0ke2VkZ2VudH0vc2FtcGxlcy9saWIvZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5qYXI6JERFUkJZX0hPTUUvbGliL2RlcmJ5LmphcgotCi1hcHA9JDE7IHNoaWZ0Ci1pZiBbICIkYXBwIiA9PSAid3JpdGVyIiBdOyB0aGVuCi0gICAgamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMuamRiYy5TaW1wbGVXcml0ZXJBcHAgamRiYy5wcm9wZXJ0aWVzCi1lbGlmIFsgIiRhcHAiID09ICJyZWFkZXIiIF07IHRoZW4KLSAgICBqYXZhIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5qZGJjLlNpbXBsZVJlYWRlckFwcCBqZGJjLnByb3BlcnRpZXMKLWVsc2UKLSAgICBlY2hvICJ1bnJlY29nbml6ZWQgbW9kZSAnJGFwcCciCi0gICAgZWNobyAidXNhZ2U6ICQwIHdyaXRlcnxyZWFkZXIiCi0gICAgZXhpdCAxCi1maQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL2thZmthL1JFQURNRSBiL3NjcmlwdHMvY29ubmVjdG9ycy9rYWZrYS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzZiZWMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2thZmthL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLVNhbXBsZSBLYWZrYSBQdWJsaXNoZXIgYW5kIFN1YnNjcmliZXIgdG9wb2xvZ3kgYXBwbGljYXRpb25zLgotCi1CeSBkZWZhdWx0IHRoZSBzYW1wbGVzIHJlcXVpcmUgdGhlIGZvbGxvd2luZyBrYWZrYSBicm9rZXIgY29uZmlndXJhdGlvbjoKLS0gYm9vdHN0cmFwLnNlcnZlcnM9ImxvY2FsaG9zdDo5MDkyIgotLSB6b29rZWVwZXIuY29ubmVjdD0ibG9jYWxob3N0OjIxODEiCi0tIGthZmthIHRvcGljICJrYWZrYVNhbXBsZVRvcGljIiBleGlzdHMKLS0gbm8gYXV0aGVudGljYXRpb24KLQotU2VlIFJFQURNRS1rYWZrYSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgc2V0dGluZyB1cCBhIGthZmthIHNlcnZlcgotYW5kIGNyZWF0aW5nIHRoZSB0b3BpYy4KLQotVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgc2FtcGxlcyBpcyBpbiB0aGUgPGVkZ2VudC1yZWxlYXNlPi9zYW1wbGVzIGRpcmVjdG9yeS4KLQotUnVubmluZyB0aGUgc2ltcGxlIHNhbXBsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Nb2RpZnkgdGhlIGthZmthLnByb3BlcnRpZXMgZmlsZSBpZiByZXF1aXJlZC4KLQotIyBydW4gdGhlIHNpbXBsZSBzYW1wbGUgc3Vic2NyaWJlcgotIyB0aGUgc3Vic2NyaWJlciBydW5zIGZvcmV2ZXIgcHJpbnRpbmcgb3V0IGVhY2ggcmVjZWl2ZWQgbWVzc2FnZQotJCAuL3J1bmthZmthc2FtcGxlLnNoIHN1YgotCi0jIHJ1biB0aGUgc2ltcGxlIHNhbXBsZSBwdWJsaXNoZXIKLSMgdGhlIHB1Ymxpc2hlciBydW5zIGZvcmV2ZXIgcHJpbnRpbmcgb3V0IGVhY2ggcHVibGlzaGVkIG1lc3NhZ2UKLSQgLi9ydW5rYWZrYXNhbXBsZS5zaCBwdWIKLQotUnVubmluZyB0aGUgZnVsbHkgY29uZmlndXJhYmxlIGNsaWVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgVG8gc2VlIGhvdyB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXM6Ci0kIC4vcnVua2Fma2FjbGllbnQuc2ggLWgKLQotIyBydW4gdGhlIHNhbXBsZSBzdWJzY3JpYmVyCi0jIHRoZSBzdWJzY3JpYmVyIHJ1bnMgZm9yZXZlciBwcmludGluZyBvdXQgZWFjaCByZWNlaXZlZCBtZXNzYWdlCi0kIC4vcnVua2Fma2FjbGllbnQuc2ggc3ViCi0KLSMgcnVuIHRoZSBzYW1wbGUgcHJvZHVjZXIKLSMgdGhlIHByb2R1Y2VyIHJ1bnMgZm9yZXZlciBwcmludGluZyBvdXQgZWFjaCBwdWJsaXNoZWQgbWVzc2FnZQotJCAuL3J1bmthZmthY2xpZW50LnNoIHB1YgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL2thZmthL1JFQURNRS1rYWZrYSBiL3NjcmlwdHMvY29ubmVjdG9ycy9rYWZrYS9SRUFETUUta2Fma2EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNTM5NjMuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2thZmthL1JFQURNRS1rYWZrYQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLVNldHRpbmcgdXAgYSBLYWZrYS9ab29rZWVwZXIgY29uZmlnIG9uIHRoZSBkZWZhdWx0IGxvY2FsaG9zdCBwb3J0cyBpcyBzaW1wbGUKLWFuZCB3ZWxsIGRvY3VtZW50ZWQgYXQgaHR0cHM6Ly9rYWZrYS5hcGFjaGUub3JnL3F1aWNrc3RhcnQuICBUaGlzIHNob3VsZCBkbyBpdDoKLQotQWZ0ZXIgZG93bmxvYWRpbmcga2Fma2E6Ci0KLXRhciB6eGYgfi9Eb3dubG9hZHMva2Fma2FfMi4xMS0wLjEwLjEuMC50Z3oKLWNkIGthZmthXzIuMTEtMC4xMC4xLjAvCi0KLSMgc3RhcnQgdGhlIHNlcnZlcnMgKGJlc3QgaW4gc2VwYXJhdGUgd2luZG93cykKLWJpbi96b29rZWVwZXItc2VydmVyLXN0YXJ0LnNoIGNvbmZpZy96b29rZWVwZXIucHJvcGVydGllcwotYmluL2thZmthLXNlcnZlci1zdGFydC5zaCBjb25maWcvc2VydmVyLnByb3BlcnRpZXMKLQotVGhlIHNhbXBsZSByZXF1aXJlcyBhIHRvcGljLiAgQ3JlYXRlIGl0OgotCi0jIGNyZWF0ZSBvdXIga2Fma2Egc2FtcGxlIHRvcGljCi1iaW4va2Fma2EtdG9waWNzLnNoIC0tY3JlYXRlIC0tem9va2VlcGVyIGxvY2FsaG9zdDoyMTgxIC0tcmVwbGljYXRpb24tZmFjdG9yIDEgLS1wYXJ0aXRpb25zIDEgLS10b3BpYyBrYWZrYVNhbXBsZVRvcGljCi1iaW4va2Fma2EtdG9waWNzLnNoIC0tbGlzdCAtLXpvb2tlZXBlciBsb2NhbGhvc3Q6MjE4MQotCi0jIHF1aWNrIHZlcmlmeQotYmluL2thZmthLWNvbnNvbGUtcHJvZHVjZXIuc2ggLS1icm9rZXItbGlzdCBsb2NhbGhvc3Q6OTA5MiAtLXRvcGljIGthZmthU2FtcGxlVG9waWMKLWhpCi10aGVyZQotXkQKLWJpbi9rYWZrYS1jb25zb2xlLWNvbnN1bWVyLnNoIC0tYm9vdHN0cmFwLXNlcnZlciBsb2NhbGhvc3Q6OTA5MiAtLXRvcGljIGthZmthU2FtcGxlVG9waWMgLS1mcm9tLWJlZ2lubmluZwotLi4uIHlvdSBzaG91bGQgc2VlIHRoZSAiaGkiIGFuZCAidGhlcmUiIG1lc3NhZ2VzLgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL2thZmthL2thZmthLnByb3BlcnRpZXMgYi9zY3JpcHRzL2Nvbm5lY3RvcnMva2Fma2Eva2Fma2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3MDA3OC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2Nvbm5lY3RvcnMva2Fma2Eva2Fma2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBib290c3RyYXAuc2VydmVycyBpcyBmb3IgYSBrYWZrYSBjb25zdW1lcgotYm9vdHN0cmFwLnNlcnZlcnM9bG9jYWxob3N0OjkwOTIKLSMgem9va2VlcGVyLmNvbm5lY3QgaXMgZm9yIGEga2Fma2EgcHJvZHVjZXIKLXpvb2tlZXBlci5jb25uZWN0PWxvY2FsaG9zdDoyMTgxCi0jZ3JvdXAuaWQ9Ci10b3BpYz1rYWZrYVNhbXBsZVRvcGljCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm5lY3RvcnMva2Fma2EvcnVua2Fma2FjbGllbnQuc2ggYi9zY3JpcHRzL2Nvbm5lY3RvcnMva2Fma2EvcnVua2Fma2FjbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkZjM4MjguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL2thZmthL3J1bmthZmthY2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1lZGdlbnQ9Li4vLi4vLi4KLQotIyBSdW5zIHRoZSBLYWZrYSBQdWJsaXNoZXIgb3IgU3Vic2NyaWJlciBDbGllbnQKLSMKLSMgLi9ydW5rYWZrYWNsaWVudC5zaCBwdWIKLSMgLi9ydW5rYWZrYWNsaWVudC5zaCBzdWIKLSMgLi9ydW5rYWZrYWNsaWVudC5zaCAtaAotCi1leHBvcnQgQ0xBU1NQQVRIPSR7ZWRnZW50fS9saWIvZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5qYXIKLQotamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2EuS2Fma2FDbGllbnQgJEAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9rYWZrYS9ydW5rYWZrYXNhbXBsZS5zaCBiL3NjcmlwdHMvY29ubmVjdG9ycy9rYWZrYS9ydW5rYWZrYXNhbXBsZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODlmZTg3MS4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2Nvbm5lY3RvcnMva2Fma2EvcnVua2Fma2FzYW1wbGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWVkZ2VudD0uLi8uLi8uLgotCi0jIFJ1bnMgdGhlIFNhbXBsZSBLYWZrYSBQdWJsaXNoZXIgb3IgU3Vic2NyaWJlcgotIwotIyAuL3J1bmthZmthc2FtcGxlLnNoIHB1YgotIyAuL3J1bmthZmthc2FtcGxlLnNoIHN1YgotCi1leHBvcnQgQ0xBU1NQQVRIPSR7ZWRnZW50fS9zYW1wbGVzL2xpYi9lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmphcgotCi1hcHA9JDE7IHNoaWZ0Ci1pZiBbICIkYXBwIiA9PSAicHViIiBdOyB0aGVuCi0gICAgamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMua2Fma2EuU2ltcGxlUHVibGlzaGVyQXBwIGthZmthLnByb3BlcnRpZXMKLWVsaWYgWyAiJGFwcCIgPT0gInN1YiIgXTsgdGhlbgotICAgIGphdmEgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmthZmthLlNpbXBsZVN1YnNjcmliZXJBcHAga2Fma2EucHJvcGVydGllcwotZWxzZQotICAgIGVjaG8gInVucmVjb2duaXplZCBtb2RlICckYXBwJyIKLSAgICBlY2hvICJ1c2FnZTogJDAgcHVifHN1YiIKLSAgICBleGl0IDEKLWZpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nvbm5lY3RvcnMvbXF0dC9SRUFETUUgYi9zY3JpcHRzL2Nvbm5lY3RvcnMvbXF0dC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMjgwN2MuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL21xdHQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotU2FtcGxlIE1RVFQgUHVibGlzaGVyIGFuZCBTdWJzY3JpYmVyIHRvcG9sb2d5IGFwcGxpY2F0aW9ucy4KLQotQnkgZGVmYXVsdCwgdGhlIGZvbGxvd2luZyBNUVRUIGJyb2tlciBjb25maWd1cmF0aW9uIGlzIGFzc3VtZWQ6Ci0tIHRoZSBicm9rZXIncyBjb25uZWN0aW9uIFVSTCBpcyB0Y3A6Ly9sb2NhbGhvc3Q6MTg4MwotLSB0aGUgYnJva2VyIGlzIGNvbmZpZ3VyZWQgZm9yIG5vIGF1dGhlbnRpY2F0aW9uCi0KLVNlZSBodHRwOi8vbXF0dC5vcmcgZm9yIHRoZSBjb2RlIGFuZCBzZXR1cCBpbmZvcm1hdGlvbiBmb3IKLWEgbXF0dCBicm9rZXIuCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHNhbXBsZXMgaXMgaW4gdGhlIDxlZGdlbnQtcmVsZWFzZT4vc2FtcGxlcyBkaXJlY3RvcnkuCi0KLVJ1bm5pbmcgdGhlIHNpbXBsZSBzYW1wbGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTW9kaWZ5IHRoZSBtcXR0LnByb3BlcnRpZXMgZmlsZSBpZiByZXF1aXJlZC4KLQotIyBydW4gdGhlIHNpbXBsZSBzYW1wbGUgc3Vic2NyaWJlcgotIyB0aGUgc3Vic2NyaWJlciBydW5zIGZvcmV2ZXIgcHJpbnRpbmcgb3V0IGVhY2ggcmVjZWl2ZWQgbWVzc2FnZQotJCAuL3J1bm1xdHRzYW1wbGUuc2ggc3ViCi0KLSMgcnVuIHRoZSBzaW1wbGUgc2FtcGxlIHB1Ymxpc2hlcgotIyB0aGUgcHVibGlzaGVyIHJ1bnMgZm9yZXZlciBwcmludGluZyBvdXQgZWFjaCBwdWJsaXNoZWQgbWVzc2FnZQotJCAuL3J1bm1xdHRzYW1wbGUuc2ggcHViCi0KLVJ1bm5pbmcgdGhlIGZ1bGx5IGNvbmZpZ3VyYWJsZSBjbGllbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFRvIHNlZSBob3cgdG8gc3BlY2lmeSBkaWZmZXJlbnQgdmFsdWVzOgotJCAuL3J1bm1xdHRjbGllbnQuc2ggLWgKLQotIyBydW4gdGhlIHN1YnNjcmliZXIgY2xpZW50Ci0jIHRoZSBzdWJzY3JpYmVyIHJ1bnMgZm9yZXZlciBwcmludGluZyBvdXQgZWFjaCByZWNlaXZlZCBtZXNzYWdlCi0kIC4vcnVubXF0dGNsaWVudC5zaCBzdWIKLQotIyBydW4gdGhlIHB1Ymxpc2hlciBjbGllbnQKLSMgdGhlIHB1Ymxpc2hlciBydW5zIGZvcmV2ZXIgcHJpbnRpbmcgb3V0IGVhY2ggcHVibGlzaGVkIG1lc3NhZ2UKLSQgLi9ydW5tcXR0Y2xpZW50LnNoIHB1YgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL21xdHQvbXF0dC5wcm9wZXJ0aWVzIGIvc2NyaXB0cy9jb25uZWN0b3JzL21xdHQvbXF0dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjI4YzdjLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY29ubmVjdG9ycy9tcXR0L21xdHQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLW1xdHQuc2VydmVyVVJMcz10Y3A6Ly9sb2NhbGhvc3Q6MTg4MwotI21xdHQuc2VydmVyVVJMcz10Y3A6Ly90ZXN0Lm1vc3F1aXR0by5vcmc6MTg4MwotI21xdHQuc2VydmVyVVJMcz10Y3A6Ly9pb3QuZWNsaXBzZS5vcmc6MTg4MwotbXF0dC50b3BpYz1tcXR0U2FtcGxlVG9waWMKLSNtcXR0LnVzZXJOYW1lPQotI21xdHQucGFzc3dvcmQ9Ci0jbXF0dC50cnVzdFN0b3JlPQotI21xdHQudHJ1c3RTdG9yZVBhc3N3b3JkPQotI21xdHQua2V5U3RvcmU9Ci0jbXF0dC5rZXlTdG9yZVBhc3N3b3JkPQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25uZWN0b3JzL21xdHQvcnVubXF0dGNsaWVudC5zaCBiL3NjcmlwdHMvY29ubmVjdG9ycy9tcXR0L3J1bm1xdHRjbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5MDRkMzQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jb25uZWN0b3JzL21xdHQvcnVubXF0dGNsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotZWRnZW50PS4uLy4uLy4uCi0KLSMgUnVucyB0aGUgTVFUVCBQdWJsaXNoZXIgb3IgU3Vic2NyaWJlciBjbGllbnQKLSMKLSMgLi9ydW5tcXR0Y2xpZW50LnNoIHB1YgotIyAuL3J1bm1xdHRjbGllbnQuc2ggc3ViCi0jIC4vcnVubXF0dGNsaWVudC5zaCAtaAotCi1leHBvcnQgQ0xBU1NQQVRIPSR7ZWRnZW50fS9zYW1wbGVzL2xpYi9lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmphcgotCi1qYXZhIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0Lk1xdHRDbGllbnQgJEAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29ubmVjdG9ycy9tcXR0L3J1bm1xdHRzYW1wbGUuc2ggYi9zY3JpcHRzL2Nvbm5lY3RvcnMvbXF0dC9ydW5tcXR0c2FtcGxlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZGIyMmMwLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY29ubmVjdG9ycy9tcXR0L3J1bm1xdHRzYW1wbGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWVkZ2VudD0uLi8uLi8uLgotCi0jIFJ1bnMgdGhlIFNhbXBsZSBNUVRUIFB1Ymxpc2hlciBvciBTdWJzY3JpYmVyCi0jCi0jIC4vcnVubXF0dHNhbXBsZS5zaCBwdWIKLSMgLi9ydW5tcXR0c2FtcGxlLnNoIHN1YgotCi1leHBvcnQgQ0xBU1NQQVRIPSR7ZWRnZW50fS9zYW1wbGVzL2xpYi9lZGdlbnQuc2FtcGxlcy5jb25uZWN0b3JzLmphcgotCi1hcHA9JDE7IHNoaWZ0Ci1pZiBbICIkYXBwIiA9PSAicHViIiBdOyB0aGVuCi0gICAgamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmNvbm5lY3RvcnMubXF0dC5TaW1wbGVQdWJsaXNoZXJBcHAgbXF0dC5wcm9wZXJ0aWVzCi1lbGlmIFsgIiRhcHAiID09ICJzdWIiIF07IHRoZW4KLSAgICBqYXZhIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMuY29ubmVjdG9ycy5tcXR0LlNpbXBsZVN1YnNjcmliZXJBcHAgbXF0dC5wcm9wZXJ0aWVzCi1lbHNlCi0gICAgZWNobyAidW5yZWNvZ25pemVkIG1vZGUgJyRhcHAnIgotICAgIGVjaG8gInVzYWdlOiAkMCBwdWJ8c3ViIgotICAgIGV4aXQgMQotZmkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY3Jvbi9SRUFETUUgYi9zY3JpcHRzL2Nyb24vUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNmMGIyLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvY3Jvbi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1SZXN0YXJ0aW5nIEVkZ2VudCBpZiB0aGUgSlZNIGNyYXNoZXMKLQotVGhlIHN0YXJ0YXBwLnNoIHNjcmlwdCBjYW4gYmUgc2V0dXAgdG8gcnVuIGFzIGEgY3JvbiBqb2IgZXZlcnkgbWludXRlIGluIG9yZGVyCi10byBtb25pdG9yIGEgSlZNIHJ1bm5pbmcgYW4gRWRnZW50IGFwcGxpY2F0aW9uIGFuZCByZXN0YXJ0IEVkZ2VudCBpZiB0aGUgCi1KVk0gY3Jhc2hlcy4gVGhlIHNjcmlwdCBjaGVja3Mgd2hldGhlciB0aGUgcGlkIG9mIHRoZSBKVk0gaW5kaWNhdGVzCi1hIHByb2Nlc3Mgd2hpY2ggaXMgc3RpbGwgcnVubmluZy4gIElmIHRoZSBwaWQgaXMgbm90IHRoZXJlLCBpdCBleGVjdXRlcyB0aGUgCi1jb21tYW5kIHRvIHN0YXJ0IHRoZSBhcHBsaWNhdGlvbiBpbiB0aGUgZmlyc3QgcGxhY2UuCi0KLUEgY3JvbnRhYiBlbnRyeSBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHdoaWNoIGNyb24gdXNlcyB0byBzY2hlZHVsZSB0aGUgam9iLgotVGhlIHNhbXBsZSBzdGFydGFwcC5jcm9uIGZpbGUgaXMgY29uZmlndXJlZCB0byBleGVjdXRlIHRoZSAKLW9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuVGVybWluYXRlQWZ0ZXJOVHVwbGVzIHNhbXBsZSBhcHBsaWNhdGlvbiwKLXdoaWNoIHRlcm1pbmF0ZXMgdGhlIEpWTSBhZnRlciBwcm9jZXNzaW5nIGEgcHJlc2V0IG51bWJlciBvZiB0dXBsZXMuCi0KLVRvIHNldHVwIGNyb24gdG8gcmVzdGFydCB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIGV2ZXJ5IG1pbnV0ZToKLQotMS4gRWRpdCB0aGUgc3RhcnRhcHAuY3JvbiBmaWxlOgotICAgLSBTZXQgdGhlIEVER0VOVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0byB5b3VyIGVkZ2VudCBpbnN0YWxsYXRpb24sCi0gICAgIGZvciBleGFtcGxlOiBFREdFTlQ9L2hvbWUveW91cl91c2VyaWQvZWRnZW50LXJlbGVhc2UvZWRnZW50L2phdmE4Ci0gICAtIFNldCBKQVZBX0hPTUUgdG8gcG9pbnQgdG8geW91ciBKYXZhIGluc3RhbGwgZGlyZWN0b3J5LiAKLQotMi4gSW5zdGFsbCBzdGFydGFwcC5jcm9uOgotCi0gICAkIGNyb250YWIgLi9zdGFydGFwcC5jcm9uCi0KLSAgIE5vdGU6IGlmIHlvdSB3aXNoIHRvIGhhdmUgeW91ciB+Ly5wcm9maWxlIGV4ZWN1dGVkIHlvdSBtdXN0IGV4cGxpY2l0bHkKLSAgIGRvIHNvIGluIHRoZSBjcm9udGFiIGVudHJ5IG9yIGluIGEgc2NyaXB0IGNhbGxlZCBieSB0aGUgZW50cnkuCi0KLTMuIFRvIHJlbW92ZSB0aGUgY3VycmVudCBjcm9udGFiIGVudHJpZXM6Ci0KLSAgICQgY3JvbnRhYiAtcgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jcm9uL3N0YXJ0YXBwLmNyb24gYi9zY3JpcHRzL2Nyb24vc3RhcnRhcHAuY3JvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyZjgwNy4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2Nyb24vc3RhcnRhcHAuY3JvbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyBDcm9udGFiIGZpbGUgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgZm9yIHNjaGVkdWxpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhIAotIyBtb25pdG9yaW5nIHNjcmlwdCBldmVyeSBtaW51dGUgdXNpbmcgY3Jvbi4KLSMKLSMgWW91IG11c3Qgc2V0IHRoZSBFREdFTlQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8geW91ciBFZGdlbnQgCi0jIGluc3RhbGxhdGlvbjoKLSMgRURHRU5UPS9ob21lL3lvdXJfdXNlcmlkL2VkZ2VudC9qYXZhOAotIwotIyBNYWtlIHN1cmUgdGhhdCBKQVZBX0hPTUUgaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCB1c2VkIGJ5IGNyb246Ci0jIEpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vanJlCi0KLSogKiAqICogKiAkRURHRU5UL3NjcmlwdHMvY3Jvbi9zdGFydGFwcC5zaCAkRURHRU5UL3NhbXBsZXMvbGliL2VkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LmphciBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LlRlcm1pbmF0ZUFmdGVyTlR1cGxlcyAvdG1wID4+IC90bXAvZWRnZW50LWNyb24ubG9nCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Nyb24vc3RhcnRhcHAuc2ggYi9zY3JpcHRzL2Nyb24vc3RhcnRhcHAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlYzU3ZGQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9jcm9uL3N0YXJ0YXBwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotX3VzYWdlKCkgewotICBlY2hvIC1lICJVc2FnZTogJHswfSB7Y2xhc3NwYXRofSB7bWFpbmNsYXNzfSBbZGlyXVxuXG5cCi1SdW5zIGEgSmF2YSBhcHBsaWNhdGlvbiB3aGlsZSBzYXZpbmcgaXRzIHN0ZG91dCB0byBkaXIvbWFpbmNsYXNzLm91dCwgaXRzIHN0ZGVyciB0byBkaXIvbWFpbmNsYXNzLmVyciwgYW5kIGl0cyBwcm9jZXNzIGlkIHRvIGRpci9tYWluY2xhc3MucGlkLlxuXAotXG5cCi1UaGlzIHNjcmlwdCBzdGFydHMgYSBKYXZhIGFwcGxpY2F0aW9uIG9ubHkgaWYgaXQgY2Fubm90IGZpbmQgaXRzIHBpZC4gSWYgdGhlIHByb2Nlc3MgaWQgc3BlY2lmaWVkIGJ5IGRpci9tYWluY2xhc3MucGlkIGV4aXN0cywgdGhlbiB0aGUgc2NyaXB0IHdpbGwgbm90IHN0YXJ0IHRoZSBhcHBsaWNhdGlvbi5cblwKLVxuXAotICAgIGNsYXNzcGF0aCBUaGUgYXBwbGljYXRpb24ncyBjbGFzcyBwYXRoLlxuXAotICAgIGNsYXNzbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbGF1bmNoZWQuXG5cCi0gICAgZGlyICAgICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHByb2Nlc3Mgc3Rkb3V0LCBzdGRlcnIgYW5kIHBpZCBmaWxlcyBhcmVcblwKLSAgICAgICAgICAgICAgd3JpdHRlbi4gSWYgZGlyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIGZpbGVzIGFyZSBzYXZlZCBpbnRvXG5cCi0gICAgICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeS5cblwKLSIKLX0KLQotIyBfZ2V0X3BpZCBwcm9ncmFtIFtwaWRmaWxlXQotIyBTZXQgJHBpZCB0byBwaWRzIGZyb20gL3RtcCogZm9yIHtwcm9ncmFtfS4KLSMgJHBpZCBzaG91bGQgYmUgZGVjbGFyZWQgbG9jYWwgaW4gdGhlIGNhbGxlci4KLV9nZXRfcGlkKCkgewotICBsb2NhbCBiYXNlPSR7MSMjKi99Ci0gIGxvY2FsIHBpZF9maWxlPSR7MjotL3RtcC8kYmFzZS5waWR9Ci0KLSAgcGlkPQotICBpZiBbIC1mICIkcGlkX2ZpbGUiIF0gOyB0aGVuCi0gICAgbG9jYWwgcAotCi0gICAgWyAhIC1yICIkcGlkX2ZpbGUiIF0gJiYgcmV0dXJuIDEgIyAiQ2Fubm90IGFjY2VzcyBwaWQgZmlsZSIKLQotICAgIHA9JChjYXQgIiRwaWRfZmlsZSIpCi0gICAgWyAteiAiJHtwLy9bMC05XS99IiBdICYmIFsgLWQgIi9wcm9jLyRwIiBdICYmIHBpZD0iJHAiCi0gICAgaWYgWyAtbiAiJHBpZCIgXTsgdGhlbgotICAgICAgICByZXR1cm4gMAotICAgIGZpCi0gICAgcmV0dXJuIDIgIyAiUHJvZ3JhbSBpcyBub3QgcnVubmluZyBidXQgcGlkIGZpbGUgZXhpc3RzIgotICBmaQotICByZXR1cm4gMyAjICJQcm9ncmFtIHBpZCBmaWxlIGRvZXMgbm90IGV4aXN0IgotfQotCi0jIF9yZWFkbGluayBwYXRoCi0jIE91dHB1dCB0aGUgZnVsbCBwYXRoLCByZXBsYWNlbWVudCBmb3IgcmVhZGxpbmsgLWYKLV9yZWFkbGluaygpIHsKLSAgKAotICBwdXNoZCAkezElLyp9ID4gL2Rldi9udWxsIDI+JjEKLSAgZWNobyAkUFdELyR7MSMjKi99Ci0gIHBvcGQgPiAvZGV2L251bGwgMj4mMQotICApCi19Ci0KLSMgX2Rpcm5hbWUgcGF0aAotIyBHZXQgdGhlIGRpcmVjdG9yeSBuYW1lLCByZXBsYWNlbWVudCBmb3IgZGlybmFtZS4KLV9kaXJuYW1lKCkgewotICBlY2hvICR7MSUvKn0KLX0KLQotX2Vycm9yKCkgewotICBlY2hvICQxOyBleGl0IDEKLX0KLQotCi0jIyBNYWluIHNjcmlwdAotWyAhIC1uICIke0VER0VOVDotfSIgXSAmJiBFREdFTlQ9Li4vLi4KLVsgISAtbiAiJHtKQVZBX0hPTUU6LX0iIF0gJiYgX2Vycm9yICJKQVZBX0hPTUUgbXVzdCBiZSBzZXQiCi0KLWlmIFsgJCMgLWx0IDIgXTsgdGhlbgotICBfdXNhZ2UKLSAgZXhpdCAxCi1maQotCi1jbGFzc3BhdGg9JHsxfQotbWFpbl9jbGFzcz0kezJ9Ci1vdXRfZGlyPSR7MzotLn0KLQotIyBDb21tYW5kIHRvIHN0YXJ0IHRoZSBhcHBsaWNhdGlvbi4KLWNvbW1hbmQ9IiR7SkFWQV9IT01FfS9iaW4vamF2YSAtY3AgJHtjbGFzc3BhdGh9ICR7bWFpbl9jbGFzc30iCi0KLWlmIFtbICEgLWQgJHtvdXRfZGlyfSB8fCAke291dF9kaXI6MDoxfSAhPSAnLycgXV07IHRoZW4KLSAgIyMgb3V0X2RpciBhcyBhYnNvbHV0ZSBwYXRoCi0gIG91dF9kaXI9JChfcmVhZGxpbmsgJHtvdXRfZGlyfSkKLSAgb3V0X2Rpcj0kKF9kaXJuYW1lICR7b3V0X2Rpcn0pCi1maQotCi1waWRfZmlsZT0ke291dF9kaXJ9LyR7bWFpbl9jbGFzc30ucGlkCi1vdXRfZmlsZT0ke291dF9kaXJ9LyR7bWFpbl9jbGFzc30ub3V0Ci1lcnJfZmlsZT0ke291dF9kaXJ9LyR7bWFpbl9jbGFzc30uZXJyCi1waWQ9Ci0KLV9nZXRfcGlkICRtYWluX2NsYXNzICRwaWRfZmlsZQotUkM9IiQ/IgotWyAkUkMgPT0gIjEiIF0gJiYgX2Vycm9yICJDYW5ub3QgYWNjZXNzIHBpZCBmaWxlICRwaWRfZmlsZSIKLQotaWYgWyAteiAiJHBpZCIgXTsgdGhlbgotICAkY29tbWFuZCA+PiAkb3V0X2ZpbGUgMj4+ICRlcnJfZmlsZSAmCi0gIHBpZD0iJCEiCi0gIGVjaG8gJHBpZCA+fCAkcGlkX2ZpbGUKLSAgZWNobyAtZSAiVGhlIHByb2dyYW0gd2FzIHJlc3RhcnRlZCB3aXRoIGNvbW1hbmQ6XG5cCi0ke2NvbW1hbmR9XG5cCi1Qcm9jZXNzIGlkOiAkcGlkIgotZWxzZQotICBlY2hvICJUaGUgcHJvZ3JhbSdzIHByb2Nlc3MgaWQgaXMgJHBpZCIKLWZpCmRpZmYgLS1naXQgYS9zY3JpcHRzL3J1bmhlbGxvZWRnZW50LmNtZCBiL3NjcmlwdHMvcnVuaGVsbG9lZGdlbnQuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2YyMjQxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcnVuaGVsbG9lZGdlbnQuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQGVjaG8gT0ZGCi0KLVJFTSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLVJFTSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLVJFTSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1SRU0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLVJFTSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotUkVNIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1SRU0KLVJFTSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLVJFTQotUkVNIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLVJFTSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotUkVNIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotUkVNIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLVJFTSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotUkVNIFJ1bnMgSGVsbG9FZGdlbnQKLXNldCBDTEFTU1BBVEg9Li5cc2FtcGxlc1xsaWJcZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuamFyCi1qYXZhIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuSGVsbG9FZGdlbnQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcnVucGVyaW9kaWNzb3VyY2UuY21kIGIvc2NyaXB0cy9ydW5wZXJpb2RpY3NvdXJjZS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzAwYTguLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9ydW5wZXJpb2RpY3NvdXJjZS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AZWNobyBPRkYKLQotUkVNIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotUkVNIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotUkVNIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLVJFTSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotUkVNICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi1SRU0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLVJFTQotUkVNICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotUkVNCi1SRU0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotUkVNIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1SRU0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1SRU0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotUkVNIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1SRU0gUnVucyBQZXJpb2RTb3VyY2UKLXNldCBDTEFTU1BBVEg9Li5cc2FtcGxlc1xsaWJcZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuamFyCi1qYXZhIG9yZy5hcGFjaGUuZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuUGVyaW9kaWNTb3VyY2UKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcnVucGVyaW9kaWNzb3VyY2Uuc2ggYi9zY3JpcHRzL3J1bnBlcmlvZGljc291cmNlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NjcyNDdkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcnVucGVyaW9kaWNzb3VyY2Uuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1lZGdlbnQ9Li4KLQotIyBSdW5zIFBlcmlvZFNvdXJjZQotIwotZXhwb3J0IENMQVNTUEFUSD0iJHtlZGdlbnR9L3NhbXBsZXMvbGliL2VkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LmphciIKLWphdmEgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy50b3BvbG9neS5QZXJpb2RpY1NvdXJjZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ydW5zZW5zb3JhZ2dyZWdhdGVzLmNtZCBiL3NjcmlwdHMvcnVuc2Vuc29yYWdncmVnYXRlcy5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTQ1MzkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9ydW5zZW5zb3JhZ2dyZWdhdGVzLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUBlY2hvIE9GRgotCi1SRU0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi1SRU0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi1SRU0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotUkVNIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi1SRU0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLVJFTSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotUkVNCi1SRU0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1SRU0KLVJFTSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1SRU0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVJFTSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVJFTSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1SRU0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVJFTSBSdW5zIFNlbnNvcnNSZWFkaW5nQWdncmVnYXRlcwotc2V0IENMQVNTUEFUSD0uLlxzYW1wbGVzXGxpYlxlZGdlbnQuc2FtcGxlcy50b3BvbG9neS5qYXIKLWphdmEgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy50b3BvbG9neS5TZW5zb3JzQWdncmVnYXRlcwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ydW5zZW5zb3JhZ2dyZWdhdGVzLnNoIGIvc2NyaXB0cy9ydW5zZW5zb3JhZ2dyZWdhdGVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmU0ZTUxLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvcnVuc2Vuc29yYWdncmVnYXRlcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLWVkZ2VudD0uLgotCi0jIFJ1bnMgU2Vuc29yc1JlYWRpbmdBZ2dyZWdhdGVzCi0jCi1leHBvcnQgQ0xBU1NQQVRIPSIke2VkZ2VudH0vc2FtcGxlcy9saWIvZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuamFyIgotamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LlNlbnNvcnNBZ2dyZWdhdGVzCmRpZmYgLS1naXQgYS9zY3JpcHRzL3J1bnNpbXBsZWZpbHRlcnRyYW5zZm9ybS5jbWQgYi9zY3JpcHRzL3J1bnNpbXBsZWZpbHRlcnRyYW5zZm9ybS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjlkYjkuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9ydW5zaW1wbGVmaWx0ZXJ0cmFuc2Zvcm0uY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQGVjaG8gT0ZGCi0KLVJFTSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLVJFTSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLVJFTSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1SRU0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLVJFTSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotUkVNIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1SRU0KLVJFTSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLVJFTQotUkVNIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLVJFTSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotUkVNIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotUkVNIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLVJFTSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotUkVNIFJ1bnMgU2ltcGxlRmlsdGVyVHJhbnNmb3JtCi1zZXQgQ0xBU1NQQVRIPS4uXHNhbXBsZXNcbGliXGVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LmphcgotamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LlNpbXBsZUZpbHRlclRyYW5zZm9ybQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ydW5zaW1wbGVmaWx0ZXJ0cmFuc2Zvcm0uc2ggYi9zY3JpcHRzL3J1bnNpbXBsZWZpbHRlcnRyYW5zZm9ybS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjkyZDA0MC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL3J1bnNpbXBsZWZpbHRlcnRyYW5zZm9ybS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLWVkZ2VudD0uLgotCi0jIFJ1bnMgU2ltcGxlRmlsdGVyVHJhbnNmb3JtCi0jCi1leHBvcnQgQ0xBU1NQQVRIPSIke2VkZ2VudH0vc2FtcGxlcy9saWIvZWRnZW50LnNhbXBsZXMudG9wb2xvZ3kuamFyIgotamF2YSBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLnRvcG9sb2d5LlNpbXBsZUZpbHRlclRyYW5zZm9ybQpkaWZmIC0tZ2l0IGEvc2V0dGluZ3MuZ3JhZGxlIGIvc2V0dGluZ3MuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTBhMzg1Li4wMDAwMDAwCi0tLSBhL3NldHRpbmdzLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotIAotLy8gTi5CLiBpZiB5b3UgYWRkIGEgc3VicHJvamVjdCB0byBhIG5ldyAnYWdncmVnYXRvciBvbmx5JyBwcm9qZWN0Ci0vLyBhZGp1c3QgdGhlICdhZ2dyZWdhdG9yT25seVByb2plY3RzJyBsaXN0IGluIGJ1aWxkLmdyYWRsZQotCi1pbmNsdWRlICdhcGk6ZnVuY3Rpb24nCi1pbmNsdWRlICdhcGk6ZXhlY3V0aW9uJwotaW5jbHVkZSAnYXBpOndpbmRvdycKLWluY2x1ZGUgJ2FwaTpvcGxldCcKLWluY2x1ZGUgJ2FwaTpncmFwaCcKLWluY2x1ZGUgJ2FwaTp0b3BvbG9neScKLWluY2x1ZGUgJ3NwaTpncmFwaCcKLWluY2x1ZGUgJ3NwaTp0b3BvbG9neScKLWluY2x1ZGUgJ3J1bnRpbWU6YXBwc2VydmljZScKLWluY2x1ZGUgJ3J1bnRpbWU6ZXRpYW8nCi1pbmNsdWRlICdydW50aW1lOmpteGNvbnRyb2wnCi1pbmNsdWRlICdydW50aW1lOmpzb25jb250cm9sJwotaW5jbHVkZSAncnVudGltZTpqb2JyZWdpc3RyeScKLWluY2x1ZGUgJ3V0aWxzOm1ldHJpY3MnCi1pbmNsdWRlICd1dGlsczpzdHJlYW1zY29wZScKLWluY2x1ZGUgJ3Byb3ZpZGVyczpkaXJlY3QnCi1pbmNsdWRlICdjb25uZWN0b3JzOmNvbW1hbmQnCi1pbmNsdWRlICdjb25uZWN0b3JzOmNvbW1vbicKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6Y3N2JwotaW5jbHVkZSAnY29ubmVjdG9yczppb3QnCi1pbmNsdWRlICdjb25uZWN0b3JzOnNlcmlhbCcKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6ZmlsZScKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6aHR0cCcKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6aW90cCcKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6amRiYycKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6a2Fma2EnCi1pbmNsdWRlICdjb25uZWN0b3JzOm1xdHQnCi1pbmNsdWRlICdjb25uZWN0b3JzOnB1YnN1YicKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6ZWRnZW50LmphdmF4LndlYnNvY2tldCcKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6amF2YXgud2Vic29ja2V0LWNsaWVudCcKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6amF2YXgud2Vic29ja2V0LXNlcnZlcicKLWluY2x1ZGUgJ2Nvbm5lY3RvcnM6d3NjbGllbnQnCi1pbmNsdWRlICdjb25uZWN0b3JzOndzY2xpZW50LWphdmF4LndlYnNvY2tldCcKLWluY2x1ZGUgJ2NvbnNvbGU6c2VydmVyJwotaW5jbHVkZSAnY29uc29sZTpzZXJ2bGV0cycKLWluY2x1ZGUgJ2FwcHM6aW90JwotaW5jbHVkZSAnYXBwczpydW50aW1lJwotaW5jbHVkZSAncHJvdmlkZXJzOmRldmVsb3BtZW50JwotaW5jbHVkZSAncHJvdmlkZXJzOmlvdCcKLWluY2x1ZGUgJ2FuYWx5dGljczptYXRoMycKLWluY2x1ZGUgJ2FuYWx5dGljczpzZW5zb3JzJwotaW5jbHVkZSAnc2FtcGxlczp1dGlscycKLWluY2x1ZGUgJ3NhbXBsZXM6YXBwcycKLWluY2x1ZGUgJ3NhbXBsZXM6dG9wb2xvZ3knCi1pbmNsdWRlICdzYW1wbGVzOmNvbm5lY3RvcnMnCi1pbmNsdWRlICdzYW1wbGVzOmNvbnNvbGUnCi1pbmNsdWRlICdzYW1wbGVzOnNjZW5hcmlvcycKLWluY2x1ZGUgJ3Rlc3Q6ZnZ0aW90JwotaW5jbHVkZSAndGVzdDpzdnQnCi1pbmNsdWRlICdwbGF0Zm9ybTpqYXZhNycKLWluY2x1ZGUgJ3BsYXRmb3JtOmFuZHJvaWQnCi1pbmNsdWRlICdhbmRyb2lkOnRvcG9sb2d5JwotaW5jbHVkZSAnYW5kcm9pZDpoYXJkd2FyZScKLQotcm9vdFByb2plY3QubmFtZSA9IGJ1aWxkX25hbWUKZGlmZiAtLWdpdCBhL3NwaS8uY2xhc3NwYXRoIGIvc3BpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMGQ3ZTIuLjAwMDAwMDAKLS0tIGEvc3BpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJncmFwaC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idG9wb2xvZ3kvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRvcG9sb2d5L3NyYy90ZXN0L2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuSlVOSVRfQ09OVEFJTkVSLzQiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvYXBpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2V4dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9zcGkvLmdpdGlnbm9yZSBiL3NwaS8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhmZTQ0Li4wMDAwMDAwCi0tLSBhL3NwaS8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vY2xhc3Nlcy8KLSoqL3Rlc3QuY2xhc3Nlcy8KLSoqL2NsYXNzZXMvCi0qKi91bml0dGVzdHMvCi0vYmluLwpkaWZmIC0tZ2l0IGEvc3BpLy5wcm9qZWN0IGIvc3BpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGMyYmU4Li4wMDAwMDAwCi0tLSBhL3NwaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnNwaTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9zcGkvUkVBRE1FLm1kIGIvc3BpL1JFQURNRS5tZAppbmRleCA0N2Q1YzU4Li43Y2RjMmNiIDEwMDY0NAotLS0gYS9zcGkvUkVBRE1FLm1kCisrKyBiL3NwaS9SRUFETUUubWQKQEAgLTEsMiArMSwyMCBAQAorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KIHNwaSBwcm92aWRlcyBiYXNlcyBjbGFzc2VzIGZvciBidWlsZGluZyB0aGUgYXBpcwogKiB0b3BvbG9neSBiYXNlIGNsYXNzZXMgZm9yIGJ1aWxkaW5nIGEgVG9wb2xvZ3lQcm92aWRlci4gSXQgaXMgbm90IHJlcXVpcmVkIHRoYXQgYSBUb3BvbG9neVByb3ZpZGVyIHVzZXMgdGhlc2UgY2xhc3Nlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcGkvZ3JhcGgvYnVpbGQuZ3JhZGxlIGIvc3BpL2dyYXBoL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNmE5My4uMDAwMDAwMAotLS0gYS9zcGkvZ3JhcGgvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOmV4ZWN1dGlvbicKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTpncmFwaCcKLSAgYWRkVGFyZ2V0RGlyQ29yZUV4dEphckRlcGVuZGVuY2llcyAnY29tcGlsZScKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvc3BpL2dyYXBoL3BvbS54bWwgYi9zcGkvZ3JhcGgvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ3ZGUzCi0tLSAvZGV2L251bGwKKysrIGIvc3BpL2dyYXBoL3BvbS54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBTUEk6IEdyYXBoPC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLWV4ZWN1dGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS1ncmFwaDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NwaS9wb20ueG1sIGIvc3BpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMTVmNQotLS0gL2Rldi9udWxsCisrKyBiL3NwaS9wb20ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC1zcGk8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogU1BJPC9uYW1lPgorCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+Z3JhcGg8L21vZHVsZT4KKyAgICA8bW9kdWxlPnRvcG9sb2d5PC9tb2R1bGU+CisgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3BpL3RvcG9sb2d5L2J1aWxkLmdyYWRsZSBiL3NwaS90b3BvbG9neS9idWlsZC5ncmFkbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MjRlNTkuLjAwMDAwMDAKLS0tIGEvc3BpL3RvcG9sb2d5L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOmFwaTp0b3BvbG9neScKLSAgYWRkVGFyZ2V0RGlyQ29yZUV4dEphckRlcGVuZGVuY2llcyAnY29tcGlsZScKLQotICAvLyBOLkIuIHJvb3QgcHJvamVjdCBhZGRzIHRlc3QgY29tbW9uIGRlcGVuZGVuY2llcwotfQpkaWZmIC0tZ2l0IGEvc3BpL3RvcG9sb2d5L3BvbS54bWwgYi9zcGkvdG9wb2xvZ3kvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NiYWZkCi0tLSAvZGV2L251bGwKKysrIGIvc3BpL3RvcG9sb2d5L3BvbS54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXNwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBTUEk6IFRvcG9sb2d5PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxyZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4uLi8uLi9zcmMvbWFpbi9pYm0tcmVtb3RlLXJlc291cmNlczwvcmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3BpL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdG9wb2xvZ3kvc3BpL3Rlc3Rlci9BYnN0cmFjdFRlc3Rlci5qYXZhIGIvc3BpL3RvcG9sb2d5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdG9wb2xvZ3kvc3BpL3Rlc3Rlci9BYnN0cmFjdFRlc3Rlci5qYXZhCmluZGV4IDI3MGQzZmQuLjNkZWU3MmEgMTAwNjQ0Ci0tLSBhL3NwaS90b3BvbG9neS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3RvcG9sb2d5L3NwaS90ZXN0ZXIvQWJzdHJhY3RUZXN0ZXIuamF2YQorKysgYi9zcGkvdG9wb2xvZ3kvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90b3BvbG9neS9zcGkvdGVzdGVyL0Fic3RyYWN0VGVzdGVyLmphdmEKQEAgLTIyLDggKzIyLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmV4ZWN1dGlvbi5Kb2I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuZXhlY3V0aW9uLlN1Ym1pdHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5leGVjdXRpb24uSm9iLlN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmV4ZWN1dGlvbi5TdWJtaXR0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kudGVzdGVyLkNvbmRpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS50ZXN0ZXIuVGVzdGVyOwpAQCAtMzMsMTIgKzMzLDMzIEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXN0ZXIgaW1wbGVtZW50cyBUZXN0ZXIgeyAKICAgICAKICAgICBwcml2YXRlIEpvYiBqb2I7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRUaW1lb3V0VmFsdWUobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0cykgeworICAgICAgICAvLyB0cnkgdG8gcHJvdGVjdCB0aGUgdGVzdHMgZnJvbSB0aW1pbmcgb3V0IHByZW1hdHVyZWx5CisgICAgICAgIC8vIGluIHRoZSBmYWNlIG9mIG92ZXJsb2FkZWQvc2xvdyBidWlsZC90ZXN0IHNlcnZlcnMuCisgICAgICAgIC8vCisgICAgICAgIC8vIE9uZSBwcm9ibGVtIHdpdGggdGhlIGZvbGxvd2luZyAiZ2VuZXJhbGx5IGJ1bXAgdGhlIHRpbWVvdXQgdmFsdWUiCisgICAgICAgIC8vIHNjaGVtZSBpcyB0aGF0IHRoZXJlIGFyZSBzb21lIHRlc3RzIHRoYXQgZXhwZWN0IC8gdGVzdC1mb3Igc29tZXRoaW5nCisgICAgICAgIC8vIHRvIE5PVCBoYXBwZW4gLSB3aXRoaW4gc29tZSB0aW1lb3V0IHRvbGVyYW5jZS4KKyAgICAgICAgLy8gSWRlYWxseSB3ZSBkb24ndCB3YW50IHN1Y2ggdGVzdHMgdG8gYWx3YXlzIHRha2UgdGhpcyBleHRyYS1sb25nIHRpbWVvdXQuCisgICAgICAgIC8vIE5vdCBzdXJlIHdoYXQgdG8gZG8gYWJvdXQgdGhhdC4gIFRoZSBmaXJzdCBzdGVwIGlzIHRvIGp1c3QgdHJ5IHRoaXMgYW5kCisgICAgICAgIC8vIHNlZSBpZiBpdCBnZW5lcmFsbHkgYWRkcmVzc2VzIHRoZSBzbG93LXRlc3Qtc2VydmVyIHByb2JsZW0uCisgICAgICAgIC8vIFRoZW4gd2UgY2FuIHJldmlldyB0ZXN0IGV4ZWN1dGlvbiB0aW1lcyB0byBpZGVudGlmeSB0aG9zZSB0aGF0IGZhbGwKKyAgICAgICAgLy8gaW50byB0aGlzIGNhc2UgYW5kIHRoZW4gY29udGVtcGxhdGUgd2hhdCB0byBkbyBhYm91dCB0aGVtLgorICAgICAgICAKKyAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbigiZWRnZW50LmJ1aWxkLmNpIikpIHsKKyAgICAgICAgICAgIC8vIGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIGJhc2UgdGhlIGRlY2lzaW9uIG9mIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRpbWVvdXQgYW5kL29yIHVuaXRzCisgICAgICAgICAgICByZXR1cm4gdGltZW91dCAqIDI7ICAvLyBtaW5pbWl6ZSB0aGUgbXVsdGlwbGllciBiZWNhdXNlIG9mIHRoZSBhZm9yZW1lbnRpb25lZCBhd2FpdC10bW8gdGVzdCBjYXNlcworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aW1lb3V0OworICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbXBsZXRlKFN1Ym1pdHRlcjxUb3BvbG9neSwgPyBleHRlbmRzIEpvYj4gc3VibWl0dGVyLCBKc29uT2JqZWN0IGNvbmZpZywgQ29uZGl0aW9uPD8+IGVuZENvbmRpdGlvbiwKICAgICAgICAgICAgIGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgbG9uZyB0bW9Nc2VjID0gTWF0aC5tYXgodW5pdC50b01pbGxpcyh0aW1lb3V0KSwgMTAwMCk7CisgICAgICAgIHRtb01zZWMgPSBnZXRUaW1lb3V0VmFsdWUodG1vTXNlYywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKICAgICAgICAgbG9uZyBtYXhUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0bW9Nc2VjOwogCiAgICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBzdWJtaXR0ZXIuc3VibWl0KHRvcG9sb2d5KCksIGNvbmZpZyk7CkBAIC01Miw4ICs3MywxNCBAQAogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CiAgICAgICAgIH0KICAgICAgICAgCisgICAgICAgIGlmICghZW5kQ29uZGl0aW9uLnZhbGlkKCkgJiYgZ2V0Sm9iKCkuZ2V0Q3VycmVudFN0YXRlKCkgIT0gU3RhdGUuQ0xPU0VEKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNvbXBsZXRlKCk6IHRpbWVkIG91dCBhZnRlciAiICsgdG1vTXNlYyArICJtc2VjIik7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGlmIChnZXRKb2IoKS5nZXRDdXJyZW50U3RhdGUoKSAhPSBTdGF0ZS5DTE9TRUQpCiAgICAgICAgICAgICBnZXRKb2IoKS5zdGF0ZUNoYW5nZShKb2IuQWN0aW9uLkNMT1NFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZSgpOiBKb2IgYWxyZWFkeSBjbG9zZWQiKTsKIAogICAgICAgICByZXR1cm4gZW5kQ29uZGl0aW9uLnZhbGlkKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2Fzc2VtYmx5L3NvdXJjZS1yZWxlYXNlLnhtbCBiL3NyYy9hc3NlbWJseS9zb3VyY2UtcmVsZWFzZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5YWViNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hc3NlbWJseS9zb3VyY2UtcmVsZWFzZS54bWwKQEAgLTAsMCArMSw4NyBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhc3NlbWJseT4KKyAgPGlkPnNvdXJjZS1yZWxlYXNlPC9pZD4KKyAgPGZvcm1hdHM+CisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICA8L2Zvcm1hdHM+CisKKyAgPGZpbGVTZXRzPgorICAgIDwhLS0gbWFpbiBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgLS0+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgPCEtLSBidWlsZCBvdXRwdXQgLS0+CisgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykuKiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LipdPC9leGNsdWRlPgorICAgICAgICA8IS0tIE1hdmVuIHdyYXBwZXIgYmluYXJpZXMgLS0+CisgICAgICAgIDxleGNsdWRlPi5tdm4vd3JhcHBlci9tYXZlbi13cmFwcGVyLmphcjwvZXhjbHVkZT4KKyAgICAgICAgPGV4Y2x1ZGU+Lm12bi93cmFwcGVyL01hdmVuV3JhcHBlckRvd25sb2FkZXIuY2xhc3M8L2V4Y2x1ZGU+CisgICAgICAgIDwhLS0gU2FtcGxlcyAtLT4KKyAgICAgICAgPGV4Y2x1ZGU+c2FtcGxlcy8qKjwvZXhjbHVkZT4KKworICAgICAgICA8IS0tIE5PVEU6IE1vc3Qgb2YgdGhlIGZvbGxvd2luZyBleGNsdWRlcyBzaG91bGQgbm90IGJlIHJlcXVpcmVkCisgICAgICAgICAgICAgaWYgdGhlIHN0YW5kYXJkIHJlbGVhc2UgcHJvY2VzcyBpcyBmb2xsb3dlZC4gVGhpcyBpcyBiZWNhdXNlIHRoZQorICAgICAgICAgICAgIHJlbGVhc2UgcGx1Z2luIGNoZWNrcyBvdXQgcHJvamVjdCBzb3VyY2VzIGludG8gYSBsb2NhdGlvbiBsaWtlCisgICAgICAgICAgICAgdGFyZ2V0L2NoZWNrb3V0LCB0aGVuIHJ1bnMgdGhlIGJ1aWxkIGZyb20gdGhlcmUuIFRoZSByZXN1bHQgaXMKKyAgICAgICAgICAgICBhIHNvdXJjZS1yZWxlYXNlIGFyY2hpdmUgdGhhdCBjb21lcyBmcm9tIGEgcHJldHR5IGNsZWFuIGRpcmVjdG9yeQorICAgICAgICAgICAgIHN0cnVjdHVyZS4KKworICAgICAgICAgICAgIEhPV0VWRVIsIGlmIHRoZSByZWxlYXNlIHBsdWdpbiBpcyBjb25maWd1cmVkIHRvIHJ1biBleHRyYSBnb2FscworICAgICAgICAgICAgIG9yIGdlbmVyYXRlIGEgcHJvamVjdCB3ZWJzaXRlLCBpdCdzIGRlZmluaXRlbHkgcG9zc2libGUgdGhhdCBzb21lCisgICAgICAgICAgICAgb2YgdGhlc2UgZmlsZXMgd2lsbCBiZSBwcmVzZW50LiBTbywgaXQncyBzYWZlciB0byBleGNsdWRlIHRoZW0uCisgICAgICAgIC0tPgorCisgICAgICAgIDwhLS0gSURFcyAtLT4KKyAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP21hdmVuLWVjbGlwc2VcLnhtbF08L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9cLnByb2plY3RdPC9leGNsdWRlPgorICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/XC5jbGFzc3BhdGhdPC9leGNsdWRlPgorICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/W14vXSpcLml3c108L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9cLmlkZWEoLy4qKT9dPC9leGNsdWRlPgorICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/b3V0KC8uKik/XTwvZXhjbHVkZT4KKyAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP1teL10qXC5pcHJdPC9leGNsdWRlPgorICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/W14vXSpcLmltbF08L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9cLnNldHRpbmdzKC8uKik/XTwvZXhjbHVkZT4KKyAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP1wuZXh0ZXJuYWxUb29sQnVpbGRlcnMoLy4qKT9dPC9leGNsdWRlPgorICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/XC5kZXBsb3lhYmxlcygvLiopP108L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9cLnd0cG1vZHVsZXMoLy4qKT9dPC9leGNsdWRlPgorCisgICAgICAgIDwhLS0gRWRpdG9ycyAtLT4KKyAgICAgICAgPGV4Y2x1ZGU+Kip+PC9leGNsdWRlPgorCisgICAgICAgIDwhLS0gbWlzYyAtLT4KKyAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP2NvYmVydHVyYVwuc2VyXTwvZXhjbHVkZT4KKworICAgICAgICA8IS0tIHJlbGVhc2UtcGx1Z2luIHRlbXAgZmlsZXMgLS0+CisgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9wb21cLnhtbFwucmVsZWFzZUJhY2t1cF08L2V4Y2x1ZGU+CisgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9yZWxlYXNlXC5wcm9wZXJ0aWVzXTwvZXhjbHVkZT4KKyAgICAgICAgCisgICAgICA8L2V4Y2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgICA8IS0tIGxpY2Vuc2UsIHJlYWRtZSwgZXRjLiBjYWxjdWxhdGVkIGF0IGJ1aWxkIHRpbWUgLS0+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORjwvZGlyZWN0b3J5PgorICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1sYW5nMy0zLjQuQUwtMi4wIGIvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL2xpY2Vuc2VzL2FwYWNoZS1saWNlbnNlLXZlcnNpb24tMi4wLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGljZW5zZXMvYmluYXJ5LXJlbGVhc2UvY29tbW9ucy1sYW5nMy0zLjQuQUwtMi4wCnJlbmFtZSB0byBzcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXMvYXBhY2hlLWxpY2Vuc2UtdmVyc2lvbi0yLjAudHh0CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXMvZDMtM18zXzktQlNELnR4dCBiL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlcy9kMy0zXzNfOS1CU0QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjAxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXMvZDMtM18zXzktQlNELnR4dApAQCAtMCwwICsxLDQxIEBACitkMyAob3JnLndlYmphcnMuYm93ZXI6ZDM6My4zLjkpCitMaWNlbnNlIHR5cGU6IEJTRCAzLUNsYXVzZSBsaWNlbnNlCisKK1RoZSBhcnRpZmFjdCdzIGFzc29jaWF0ZWQgcG9tLnhtbCBzdGF0ZXM6CisgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5CU0QgMy1DbGF1c2U8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvQlNEIDMtQ2xhdXNlI2xpY2Vuc2VUZXh0PC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICA8L2xpY2Vuc2U+CisKK1RoZSBVUkwgaXMgYmFkLiBUaGUgYXBwcm9wcmlhdGUgdmFsdWUgaXMKK2h0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlI2xpY2Vuc2VUZXh0CisKK1RoZSBMSUNFTlNFIGZpbGUgZW1iZWRkZWQgaW4gdGhlIGFydGlmYWN0IGlzOgorCitDb3B5cmlnaHQgKGMpIDIwMTMsIE1pY2hhZWwgQm9zdG9jaworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisqIFRoZSBuYW1lIE1pY2hhZWwgQm9zdG9jayBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKK0FORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgTUlDSEFFTCBCT1NUT0NLIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKK0lORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKK09GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCitFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvc2l6emxlLk1JVCBiL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlcy9kMy1sZWdlbmQtTUlULnR4dApzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBsaWNlbnNlcy9zaXp6bGUuTUlUCnJlbmFtZSB0byBzcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXMvZDMtbGVnZW5kLU1JVC50eHQKaW5kZXggN2RjZWQxYS4uZjhiZDI3ZiAxMDA2NDQKLS0tIGEvbGljZW5zZXMvc2l6emxlLk1JVAorKysgYi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXMvZDMtbGVnZW5kLU1JVC50eHQKQEAgLTEsOSArMSwxNSBAQAotc2VydmxldHMvd2ViYXBwX2NvbnRlbnQvanMvZXh0L2pxdWVyeS11aS0xLjExLjQuY3VzdG9tL2V4dGVybmFsL2pxdWVyeS9qcXVlcnkuanM6Ci1Gb3IgaW5jbHVkZWQgU2l6emxlLmpzCitkMy5sZWdlbmQuanMgIChodHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1pKT05TU09OLzM5MTgzNjkvcmF3L2JmOWJjZTZiNjhhM2I3MGY4NzQ1MGYxNTU0MzZjYTRhODRhZjFiYTQvZDMubGVnZW5kLmpzKQogTGljZW5zZSB0eXBlOiBNSVQKIAotQ29weXJpZ2h0IDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwotaHR0cDovL2pxdWVyeS5jb20vCitUaGUgYXJ0aWZhY3Qgb25seSBjb250YWlucy9zdXBwbGllcyB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgaW5mb3JtYXRpb246CisKKy8vIChDKSAyMDEyIHppZ2d5LmpvbnNzb24ubnljQGdtYWlsLmNvbQorLy8gTUlUIGxpY2VuY2UKKworVGhlIGdlbmVyaWMgTUlUIGxpY2Vuc2UgdGV4dCBpczoKKworTUlUIExpY2Vuc2UKK0NvcHlyaWdodCAoYykgPHllYXI+IDxjb3B5cmlnaHQgaG9sZGVycz4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlcy9kMy1wbHVnaW5zLXNhbmtleS0xXzFfMC1CU0QudHh0IGIvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL2xpY2Vuc2VzL2QzLXBsdWdpbnMtc2Fua2V5LTFfMV8wLUJTRC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzMzBjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlcy9kMy1wbHVnaW5zLXNhbmtleS0xXzFfMC1CU0QudHh0CkBAIC0wLDAgKzEsMzkgQEAKK2QzLXBsdWdpbnMtc2Fua2V5IChvcmcud2ViamFycy5ib3dlcjpkMy1wbHVnaW5zLXNhbmtleToxLjEuMCkKK0xpY2Vuc2UgdHlwZTogQlNEIDItQ2xhdXNlIGxpY2Vuc2UKKworVGhlIGFydGlmYWN0J3MgYXNzb2NpYXRlZCBwb20ueG1sIHN0YXRlczoKKyAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkJTRCAyLUNsYXVzZTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy9CU0QgMi1DbGF1c2UjbGljZW5zZVRleHQ8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgIDwvbGljZW5zZT4KKworVGhlIFVSTCBpcyBiYWQuIFRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpcworaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy9CU0QtMi1DbGF1c2UjbGljZW5zZVRleHQKKworVGhlIGFydGlmYWN0IGhhcyBubyBvdGhlciBlbWJlZGRlZCBsaWNlbnNlIGluZm9ybWF0aW9uLgorCitUaGUgZ2VuZXJpYyBCU0QgMi1DbGF1c2UgbGljZW5zZSBhdCB0aGF0IFVSTCBpczoKKworQ29weXJpZ2h0IChjKSA8eWVhcj4gPG93bmVyPiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBNSUNIQUVMIEJPU1RPQ0sgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCitCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKK0VWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGljZW5zZXMvc2l6emxlLk1JVCBiL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlcy9qcXVlcnktMV8xMV8yLU1JVC50eHQKc2ltaWxhcml0eSBpbmRleCA3MCUKY29weSBmcm9tIGxpY2Vuc2VzL3NpenpsZS5NSVQKY29weSB0byBzcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXMvanF1ZXJ5LTFfMTFfMi1NSVQudHh0CmluZGV4IDdkY2VkMWEuLjZjZmUzZWMgMTAwNjQ0Ci0tLSBhL2xpY2Vuc2VzL3NpenpsZS5NSVQKKysrIGIvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL2xpY2Vuc2VzL2pxdWVyeS0xXzExXzItTUlULnR4dApAQCAtMSw5ICsxLDE5IEBACi1zZXJ2bGV0cy93ZWJhcHBfY29udGVudC9qcy9leHQvanF1ZXJ5LXVpLTEuMTEuNC5jdXN0b20vZXh0ZXJuYWwvanF1ZXJ5L2pxdWVyeS5qczoKLUZvciBpbmNsdWRlZCBTaXp6bGUuanMKK2pxdWVyeSAob3JnLndlYmphcnM6anF1ZXJ5OjEuMTEuMikKIExpY2Vuc2UgdHlwZTogTUlUCiAKLUNvcHlyaWdodCAyMDEzIGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKLWh0dHA6Ly9qcXVlcnkuY29tLworVGhlIGFydGlmYWN0J3MgcG9tLnhtbCBzdGF0ZXM6CisgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5NSVQgTGljZW5zZTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvYmxvYi9tYXN0ZXIvTUlULUxJQ0VOU0UudHh0PC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICA8L2xpY2Vuc2U+CisKK1RoZSBVUkwgaXMgYmFkIGFuZCB3b3VsZCBub3QgeWllbGQgYXJ0aWZhY3QtdmVyc2lvbiBzcGVjaWZpYyBjb250ZW50LgorCitUaGUgZ2VuZXJpYyBNSVQgbGljZW5zZSBpczoKKworTUlUIExpY2Vuc2UKK0NvcHlyaWdodCAoYykgPHllYXI+IDxjb3B5cmlnaHQgaG9sZGVycz4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKQEAgLTIyLDQgKzMyLDQgQEAKIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWNlbnNlcy9zaXp6bGUuTUlUIGIvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL2xpY2Vuc2VzL2pxdWVyeS11aS0xXzExXzQtTUlULnR4dApzaW1pbGFyaXR5IGluZGV4IDY3JQpjb3B5IGZyb20gbGljZW5zZXMvc2l6emxlLk1JVApjb3B5IHRvIHNyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9saWNlbnNlcy9qcXVlcnktdWktMV8xMV80LU1JVC50eHQKaW5kZXggN2RjZWQxYS4uN2NjYzc5OSAxMDA2NDQKLS0tIGEvbGljZW5zZXMvc2l6emxlLk1JVAorKysgYi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvbGljZW5zZXMvanF1ZXJ5LXVpLTFfMTFfNC1NSVQudHh0CkBAIC0xLDkgKzEsMjEgQEAKLXNlcnZsZXRzL3dlYmFwcF9jb250ZW50L2pzL2V4dC9qcXVlcnktdWktMS4xMS40LmN1c3RvbS9leHRlcm5hbC9qcXVlcnkvanF1ZXJ5LmpzOgotRm9yIGluY2x1ZGVkIFNpenpsZS5qcworanF1ZXJ5LXVpIChvcmcud2ViamFyczpqcXVlcnktdWk6MS4xMS40KQogTGljZW5zZSB0eXBlOiBNSVQKIAotQ29weXJpZ2h0IDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwotaHR0cDovL2pxdWVyeS5jb20vCitUaGUgYXJ0aWZhY3QncyBhc3NvY2lhdGVkIHBvbS54bWwgc3RhdGVzOgorICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+TUlUIExpY2Vuc2U8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpL2Jsb2IvbWFzdGVyL01JVC1MSUNFTlNFLnR4dDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgPC9saWNlbnNlPgorCitUaGUgVVJMIGlzIGJhZCBhbmQgd291bGQgbm90IHlpZWxkIGFydGlmYWN0LXZlcnNpb24gc3BlY2lmaWMgY29udGVudC4KKworVGhlIGFydGlmYWN0IGhhcyBubyBvdGhlciBlbWJlZGRlZCBsaWNlbnNlIGluZm9ybWF0aW9uLgorCitUaGUgZ2VuZXJpYyBNSVQgbGljZW5zZSBpczoKKworTUlUIExpY2Vuc2UKK0NvcHlyaWdodCAoYykgPHllYXI+IDxjb3B5cmlnaHQgaG9sZGVycz4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRSBiL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWNjOTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCkBAIC0wLDAgKzEsNSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZGV2ZWxvcGVkIGJ5IElCTSBDb3JwLgorQ29weXJpZ2h0IElCTSBDb3JwLiAyMDE1LCAyMDE2CisKZGlmZiAtLWdpdCBhL3NyYy9zaXRlL2FzY2lpZG9jL2RvY3MuYWRvYyBiL3NyYy9zaXRlL2FzY2lpZG9jL2RvY3MuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTU2ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NpdGUvYXNjaWlkb2MvZG9jcy5hZG9jCkBAIC0wLDAgKzEsMjIgQEAKKy8vLy8KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8vLworCisjIFRlc3QKKworQmxhaCBibGFoIGJsYWggLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3NpdGUvYXNjaWlkb2MvcmVsZWFzaW5nLmFkb2MgYi9zcmMvc2l0ZS9hc2NpaWRvYy9yZWxlYXNpbmcuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E2NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NpdGUvYXNjaWlkb2MvcmVsZWFzaW5nLmFkb2MKQEAgLTAsMCArMSw1NyBAQAorLy8vLworCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLy8vCisKKyMgUmVsZWFzaW5nIEVkZ2VudAorCitJbiBnZW5lcmFsIHRoZSBgbWFzdGVyYCBicmFuY2ggY29udGFpbnMgdGhlIHJlcG9zaXRvcnkgc3RhdGUgb2YgdGhlIGxhdGVzdCByZWxlYXNlIG9mIEVkZ2VudC4KK05vIGNvbW1pdCBzaG91bGQgYmUgZG9uZSB0byBgbWFzdGVyYCBleGNlcHQgZm9yIG1lcmdpbmcgYWZ0ZXIgYSBzdWNjZXNzZnVsIHJlbGVhc2UuCisKK05vcm1hbCBkZXZlbG9wbWVudCBpcyBkb25lIGluIHRoZSBgZGV2ZWxvcGAgYnJhbmNoIG9yIGluIGZlYXR1cmUgYnJhbmNoZXMgdGhhdCBhcmUgbWVyZ2VkIHRvIGBkZXZlbG9wYCBhZnRlciB0aGV5IGFyZSBmaW5pc2hlZC4KKworQSB2ZXJzaW9uIGlzIGJ1aWx0IHVwIG9mIHRocmVlIHBhcnRzOiBgbWFqb3JgLmBtaW5vcmAuYGJ1Z2ZpeGAuIEZvciBlYWNoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGEgY29ycmVzcG9uZGluZyBgcmVsZWFzZWAgYnJhbmNoIGlzIG1haW50YWluZWQuCitUaGlzIGFsbG93cyBzaGlwcGluZyBvZiBidWctZml4IHJlbGVhc2VzLCBpZiB0aGlzIGlzIHJlcXVpcmVkLiBGb3IgYnVnLWZpeCByZWxlYXNlcyBubyBuZXcgYnJhbmNoIGlzIGNyZWF0ZWQuCisKK0Fzc3VtaW5nIGRldmVsb3AgaXMgY3VycmVudGx5IGluIHZlcnNpb24gYDEuMi4wLVNOQVBTSE9UYCBhbmQgd2UgYXJlIHByZXBhcmluZyBhIG5ldyByZWxlYXNlLCB0aGVuIHdlIHdvdWxkIGZpcnN0IGNyZWF0ZSBhIGByZWxlYXNlLzEuMmAgYnJhbmNoLiBXaXRoaW4gdGhpcyBicmFuY2gsIHRoZSBFZGdlbnQgdmVyc2lvbiBpcyBgMS4yLjAtU05BUFNIT1RgIGFuZCBkZXZlbG9wIGJlY29tZXMgYDEuMy4wLVNOQVBTSE9UYC4KK0luIHRoZSBgcmVsZWFzZS8xLjJgIGJyYW5jaCBhbGwgd29yayBwcmlvciB0byBjdXR0aW5nIGEgcmVsZWFzZSBvciBmb3IgZml4aW5nIGJ1Zy1maXhlcyBpbiBhbiBleGlzdGluZyByZWxlYXNlIGNhbiBiZSBwZXJmb3JtZWQuIFRoaXMgYnJhbmNoIGlzIHVzdWFsbHkgdXNlZCB0byBzdGFiaWxpemUgdGhlIHNvZnR3YXJlIHByaW9yIHRvIGEgcmVsZWFzZS4KKworQXMgc29vbiBhcyB0aGUgcmVsZWFzZSBicmFuY2ggaXMgc3RhYmxlIGVub3VnaCwgdGhlIHJlbGVhc2UgbWFuYWdlciBjdXRzIGEgcmVsZWFzZS4KKworV2hlbiBkb2luZyB0aGlzLCBhbGwgbW9kdWxlcyB2ZXJzaW9ucyBhcmUgc2V0IHRvIGEgcmVsZWFzZSB2ZXJzaW9uLCB0aGlzIHZlcnNpb24gaXMgY29tbWl0dGVkIGFuZCB0YWdnZWQgYW5kIHRoZW4gdGhlIHZlcnNpb24gaXMgdXN1YWxseSBpbmNyZW1lbnRlZCB0byB0aGUgbmV4dCBoaWdoZXIgYnVnLWZpeCB2ZXJzaW9uLgorU28gaWYgdGhlIGByZWxlYXNlLzEuMmAgYnJhbmNoIGlzIGN1cnJlbnRseSBpbiB2ZXJzaW9uIGAxLjIuMC1TTkFQU0hPVGAsIHRoZSB2ZXJzaW9ucyBhcmUgY2hhbmdlZCB0byBgMS4yLjBgIGFuZCBhZnRlciB0aGUgY29tbWl0dGluZyBhbmQgdGFnZ2luZyB0aGUgdmVyc2lvbiBpcyB1cGRhdGVkIHRvIGAxLjIuMS1TTkFQU0hPVGAuCisKK0FsbCBvZiB0aGVzZSBzdGVwcyBhcmUgYXV0b21hdGVkIGJ5IHRoZSBgbWF2ZW4tcmVsZWFzZS1wbHVnaW5gLgorCisjIyBDcmVhdGluZyB0aGUgcmVsZWFzZSBicmFuY2gKKworQSBuZXcgcmVsZWFzZSBicmFuY2ggaXMgYWx3YXlzIGNyZWF0ZWQgZnJvbSB0aGUgYGRldmVsb3BgIGJyYW5jaC4gU28gbWFrZSBzdXJlIGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBwdWxsZWQgYW5kIHRoZSByZXBvIGlzIHVwIHRvIGRhdGUuCisKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCBwZXJmb3JtcyB0aGUgYnJhbmNoaW5nOgorCisgICAgbXZuIHJlbGVhc2U6YnJhbmNoIC1QIHBsYXRmb3JtLWFuZHJvaWQscGxhdGZvcm0tamF2YTcsZGlzdHJpYnV0aW9uIC1EYnJhbmNoTmFtZT1yZWxlYXNlLzEuMiAtRGF1dG9WZXJzaW9uU3VibW9kdWxlcz10cnVlCisKK1dpdGhvdXQgdGhlIGAtRGF1dG9WZXJzaW9uU3VibW9kdWxlcz10cnVlYCB3ZSB3b3VsZCBoYXZlIHRvIHNwZWNpZnkgdGhlIHZlcnNpb24gZm9yIGVhY2ggbW9kdWxlIHNlcGFyYXRlbHkuIFRoaXMgd2F5IHdlIG9ubHkgaGF2ZSB0byBzcGVjaWZ5IHRoZSB2ZXJzaW9uIG9mIHRoZSByb290IG1vZHVsZSBhbmQgYWxsIGNoaWxkcmVuIHdpbGwgaW5oZXJpdCB0aGlzIHZlcnNpb24uCisKK0Fsc28gdGhlIG9ubHkgd2F5IGFsbCBtb2R1bGVzIGFyZSBwcm9jZXNzZWQsIGlzIGlmIHdlIGVuYWJsZSB0aGUgYGRpc3RyaWJ1dGlvbmAgYW5kIHRoZSB0d28gYHBsYXRmb3JtLWFuZHJvaWRgIGFuZCBgcGxhdGZvcm0tamF2YTdgIHByb2ZpbGVzLgorCitBZnRlciB0aGlzIHRoZSBicmFuY2hlcyBhbmQgdGhlIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCwgYnV0IG5vdCB5ZXQgcHVzaGVkLiBTbyBhcyBhIGxhc3Qgc3RlcCBoZXJlIHRoZSByZWxlYXNlLW1hbmFnZXIgbmVlZHMgdG8gcHVzaCB0aGUgY2hhbmdlcyBpbiBoaXMgZ2l0IHJlcG8uCisKKworIyMgUHJlcGFyaW5nIGEgcmVsZWFzZQorCitUbyBiZSBjb250aW51ZWQgLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3NpdGUvc2l0ZS54bWwgYi9zcmMvc2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWU5ZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSw5MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorIAorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgCisgLS0+Cis8cHJvamVjdCBuYW1lPSJFZGdlbnQiPgorCisgICAgPHNraW4+CisgICAgICAgIDxncm91cElkPmx0LnZlbHlraXMubWF2ZW4uc2tpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnJlZmxvdy1tYXZlbi1za2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KKyAgICA8L3NraW4+CisKKyAgICA8IS0tCisgICAgRGV0YWlscyBvbiBob3cgdG8gY29uZmlndXJlIHRoZSByZWZsb3cgc2tpbjoKKyAgICBodHRwOi8vYW5kcml1c3ZlbHlraXMuZ2l0aHViLmlvL3JlZmxvdy1tYXZlbi1za2luL3NraW4vCistLT4KKyAgICA8Y3VzdG9tPgorICAgICAgICA8cmVmbG93U2tpbj4KKyAgICAgICAgICAgIDx0aGVtZT5ib290c3dhdGNoLWNlcnVsZWFuPC90aGVtZT4KKyAgICAgICAgICAgIDx0aXRsZVRlbXBsYXRlPkFwYWNoZSBFZGdlbnSuIChJbmN1YmF0aW5nKSAtICUyJHM8L3RpdGxlVGVtcGxhdGU+CisgICAgICAgICAgICA8c2xvZ2FuIHBvc2l0aW9uPSJiYW5uZXJSaWdodCI+QWNjZWxlcmF0aW5nIEFuYWx5dGljcyBhdCB0aGUgRWRnZTwvc2xvZ2FuPgorICAgICAgICAgICAgPHRvYz50b3A8L3RvYz4KKyAgICAgICAgICAgIDx0b2NUb3BGbGF0dGVuPnRydWU8L3RvY1RvcEZsYXR0ZW4+CisgICAgICAgICAgICA8dG9wTmF2PnJlcG9ydHN8bW9kdWxlc3xwYXJlbnQ8L3RvcE5hdj4KKyAgICAgICAgICAgIDxib3R0b21OYXY+CisgICAgICAgICAgICAgICAgPGNvbHVtbj5yZXBvcnRzPC9jb2x1bW4+CisgICAgICAgICAgICAgICAgPGNvbHVtbj5tb2R1bGVzPC9jb2x1bW4+CisgICAgICAgICAgICAgICAgPGNvbHVtbj5wYXJlbnQ8L2NvbHVtbj4KKyAgICAgICAgICAgIDwvYm90dG9tTmF2PgorICAgICAgICAgICAgPGJyYW5kPgorICAgICAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEluY3ViYXRpbmcpPC9uYW1lPgorICAgICAgICAgICAgICAgIDxocmVmPmh0dHBzOi8vZWRnZW50LmFwYWNoZS5vcmcvPC9ocmVmPgorICAgICAgICAgICAgPC9icmFuZD4KKyAgICAgICAgICAgIDxib3R0b21EZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBBcGFjaGUgRWRnZW50IGlzIGFuIGVmZm9ydCB1bmRlcmdvaW5nIEluY3ViYXRpb24gYXQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICAgICAgICAgICAgICAgKEFTRiksIHNwb25zb3JlZCBieSB0aGUgSW5jdWJhdG9yLiBJbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZAorICAgICAgICAgICAgICAgIHByb2plY3RzIHVudGlsIGEgZnVydGhlciByZXZpZXcgaW5kaWNhdGVzIHRoYXQgdGhlIGluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywKKyAgICAgICAgICAgICAgICBhbmQgZGVjaXNpb24gbWFraW5nIHByb2Nlc3MgaGF2ZSBzdGFiaWxpemVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCBvdGhlcgorICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgQVNGIHByb2plY3RzLiBXaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uCisgICAgICAgICAgICAgICAgb2YgdGhlIGNvbXBsZXRlbmVzcyBvciBzdGFiaWxpdHkgb2YgdGhlIGNvZGUsIGl0IGRvZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvamVjdAorICAgICAgICAgICAgICAgIGhhcyB5ZXQgdG8gYmUgZnVsbHkgZW5kb3JzZWQgYnkgdGhlIEFTRi4KKyAgICAgICAgICAgIDwvYm90dG9tRGVzY3JpcHRpb24+CisgICAgICAgICAgICA8YnJlYWRjcnVtYnM+dHJ1ZTwvYnJlYWRjcnVtYnM+CisgICAgICAgICAgICA8aGlnaGxpZ2h0SnM+dHJ1ZTwvaGlnaGxpZ2h0SnM+CisgICAgICAgICAgICA8cGFnZXM+CisgICAgICAgICAgICAgICAgPGRldmVsb3Blci1pbmZvPgorICAgICAgICAgICAgICAgICAgICA8dG9jPnNpZGViYXI8L3RvYz4KKyAgICAgICAgICAgICAgICA8L2RldmVsb3Blci1pbmZvPgorICAgICAgICAgICAgPC9wYWdlcz4KKyAgICAgICAgPC9yZWZsb3dTa2luPgorICAgIDwvY3VzdG9tPgorCisgICAgPGJhbm5lckxlZnQ+CisgICAgICAgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKGluY3ViYXRpbmcpPC9uYW1lPgorICAgICAgICA8c3JjPmh0dHBzOi8vZWRnZW50LmFwYWNoZS5vcmcvaW1nL2FwYWNoZV9sb2dvLnBuZzwvc3JjPgorICAgICAgICA8aHJlZj5odHRwczovL2VkZ2VudC5hcGFjaGUub3JnLzwvaHJlZj4KKyAgICA8L2Jhbm5lckxlZnQ+CisKKyAgICA8YmFubmVyUmlnaHQ+CisgICAgICAgIDxuYW1lPkFwYWNoZSBJbmN1YmF0b3I8L25hbWU+CisgICAgICAgIDxzcmM+aHR0cHM6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9pbWFnZXMvaW5jdWJhdG9yX2ZlYXRoZXJfZWdnX2xvZ29fc20ucG5nPC9zcmM+CisgICAgICAgIDxocmVmPmh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy88L2hyZWY+CisgICAgPC9iYW5uZXJSaWdodD4KKworICAgIDxib2R5PgorICAgICAgICA8bGlua3M+CisgICAgICAgICAgICA8aXRlbSBuYW1lPSJXaWtpIiBocmVmPSJodHRwczovL2N3aWtpLmFwYWNoZS5vcmcvY29uZmx1ZW5jZS9kaXNwbGF5L0VER0VOVCIvPgorICAgICAgICAgICAgPGl0ZW0gbmFtZT0iSXNzdWVzIiBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvRURHRU5UIi8+CisgICAgICAgICAgICA8aXRlbSBuYW1lPSJDSSIgaHJlZj0iaHR0cHM6Ly9idWlsZHMuYXBhY2hlLm9yZy92aWV3L0UtRy92aWV3L0VkZ2VudC8iLz4KKyAgICAgICAgPC9saW5rcz4KKyAgICAgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiBpbmhlcml0PSJ0b3AiLz4KKyAgICAgICAgPG1lbnUgcmVmPSJwYXJlbnQiIGluaGVyaXQ9InRvcCIvPgorICAgICAgICA8bWVudSByZWY9Im1vZHVsZXMiIGluaGVyaXQ9InRvcCIvPgorICAgIDwvYm9keT4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvLmNsYXNzcGF0aCBiL3Rlc3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3Y2VmNi4uMDAwMDAwMAotLS0gYS90ZXN0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmdnRpb3Qvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InN2dC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2FuYWx5dGljcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9hcGkiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvY29ubmVjdG9ycyIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9jb25zb2xlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2V4dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9wcm92aWRlcnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvc3BpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL3V0aWxzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkpVTklUX0NPTlRBSU5FUi80Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2FwcHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvcnVudGltZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9wcm92aWRlcl9pb3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkgY29tYmluZWFjY2Vzc3J1bGVzPSJmYWxzZSIga2luZD0ic3JjIiBwYXRoPSIvc2FtcGxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0Ly5wcm9qZWN0IGIvdGVzdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyOTlkYi4uMDAwMDAwMAotLS0gYS90ZXN0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dGVzdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0L2FwcHNlcnZpY2UtYXBwbGljYXRpb25zL3BvbS54bWwgYi90ZXN0L2FwcHNlcnZpY2UtYXBwbGljYXRpb25zL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzOGUyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXBwc2VydmljZS1hcHBsaWNhdGlvbnMvcG9tLnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdGVzdDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+ZWRnZW50LXRlc3QtYXBwc2VydmljZS1hcHBsaWNhdGlvbnM8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogVGVzdDogQXBwU2VydmljZSBBcHBsaWNhdGlvbnM8L25hbWU+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FwaS90b3BvbG9neS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvc2VydmljZXMvVGVzdEFwcGxpY2F0aW9ucy5qYXZhIGIvdGVzdC9hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvc2VydmljZXMvVGVzdEFwcGxpY2F0aW9ucy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGFwaS90b3BvbG9neS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvc2VydmljZXMvVGVzdEFwcGxpY2F0aW9ucy5qYXZhCnJlbmFtZSB0byB0ZXN0L2FwcHNlcnZpY2UtYXBwbGljYXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC90b3BvbG9neS9zZXJ2aWNlcy9UZXN0QXBwbGljYXRpb25zLmphdmEKaW5kZXggMDA1MzMyOC4uODc0ODA4YSAxMDA2NDQKLS0tIGEvYXBpL3RvcG9sb2d5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC90b3BvbG9neS9zZXJ2aWNlcy9UZXN0QXBwbGljYXRpb25zLmphdmEKKysrIGIvdGVzdC9hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvdG9wb2xvZ3kvc2VydmljZXMvVGVzdEFwcGxpY2F0aW9ucy5qYXZhCkBAIC0xOCwxMiArMTgsMTEgQEAKICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnRlc3QudG9wb2xvZ3kuc2VydmljZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5mdW5jdGlvbi5CaUNvbnN1bWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwogaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LnNlcnZpY2VzLlRvcG9sb2d5QnVpbGRlcjsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwotCiAvKioKICAqIFNvbWUgZHVtbXkgdGVzdCBhcHBsaWNhdGlvbnMgdGhhdCB3aWxsIGJlIHBhcnQgb2YgdGhpcwogICogamFyIGluY2x1ZGluZyBoYXZpbmcgc2VydmljZSBwcm92aWRlciBlbnRyaWVzLgpkaWZmIC0tZ2l0IGEvdGVzdC9hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuc2VydmljZXMuVG9wb2xvZ3lCdWlsZGVyIGIvdGVzdC9hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuc2VydmljZXMuVG9wb2xvZ3lCdWlsZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTQzMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2FwcHNlcnZpY2UtYXBwbGljYXRpb25zL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5zZXJ2aWNlcy5Ub3BvbG9neUJ1aWxkZXIKQEAgLTAsMCArMSwxOSBAQAorIworIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworb3JnLmFwYWNoZS5lZGdlbnQudGVzdC50b3BvbG9neS5zZXJ2aWNlcy5UZXN0QXBwbGljYXRpb25zJEFwcE9uZQorb3JnLmFwYWNoZS5lZGdlbnQudGVzdC50b3BvbG9neS5zZXJ2aWNlcy5UZXN0QXBwbGljYXRpb25zJEFwcFR3bworb3JnLmFwYWNoZS5lZGdlbnQudGVzdC50b3BvbG9neS5zZXJ2aWNlcy5UZXN0QXBwbGljYXRpb25zJEFwcFRocmVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9mdnRpb3QvYnVpbGQuZ3JhZGxlIGIvdGVzdC9mdnRpb3QvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGNhNjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZnZ0aW90L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVwZW5kZW5jaWVzIHsKLSAgYWRkVGFyZ2V0RGlyUHJvamVjdEphckRlcGVuZGVuY3kgJ2NvbXBpbGUnLCAnOnByb3ZpZGVyczppb3QnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpydW50aW1lOmFwcHNlcnZpY2UnCi0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzpydW50aW1lOmpzb25jb250cm9sJwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBwczppb3QnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9mdnRpb3QvcG9tLnhtbCBiL3Rlc3QvZnZ0aW90L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyMTkwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZnZ0aW90L3BvbS54bWwKQEAgLTAsMCArMSwxMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC10ZXN0PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtdGVzdC1mdnRpb3Q8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogVGVzdDogZnZ0aW90PC9uYW1lPgorCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+cHJlLWludGVncmF0aW9uLXRlc3Q8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtdGVzdC1hcHBzZXJ2aWNlLWFwcGxpY2F0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1yZXNvdXJjZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxkZXN0RmlsZU5hbWU+dGVzdC1hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy5qYXI8L2Rlc3RGaWxlTmFtZT4KKyAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWNvbm5lY3RvcnMtcHVic3ViPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcnVudGltZS1qc29uY29udHJvbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXByb3ZpZGVycy1kaXJlY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcHBzLWlvdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwcHMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtaW90PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC9mdnRpb3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Z2dC9pb3QvSW90QXBwU2VydmljZVRlc3QuamF2YSBiL3Rlc3QvZnZ0aW90L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9mdnQvaW90L0lvdEFwcFNlcnZpY2VJVC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIHRlc3QvZnZ0aW90L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9mdnQvaW90L0lvdEFwcFNlcnZpY2VUZXN0LmphdmEKcmVuYW1lIHRvIHRlc3QvZnZ0aW90L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9mdnQvaW90L0lvdEFwcFNlcnZpY2VJVC5qYXZhCmluZGV4IGIxYmEyNDcuLmVmZWE3MTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZnZ0aW90L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9mdnQvaW90L0lvdEFwcFNlcnZpY2VUZXN0LmphdmEKKysrIGIvdGVzdC9mdnRpb3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Z2dC9pb3QvSW90QXBwU2VydmljZUlULmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblByaW1pdGl2ZTsKIAotcHVibGljIGNsYXNzIElvdEFwcFNlcnZpY2VUZXN0IHsKK3B1YmxpYyBjbGFzcyBJb3RBcHBTZXJ2aWNlSVQgewogICAgIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFwcFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTYxLDYgKzYxLDcgQEAKICAgICB9CiAgICAgCiAgICAgQFRlc3QKKyAgICAvL0BJZ25vcmUoIlRoaXMgdGVzdCByZWxpZXMgb24gYW4gZXhpc3Rpbmcgd2FyIGluIGEgZ2l2ZW4gbG9jYXRpb24gLi4uIG5lZWQgdG8gcmVmYWN0b3IgdGhpcyIpCiAgICAgcHVibGljIHZvaWQgdGVzdEFwcFNlcnZpY2VKYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgCiAgICAgICAgIERpcmVjdFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERpcmVjdFByb3ZpZGVyKCk7CkBAIC02OCwxMSArNjksMTIgQEAKICAgICAgICAgSnNvbkNvbnRyb2xTZXJ2aWNlIGNvbnRyb2wgPSBuZXcgSnNvbkNvbnRyb2xTZXJ2aWNlKCk7CiAgICAgICAgIHByb3ZpZGVyLmdldFNlcnZpY2VzKCkuYWRkU2VydmljZShDb250cm9sU2VydmljZS5jbGFzcywgY29udHJvbCk7ICAgICAgICAKICAgICAgICAgQXBwU2VydmljZS5jcmVhdGVBbmRSZWdpc3Rlcihwcm92aWRlciwgcHJvdmlkZXIpOwotICAgICAgICBTdHJpbmcgcWQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImVkZ2VudC50ZXN0LnJvb3QuZGlyIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocWQpOwotICAgICAgICBGaWxlIHRlc3RBcHBzSmFyID0gbmV3IEZpbGUocWQsICJhcGkvdG9wb2xvZ3kvYnVpbGQvbGliL3Rlc3QvZWRnZW50LmFwaS50b3BvbG9neS5BUFBTLlRFU1QuamFyIik7CisKKyAgICAgICAgRmlsZSB0ZXN0QXBwc0phciA9IGdldFNlcnZlckphcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RBcHBzSmFyKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0QXBwc0phci5leGlzdHMoKSk7Ci0gICAgICAgIAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzaW5nIHNlcnZlciBqYXIgYXQ6ICIgKyB0ZXN0QXBwc0phci50b1N0cmluZygpKTsKKwogICAgICAgICBVUkwgdGVzdEFwcHNKYXJVUkwgPSB0ZXN0QXBwc0phci50b1VSSSgpLnRvVVJMKCk7CiAgICAgICAgIEpzb25PYmplY3QgcmVnaXN0ZXJKYXIgPSBuZXdSZWdpc3RlckphclJlcXVlc3QodGVzdEFwcHNKYXJVUkwudG9FeHRlcm5hbEZvcm0oKSk7ICAgICAgIAogICAgICAgICBKc29uRWxlbWVudCBjcnIgPSBjb250cm9sLmNvbnRyb2xSZXF1ZXN0KHJlZ2lzdGVySmFyKTsgICAgCkBAIC05OSw2ICsxMDEsNyBAQAogICAgICAgICAKICAgICAgICAgcmV0dXJuIHN1Ym1pdEFwcDsKICAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIEpzb25PYmplY3QgbmV3UmVnaXN0ZXJKYXJSZXF1ZXN0KFN0cmluZyBqYXJVUkwpIHsKICAgICAgICAgSnNvbk9iamVjdCBzdWJtaXRBcHAgPSBuZXcgSnNvbk9iamVjdCgpOyAgIAogICAgICAgICBzdWJtaXRBcHAuYWRkUHJvcGVydHkoSnNvbkNvbnRyb2xTZXJ2aWNlLlRZUEVfS0VZLCBBcHBsaWNhdGlvblNlcnZpY2VNWEJlYW4uVFlQRSk7CkBAIC0xMTEsNiArMTE0LDkgQEAKICAgICAgICAgCiAgICAgICAgIHJldHVybiBzdWJtaXRBcHA7CiAgICAgfQotICAgIAorCisgICAgcHJpdmF0ZSBGaWxlIGdldFNlcnZlckphcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvdGVzdC1hcHBzZXJ2aWNlLWFwcGxpY2F0aW9ucy5qYXIiKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZnZ0aW90L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9mdnQvaW90L0lvdFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdC9mdnRpb3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Z2dC9pb3QvSW90UHJvdmlkZXJJVC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIHRlc3QvZnZ0aW90L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9mdnQvaW90L0lvdFByb3ZpZGVyVGVzdC5qYXZhCnJlbmFtZSB0byB0ZXN0L2Z2dGlvdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvZnZ0L2lvdC9Jb3RQcm92aWRlcklULmphdmEKaW5kZXggYTU1NTYyYy4uYzdiNzc0ZiAxMDA2NDQKLS0tIGEvdGVzdC9mdnRpb3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Z2dC9pb3QvSW90UHJvdmlkZXJUZXN0LmphdmEKKysrIGIvdGVzdC9mdnRpb3Qvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L2Z2dC9pb3QvSW90UHJvdmlkZXJJVC5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAvKioKICAqIFRlc3QgSW90UHJvdmlkZXIgdXNpbmcgdGhlIEVjaG9Jb3REZXZpY2UuCiAgKi8KLXB1YmxpYyBjbGFzcyBJb3RQcm92aWRlclRlc3QgeworcHVibGljIGNsYXNzIElvdFByb3ZpZGVySVQgewogICAgIAogICAgIC8qKgogICAgICAqIEJhc2ljIHRlc3Qgd2UgY2FuIHN0YXJ0IGFwcGxpY2F0aW9ucwpAQCAtNzcsNyArNzcsNyBAQAogICAgICAgICBJb3RUZXN0QXBwcy5yZWdpc3RlckFwcGxpY2F0aW9ucyhwcm92aWRlcik7CiAKICAgICAgICAgLy8gQ3JlYXRlIGEgU3VibWl0IEFwcE9uZSByZXF1ZXN0Ci0gICAgICAgIEpzb25PYmplY3Qgc3VibWl0QXBwT25lID0gSW90QXBwU2VydmljZVRlc3QubmV3U3VibWl0UmVxdWVzdCgiQXBwT25lIik7CisgICAgICAgIEpzb25PYmplY3Qgc3VibWl0QXBwT25lID0gSW90QXBwU2VydmljZUlULm5ld1N1Ym1pdFJlcXVlc3QoIkFwcE9uZSIpOwogICAgICAgICAKICAgICAgICAgLy8gQ3JlYXRlIGEgdGVzdCBhcHBsaWNhdGlvbiB0aGF0IGxpc3RlbnMgZm9yIHRoZQogICAgICAgICAvLyBvdXRwdXQgb2YgQXBwT25lIChhcyBhIHB1Ymxpc2hlZCB0b3BpYykuCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgICAgSW90VGVzdEFwcHMucmVnaXN0ZXJBcHBsaWNhdGlvbnMocHJvdmlkZXIpOwogCiAgICAgICAgIC8vIENyZWF0ZSBhIFN1Ym1pdCBBcHBPbmUgcmVxdWVzdAotICAgICAgICBKc29uT2JqZWN0IHN1Ym1pdEFwcE9uZSA9IElvdEFwcFNlcnZpY2VUZXN0Lm5ld1N1Ym1pdFJlcXVlc3QoIkFwcE9uZSIpOworICAgICAgICBKc29uT2JqZWN0IHN1Ym1pdEFwcE9uZSA9IElvdEFwcFNlcnZpY2VJVC5uZXdTdWJtaXRSZXF1ZXN0KCJBcHBPbmUiKTsKICAgICAgICAgCiAgICAgICAgIC8vIENyZWF0ZSBhbiBhcHBsaWNhdGlvbiB0aGF0IHNlbmRzIGEgZGV2aWNlIGV2ZW50CiAgICAgICAgIC8vIHdpdGggdGhlIHN1Ym1pdCBqb2IgY29tbWFuZCwgYW5kIHRoaXMgd2lsbCBiZSBlY2hvZWQKZGlmZiAtLWdpdCBhL3Rlc3QvcG9tLnhtbCBiL3Rlc3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjNjZDdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wb20ueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC10ZXN0PC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgIDxuYW1lPkFwYWNoZSBFZGdlbnQgKEphdmEgOCk6IFRlc3Q8L25hbWU+CisKKyAgPG1vZHVsZXM+CisgICAgPG1vZHVsZT5hcHBzZXJ2aWNlLWFwcGxpY2F0aW9uczwvbW9kdWxlPgorICAgIDxtb2R1bGU+ZnZ0aW90PC9tb2R1bGU+CisgICAgPG1vZHVsZT5zdnQ8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorCisgIDwhLS0gVE9ETzogQWRkIHRoZSBsaWNlbnNlIGhlYWRlcnMgb3IgcmVtb3ZlIHRoZSBmaWxlcyAtLT4KKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5yYXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1yYXQtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmxpY2Vuc2UtY2hlY2s8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZXhjbHVkZXMgY29tYmluZS5jaGlsZHJlbj0iYXBwZW5kIj4KKyAgICAgICAgICAgIDxleGNsdWRlPmNvbnNvbGVVcmwudHh0PC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+R3BzT2JkQW5hbHl0aWNzQXBwbGljYXRpb24ucHJvcGVydGllczwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPmlvdGZVcmwudHh0PC9leGNsdWRlPgorICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC9zdnQvYnVpbGQuZ3JhZGxlIGIvdGVzdC9zdnQvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE2ZTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3Qvc3Z0L2J1aWxkLmdyYWRsZQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotZGVmIGxpYj0gIiR0YXJnZXRfamF2YThfZGlyLyRwcm9qZWN0LnNpbXBsZUdyb3VwTmFtZS8kcHJvamVjdC5uYW1lIgotCi0vL2RlZiBsaWI9IiR7cHJvamVjdC5kaXN0c0Rpcn0vbGliIgotCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6cHJvdmlkZXJzOmRldmVsb3BtZW50JwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6c2FtcGxlczphcHBzJwotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6Y29ubmVjdG9yczppb3RwJwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLXRhc2tzLmJ1aWxkLmRvRmlyc3QoKXsKLSAgbWtkaXIgbGliIAotfQotCi10YXNrcy5idWlsZC5kb0xhc3QoKXsKLSAgZGVsZXRlIGxpYgotfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdnQvcG9tLnhtbCBiL3Rlc3Qvc3Z0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyYjliMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3Z0L3BvbS54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXRlc3Q8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmVkZ2VudC10ZXN0LXN2dDwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBUZXN0OiBTVlQ8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHJlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPi4uLy4uL3NyYy9tYWluL2libS1yZW1vdGUtcmVzb3VyY2VzPC9yZW1vdGUtcmVzb3VyY2VzLW1hdmVuLXBsdWdpbi5yZW1vdGUtcmVzb3VyY2VzLmRpcj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1jb25zb2xlLXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzLW1ldHJpY3M8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1wcm92aWRlcnMtZGV2ZWxvcG1lbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L3N2dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvc3Z0L2FwcHMvRmxlZXRNYW5hZ2VtZW50QW5hbHl0aWNzQ2xpZW50QXBwbGljYXRpb24uamF2YSBiL3Rlc3Qvc3Z0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9zdnQvYXBwcy9GbGVldE1hbmFnZW1lbnRBbmFseXRpY3NDbGllbnRBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE4NTY3Li4wMDAwMDAwCi0tLSBhL3Rlc3Qvc3Z0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9zdnQvYXBwcy9GbGVldE1hbmFnZW1lbnRBbmFseXRpY3NDbGllbnRBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC50ZXN0LnN2dC5hcHBzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudGVzdC5zdnQuYXBwcy5pb3RwLkFic3RyYWN0SW90cEFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi0vKioKLSAqIEEgR2xvYmFsIFBvc2l0aW9uYWwgU3lzdGVtIGFuZCBPbi1Cb2FyZCBEaWFnbm9zdGljcyBhcHBsaWNhdGlvbiB0byBwZXJmb3JtCi0gKiBhbmFseXRpY3MgZGVmaW5lZCBpbiB7QGxpbmsgR3BzQW5hbHl0aWNzQXBwbGljYXRpb259IGFuZAotICoge0BsaW5rIE9iZEFuYWx5dGljc0FwcGxpY2F0aW9ufS4KLSAqIDxwPgotICogVGhlIEVkZ2VudCBjb25zb2xlIFVSTCBpcyB3cml0dGVuIHRvIHRoZSBjb25zb2xlIGFuZCB0byBmaWxlIGNvbnNvbGVVcmwudHh0LgotICogPHA+Ci0gKiBUaGUgV2F0c29uIElvdEYgVVJMIGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUgYW5kIHRvIGZpbGUgaW90ZlVybC50eHQKLSAqIAotICogPHA+Ci0gKiBBcmd1bWVudDogc3BlY2lmeSBwYXRobmFtZSB0byBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzIGZpbGUuIElmIHJ1bm5pbmcgaW4KLSAqIEVjbGlwc2UsIHlvdSBjYW4gc3BlY2lmeSBHcHNPYmRBbmFseXRpY3NBcHBsaWNhdGlvbi5wcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgRmxlZXRNYW5hZ2VtZW50QW5hbHl0aWNzQ2xpZW50QXBwbGljYXRpb24gZXh0ZW5kcyBBYnN0cmFjdElvdHBBcHBsaWNhdGlvbiB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIm1pc3NpbmcgcGF0aG5hbWUgdG8gYXBwbGljYXRpb24gcHJvcGVydGllcyBmaWxlIik7Ci0KLSAgICAgICAgRmxlZXRNYW5hZ2VtZW50QW5hbHl0aWNzQ2xpZW50QXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBuZXcgRmxlZXRNYW5hZ2VtZW50QW5hbHl0aWNzQ2xpZW50QXBwbGljYXRpb24oYXJnc1swXSk7Ci0KLSAgICAgICAgYXBwbGljYXRpb24ucnVuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wc1BhdGgKLSAgICAgKiAgICAgICAgICAgIHBhdGhuYW1lIHRvIGFuIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgRmxlZXRNYW5hZ2VtZW50QW5hbHl0aWNzQ2xpZW50QXBwbGljYXRpb24oU3RyaW5nIHByb3BzUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHByb3BzUGF0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRUb3BvbG9neShUb3BvbG9neSB0KSB7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBHUFMgYW5hbHl0aWNzIHRvIHRoZSB0b3BvbG9neQotICAgICAgICBuZXcgR3BzQW5hbHl0aWNzQXBwbGljYXRpb24odCwgdGhpcykuYWRkQW5hbHl0aWNzKCk7Ci0KLSAgICAgICAgLy8gVE9ETyBBZGQgdGhlIE9CRCBhbmFseXRpY3MgdG8gdGhlIHRvcG9sb2d5Ci0gICAgICAgIC8vIG5ldyBPYmRBbmFseXRpY3NBcHBsaWNhdGlvbih0LCB0aGlzKS5hZGRBbmFseXRpY3MoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9zdnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3N2dC9hcHBzL0dwc0FuYWx5dGljc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0L3N2dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvc3Z0L2FwcHMvR3BzQW5hbHl0aWNzQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1OTQwMC4uMDAwMDAwMAotLS0gYS90ZXN0L3N2dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvc3Z0L2FwcHMvR3BzQW5hbHl0aWNzQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQudGVzdC5zdnQuYXBwczsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuY29ubmVjdG9ycy5pb3QuUW9TOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRlc3Quc3Z0LnV0aWxzLnNlbnNvci5ncHMuR3BzU2Vuc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRlc3Quc3Z0LnV0aWxzLnNlbnNvci5ncHMuU2ltdWxhdGVkR2VvZmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudGVzdC5zdnQudXRpbHMuc2Vuc29yLmdwcy5TaW11bGF0ZWRHcHNTZW5zb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC50b3BvbG9neS5UV2luZG93OwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7Ci0KLS8qKgotICogR1BTIGFuYWx5dGljcwotICogPHA+Ci0gKiBTb3VyY2UgaXMgYSBzdHJlYW0gb2YgR1BTIHNlbnNvciBkYXRhIHtAbGluayBHcHNTZW5zb3J9Ci0gKiA8cD4KLSAqIEhlcmUncyBhbiBvdXRsaW5lIG9mIHRoZSB0b3BvbG9neQotICogPHVsPgotICogPGxpPkxvZyBHUFMgY29vcmRpbmF0ZXMgYnkgcHVibGlzaGluZyB0byBJb3RGLiBUaGUgZGF0YSBtYXkgYmUgdXNlZCBieSBhCi0gKiBzZXJ2ZXIgYXBwbGljYXRpb24gdG8gZGlzcGxheSB0aGUgdmVoaWNsZSBvbiBhIG1hcC48L2xpPgotICogPGxpPkZpbHRlciB0byBkZXRlY3Qgc3BlZWRzIGFib3ZlIGEgdGhyZXNob2xkIGFuZCBwdWJsaXNoIGFsZXJ0IElvdEY8L2xpPgotICogPGxpPkZpbHRlciBmb3IgR1BTIGNvb3JkaW5hdGVzIHRoYXQgYXJlIG91dHNpZGUgb2YgYSBkZWZpbmVkIEdlb2ZlbmNlCi0gKiBib3VuZGFyeTwvbGk+Ci0gKiA8bGk+V2luZG93aW5nIHRvIGRldGVjdCBoYXJkIGRyaXZpbmc6IGhhcmQgYnJha2luZyBvciBoYXJkIGFjY2VsZXJhdGlvbiBhbmQKLSAqIHB1Ymxpc2ggYWxlcnQgdG8gSW90RjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgR3BzQW5hbHl0aWNzQXBwbGljYXRpb24gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBGbGVldE1hbmFnZW1lbnRBbmFseXRpY3NDbGllbnRBcHBsaWNhdGlvbiBhcHA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUb3BvbG9neSB0b3BvbG9neTsKLQotICAgIC8vIFRPRE86IG1ha2UgdGhlc2UgY29uZmlndXJhYmxlIHByb3BlcnRpZXMKLSAgICBib29sZWFuIHRyYWNrR3BzTG9jYXRpb24gPSB0cnVlOwotICAgIGJvb2xlYW4gdHJhY2tTcGVlZGluZyA9IHRydWU7Ci0gICAgYm9vbGVhbiB0cmFja0dlb2ZlbmNlID0gdHJ1ZTsKLSAgICBib29sZWFuIHRyYWNrSGFyZERyaXZpbmcgPSB0cnVlOwotICAgIC8vIEhhcmQgYnJha2luZyBhbmQgYWNjZWxlcmF0aW9uIHRocmVzaG9sZHMgbWF5IGRlcGVuZCBvbiB0aGUgdmVoaWNsZSBtb2RlbAotICAgIGRvdWJsZSBoYXJkQnJha2luZ1RocmVzaG9sZF9NcGhQZXJTZWMgPSAtOC4yNTsKLSAgICBkb3VibGUgaGFyZEFjY2VsZXJhdGlvblRocmVzaG9sZF9NcGhQZXJTZWMgPSA3LjM3OwotICAgIFN0cmluZyBkcml2ZXJJZCA9ICJkcml2ZXIxIjsKLSAgICBTdHJpbmcgVklOID0gIjEyMzQ1NiI7Ci0gICAgZG91YmxlIG1heFNwZWVkX01waCA9IDcwOwotCi0gICAgc3RhdGljIGRvdWJsZSBNSUxFU19QRVJfSE9VUl9UT19NRVRFUlNfUEVSX1NFQyA9IDAuNDQ3MDQ7Ci0gICAgZG91YmxlIE1FVEVSU19QRVJfSE9VUl9UT19NSUxFU19QRVJfU0VDID0gMSAvIE1JTEVTX1BFUl9IT1VSX1RPX01FVEVSU19QRVJfU0VDOwotICAgIC8vIENvbnZlcnQgNzAgbWlsZXMgcGVyIGhvdXIgdG8gbWV0ZXJzIHRvIHNlYwotICAgIGRvdWJsZSBNQVhfU1BFRURfTUVURVJTX1BFUl9TRUMgPSBtYXhTcGVlZF9NcGggKiBNSUxFU19QRVJfSE9VUl9UT19NRVRFUlNfUEVSX1NFQzsKLSAgICBzdGF0aWMgZG91YmxlIE1QU19UT19NUEggPSAzLjY7Ci0KLSAgICBwdWJsaWMgR3BzQW5hbHl0aWNzQXBwbGljYXRpb24oVG9wb2xvZ3kgdCwgRmxlZXRNYW5hZ2VtZW50QW5hbHl0aWNzQ2xpZW50QXBwbGljYXRpb24gYXBwKSB7Ci0gICAgICAgIHRoaXMudG9wb2xvZ3kgPSB0OwotICAgICAgICB0aGlzLmFwcCA9IGFwcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIEdQUyBzZW5zb3IgYW5hbHl0aWNzIHRvIHRoZSB0b3BvbG9neS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBbmFseXRpY3MoKSB7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgc291cmNlIEdQUyBkYXRhCi0gICAgICAgIFNpbXVsYXRlZEdwc1NlbnNvciBnID0gbmV3IFNpbXVsYXRlZEdwc1NlbnNvcigpOwotICAgICAgICBUU3RyZWFtPEdwc1NlbnNvcj4gZ3BzU2Vuc29yID0gdG9wb2xvZ3kucG9sbCgoKSAtPiBnLm5leHRHcHMoKSwgNTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotCi0gICAgICAgIC8vIFB1Ymxpc2ggR1BTIGRhdGEgdG8gSW90RiBldmVyeSAxIHNlY29uZAotICAgICAgICBpZiAodHJhY2tHcHNMb2NhdGlvbikgewotICAgICAgICAgICAgVFN0cmVhbTxHcHNTZW5zb3I+IGxvZ0dwcyA9IGdwc1NlbnNvci5wZWVrKHQgLT4gU3lzdGVtLm91dC5wcmludGxuKCJsb2cgR1BTOiAiICsgdC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICBsb2dHcHMudGFnKCJsb2dHcHMiKTsKLSAgICAgICAgICAgIC8vIFB1Ymxpc2ggR1BTIGxvY2F0aW9uIHRvIElvdEYKLSAgICAgICAgICAgIGFwcC5pb3REZXZpY2UoKS5ldmVudHMoSnNvbkdwcyhsb2dHcHMpLCAiR1BTOiAiICsgZHJpdmVySWQsIFFvUy5GSVJFX0FORF9GT1JHRVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlsdGVyIGZvciBhY3R1YWwgc3BlZWRpbmcgYW5kIHB1Ymxpc2ggdG8gSW9URiBhbmQgbG9jYWwgZmlsZQotICAgICAgICBpZiAodHJhY2tTcGVlZGluZykgewotICAgICAgICAgICAgVFN0cmVhbTxHcHNTZW5zb3I+IHNwZWVkaW5nID0gZ3BzU2Vuc29yLmZpbHRlcih0IC0+IHQuZ2V0U3BlZWRNZXRlcnNQZXJTZWMoKSA+IE1BWF9TUEVFRF9NRVRFUlNfUEVSX1NFQyk7Ci0KLSAgICAgICAgICAgIHNwZWVkaW5nLnRhZygic3BlZWRpbmciKTsKLSAgICAgICAgICAgIC8vIENvdW50IHNwZWVkaW5nIHR1cGxlcwotICAgICAgICAgICAgLy8gVE9ETyBpbnZlc3RpZ2F0ZSB3aHkgcHVibGlzaCBkb2Vzbid0IGFwcGVhciB0byB3b3JrIHdoZW4gYQotICAgICAgICAgICAgLy8gY291bnRlciBpcyBzZXQKLSAgICAgICAgICAgIC8vIE1ldHJpY3MuY291bnRlcihzcGVlZGluZyk7Ci0KLSAgICAgICAgICAgIHNwZWVkaW5nLnBlZWsodCAtPiBTeXN0ZW0ub3V0LnByaW50bG4oIkFsZXJ0OiBzcGVlZGluZyAtICIgKyB0LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIC8vIFdyaXRlIHNwZWVkaW5nIGV2ZW50IHRvIElvdEYKLSAgICAgICAgICAgIGFwcC5pb3REZXZpY2UoKS5ldmVudHMoSnNvblNwZWVkKHNwZWVkaW5nKSwgIlNwZWVkaW5nOiAiICsgZHJpdmVySWQsIFFvUy5GSVJFX0FORF9GT1JHRVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlsdGVyIGZvciBHZW9mZW5jZSBib3VuZGFyeSBleGNlcHRpb25zIGFuZCBwdWJsaXNoIHRvIElvVEYKLSAgICAgICAgaWYgKHRyYWNrR2VvZmVuY2UpIHsKLSAgICAgICAgICAgIFRTdHJlYW08R3BzU2Vuc29yPiBnZW9mZW5jZSA9IGdwc1NlbnNvcgotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHQgLT4gU2ltdWxhdGVkR2VvZmVuY2Uub3V0c2lkZUdlb2ZlbmNlKHQuZ2V0TGF0aXR1ZGUoKSwgdC5nZXRMb25naXR1ZGUoKSkpOwotCi0gICAgICAgICAgICBnZW9mZW5jZS50YWcoImdlb2ZlbmNlIik7Ci0gICAgICAgICAgICAvLyBDb3VudCBHZW9mZW5jZSBleGNlcHRpb25zCi0gICAgICAgICAgICAvLyBUT0RPIGludmVzdGlnYXRlIHdoeSBwdWJsaXNoIGRvZXNuJ3QgYXBwZWFyIHRvIHdvcmsgd2hlbiBhCi0gICAgICAgICAgICAvLyBjb3VudGVyIGlzIHNldAotICAgICAgICAgICAgLy8gTWV0cmljcy5jb3VudGVyKGdlb2ZlbmNlKTsKLQotICAgICAgICAgICAgZ2VvZmVuY2UucGVlayh0IC0+IFN5c3RlbS5vdXQucHJpbnRsbigiQWxlcnQ6IGdlb2ZlbmNlIC0gIiArIHQudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgLy8gV3JpdGUgR2VvZmVuY2UgZXhjZXB0aW9ucyB0byBJb3RGCi0gICAgICAgICAgICBhcHAuaW90RGV2aWNlKCkuZXZlbnRzKEpzb25HZW9mZW5jZShnZW9mZW5jZSksICJHZW9mZW5jZTogIiArIGRyaXZlcklkLCBRb1MuRklSRV9BTkRfRk9SR0VUKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEhhcmQgYnJha2luZzogKHNwZWVkMSAtIHNwZWVkMCkvKHRpbWUxIC0gdGltZTApIDwKLSAgICAgICAgICogaGFyZEJyYWtpbmdUaHJlc2hvbGRfS3BoUGVyU2VjIEhhcmQgYWNjZWxlcmF0aW9uOiAoc3BlZWQxIC0KLSAgICAgICAgICogc3BlZWQwKS8odGltZTEgLSB0aW1lMCkgPiBoYXJkQWNjZWxlcmF0aW9uVGhyZXNob2xkX0twaFBlclNlYyAxIG1wcyA9Ci0gICAgICAgICAqIDMuNiBrcGgKLSAgICAgICAgICovCi0gICAgICAgIGlmICh0cmFja0hhcmREcml2aW5nKSB7Ci0gICAgICAgICAgICBUU3RyZWFtPEdwc1NlbnNvcj4gaGFyZERyaXZpbmcgPSBncHNTZW5zb3I7Ci0gICAgICAgICAgICAvLyBUT0RPIHJlcGxhY2UgaGFyZGNvZGVkICIyIiBpbiAibGFzdCgyLCIgdG8gZm9yY2Ugc2VlaW5nCi0gICAgICAgICAgICAvLyBoYXJkRHJpdmluZyBhbHRlcgotICAgICAgICAgICAgVFdpbmRvdzxHcHNTZW5zb3IsIE9iamVjdD4gd2luZG93ID0gaGFyZERyaXZpbmcubGFzdCgyLCB0dXBsZSAtPiAwKTsKLSAgICAgICAgICAgIFRTdHJlYW08R3BzU2Vuc29yW10+IGxvZ0hhcmREcml2aW5nID0gd2luZG93LmJhdGNoKCh0dXBsZXMsIGtleSkgLT4gewotICAgICAgICAgICAgICAgIEdwc1NlbnNvcltdIHJlc3VsdHMgPSBudWxsOwotICAgICAgICAgICAgICAgIE9iamVjdFtdIHR1cGxlc0FycmF5ID0gdHVwbGVzLnRvQXJyYXkoKTsKLQotICAgICAgICAgICAgICAgIEdwc1NlbnNvciBncHMxID0gKEdwc1NlbnNvcikgdHVwbGVzQXJyYXlbMV07Ci0gICAgICAgICAgICAgICAgR3BzU2Vuc29yIGdwczAgPSAoR3BzU2Vuc29yKSB0dXBsZXNBcnJheVswXTsKLSAgICAgICAgICAgICAgICBkb3VibGUgc3BlZWQxID0gZ3BzMS5nZXRTcGVlZE1ldGVyc1BlclNlYygpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBzcGVlZDAgPSBncHMwLmdldFNwZWVkTWV0ZXJzUGVyU2VjKCk7Ci0gICAgICAgICAgICAgICAgbG9uZyB0aW1lMSA9IGdwczEuZ2V0VGltZSgpOwotICAgICAgICAgICAgICAgIGxvbmcgdGltZTAgPSBncHMwLmdldFRpbWUoKTsKLQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBoYXJkIGJyYWtpbmcgb3IgaGFyZCBhY2NlbGVyYXRpb24KLSAgICAgICAgICAgICAgICAvLyBBdm9pZCBkaXZpc2lvbiBieSAwCi0gICAgICAgICAgICAgICAgaWYgKHRpbWUxIC0gdGltZTAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgbXBoUGVyU2VjID0gKHNwZWVkMSAtIHNwZWVkMCkgLyAodGltZTEgLSB0aW1lMCkgKiBNUFNfVE9fTVBIOwotICAgICAgICAgICAgICAgICAgICBpZiAobXBoUGVyU2VjIDwgaGFyZEJyYWtpbmdUaHJlc2hvbGRfTXBoUGVyU2VjIHx8IG1waFBlclNlYyA+IGhhcmRBY2NlbGVyYXRpb25UaHJlc2hvbGRfTXBoUGVyU2VjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbmV3IEdwc1NlbnNvclsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbMF0gPSBncHMwOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1sxXSA9IGdwczE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgICAgICB9KS5wZWVrKHQgLT4gU3lzdGVtLm91dC5wcmludGxuKCJoYXJkRHJpdmluZzogdDA9IiArIHRbMF0udG9TdHJpbmcoKSArICIgdFsxXT0iICsgdFsxXS50b1N0cmluZygpKSkKLSAgICAgICAgICAgICAgICAgICAgLnRhZygiaGFyZERyaXZpbmciKTsKLQotICAgICAgICAgICAgYXBwLmlvdERldmljZSgpLmV2ZW50cyhKc29uSGFyZERyaXZpbmcobG9nSGFyZERyaXZpbmcpLCAiaGFyZERyaXZpbmc6ICIgKyBkcml2ZXJJZCwgUW9TLkZJUkVfQU5EX0ZPUkdFVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFRTdHJlYW08SnNvbk9iamVjdD4gSnNvbkdwcyhUU3RyZWFtPEdwc1NlbnNvcj4gZ3BzU2Vuc29yKSB7Ci0gICAgICAgIHJldHVybiBncHNTZW5zb3IubWFwKHQgLT4gewotICAgICAgICAgICAgSnNvbk9iamVjdCBqID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoImxhdCIsIHQuZ2V0TGF0aXR1ZGUoKSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJsb25nIiwgdC5nZXRMb25naXR1ZGUoKSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJhbHQiLCB0LmdlQWx0aXR1ZGUoKSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJtcGgiLCB0LmdldFNwZWVkTWV0ZXJzUGVyU2VjKCkgKiBNRVRFUlNfUEVSX0hPVVJfVE9fTUlMRVNfUEVSX1NFQyk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJjb3Vyc2UiLCB0LmdldENvdXJzZSgpKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoInRpbWUiLCB0LmdldFRpbWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gajsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUU3RyZWFtPEpzb25PYmplY3Q+IEpzb25TcGVlZChUU3RyZWFtPEdwc1NlbnNvcj4gZ3BzU2Vuc29yKSB7Ci0gICAgICAgIHJldHVybiBncHNTZW5zb3IubWFwKHQgLT4gewotICAgICAgICAgICAgSnNvbk9iamVjdCBqID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoImxhdCIsIHQuZ2V0TGF0aXR1ZGUoKSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJsb25nIiwgdC5nZXRMb25naXR1ZGUoKSk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJtcGgiLCB0LmdldFNwZWVkTWV0ZXJzUGVyU2VjKCkgKiBNRVRFUlNfUEVSX0hPVVJfVE9fTUlMRVNfUEVSX1NFQyk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJ0aW1lIiwgdC5nZXRUaW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuIGo7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgVFN0cmVhbTxKc29uT2JqZWN0PiBKc29uR2VvZmVuY2UoVFN0cmVhbTxHcHNTZW5zb3I+IGdwc1NlbnNvcikgewotICAgICAgICByZXR1cm4gZ3BzU2Vuc29yLm1hcCh0IC0+IHsKLSAgICAgICAgICAgIEpzb25PYmplY3QgaiA9IG5ldyBKc29uT2JqZWN0KCk7Ci0gICAgICAgICAgICBqLmFkZFByb3BlcnR5KCJsYXQiLCB0LmdldExhdGl0dWRlKCkpOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgibG9uZyIsIHQuZ2V0TG9uZ2l0dWRlKCkpOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgidGltZSIsIHQuZ2V0VGltZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBqOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRTdHJlYW08SnNvbk9iamVjdD4gSnNvbkhhcmREcml2aW5nKFRTdHJlYW08R3BzU2Vuc29yW10+IGdwc1NlbnNvcnMpIHsKLSAgICAgICAgcmV0dXJuIGdwc1NlbnNvcnMubWFwKHQgLT4gewotICAgICAgICAgICAgSnNvbk9iamVjdCBqID0gbmV3IEpzb25PYmplY3QoKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoImxhdDEiLCB0WzBdLmdldExhdGl0dWRlKCkpOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgibG9uZzEiLCB0WzBdLmdldExvbmdpdHVkZSgpKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoInRpbWUxIiwgdFswXS5nZXRUaW1lKCkpOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgic3BlZWQxIiwgdFswXS5nZXRTcGVlZE1ldGVyc1BlclNlYygpKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoImxhdDIiLCB0WzFdLmdldExhdGl0dWRlKCkpOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgibG9uZzIiLCB0WzFdLmdldExvbmdpdHVkZSgpKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoInRpbWUyIiwgdFsxXS5nZXRUaW1lKCkpOwotICAgICAgICAgICAgai5hZGRQcm9wZXJ0eSgic3BlZWQyIiwgdFsxXS5nZXRTcGVlZE1ldGVyc1BlclNlYygpKTsKLSAgICAgICAgICAgIGouYWRkUHJvcGVydHkoIm1waFBlclNlYyIsICh0WzFdLmdldFNwZWVkTWV0ZXJzUGVyU2VjKCkgLSB0WzBdLmdldFNwZWVkTWV0ZXJzUGVyU2VjKCkpICogTVBTX1RPX01QSAotICAgICAgICAgICAgICAgICAgICAvICh0WzFdLmdldFRpbWUoKSAtIHRbMF0uZ2V0VGltZSgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gajsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3N2dC9hcHBzL09iZEFuYWx5dGljc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0L3N2dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvc3Z0L2FwcHMvT2JkQW5hbHl0aWNzQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwZDZlOS4uMDAwMDAwMAotLS0gYS90ZXN0L3N2dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvc3Z0L2FwcHMvT2JkQW5hbHl0aWNzQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmVkZ2VudC50ZXN0LnN2dC5hcHBzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQudG9wb2xvZ3kuVG9wb2xvZ3k7Ci1wdWJsaWMgY2xhc3MgT2JkQW5hbHl0aWNzQXBwbGljYXRpb257Ci0vLyBUT0RPOgotLy8gICAgcHJpdmF0ZSBmaW5hbCBGbGVldE1hbmFnZW1lbnRBbmFseXRpY3NDbGllbnRBcHBsaWNhdGlvbiBhcHA7Ci0vLyAgICBwcml2YXRlIGZpbmFsIFRvcG9sb2d5IHQ7Ci0vLyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzZW5zb3JJZCA9ICJvYmQiOwotCi0gICAgcHVibGljIE9iZEFuYWx5dGljc0FwcGxpY2F0aW9uKFRvcG9sb2d5IHQsIEZsZWV0TWFuYWdlbWVudEFuYWx5dGljc0NsaWVudEFwcGxpY2F0aW9uIGFwcCkgewotLy8gICAgICAgIHRoaXMudCA9IHQ7Ci0vLyAgICAgICAgdGhpcy5hcHAgPSBhcHA7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCB0aGUgT0RCIHNlbnNvcidzIGFuYWx5dGljcyB0byB0aGUgdG9wb2xvZ3kuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQW5hbHl0aWNzKCkgewotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3N2dC9hcHBzL2lvdHAvQWJzdHJhY3RJb3RwQXBwbGljYXRpb24uamF2YSBiL3Rlc3Qvc3Z0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9zdnQvYXBwcy9pb3RwL0Fic3RyYWN0SW90cEFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMTA1M2YuLjAwMDAwMDAKLS0tIGEvdGVzdC9zdnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3N2dC9hcHBzL2lvdHAvQWJzdHJhY3RJb3RwQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuZWRnZW50LnRlc3Quc3Z0LmFwcHMuaW90cDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LmNvbm5lY3RvcnMuaW90LklvdERldmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5jb25uZWN0b3JzLmlvdHAuSW90cERldmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuQWJzdHJhY3RBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmVkZ2VudC5zYW1wbGVzLmFwcHMuQXBwbGljYXRpb25VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5lZGdlbnQuc2FtcGxlcy5hcHBzLlRvcG9sb2d5UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuZWRnZW50LnRvcG9sb2d5LlRvcG9sb2d5OwotCi0vKioKLSAqIEFuIElvdEYgQXBwbGljYXRpb24gYmFzZSBjbGFzcy4KLSAqIDxwPgotICogQXBwbGljYXRpb24gaW5zdGFuY2VzIG5lZWQgdG86Ci0gKiA8dWw+Ci0gKiA8bGk+ZGVmaW5lIGFuIGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgI2J1aWxkVG9wb2xvZ3koVG9wb2xvZ3kpfTwvbGk+Ci0gKiA8bGk+Y2FsbCB7QGxpbmsgI3J1bigpfSB0byBidWlsZCBhbmQgc3VibWl0IHRoZSB0b3BvbG9neSBmb3IgZXhlY3V0aW9uLjwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBUaGUgY2xhc3MgcHJvdmlkZXMgc29tZSBjb21tb24gcHJvY2Vzc2luZyBuZWVkczoKLSAqIDx1bD4KLSAqIDxsaT5TdXBwb3J0IGZvciBhbiBleHRlcm5hbCBjb25maWd1cmF0aW9uIGZpbGU8L2xpPgotICogPGxpPlByb3ZpZGVzIGEge0BsaW5rIFRvcG9sb2d5UHJvdmlkZXJGYWN0b3J5fTwvbGk+Ci0gKiA8bGk+UHJvdmlkZXMgYSB7QGxpbmsgQXBwbGljYXRpb25VdGlsaXRpZXN9PC9saT4KLSAqIDxsaT5Qcm92aWRlcyBhIHtAbGluayBJb3REZXZpY2V9PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdElvdHBBcHBsaWNhdGlvbiBleHRlbmRzIEFic3RyYWN0QXBwbGljYXRpb24gewotCi0gICAgcHJpdmF0ZSBJb3REZXZpY2UgZGV2aWNlOwotCi0gICAgcHVibGljIEFic3RyYWN0SW90cEFwcGxpY2F0aW9uKFN0cmluZyBwcm9wc1BhdGgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlcihwcm9wc1BhdGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHByZUJ1aWxkVG9wb2xvZ3koVG9wb2xvZ3kgdG9wb2xvZ3kpIHsKLSAgICAgICAgLy8gQWRkIGFuIElvdHAgZGV2aWNlIGNvbW11bmljYXRpb24gbWFuYWdlciB0byB0aGUgdG9wb2xvZ3kKLSAgICAgICAgLy8gRGVjbGFyZSBhIGNvbm5lY3Rpb24gdG8gSW9URiBRdWlja3N0YXJ0IHNlcnZpY2UKLSAgICAgICAgU3RyaW5nIGRldmljZUlkID0gInFzIiArIExvbmcudG9IZXhTdHJpbmcobmV3IFJhbmRvbSgpLm5leHRMb25nKCkpOwotICAgICAgICBkZXZpY2UgPSBJb3RwRGV2aWNlLnF1aWNrc3RhcnQodG9wb2xvZ3ksIGRldmljZUlkKTsKLQotICAgICAgICAvLyBUT0RPIHJlcGxhY2UgcXVpY2tzdGFydAotICAgICAgICAvLyBpb3RmRGV2aWNlID0gbmV3IElvdHBEZXZpY2UodG9wb2xvZ3ksIG5ldyBGaWxlKCJkZXZpY2UuY2ZnIikpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUXVpY2tzdGFydCBkZXZpY2UgdHlwZToiICsgSW90cERldmljZS5RVUlDS1NUQVJUX0RFVklDRV9UWVBFKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJRdWlja3N0YXJ0IGRldmljZSBpZCAgOiIgKyBkZXZpY2VJZCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaHR0cHM6Ly9xdWlja3N0YXJ0LmludGVybmV0b2Z0aGluZ3MuaWJtY2xvdWQuY29tLyMvZGV2aWNlLyIgKyBkZXZpY2VJZCk7Ci0gICAgICAgIC8vIEFsc28gd3JpdGUgdGhpcyBpbmZvcm1hdGlvbiB0byBmaWxlIHF1aWNrc3RhcnRVcmwudHh0IGluIGNhc2UgdGhlCi0gICAgICAgIC8vIGNvbnNvbGUgc2Nyb2xscyB0b28gZmFzdAotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKCJpb3RmVXJsLnR4dCIsICJVVEYtOCIpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlF1aWNrc3RhcnQgZGV2aWNlIHR5cGU6IiArIElvdHBEZXZpY2UuUVVJQ0tTVEFSVF9ERVZJQ0VfVFlQRSk7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUXVpY2tzdGFydCBkZXZpY2UgaWQgIDoiICsgZGV2aWNlSWQpOwotICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oImh0dHBzOi8vcXVpY2tzdGFydC5pbnRlcm5ldG9mdGhpbmdzLmlibWNsb3VkLmNvbS8jL2RldmljZS8iICsgZGV2aWNlSWQpOwotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhcHBsaWNhdGlvbidzIElvdERldmljZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIElvdERldmljZQotICAgICAqLwotICAgIHB1YmxpYyBJb3REZXZpY2UgaW90RGV2aWNlKCkgewotICAgICAgICByZXR1cm4gZGV2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBvc2UgYSBJb3REZXZpY2UgZXZlbnRJZCBmb3IgdGhlIHNlbnNvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2Vuc29ySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZW5zb3IgaWQKLSAgICAgKiBAcGFyYW0gZXZlbnRJZAotICAgICAqICAgICAgICAgICAgdGhlIHNlbnNvcidzIGV2ZW50SWQKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXZpY2UgZXZlbnRJZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc2Vuc29yRXZlbnRJZChTdHJpbmcgc2Vuc29ySWQsIFN0cmluZyBldmVudElkKSB7Ci0gICAgICAgIHJldHVybiBzZW5zb3JJZCArICIuIiArIGV2ZW50SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcG9zZSBhIElvdHBEZXZpY2UgY29tbWFuZElkIGZvciB0aGUgc2Vuc29yCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlbnNvcklkCi0gICAgICogICAgICAgICAgICB0aGUgc2Vuc29yIGlkCi0gICAgICogQHBhcmFtIGNvbW1hbmRJZAotICAgICAqICAgICAgICAgICAgdGhlIHNlbnNvcidzIGNvbW1hbmRJZAotICAgICAqIEByZXR1cm4gdGhlIGRldmljZSBjb21tYW5kSWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbW1hbmRJZChTdHJpbmcgc2Vuc29ySWQsIFN0cmluZyBjb21tYW5kSWQpIHsKLSAgICAgICAgcmV0dXJuIHNlbnNvcklkICsgIi4iICsgY29tbWFuZElkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3Qvc3Z0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9zdnQvdXRpbHMvc2Vuc29yL2dwcy9HcHNTZW5zb3IuamF2YSBiL3Rlc3Qvc3Z0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9zdnQvdXRpbHMvc2Vuc29yL2dwcy9HcHNTZW5zb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3ZTA4MS4uMDAwMDAwMAotLS0gYS90ZXN0L3N2dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvc3Z0L3V0aWxzL3NlbnNvci9ncHMvR3BzU2Vuc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQudGVzdC5zdnQudXRpbHMuc2Vuc29yLmdwczsKLQotcHVibGljIGNsYXNzIEdwc1NlbnNvciB7Ci0KLSAgICBwcml2YXRlIGRvdWJsZSBsYXRpdHVkZTsKLSAgICBwcml2YXRlIGRvdWJsZSBsb25naXR1ZGU7Ci0gICAgcHJpdmF0ZSBkb3VibGUgYWx0aXR1ZGU7Ci0gICAgcHJpdmF0ZSBkb3VibGUgc3BlZWRNZXRlcnNQZXJTZWM7IC8vIG1ldGVycyBwZXIgc2VjCi0gICAgcHJpdmF0ZSBsb25nIHRpbWU7Ci0gICAgcHJpdmF0ZSBkb3VibGUgY291cnNlOwotCi0gICAgcHVibGljIEdwc1NlbnNvcihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGRvdWJsZSBhbHRpdHVkZSwgZG91YmxlIHNwZWVkTWV0ZXJzUGVyU2VjLCBsb25nIHRpbWUsCi0gICAgICAgICAgICBkb3VibGUgY291cnNlKSB7Ci0KLSAgICAgICAgdGhpcy5sYXRpdHVkZSA9IGxhdGl0dWRlOwotICAgICAgICB0aGlzLmxvbmdpdHVkZSA9IGxvbmdpdHVkZTsKLSAgICAgICAgdGhpcy5hbHRpdHVkZSA9IGFsdGl0dWRlOwotICAgICAgICB0aGlzLnNwZWVkTWV0ZXJzUGVyU2VjID0gc3BlZWRNZXRlcnNQZXJTZWM7Ci0gICAgICAgIHRoaXMudGltZSA9IHRpbWU7Ci0gICAgICAgIHRoaXMuY291cnNlID0gY291cnNlOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0TGF0aXR1ZGUoKSB7Ci0gICAgICAgIHJldHVybiBsYXRpdHVkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldExvbmdpdHVkZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvbmdpdHVkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdlQWx0aXR1ZGUoKSB7Ci0gICAgICAgIHJldHVybiBhbHRpdHVkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFNwZWVkTWV0ZXJzUGVyU2VjKCkgewotICAgICAgICByZXR1cm4gc3BlZWRNZXRlcnNQZXJTZWM7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRDb3Vyc2UoKSB7Ci0gICAgICAgIHJldHVybiBjb3Vyc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGxhdGl0dWRlICsgIiwgIiArIGxvbmdpdHVkZSArICIsICIgKyBhbHRpdHVkZSArICIsICIgKyBzcGVlZE1ldGVyc1BlclNlYyArICIsICIgKyB0aW1lICsgIiwgIiArIGNvdXJzZTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3Qvc3Z0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9zdnQvdXRpbHMvc2Vuc29yL2dwcy9TaW11bGF0ZWRHZW9mZW5jZS5qYXZhIGIvdGVzdC9zdnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3N2dC91dGlscy9zZW5zb3IvZ3BzL1NpbXVsYXRlZEdlb2ZlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOGNiNjQuLjAwMDAwMDAKLS0tIGEvdGVzdC9zdnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3N2dC91dGlscy9zZW5zb3IvZ3BzL1NpbXVsYXRlZEdlb2ZlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQudGVzdC5zdnQudXRpbHMuc2Vuc29yLmdwczsKLQotcHVibGljIGNsYXNzIFNpbXVsYXRlZEdlb2ZlbmNlIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZSBHRU9GRU5DRV9MQVRJVFVERV9NQVggPSAzNy4yMTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGRvdWJsZSBHRU9GRU5DRV9MQVRJVFVERV9NSU4gPSAzNy4wOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZG91YmxlIEdFT0ZFTkNFX0xPTkdJVFVERV9NQVggPSAtMTIxLjc1OwotICAgIHByb3RlY3RlZCBzdGF0aWMgZG91YmxlIEdFT0ZFTkNFX0xPTkdJVFVERV9NSU4gPSAtMTIyLjA7Ci0KLSAgICAvLyBTaW1wbGUgR2VvZmVuY2UgdGVzdAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvdXRzaWRlR2VvZmVuY2UoZG91YmxlIGxhdGl0dWRlLCBkb3VibGUgbG9uZ2l0dWRlKSB7Ci0KLSAgICAgICAgaWYgKGxhdGl0dWRlIDwgR0VPRkVOQ0VfTEFUSVRVREVfTUlOIHx8IGxhdGl0dWRlID4gR0VPRkVOQ0VfTEFUSVRVREVfTUFYIHx8IGxvbmdpdHVkZSA8IEdFT0ZFTkNFX0xPTkdJVFVERV9NSU4KLSAgICAgICAgICAgICAgICB8fCBsb25naXR1ZGUgPiBHRU9GRU5DRV9MT05HSVRVREVfTUFYKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3N2dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvc3Z0L3V0aWxzL3NlbnNvci9ncHMvU2ltdWxhdGVkR3BzU2Vuc29yLmphdmEgYi90ZXN0L3N2dC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3Qvc3Z0L3V0aWxzL3NlbnNvci9ncHMvU2ltdWxhdGVkR3BzU2Vuc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNGMyYWEuLjAwMDAwMDAKLS0tIGEvdGVzdC9zdnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L3N2dC91dGlscy9zZW5zb3IvZ3BzL1NpbXVsYXRlZEdwc1NlbnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5lZGdlbnQudGVzdC5zdnQudXRpbHMuc2Vuc29yLmdwczsKLQotcHVibGljIGNsYXNzIFNpbXVsYXRlZEdwc1NlbnNvciB7Ci0gICAgcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4OwotICAgIHByaXZhdGUgaW50IHNpbXVsYXRlZFNlYzsKLSAgICBwcml2YXRlIGludCByZXF1ZXN0ZWRJdGVyYXRpb25zID0gLTE7IC8vIC0xIG1lYW5zIGxvb3AgdGhyb3VnaCBncHNEYXRhQXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmV2ZXIKLSAgICBwcml2YXRlIGludCBjdXJyZW50SXRlcmF0aW9uID0gMDsKLQotICAgIHB1YmxpYyBTaW11bGF0ZWRHcHNTZW5zb3IoKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gLTE7Ci0gICAgICAgIHRoaXMuc2ltdWxhdGVkU2VjID0gMTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBSZXBsYWNlIGhhcmQtY29kZWQgZGF0YSB0byByZWFkaW5nIGluIEdQUyBkYXRhIGZyb20gZmlsZQotICAgIC8vIEdQUyBkYXRhIGZyb20gSUJNIFNpbGljb24gVmFsbGV5IExhYiB0byBJQk0gQWxtYWRlbiBSZXNlYXJjaCBhbmQgYmFjayB0bwotICAgIC8vIElCTSBTVkwKLSAgICBwcml2YXRlIHN0YXRpYyBkb3VibGVbXVtdIGdwc0RhdGFBcnJheSA9IHsgeyAzNy4xOTU2NDcsIC0xMjEuNzQ4MDg3IH0sIC8vIElCTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsaWNvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsbGV5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYWIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDU1NQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFpbGV5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdmUKLSAgICAgICAgICAgIHsgMzcuMTgxMTA2Nzk5OTk5OTksIC0xMjEuNzg2NTAwMyB9LCAvLyBDYWxlcm8gUmVzZXJ2b2lyIE1jS2VhbgotICAgICAgICAgICAgeyAzNy4xOTkyNjI5OTk5OTk5OSwgLTEyMS44MjIzNDM5OTk5OTk5OSB9LCAvLyBTYW50YSBDbGFyYSBIb3JzZW1lbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NvY2lhdGlvbiAyMDM1MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNY0tlYW4KLSAgICAgICAgICAgIHsgMzcuMTk4NjMyLCAtMTIxLjgyMjM0Mzk5OTk5OTk5IH0sIC8vIEZvcmVzdHJ5ICYgRmlyZSBQcm90ZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyMDI1NSBNY0tlYW4KLSAgICAgICAgICAgIHsgMzcuMTk4NzU0Njk5OTk5OTksIC0xMjEuODIzMjA4MzAwMDAwMDMgfSwgLy8gU3QuIEFudGhvbnkgQ2h1cmNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwMTAxIE1jS2VhbgotICAgICAgICAgICAgeyAzNy4yMDA0MDA0LCAtMTIxLjgyNTc4MDMwMDAwMDAyIH0sIC8vIENoYWxsZW5nZXIgU2Nob29sIDE5OTUwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWNLZWFuCi0gICAgICAgICAgICB7IDM3LjE5OTU3NiwgLTEyMS44MjQ2ODkwMDAwMDAwMyB9LCAvLyBGaXJlaG91c2UgTm8uMjggMTk5MTEgTWNLZWFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZAotICAgICAgICAgICAgeyAzNy4yMTEwNTMsIC0xMjEuODA2OTQ5IH0sIC8vIElCTSBBbG1hZGVuIFJlc2VhcmNoIEhhcnJ5IFJvYWQKLSAgICAgICAgICAgIC8vIHRoZW4gZ28gYmFjayB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24KLSAgICAgICAgICAgIHsgMzcuMTk5NTc2LCAtMTIxLjgyNDY4OTAwMDAwMDAzIH0sIC8vIEZpcmVob3VzZSBOby4yOCAxOTkxMSBNY0tlYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJkCi0gICAgICAgICAgICB7IDM3LjIwMDQwMDQsIC0xMjEuODI1NzgwMzAwMDAwMDIgfSwgLy8gQ2hhbGxlbmdlciBTY2hvb2wgMTk5NTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNY0tlYW4KLSAgICAgICAgICAgIHsgMzcuMTk4NzU0Njk5OTk5OTksIC0xMjEuODIzMjA4MzAwMDAwMDMgfSwgLy8gU3QuIEFudGhvbnkgQ2h1cmNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwMTAxIE1jS2VhbgotICAgICAgICAgICAgeyAzNy4xOTg2MzIsIC0xMjEuODIyMzQzOTk5OTk5OTkgfSwgLy8gRm9yZXN0cnkgJiBGaXJlIFByb3RlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwMjU1IE1jS2VhbgotICAgICAgICAgICAgeyAzNy4xOTkyNjI5OTk5OTk5OSwgLTEyMS44MjIzNDM5OTk5OTk5OSB9LCAvLyBTYW50YSBDbGFyYSBIb3JzZW1lbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NvY2lhdGlvbiAyMDM1MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNY0tlYW4KLSAgICAgICAgICAgIHsgMzcuMTgxMTA2Nzk5OTk5OTksIC0xMjEuNzg2NTAwMyB9LCAvLyBDYWxlcm8gUmVzZXJ2b2lyIE1jS2VhbgotICAgICAgICAgICAgeyAzNy4xOTU2NDcsIC0xMjEuNzQ4MDg3IH0sIC8vIElCTSBTaWxpY29uIFZhbGxleSBMYWIgNTU1IEJhaWxleSBBdmUKLSAgICB9OwotCi0gICAgLy8gVE9ETyBSZS13cml0ZSBrbHVnZSBjb2RlIHRvIHJlYWQgZnJvbSBhIGZpbGUKLSAgICAvLyBSZXR1cm5zIGEgR3BzU2Vuc29yIHVzaW5nIHRoZSBoYXJkLWNvZGVkIGxpc3QsIHRoZW4gcmVwZWF0cyB0aHJvdWdoIHRoZQotICAgIC8vIGxpc3QKLSAgICAvLyBmb3JldmVyIHdoZW4gcmVxdWVzdGVkSXRlcmF0aW9ucyA9IC0xLCBvciB1bnRpbCBpdGVyYXRpb25zIGlzIHJlYWNoZWQuCi0gICAgcHVibGljIEdwc1NlbnNvciBuZXh0R3BzKCkgewotCi0gICAgICAgIEdwc1NlbnNvciByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAocmVxdWVzdGVkSXRlcmF0aW9ucyA9PSAtMSB8fCBjdXJyZW50SXRlcmF0aW9uIDwgcmVxdWVzdGVkSXRlcmF0aW9ucykgewotICAgICAgICAgICAgc2ltdWxhdGVkU2VjKys7Ci0KLSAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgaW5kZXggdG8gdXNlIGZvciBnZW5lcmF0aW5nIHRoZSBuZXh0IEdQUyBjb29yZGluYXRlCi0gICAgICAgICAgICAvLyBJZiBjdXJyZW50SW5kZXggaXMgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSwgdGhlbiBzZXQKLSAgICAgICAgICAgIC8vIGN1cnJlbnRJbmRleCB0byBzdGFydCBvdmVyIGF0IHRoZSBhcnJheSBiZWdpbm5pbmcgYXQgaW5kZXggMAotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpbmNyZW1lbnQgY3VycmVudEluZGV4Ci0gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID49IGdwc0RhdGFBcnJheS5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBjdXJyZW50SXRlcmF0aW9uKys7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKLQotICAgICAgICAgICAgLy8gaGFyZGNvZGUgb3RoZXIgZGF0YSAoYWx0aXR1ZGUsIGNvdXJzZSwgdGltZSwgc3BlZWQsIGV0Yy4pIGFuZCBhdAotICAgICAgICAgICAgLy8gaW5kZXggNSBmb3IgaGFyZCBicmFraW5nIGFuZCBhY2NlbGVyYXRpb24gc3BlZWQKLSAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT0gNSkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgR3BzU2Vuc29yKGdwc0RhdGFBcnJheVtjdXJyZW50SW5kZXhdWzBdLCBncHNEYXRhQXJyYXlbY3VycmVudEluZGV4XVsxXSwgMzIuMSwgNDIuNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsYXRlZFNlYywgMzguMik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEdwc1NlbnNvcihncHNEYXRhQXJyYXlbY3VycmVudEluZGV4XVswXSwgZ3BzRGF0YUFycmF5W2N1cnJlbnRJbmRleF1bMV0sIDIwLjEsIDI5LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaW11bGF0ZWRTZWMsIDI4LjIpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29sY2hhaW5zLXRyYXZpcy54bWwgYi90b29sY2hhaW5zLXRyYXZpcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkYzIwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xjaGFpbnMtdHJhdmlzLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEY4Ij8+Cis8IS0tCisKKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tPgorPHRvb2xjaGFpbnM+CisgIDwhLS0gUGF0aHMgdGFrZW4gZnJvbToKKyAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS90cmF2aXMtY2kvdHJhdmlzLWNvb2tib29rcy9ibG9iLzRmMjI3MmNlNzZjODUzYzZlMzNjYjRmZjg3NmMzMmE0MzQxNzU0ZjYvY2lfZW52aXJvbm1lbnQvamF2YS90ZW1wbGF0ZXMvdWJ1bnR1L2pka19zd2l0Y2hlci5zaC5lcmIKKyAgLS0+CisgIDx0b29sY2hhaW4+CisgICAgPHR5cGU+amRrPC90eXBlPgorICAgIDxwcm92aWRlcz4KKyAgICAgIDx2ZXJzaW9uPjEuODwvdmVyc2lvbj4KKyAgICAgIDx2ZW5kb3I+b3JhY2xlPC92ZW5kb3I+CisgICAgPC9wcm92aWRlcz4KKyAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgIDxqZGtIb21lPi91c3IvbGliL2p2bS9qYXZhLTgtb3JhY2xlPC9qZGtIb21lPgorICAgIDwvY29uZmlndXJhdGlvbj4KKyAgPC90b29sY2hhaW4+CisgIDx0b29sY2hhaW4+CisgICAgPHR5cGU+amRrPC90eXBlPgorICAgIDxwcm92aWRlcz4KKyAgICAgIDx2ZXJzaW9uPjEuNzwvdmVyc2lvbj4KKyAgICAgIDx2ZW5kb3I+b3JhY2xlPC92ZW5kb3I+CisgICAgPC9wcm92aWRlcz4KKyAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgIDxqZGtIb21lPi91c3IvbGliL2p2bS9qYXZhLTctb3JhY2xlPC9qZGtIb21lPgorICAgIDwvY29uZmlndXJhdGlvbj4KKyAgPC90b29sY2hhaW4+Cis8L3Rvb2xjaGFpbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXRpbHMvLmNsYXNzcGF0aCBiL3V0aWxzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MzlmNTcuLjAwMDAwMDAKLS0tIGEvdXRpbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1ldHJpY3Mvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1ldHJpY3Mvc3JjL3Rlc3QvamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InN0cmVhbXNjb3BlL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzdHJlYW1zY29wZS9zcmMvdGVzdC9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGNvbWJpbmVhY2Nlc3NydWxlcz0iZmFsc2UiIGtpbmQ9InNyYyIgcGF0aD0iL2FwaSIvPgotCTxjbGFzc3BhdGhlbnRyeSBjb21iaW5lYWNjZXNzcnVsZXM9ImZhbHNlIiBraW5kPSJzcmMiIHBhdGg9Ii9leHQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuSlVOSVRfQ09OVEFJTkVSLzQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXRpbHMvLmdpdGlnbm9yZSBiL3V0aWxzLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGZlNDQuLjAwMDAwMDAKLS0tIGEvdXRpbHMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotL2NsYXNzZXMvCi0qKi90ZXN0LmNsYXNzZXMvCi0qKi9jbGFzc2VzLwotKiovdW5pdHRlc3RzLwotL2Jpbi8KZGlmZiAtLWdpdCBhL3V0aWxzLy5wcm9qZWN0IGIvdXRpbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTc1NjIuLjAwMDAwMDAKLS0tIGEvdXRpbHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT51dGlsczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91dGlscy9tZXRyaWNzL2J1aWxkLmdyYWRsZSBiL3V0aWxzL21ldHJpY3MvYnVpbGQuZ3JhZGxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGMzN2FhLi4wMDAwMDAwCi0tLSBhL3V0aWxzL21ldHJpY3MvYnVpbGQuZ3JhZGxlCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLSovCi1kZXBlbmRlbmNpZXMgewotICBhZGRUYXJnZXREaXJQcm9qZWN0SmFyRGVwZW5kZW5jeSAnY29tcGlsZScsICc6YXBpOnRvcG9sb2d5JwotICBhZGRUYXJnZXREaXJDb3JlRXh0SmFyRGVwZW5kZW5jaWVzICdjb21waWxlJwotCi0gIC8vIE4uQi4gcm9vdCBwcm9qZWN0IGFkZHMgdGVzdCBjb21tb24gZGVwZW5kZW5jaWVzCi19Ci0KLWFkZENvbXBpbGVUZXN0RGVwZW5kZW5jaWVzICc6YXBpOnRvcG9sb2d5JwpkaWZmIC0tZ2l0IGEvdXRpbHMvbWV0cmljcy9wb20ueG1sIGIvdXRpbHMvbWV0cmljcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDhlNmIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9tZXRyaWNzL3BvbS54bWwKQEAgLTAsMCArMSw1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtbWV0cmljczwvYXJ0aWZhY3RJZD4KKworICA8bmFtZT5BcGFjaGUgRWRnZW50IChKYXZhIDgpOiBVdGlsczogTWV0cmljczwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cmVtb3RlLXJlc291cmNlcy1tYXZlbi1wbHVnaW4ucmVtb3RlLXJlc291cmNlcy5kaXI+Li4vLi4vc3JjL21haW4vaWJtLXJlbW90ZS1yZXNvdXJjZXM8L3JlbW90ZS1yZXNvdXJjZXMtbWF2ZW4tcGx1Z2luLnJlbW90ZS1yZXNvdXJjZXMuZGlyPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gVE9ETzogVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGJlY2F1c2Ugb2YgYSBkZXBlbmRlbmN5IHRvIFRvcG9sb2d5QWJzdHJhY3RUZXN0IC0+IFdvdWxkIHN1Z2dlc3QgdG8gbW92ZSB0ZXN0LXV0aWwgc3R1dHQgaW50byBhIGRlZGljYXRlZCB0ZXN0LXV0aWxzIGFydGlmYWN0IC0tPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtYXBpLXRvcG9sb2d5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS91dGlscy9tZXRyaWNzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9tZXRyaWNzL01ldHJpY3NFdmVyeXdoZXJlVGVzdC5qYXZhIGIvdXRpbHMvbWV0cmljcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvZWRnZW50L3Rlc3QvbWV0cmljcy9NZXRyaWNzRXZlcnl3aGVyZVRlc3QuamF2YQppbmRleCA3NDExYTJiLi5iMDUxMTczIDEwMDY0NAotLS0gYS91dGlscy9tZXRyaWNzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9lZGdlbnQvdGVzdC9tZXRyaWNzL01ldHJpY3NFdmVyeXdoZXJlVGVzdC5qYXZhCisrKyBiL3V0aWxzL21ldHJpY3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2VkZ2VudC90ZXN0L21ldHJpY3MvTWV0cmljc0V2ZXJ5d2hlcmVUZXN0LmphdmEKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgIC8qKgogICAgICAqIFRlc3QgUGVlay4gVGhpcyB3aWxsIG9ubHkgd29yayB3aXRoIGFuIGVtYmVkZGVkIHNldHVwLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogQHRocm93cyBFeGNlcHRpb24gb24gZmFpbHVyZQogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgbWV0cmljc0V2ZXJ5d2hlcmVQZWVrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS91dGlscy9wb20ueG1sIGIvdXRpbHMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc0ODdlCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbHMvcG9tLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5lZGdlbnQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHM8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogVXRpbHM8L25hbWU+CisKKyAgPG1vZHVsZXM+CisgICAgPG1vZHVsZT5tZXRyaWNzPC9tb2R1bGU+CisgICAgPG1vZHVsZT5zdHJlYW1zY29wZTwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3V0aWxzL3N0cmVhbXNjb3BlL2J1aWxkLmdyYWRsZSBiL3V0aWxzL3N0cmVhbXNjb3BlL2J1aWxkLmdyYWRsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3NmUwMy4uMDAwMDAwMAotLS0gYS91dGlscy9zdHJlYW1zY29wZS9idWlsZC5ncmFkbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLWRlcGVuZGVuY2llcyB7Ci0gIGFkZFRhcmdldERpclByb2plY3RKYXJEZXBlbmRlbmN5ICdjb21waWxlJywgJzphcGk6dG9wb2xvZ3knCi0gIGFkZFRhcmdldERpckNvcmVFeHRKYXJEZXBlbmRlbmNpZXMgJ2NvbXBpbGUnCi0KLSAgLy8gTi5CLiByb290IHByb2plY3QgYWRkcyB0ZXN0IGNvbW1vbiBkZXBlbmRlbmNpZXMKLX0KLQotYWRkQ29tcGlsZVRlc3REZXBlbmRlbmNpZXMgJzphcGk6dG9wb2xvZ3knCi0KLXRlc3QgewotICAvLyB0aGlzIHByb2plY3QgbGFja3MgdGVzdHMgYW5kIHRoaXMgdGFzayBmYWlscyBpZiBhdHRlbXB0ZWQgCi0gIGVuYWJsZWQgPSBmYWxzZQotfQpkaWZmIC0tZ2l0IGEvdXRpbHMvc3RyZWFtc2NvcGUvcG9tLnhtbCBiL3V0aWxzL3N0cmVhbXNjb3BlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzMjEzYwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWxzL3N0cmVhbXNjb3BlL3BvbS54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5lZGdlbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+ZWRnZW50LXV0aWxzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5lZGdlbnQtdXRpbHMtc3RyZWFtc2NvcGU8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+QXBhY2hlIEVkZ2VudCAoSmF2YSA4KTogVXRpbHM6IFN0cmVhbXNjb3BlPC9uYW1lPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmVkZ2VudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVkZ2VudC1hcGktdG9wb2xvZ3k8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8IS0tIFRPRE86IFRoaXMgaXMgb25seSByZXF1aXJlZCBiZWNhdXNlIG9mIGEgZGVwZW5kZW5jeSB0byBUb3BvbG9neUFic3RyYWN0VGVzdCAtPiBXb3VsZCBzdWdnZXN0IHRvIG1vdmUgdGVzdC11dGlsIHN0dXR0IGludG8gYSBkZWRpY2F0ZWQgdGVzdC11dGlscyBhcnRpZmFjdCAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZWRnZW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZWRnZW50LWFwaS10b3BvbG9neTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4wPC92ZXJzaW9uPgorICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0Pgo=