ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTY1YWUKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNiBAQAorKi5pbWwKKyouaXByCisqLml3cworLmlkZWEKK3RhcmdldAorKn4KZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDEyMDc0NjQuLmVlNDViNjIgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTQsNiArMTQsOSBAQAogCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKKyMgSW5jbHVkZSBkZWZpbml0aW9ucyBvZiBEQUdHRVIyX1BST0NFU1NPUl9DTEFTU0VTL0xJQlJBUklFUworaW5jbHVkZSBleHRlcm5hbC9kYWdnZXIyL2RhZ2dlcjJfYW5ub3RhdGlvbl9wcm9jZXNzb3IubWsKKwogIyBidWlsZCBjYWxpcGVyIGhvc3QgamFyCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0yNCwxNiArMjcsNTUgQEAKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBKQVZBX0xJQlJBUklFUwogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgY2FsaXBlci9zcmMvbWFpbi9qYXZhLykKIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSBjYWxpcGVyL3NyYy9tYWluL3Jlc291cmNlcworTE9DQUxfSVNfSE9TVF9NT0RVTEUgOj0gdHJ1ZQogCiBMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICBhcGFjaGUtY29tbW9ucy1tYXRoLWhvc3QgXAogICBjYWxpcGVyLWdzb24taG9zdCBcCiAgIGNhbGlwZXItamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlci1ob3N0IFwKKyAgY2FsaXBlci1qZXJzZXktY2xpZW50LWhvc3QgXAorICBjYWxpcGVyLWplcnNleS1jb3JlLWhvc3QgXAorICBjYWxpcGVyLWpvZGEtdGltZS1ob3N0IFwKKyAgY2FsaXBlci1qc3IzMTEtYXBpLWhvc3QgXAorICBkYWdnZXIyLWhvc3QgXAorICBkYWdnZXIyLWluamVjdC1ob3N0IFwKICAgZ3VhdmFsaWIKIAorIyBVc2UgRGFnZ2VyMiBhbm5vdGF0aW9uIHByb2Nlc3NvcgorUFJPQ0VTU09SX0xJQlJBUklFUyA6PSAkKERBR0dFUjJfUFJPQ0VTU09SX0xJQlJBUklFUykKK1BST0NFU1NPUl9DTEFTU0VTIDo9ICQoREFHR0VSMl9QUk9DRVNTT1JfQ0xBU1NFUykKK2luY2x1ZGUgZXh0ZXJuYWwvZGFnZ2VyMi9qYXZhX2Fubm90YXRpb25fcHJvY2Vzc29ycy5taworCiBpbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCiAKKyMgUmVtZW1iZXIgdGhlIGxvY2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXMsIHRoaXMgaXMgbmVlZGVkIGZvciB3aGVuCisjIGJ1aWxkaW5nIGZvciB0YXJnZXQKK2NhbGlwZXJfaG9zdF9nZW5lcmF0ZWRfc291cmNlc19kaXIgOj0gJChsb2NhbC1nZW5lcmF0ZWQtc291cmNlcy1kaXIpL2Fubm90YXRpb25fcHJvY2Vzc29yX291dHB1dAorCisjIGJ1aWxkIGNhbGlwZXIgdGFyZ2V0IGFwaSBqYXIKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRoaXMgY29udGFpbnMganVzdCB0aG9zZSBjbGFzc2VzIG5lZWRlZCBmb3IgYmVuY2htYXJrcyB0byBjb21waWxlLgorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IGNhbGlwZXItYXBpLXRhcmdldAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBKQVZBX0xJQlJBUklFUworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BZnRlckV4cGVyaW1lbnQuamF2YSBcCisgIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQmVmb3JlRXhwZXJpbWVudC5qYXZhIFwKKyAgY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9QYXJhbS5qYXZhIFwKKyAgY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BbGwuamF2YSBcCisgIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQmVuY2htYXJrLmphdmEKKworaW5jbHVkZSAkKEJVSUxEX0pBVkFfTElCUkFSWSkKKwogIyBidWlsZCBjYWxpcGVyIHRlc3RzCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyB2b2dhciAtLWV4cGVjdGF0aW9ucyAkQU5EUk9JRF9CVUlMRF9UT1AvZXh0ZXJuYWwvY2FsaXBlci9leHBlY3RhdGlvbnMva25vd25mYWlsdXJlcy50eHQgXAorICAgICAgICAtLXRlc3Qtb25seSBcCisgICAgICAgIC0tY2xhc3NwYXRoICRBTkRST0lEX0JVSUxEX1RPUC9vdXQvaG9zdC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NhbGlwZXItdGVzdHNfaW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciBcCisgICAgICAgIGNvbS5nb29nbGUuY2FsaXBlcgogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIApAQCAtNDEsMTkgKzgzLDQ5IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBjYWxpcGVyL3NyYy90ZXN0L2phdmEvKQorTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IGNhbGlwZXIvc3JjL3Rlc3QvcmVzb3VyY2VzCitMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBcCiAgIGNhbGlwZXItaG9zdCBcCi0gIGp1bml0CisgIGp1bml0IFwKKyAgbW9ja2l0by1ob3N0CisKKyMgVXNlIERhZ2dlcjIgYW5ub3RhdGlvbiBwcm9jZXNzb3IKK1BST0NFU1NPUl9MSUJSQVJJRVMgOj0gJChEQUdHRVIyX1BST0NFU1NPUl9MSUJSQVJJRVMpCitQUk9DRVNTT1JfQ0xBU1NFUyA6PSAkKERBR0dFUjJfUFJPQ0VTU09SX0NMQVNTRVMpCitpbmNsdWRlIGV4dGVybmFsL2RhZ2dlcjIvamF2YV9hbm5vdGF0aW9uX3Byb2Nlc3NvcnMubWsKIAogaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQogCi0jIEJ1aWxkIGRlcGVuZGVuY2llcy4KKyMgYnVpbGQgY2FsaXBlciBleGFtcGxlcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBjYWxpcGVyLWV4YW1wbGVzCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBleGFtcGxlcy9zcmMvbWFpbi9qYXZhLykKK0xPQ0FMX0lTX0hPU1RfTU9EVUxFIDo9IHRydWUKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgY2FsaXBlci1ob3N0IFwKKyAganVuaXQgXAorICBtb2NraXRvLWhvc3QKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQorCisjIEJ1aWxkIGhvc3QgZGVwZW5kZW5jaWVzLgogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9QUkVCVUlMVF9KQVZBX0xJQlJBUklFUyA6PSBcCi0gICAgY2FsaXBlci1nc29uLWhvc3Q6bGliL2dzb24tMS43LjEkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKSBcCi0gICAgY2FsaXBlci1qYXZhLWFsbG9jYXRpb24taW5zdHJ1bWVudGVyLWhvc3Q6bGliL2phdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXItMi4wJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkKKyAgICBjYWxpcGVyLWdzb24taG9zdDpsaWIvZ3Nvbi0yLjIuMiQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpIFwKKyAgICBjYWxpcGVyLWphdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXItaG9zdDpsaWIvamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlci0yLjAkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKSBcCisgICAgY2FsaXBlci1qZXJzZXktY2xpZW50LWhvc3Q6bGliL2plcnNleS1jbGllbnQtMS4xMSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpIFwKKyAgICBjYWxpcGVyLWplcnNleS1jb3JlLWhvc3Q6bGliL2plcnNleS1jb3JlLTEuMTEkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKSBcCisgICAgY2FsaXBlci1qb2RhLXRpbWUtaG9zdDpsaWIvam9kYS10aW1lLTIuMSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpIFwKKyAgICBjYWxpcGVyLWpzcjMxMS1hcGktaG9zdDpsaWIvanNyMzExLWFwaS0xLjEuMSQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpCiAKIGluY2x1ZGUgJChCVUlMRF9IT1NUX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvUkVBRE1FLmFuZHJvaWQgYi9SRUFETUUuYW5kcm9pZAppbmRleCA5MTYxN2I1Li44NTBkMmVlIDEwMDY0NAotLS0gYS9SRUFETUUuYW5kcm9pZAorKysgYi9SRUFETUUuYW5kcm9pZApAQCAtMiw5ICsyLDE0IEBACiBMaWNlbnNlOiBBcGFjaGUgMgogRGVzY3JpcHRpb246ICJHb29nbGUncyBDYWxpcGVyIEJlbmNobWFya2luZyBBbmQgTWVhc3VyaW5nIFRvb2wiCiAKLVZlcnNpb246IDAuNS1yYzEKK1ZlcnNpb246IDczZWZiZTEzOGRhZmJhNTdkNmE4OTAyNTc5NjFiYTgzZjQxYjg5ZjIKIAotU29tZSBvZiB0aGUgZXhhbXBsZXMgZG8gbm90IGJ1aWxkLCB0aGF0IGlzIGFuIGlzc3VlIHdpdGggdXBzdHJlYW0uCitUaGlzIHVzZXMgdGhlIERhZ2dlcjIgZGVwZW5kZW5jeSBpbmplY3Rpb24gZnJhbWV3b3JrIHdoaWNoIHJ1bnMgYXMgYW4gYW5ub3RhdGlvbgorcHJvY2Vzc29yIGFuZCBnZW5lcmF0ZXMgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW5nIGNvZGUuIEF0IHRoZSBtb21lbnQgdGhlCitnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIGNhbGlwZXItaG9zdCB0YXJnZXQgY2FuIGJlIGZvdW5kIGF0OgorICBvdXQvaG9zdC9jb21tb24vZ2VuL0pBVkFfTElCUkFSSUVTL2NhbGlwZXItaG9zdF9pbnRlcm1lZGlhdGVzL2Fubm90YXRpb25fcHJvY2Vzc29yX291dHB1dC8KK0ZvciB0aGUgY2FsaXBlci10ZXN0cyB0YXJnZXQgaXQgY2FuIGJlIGZvdW5kIGF0OgorICBvdXQvaG9zdC9jb21tb24vZ2VuL0pBVkFfTElCUkFSSUVTL2NhbGlwZXItdGVzdHNfaW50ZXJtZWRpYXRlcy9hbm5vdGF0aW9uX3Byb2Nlc3Nvcl9vdXRwdXQvCiAKIExvY2FsIFBhdGNoZXM6CiAgICAgTm9uZQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9wb20ueG1sIGIvY2FsaXBlci9wb20ueG1sCmluZGV4IGJlZmQ1ODMuLjk4ODQ3MjQgMTAwNjQ0Ci0tLSBhL2NhbGlwZXIvcG9tLnhtbAorKysgYi9jYWxpcGVyL3BvbS54bWwKQEAgLTEsMjIgKzEsNTcgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLgorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNhbGlwZXI8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNhbGlwZXI8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjAuNS1yYzE8L3ZlcnNpb24+Ci0gIDxpbmNlcHRpb25ZZWFyPjIwMDk8L2luY2VwdGlvblllYXI+Ci0gIDxuYW1lPmNhbGlwZXI8L25hbWU+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLm9zczwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vc3MtcGFyZW50PC9hcnRpZmFjdElkPgogICAgIDx2ZXJzaW9uPjc8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgotICA8dXJsPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jYWxpcGVyLzwvdXJsPgorCisgIDxncm91cElkPmNvbS5nb29nbGUuY2FsaXBlcjwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+Y2FsaXBlcjwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgIDxuYW1lPmNhbGlwZXI8L25hbWU+CiAgIDxkZXNjcmlwdGlvbj5DYWxpcGVyOiBNaWNyb2JlbmNobWFya2luZyBGcmFtZXdvcmsgZm9yIEphdmE8L2Rlc2NyaXB0aW9uPgotICA8cHJvcGVydGllcz4KLSAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgPC9wcm9wZXJ0aWVzPgorCisgIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NhbGlwZXIvPC91cmw+CisKKyAgPGluY2VwdGlvblllYXI+MjAwOTwvaW5jZXB0aW9uWWVhcj4KKworICA8b3JnYW5pemF0aW9uPgorICAgIDxuYW1lPkdvb2dsZSBJbmMuPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL3d3dy5nb29nbGUuY29tPC91cmw+CisgIDwvb3JnYW5pemF0aW9uPgorCisgIDxkZXZlbG9wZXJzPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8bmFtZT5HcmVnb3J5IEtpY2s8L25hbWU+CisgICAgICA8b3JnYW5pemF0aW9uPkdvb2dsZSBJbmMuPC9vcmdhbml6YXRpb24+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxuYW1lPkplc3NlIFdpbHNvbjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgPC9kZXZlbG9wZXJzPgorCiAgIDxsaWNlbnNlcz4KICAgICA8bGljZW5zZT4KICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CkBAIC0yNCw1NSArNTksOTcgQEAKICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgogICAgIDwvbGljZW5zZT4KICAgPC9saWNlbnNlcz4KKwogICA8c2NtPgogICAgIDxjb25uZWN0aW9uPnNjbTpnaXQ6aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NhbGlwZXIvPC9jb25uZWN0aW9uPgogICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpnaXQ6aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NhbGlwZXIvPC9kZXZlbG9wZXJDb25uZWN0aW9uPgogICAgIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NhbGlwZXIvc291cmNlL2Jyb3dzZTwvdXJsPgogICA8L3NjbT4KKwogICA8aXNzdWVNYW5hZ2VtZW50PgogICAgIDxzeXN0ZW0+R29vZ2xlIENvZGUgSXNzdWUgVHJhY2tpbmc8L3N5c3RlbT4KICAgICA8dXJsPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jYWxpcGVyL2lzc3Vlcy9saXN0PC91cmw+CiAgIDwvaXNzdWVNYW5hZ2VtZW50PgotICA8b3JnYW5pemF0aW9uPgotICAgIDxuYW1lPkdvb2dsZSwgSW5jLjwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly93d3cuZ29vZ2xlLmNvbTwvdXJsPgotICA8L29yZ2FuaXphdGlvbj4KKworICA8cHJvcGVydGllcz4KKyAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8Z3BnLnNraXA+dHJ1ZTwvZ3BnLnNraXA+CisgIDwvcHJvcGVydGllcz4KKwogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmZpbmRidWdzPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+anNyMzA1PC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+MS4zLjk8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPjwhLS0gdXNlZCBvbmx5IGZvciBhbm5vdGF0aW9ucyAtLT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuZ3NvbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmdzb248L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjcuMTwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjIuMi4yPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmpvZGEtdGltZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpvZGEtdGltZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjExPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZGFnZ2VyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZGFnZ2VyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZGFnZ2VyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+ZGFnZ2VyLWNvbXBpbGVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjExLjAuMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgIDx2ZXJzaW9uPjE4LjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmhpYmVybmF0ZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmhpYmVybmF0ZS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My42LjcuRmluYWw8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPjwhLS0gdXNlZCBvbmx5IGZvciBhbm5vdGF0aW9ucyAtLT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLW1hdGg8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmphdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXI8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5qYXZhLWFsbG9jYXRpb24taW5zdHJ1bWVudGVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjQuMTA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuOS41PC92ZXJzaW9uPgogICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CisKICAgPGJ1aWxkPgogICAgIDxkZWZhdWx0R29hbD5wYWNrYWdlPC9kZWZhdWx0R29hbD4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjMuMjwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My4yPC92ZXJzaW9uPgogICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICA8c291cmNlPjEuNjwvc291cmNlPgogICAgICAgICAgIDx0YXJnZXQ+MS42PC90YXJnZXQ+CkBAIC04MCw4ICsxNTcsMTMgQEAKICAgICAgIDwvcGx1Z2luPgogICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZWNsaXBzZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuODwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+Mi45PC92ZXJzaW9uPgogICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICA8ZG93bmxvYWRTb3VyY2VzPnRydWU8L2Rvd25sb2FkU291cmNlcz4KICAgICAgICAgICA8ZG93bmxvYWRKYXZhZG9jcz50cnVlPC9kb3dubG9hZEphdmFkb2NzPgpAQCAtOTAsMTIgKzE3MiwxOSBAQAogICAgICAgPC9wbHVnaW4+CiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjUuMTwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFyZ3VtZW50cz4tRGVuYWJsZUNpUHJvZmlsZT10cnVlPC9hcmd1bWVudHM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjEuMjwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgogICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICA8ZXhlY3V0aW9uPgogICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgogICAgICAgICAgICAgPGdvYWxzPgogICAgICAgICAgICAgICA8Z29hbD5qYXItbm8tZm9yazwvZ29hbD4KICAgICAgICAgICAgIDwvZ29hbHM+CkBAIC0xMDUsNyArMTk0LDcgQEAKICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNzwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+Mi4xMC4xPC92ZXJzaW9uPgogICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICA8ZXhlY3V0aW9uPgogICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWphdmFkb2NzPC9pZD4KQEAgLTExNywxOCArMjA2LDkxIEBACiAgICAgICAgIDwvZXhlY3V0aW9ucz4KICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPGxpbmtzPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2Rvd25sb2FkLm9yYWNsZS5jb20vamF2YXNlLzEuNS4wL2RvY3MvYXBpLzwvbGluaz4KKyAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9kb3dubG9hZC5vcmFjbGUuY29tL2phdmFzZS8xLjYuMC9kb2NzL2FwaS88L2xpbms+CiAgICAgICAgICAgPC9saW5rcz4KICAgICAgICAgICA8dmVyc2lvbj50cnVlPC92ZXJzaW9uPgogICAgICAgICAgIDxzaG93PnB1YmxpYzwvc2hvdz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNoYWRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5zaGFkZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHNoYWRlZEFydGlmYWN0QXR0YWNoZWQ+dHJ1ZTwvc2hhZGVkQXJ0aWZhY3RBdHRhY2hlZD4KKyAgICAgICAgICAgICAgPHNoYWRlZENsYXNzaWZpZXJOYW1lPmFsbDwvc2hhZGVkQ2xhc3NpZmllck5hbWU+CisgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSByZWxvY2F0aW9uIGFzIGl0IGlzIGJyZWFraW5nIHNvbWUgcmVmbGVjdGlvbiAtLT4KKyAgICAgICAgICAgICAgPCEtLSA8cmVsb2NhdGlvbnM+CisgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICA8cGF0dGVybj5jb20uZ29vZ2xlPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+Y29tLmdvb2dsZS5jYWxpcGVyLnNoYWRlZC5jb20uZ29vZ2xlPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uZ29vZ2xlLmNhbGlwZXIuKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNvbS5zdW4uamVyc2V5PC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+Y29tLmdvb2dsZS5jYWxpcGVyLnNoYWRlZC5jb20uc3VuLmplcnNleTwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICA8cGF0dGVybj5jb20uc3VuLndzPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+Y29tLmdvb2dsZS5jYWxpcGVyLnNoYWRlZC5jb20uc3VuLndzPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmphdmF4LmluamVjdDwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPmNvbS5nb29nbGUuY2FsaXBlci5zaGFkZWQuamF2YXguaW5qZWN0PC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmphdmF4LndzPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+Y29tLmdvb2dsZS5jYWxpcGVyLnNoYWRlZC5qYXZheC53czwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuYW9wYWxsaWFuY2U8L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5jb20uZ29vZ2xlLmNhbGlwZXIuc2hhZGVkLm9yZy5hb3BhbGxpYW5jZTwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuam9kYTwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPmNvbS5nb29nbGUuY2FsaXBlci5zaGFkZWQub3JnLmpvZGE8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLm9iamVjdHdlYjwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPmNvbS5nb29nbGUuY2FsaXBlci5zaGFkZWQub3JnLm9iamVjdHdlYjwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbnM+IC0tPgorICAgICAgICAgICAgICA8dHJhbnNmb3JtZXJzPgorICAgICAgICAgICAgICAgIDx0cmFuc2Zvcm1lciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLnNoYWRlLnJlc291cmNlLk1hbmlmZXN0UmVzb3VyY2VUcmFuc2Zvcm1lciI+CisgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICA8UHJlbWFpbi1DbGFzcz5jb20uZ29vZ2xlLm1vbml0b3JpbmcucnVudGltZS5pbnN0cnVtZW50YXRpb24uQWxsb2NhdGlvbkluc3RydW1lbnRlcjwvUHJlbWFpbi1DbGFzcz4KKyAgICAgICAgICAgICAgICAgICAgPENhbi1SZWRlZmluZS1DbGFzc2VzPnRydWU8L0Nhbi1SZWRlZmluZS1DbGFzc2VzPgorICAgICAgICAgICAgICAgICAgICA8Q2FuLVJldHJhbnNmb3JtLUNsYXNzZXM+dHJ1ZTwvQ2FuLVJldHJhbnNmb3JtLUNsYXNzZXM+CisgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWVyPgorICAgICAgICAgICAgICA8L3RyYW5zZm9ybWVycz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuNDwvdmVyc2lvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5zaWduLWFydGlmYWN0czwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KICAgPC9idWlsZD4KLSAgPGRldmVsb3BlcnM+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPkplc3NlIFdpbHNvbjwvbmFtZT4KLSAgICAgIDxvcmdhbml6YXRpb24+R29vZ2xlIEluYy48L29yZ2FuaXphdGlvbj4KLSAgICA8L2RldmVsb3Blcj4KLSAgPC9kZXZlbG9wZXJzPgorCiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0FmdGVyRXhwZXJpbWVudC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BZnRlckV4cGVyaW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWY2Y2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BZnRlckV4cGVyaW1lbnQuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEFuIGFubm90YXRpb24gZm9yIG1ldGhvZHMgdG8gYmUgcnVuIGFmdGVyIGFuIGV4cGVyaW1lbnQgaGFzIGJlZW4gcGVyZm9ybWVkLgorICoKKyAqIEBzZWUgQmVmb3JlRXhwZXJpbWVudAorICovCitAVGFyZ2V0KE1FVEhPRCkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEFmdGVyRXhwZXJpbWVudCB7CisgIC8qKgorICAgKiBBIHF1YWxpZmllciBmb3Igd2hpY2ggdHlwZXMgb2YgZXhwZXJpbWVudHMgdGhpcyBtZXRob2Qgc2hvdWxkIHJ1bi4gRm9yIGV4YW1wbGUsIGFubm90YXRpbmcgYQorICAgKiBtZXRob2Qgd2l0aCB7QGNvZGUgQEFmdGVyRXhwZXJpbWVudChCZW5jaG1hcmsuY2xhc3MpfSB3aWxsIGNhdXNlIGl0IHRvIG9ubHkgcnVuIGZvcgorICAgKiB7QGxpbmsgQmVuY2htYXJrfSBleHBlcmltZW50cy4gQnkgZGVmYXVsdCwgYW5ub3RhdGVkIG1ldGhvZHMgcnVuIGZvciBhbGwgZXhwZXJpbWVudHMuCisgICAqLworICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gdmFsdWUoKSBkZWZhdWx0IEFsbC5jbGFzczsKK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvVXBsb2FkUmVzdWx0cy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BbGwuamF2YQpzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSBjYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YQpyZW5hbWUgdG8gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BbGwuamF2YQppbmRleCA3ZGFlN2FmLi4wOGIyNDU2IDEwMDY0NAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YQorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0FsbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwxMyArMTYsMTEgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwogCiAvKioKLSAqIFVzYWdlOiBVcGxvYWRSZXN1bHRzIDxmaWxlX29yX2Rpcj4KKyAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIGxpZmVjeWNsZSBhbm5vdGF0aW9ucyB0aGF0IGluZGljYXRlcyBpdCBzaG91bGQgYXNzb2NpYXRlIHdpdGggYWxsIGJlbmNobWFyaworICogdHlwZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRSZXN1bHRzIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIG5ldyBSdW5uZXIoKS51cGxvYWRSZXN1bHRzRmlsZU9yRGlyKG5ldyBGaWxlKGFyZ3NbMF0pKTsKLSAgfQotfQorQFRhcmdldCh7fSkgLy8gc2hvdWxkIG5ldmVyIGFjdHVhbGx5IGJlIGFwcGxpZWQKK3B1YmxpYyBAaW50ZXJmYWNlIEFsbCB7fQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BbGxvY2F0aW9uTWVhc3VyZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQWxsb2NhdGlvbk1lYXN1cmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYzM0ODguLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BbGxvY2F0aW9uTWVhc3VyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLk5vbkNvbnN0YW50TWVtb3J5VXNhZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdXBwbGllcjsKLWltcG9ydCBjb20uZ29vZ2xlLm1vbml0b3JpbmcucnVudGltZS5pbnN0cnVtZW50YXRpb24uQWxsb2NhdGlvblJlY29yZGVyOwotaW1wb3J0IGNvbS5nb29nbGUubW9uaXRvcmluZy5ydW50aW1lLmluc3RydW1lbnRhdGlvbi5TYW1wbGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWxsb2NhdGlvbk1lYXN1cmVyIGV4dGVuZHMgTWVhc3VyZXIgewotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFMTE9DQVRJT05fRElTUExBWV9USFJFU0hPTEQgPSA1MDsKLQotICBwcml2YXRlIGJvb2xlYW4gbG9nOwotICBwcml2YXRlIGxvbmcgdGVtcEFsbG9jYXRpb25Db3VudDsKLSAgcHJpdmF0ZSBsb25nIGFsbG9jYXRpb25zVG9JZ25vcmU7Ci0gIHByaXZhdGUgbG9uZyBudW1iZXJPZkFsbG9jYXRpb25zOwotICBwcml2YXRlIGxvbmcgYWxsb2NhdGlvbkNvdW50OwotICBwcml2YXRlIGxvbmcgb3V0T2ZUaHJlYWRBbGxvY2F0aW9uQ291bnQ7Ci0gIHByaXZhdGUgYm9vbGVhbiByZWNvcmRBbGxvY2F0aW9uczsKLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCi0gIHByb3RlY3RlZCBBbGxvY2F0aW9uTWVhc3VyZXIoKSB7Ci0gICAgbG9nID0gZmFsc2U7Ci0gICAgYWxsb2NhdGlvbnNUb0lnbm9yZSA9IDA7Ci0gICAgbnVtYmVyT2ZBbGxvY2F0aW9ucyA9IDA7Ci0gICAgYWxsb2NhdGlvbkNvdW50ID0gMDsKLSAgICBvdXRPZlRocmVhZEFsbG9jYXRpb25Db3VudCA9IDA7Ci0gICAgcmVjb3JkQWxsb2NhdGlvbnMgPSBmYWxzZTsKLQotICAgIGZpbmFsIFRocmVhZCBhbGxvY2F0aW5nVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICBBbGxvY2F0aW9uUmVjb3JkZXIuYWRkU2FtcGxlcihuZXcgU2FtcGxlcigpIHsKLSAgICAgIC8vIGFsbG9jYXRlZCB7QGNvZGUgbmV3T2JqfSBvZiB0eXBlIHtAY29kZSBkZXNjfSwgd2hvc2Ugc2l6ZSBpcyB7QGNvZGUgc2l6ZX0uCi0gICAgICAvLyBpZiB0aGlzIHdhcyBub3QgYW4gYXJyYXksIHtAY29kZSBjb3VudH0gaXMgLTEuIElmIGl0IHdhcyBhcnJheSwge0Bjb2RlIGNvdW50fSBpcyB0aGUKLSAgICAgIC8vIHNpemUgb2YgdGhlIGFycmF5LgotICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHNhbXBsZUFsbG9jYXRpb24oaW50IGNvdW50LCBTdHJpbmcgZGVzYywgT2JqZWN0IG5ld09iaiwgbG9uZyBzaXplKSB7Ci0gICAgICAgIGlmIChyZWNvcmRBbGxvY2F0aW9ucykgewotICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmVxdWFscyhhbGxvY2F0aW5nVGhyZWFkKSkgewotICAgICAgICAgICAgaWYgKGxvZykgewotICAgICAgICAgICAgICBsb2dBbGxvY2F0aW9uKGNvdW50LCBkZXNjLCBzaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyT2ZBbGxvY2F0aW9ucyA9PSAwKSB7Ci0gICAgICAgICAgICAgIGxvZygic2VlIGZpcnN0IHJ1biBmb3IgbGlzdCBvZiBhbGxvY2F0aW9ucyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWxsb2NhdGlvbkNvdW50ID0gaW5jcmVtZW50QWxsb2NhdGlvbkNvdW50KGFsbG9jYXRpb25Db3VudCwgY291bnQsIHNpemUpOwotICAgICAgICAgICAgdGVtcEFsbG9jYXRpb25Db3VudCsrOwotICAgICAgICAgICAgbnVtYmVyT2ZBbGxvY2F0aW9ucysrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRPZlRocmVhZEFsbG9jYXRpb25Db3VudCA9IGluY3JlbWVudEFsbG9jYXRpb25Db3VudChvdXRPZlRocmVhZEFsbG9jYXRpb25Db3VudCwgY291bnQsIHNpemUpOwotICAgICAgICAgICAgbnVtYmVyT2ZBbGxvY2F0aW9ucysrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGxvbmcgaW5jcmVtZW50QWxsb2NhdGlvbkNvdW50KGxvbmcgb3JpZywgaW50IGNvdW50LCBsb25nIHNpemUpOwotCi0gIHByaXZhdGUgdm9pZCBsb2dBbGxvY2F0aW9uKGludCBjb3VudCwgU3RyaW5nIGRlc2MsIGxvbmcgc2l6ZSkgewotICAgIGlmIChudW1iZXJPZkFsbG9jYXRpb25zID49IGFsbG9jYXRpb25zVG9JZ25vcmUpIHsKLSAgICAgIGlmIChudW1iZXJPZkFsbG9jYXRpb25zIDwgQUxMT0NBVElPTl9ESVNQTEFZX1RIUkVTSE9MRCArIGFsbG9jYXRpb25zVG9JZ25vcmUpIHsKLSAgICAgICAgbG9nKCJhbGxvY2F0aW5nICIgKyBkZXNjICsgKGNvdW50ID09IC0xID8gIiIgOiAiIGFycmF5IHdpdGggIiArIGNvdW50ICsgIiBlbGVtZW50cyIpCi0gICAgICAgICAgICArICIgd2l0aCBzaXplICIgKyBzaXplICsgIiBieXRlcyIpOwotICAgICAgfSBlbHNlIGlmIChudW1iZXJPZkFsbG9jYXRpb25zID09IEFMTE9DQVRJT05fRElTUExBWV9USFJFU0hPTEQgKyBhbGxvY2F0aW9uc1RvSWdub3JlKSB7Ci0gICAgICAgIGxvZygiLi4ubW9yZSBhbGxvY2F0aW9ucy4uLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgTWVhc3VyZW1lbnRTZXQgcnVuKFN1cHBsaWVyPENvbmZpZ3VyZWRCZW5jaG1hcms+IHRlc3RTdXBwbGllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAvLyB3YXJtIHVwLCBmb3Igc29tZSByZWFzb24gdGhlIHZlcnkgZmlyc3QgdGltZSBhbnl0aGluZyBpcyBtZWFzdXJlZCwgaXQgd2lsbCBoYXZlIGEgZmV3IG1vcmUKLSAgICAvLyBhbGxvY2F0aW9ucy4KLSAgICBtZWFzdXJlQWxsb2NhdGlvbnModGVzdFN1cHBsaWVyLmdldCgpLCAxLCAwKTsKLQotICAgIC8vIFRoZSAib25lIiBjYXNlIHNlcnZlcyBhcyBhIGJhc2UgbGluZS4gVGhlcmUgbWF5IGJlIGNhY2hpbmcsIGxhenkgbG9hZGluZywgZXRjIGdvaW5nIG9uIGhlcmUuCi0gICAgdGVtcEFsbG9jYXRpb25Db3VudCA9IDA7IC8vIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNhbXBsZXIgaXMgY2FsbGVkIGluIG9uZSByZXAKLSAgICBsb25nIG9uZSA9IG1lYXN1cmVBbGxvY2F0aW9uc1RvdGFsKHRlc3RTdXBwbGllci5nZXQoKSwgMSk7Ci0gICAgbG9uZyBvbmVBbGxvY2F0aW9ucyA9IHRlbXBBbGxvY2F0aW9uQ291bnQ7Ci0KLSAgICAvLyB3ZSBleHBlY3QgdGhhdCB0aGUgZGVsdGEgYmV0d2VlbiBhbnkgdHdvIGNvbnNlY3V0aXZlIHJlcHMgd2lsbCBiZSBjb25zdGFudAotICAgIHRlbXBBbGxvY2F0aW9uQ291bnQgPSAwOyAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzYW1wbGVyIGlzIGNhbGxlZCBpbiB0d28gcmVwcwotICAgIGxvbmcgdHdvID0gbWVhc3VyZUFsbG9jYXRpb25zVG90YWwodGVzdFN1cHBsaWVyLmdldCgpLCAyKTsKLSAgICBsb25nIHR3b0FsbG9jYXRpb25zID0gdGVtcEFsbG9jYXRpb25Db3VudDsKLSAgICBsb25nIGV4cGVjdGVkRGlmZiA9IHR3byAtIG9uZTsKLSAgICAvLyB0aGVyZSBpcyBzb21lIG92ZXJoZWFkIG9uIHRoZSBmaXJzdCBjYWxsIHRoYXQgd2UgY2FuIGlnbm9yZSBmb3IgdGhlIHB1cnBvc2VzIG9mIG1lYXN1cmVtZW50Ci0gICAgbG9uZyB1bml0c1RvSWdub3JlID0gb25lIC0gZXhwZWN0ZWREaWZmOwotICAgIGFsbG9jYXRpb25zVG9JZ25vcmUgPSAyICogb25lQWxsb2NhdGlvbnMgLSB0d29BbGxvY2F0aW9uczsKLSAgICBsb2coImlnbm9yaW5nICIgKyBhbGxvY2F0aW9uc1RvSWdub3JlICsgIiBhbGxvY2F0aW9uKHMpIHBlciBtZWFzdXJlbWVudCBhcyBvdmVyaGVhZCIpOwotCi0gICAgTWVhc3VyZW1lbnRbXSBhbGxvY2F0aW9uTWVhc3VyZW1lbnRzID0gbmV3IE1lYXN1cmVtZW50WzRdOwotICAgIGxvZyA9IHRydWU7Ci0gICAgYWxsb2NhdGlvbk1lYXN1cmVtZW50c1swXSA9IG1lYXN1cmVBbGxvY2F0aW9ucyh0ZXN0U3VwcGxpZXIuZ2V0KCksIDEsIHVuaXRzVG9JZ25vcmUpOwotICAgIGxvZyA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYWxsb2NhdGlvbk1lYXN1cmVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgYWxsb2NhdGlvbk1lYXN1cmVtZW50c1tpXSA9Ci0gICAgICAgICAgbWVhc3VyZUFsbG9jYXRpb25zKHRlc3RTdXBwbGllci5nZXQoKSwgaSArIDEsIHVuaXRzVG9JZ25vcmUpOwotICAgICAgaWYgKE1hdGgucm91bmQoYWxsb2NhdGlvbk1lYXN1cmVtZW50c1tpXS5nZXRSYXcoKSkgIT0gZXhwZWN0ZWREaWZmKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb25Db25zdGFudE1lbW9yeVVzYWdlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIGFib3ZlIGxvZ2ljIGd1YXJhbnRlZXMgdGhhdCBhbGwgdGhlIG1lYXN1cmVtZW50cyBhcmUgZXF1YWwsIHNvIHdlIG9ubHkgbmVlZCB0byByZXR1cm4gYQotICAgIC8vIHNpbmdsZSBtZWFzdXJlbWVudC4KLSAgICBhbGxvY2F0aW9uc1RvSWdub3JlID0gMDsKLSAgICByZXR1cm4gbmV3IE1lYXN1cmVtZW50U2V0KGFsbG9jYXRpb25NZWFzdXJlbWVudHNbMF0pOwotICB9Ci0KLSAgcHJpdmF0ZSBNZWFzdXJlbWVudCBtZWFzdXJlQWxsb2NhdGlvbnMoQ29uZmlndXJlZEJlbmNobWFyayBiZW5jaG1hcmssIGludCByZXBzLCBsb25nIHRvSWdub3JlKQotICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgcHJlcGFyZUZvclRlc3QoKTsKLSAgICBsb2coTG9nQ29uc3RhbnRzLk1FQVNVUkVEX1NFQ1RJT05fU1RBUlRJTkcpOwotICAgIHJlc2V0QWxsb2NhdGlvbnMoKTsKLSAgICByZWNvcmRBbGxvY2F0aW9ucyA9IHRydWU7Ci0gICAgYmVuY2htYXJrLnJ1bihyZXBzKTsKLSAgICByZWNvcmRBbGxvY2F0aW9ucyA9IGZhbHNlOwotICAgIGxvZyhMb2dDb25zdGFudHMuTUVBU1VSRURfU0VDVElPTl9ET05FKTsKLSAgICBsb25nIGFsbG9jYXRpb25zID0gKGFsbG9jYXRpb25Db3VudCAtIHRvSWdub3JlKSAvIHJlcHM7Ci0gICAgbG9uZyBvdXRPZlRocmVhZEFsbG9jYXRpb25zID0gb3V0T2ZUaHJlYWRBbGxvY2F0aW9uQ291bnQ7Ci0gICAgbG9nKGFsbG9jYXRpb25zICsgIiAiICsgdHlwZSArICIocykgYWxsb2NhdGVkIHBlciByZXAiKTsKLSAgICBsb2cob3V0T2ZUaHJlYWRBbGxvY2F0aW9ucyArICIgb3V0IG9mIHRocmVhZCAiICsgdHlwZSArICIocykgYWxsb2NhdGVkIGluICIgKyByZXBzICsgIiByZXBzIik7Ci0gICAgYmVuY2htYXJrLmNsb3NlKCk7Ci0gICAgcmV0dXJuIGdldE1lYXN1cmVtZW50KGJlbmNobWFyaywgYWxsb2NhdGlvbnMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IE1lYXN1cmVtZW50IGdldE1lYXN1cmVtZW50KENvbmZpZ3VyZWRCZW5jaG1hcmsgYmVuY2htYXJrLCBsb25nIGFsbG9jYXRpb25zKTsKLQotICBwcml2YXRlIGxvbmcgbWVhc3VyZUFsbG9jYXRpb25zVG90YWwoQ29uZmlndXJlZEJlbmNobWFyayBiZW5jaG1hcmssIGludCByZXBzKQotICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgcHJlcGFyZUZvclRlc3QoKTsKLSAgICBsb2coTG9nQ29uc3RhbnRzLk1FQVNVUkVEX1NFQ1RJT05fU1RBUlRJTkcpOwotICAgIHJlc2V0QWxsb2NhdGlvbnMoKTsKLSAgICByZWNvcmRBbGxvY2F0aW9ucyA9IHRydWU7Ci0gICAgYmVuY2htYXJrLnJ1bihyZXBzKTsKLSAgICByZWNvcmRBbGxvY2F0aW9ucyA9IGZhbHNlOwotICAgIGxvZyhMb2dDb25zdGFudHMuTUVBU1VSRURfU0VDVElPTl9ET05FKTsKLSAgICBsb25nIGFsbG9jYXRpb25zID0gYWxsb2NhdGlvbkNvdW50OwotICAgIGxvbmcgb3V0T2ZUaHJlYWRBbGxvY2F0aW9ucyA9IG91dE9mVGhyZWFkQWxsb2NhdGlvbkNvdW50OwotICAgIGxvZyhhbGxvY2F0aW9ucyArICIgIiArIHR5cGUgKyAiKHMpIGFsbG9jYXRlZCBpbiAiICsgcmVwcyArICIgcmVwcyIpOwotICAgIGlmIChvdXRPZlRocmVhZEFsbG9jYXRpb25zID4gMCkgewotICAgICAgbG9nKG91dE9mVGhyZWFkQWxsb2NhdGlvbnMgKyAiIG91dCBvZiB0aHJlYWQgIiArIHR5cGUgKyAiKHMpIGFsbG9jYXRlZCBpbiAiICsgcmVwcyArICIgcmVwcyIpOwotICAgIH0KLSAgICBiZW5jaG1hcmsuY2xvc2UoKTsKLSAgICByZXR1cm4gYWxsb2NhdGlvbnM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVzZXRBbGxvY2F0aW9ucygpIHsKLSAgICBhbGxvY2F0aW9uQ291bnQgPSAwOwotICAgIG91dE9mVGhyZWFkQWxsb2NhdGlvbkNvdW50ID0gMDsKLSAgICBudW1iZXJPZkFsbG9jYXRpb25zID0gMDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Bcmd1bWVudHMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZWIwNzkuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Bcmd1bWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLkRpc3BsYXlVc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuVXNlckV4Y2VwdGlvbi5JbmNvbXBhdGlibGVBcmd1bWVudHNFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlVzZXJFeGNlcHRpb24uSW52YWxpZFBhcmFtZXRlclZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLk11bHRpcGxlQmVuY2htYXJrQ2xhc3Nlc0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuVXNlckV4Y2VwdGlvbi5Ob0JlbmNobWFya0NsYXNzRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLlVucmVjb2duaXplZE9wdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkSGFzaE11bHRpbWFwOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBydW5uZXIgYW5kIGluLXByb2Nlc3MgcnVubmVyLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXJndW1lbnRzIHsKLSAgcHJpdmF0ZSBTdHJpbmcgc3VpdGVDbGFzc05hbWU7Ci0KLSAgLyoqIEpWTXMgdG8gcnVuIGluIHRoZSBiZW5jaG1hcmsgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiB1c2VyVm1zID0gU2V0cy5uZXdMaW5rZWRIYXNoU2V0KCk7Ci0KLSAgLyoqCi0gICAqIFBhcmFtZXRlciB2YWx1ZXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIG9uIHRoZSBjb21tYW5kIGxpbmUuIFBhcmFtZXRlcnMgd2l0aAotICAgKiBubyB2YWx1ZSBpbiB0aGlzIG11bHRpbWFwIHdpbGwgZ2V0IHRoZWlyIHZhbHVlcyBmcm9tIHRoZSBiZW5jaG1hcmsgc3VpdGUuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB1c2VyUGFyYW1ldGVycyA9IExpbmtlZEhhc2hNdWx0aW1hcC5jcmVhdGUoKTsKLQotICAvKioKLSAgICogVk0gcGFyYW1ldGVycyBsaWtlIHttZW1vcnk9Wy1YbXg2NCwtWG14MTI4XSxqaXQ9Wy1jbGllbnQsLXNlcnZlcl19Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB2bVBhcmFtZXRlcnMgPSBMaW5rZWRIYXNoTXVsdGltYXAuY3JlYXRlKCk7Ci0KLSAgcHJpdmF0ZSBpbnQgdHJpYWxzID0gMTsKLSAgcHJpdmF0ZSBsb25nIHdhcm11cE1pbGxpcyA9IDMwMDA7Ci0gIHByaXZhdGUgbG9uZyBydW5NaWxsaXMgPSAxMDAwOwotICBwcml2YXRlIFN0cmluZyB0aW1lVW5pdCA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGluc3RhbmNlVW5pdCA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIG1lbW9yeVVuaXQgPSBudWxsOwotICBwcml2YXRlIEZpbGUgc2F2ZVJlc3VsdHNGaWxlID0gbnVsbDsKLSAgcHJpdmF0ZSBGaWxlIHVwbG9hZFJlc3VsdHNGaWxlID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIGNhcHR1cmVWbUxvZyA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gcHJpbnRTY29yZSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gbWVhc3VyZU1lbW9yeSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLSAgcHJpdmF0ZSBpbnQgZGVidWdSZXBzID0gZGVmYXVsdERlYnVnUmVwczsKLSAgcHJpdmF0ZSBNZWFzdXJlbWVudFR5cGUgbWVhc3VyZW1lbnRUeXBlOwotICBwcml2YXRlIE1lYXN1cmVtZW50VHlwZSBwcmltYXJ5TWVhc3VyZW1lbnRUeXBlOwotCi0gIC8qKgotICAgKiBBIHNpZ25hbCB0aGF0IGluZGljYXRlcyBhIEpTT04gb2JqZWN0IGludGVybGVhdmVkIHdpdGggdGhlIHByb2Nlc3Mgb3V0cHV0LgotICAgKiBTaG91bGQgYmUgc2hvcnQsIGJ1dCB1bmxpa2VseSB0byBzaG93IHVwIGluIHRoZSBwcm9jZXNzZXMgbmF0dXJhbCBvdXRwdXQuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBtYXJrZXIgPSAiLy9aeEovIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdERlbGltaXRlciA9ICIsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHREZWJ1Z1JlcHMgPSAxMDAwOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3VpdGVDbGFzc05hbWUoKSB7Ci0gICAgcmV0dXJuIHN1aXRlQ2xhc3NOYW1lOwotICB9Ci0KLSAgcHVibGljIFNldDxTdHJpbmc+IGdldFVzZXJWbXMoKSB7Ci0gICAgcmV0dXJuIHVzZXJWbXM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFRyaWFscygpIHsKLSAgICByZXR1cm4gdHJpYWxzOwotICB9Ci0KLSAgcHVibGljIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBnZXRWbVBhcmFtZXRlcnMoKSB7Ci0gICAgcmV0dXJuIHZtUGFyYW1ldGVyczsKLSAgfQotCi0gIHB1YmxpYyBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0VXNlclBhcmFtZXRlcnMoKSB7Ci0gICAgcmV0dXJuIHVzZXJQYXJhbWV0ZXJzOwotICB9Ci0KLSAgcHVibGljIGxvbmcgZ2V0V2FybXVwTWlsbGlzKCkgewotICAgIHJldHVybiB3YXJtdXBNaWxsaXM7Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBnZXRSdW5NaWxsaXMoKSB7Ci0gICAgcmV0dXJuIHJ1bk1pbGxpczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGltZVVuaXQoKSB7Ci0gICAgcmV0dXJuIHRpbWVVbml0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZVVuaXQoKSB7Ci0gICAgcmV0dXJuIGluc3RhbmNlVW5pdDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5VW5pdCgpIHsKLSAgICByZXR1cm4gbWVtb3J5VW5pdDsKLSAgfQotCi0gIHB1YmxpYyBGaWxlIGdldFNhdmVSZXN1bHRzRmlsZSgpIHsKLSAgICByZXR1cm4gc2F2ZVJlc3VsdHNGaWxlOwotICB9Ci0KLSAgcHVibGljIEZpbGUgZ2V0VXBsb2FkUmVzdWx0c0ZpbGUoKSB7Ci0gICAgcmV0dXJuIHVwbG9hZFJlc3VsdHNGaWxlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2FwdHVyZVZtTG9nKCkgewotICAgIHJldHVybiBjYXB0dXJlVm1Mb2c7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwcmludFNjb3JlKCkgewotICAgIHJldHVybiBwcmludFNjb3JlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0TWVhc3VyZU1lbW9yeSgpIHsKLSAgICByZXR1cm4gbWVhc3VyZU1lbW9yeTsKLSAgfQotCi0gIHB1YmxpYyBNZWFzdXJlbWVudFR5cGUgZ2V0TWVhc3VyZW1lbnRUeXBlKCkgewotICAgIHJldHVybiBtZWFzdXJlbWVudFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgTWVhc3VyZW1lbnRUeXBlIGdldFByaW1hcnlNZWFzdXJlbWVudFR5cGUoKSB7Ci0gICAgcmV0dXJuIHByaW1hcnlNZWFzdXJlbWVudFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXREZWJ1ZygpIHsKLSAgICByZXR1cm4gZGVidWc7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldERlYnVnUmVwcygpIHsKLSAgICByZXR1cm4gZGVidWdSZXBzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRNYXJrZXIoKSB7Ci0gICAgcmV0dXJuIG1hcmtlcjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQXJndW1lbnRzIHBhcnNlKFN0cmluZ1tdIGFyZ3NBcnJheSkgewotICAgIEFyZ3VtZW50cyByZXN1bHQgPSBuZXcgQXJndW1lbnRzKCk7Ci0KLSAgICBJdGVyYXRvcjxTdHJpbmc+IGFyZ3MgPSBJdGVyYXRvcnMuZm9yQXJyYXkoYXJnc0FycmF5KTsKLSAgICBTdHJpbmcgZGVsaW1pdGVyID0gZGVmYXVsdERlbGltaXRlcjsKLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJQYXJhbWV0ZXJTdHJpbmdzID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7Ci0gICAgTWFwPFN0cmluZywgU3RyaW5nPiB2bVBhcmFtZXRlclN0cmluZ3MgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKLSAgICBTdHJpbmcgdm1TdHJpbmcgPSBudWxsOwotICAgIGJvb2xlYW4gc3RhbmRhcmRSdW4gPSBmYWxzZTsKLSAgICB3aGlsZSAoYXJncy5oYXNOZXh0KCkpIHsKLSAgICAgIFN0cmluZyBhcmcgPSBhcmdzLm5leHQoKTsKLQotICAgICAgaWYgKCItLWhlbHAiLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgIHRocm93IG5ldyBEaXNwbGF5VXNhZ2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKCItRCIpIHx8IGFyZy5zdGFydHNXaXRoKCItSiIpKSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSGFuZGxlIHVzZXIgcGFyYW1ldGVycyAoLUQpIGFuZCBWTSBwYXJhbWV0ZXJzICgtSikgb2YgdGhlc2UgZm9ybXM6Ci0gICAgICAgICAqCi0gICAgICAgICAqIC1EbGVuZ3RoPTEwMAotICAgICAgICAgKiAtSm1lbW9yeT0tWG14MTAyNE0KLSAgICAgICAgICogLURsZW5ndGg9MTAwLDIwMAotICAgICAgICAgKiAtSm1lbW9yeT0tWG14MTAyNE0sLVhteDIwNDhNCi0gICAgICAgICAqIC1EbGVuZ3RoIDEwMAotICAgICAgICAgKiAtSm1lbW9yeSAtWG14MTAyNE0KLSAgICAgICAgICogLURsZW5ndGggMTAwLDIwMAotICAgICAgICAgKiAtSm1lbW9yeSAtWG14MTAyNE0sLVhteDIwNDhNCi0gICAgICAgICAqLwotCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0gICAgICAgIGludCBlcXVhbHNTaWduID0gYXJnLmluZGV4T2YoJz0nKTsKLSAgICAgICAgaWYgKGVxdWFsc1NpZ24gPT0gLTEpIHsKLSAgICAgICAgICBuYW1lID0gYXJnLnN1YnN0cmluZygyKTsKLSAgICAgICAgICB2YWx1ZSA9IGFyZ3MubmV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG5hbWUgPSBhcmcuc3Vic3RyaW5nKDIsIGVxdWFsc1NpZ24pOwotICAgICAgICAgIHZhbHVlID0gYXJnLnN1YnN0cmluZyhlcXVhbHNTaWduICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcHJldmlvdXNWYWx1ZTsKLSAgICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKCItRCIpKSB7Ci0gICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHVzZXJQYXJhbWV0ZXJTdHJpbmdzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHZtUGFyYW1ldGVyU3RyaW5ncy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbi5EdXBsaWNhdGVQYXJhbWV0ZXJFeGNlcHRpb24oYXJnKTsKLSAgICAgICAgfQotICAgICAgICBzdGFuZGFyZFJ1biA9IHRydWU7Ci0gICAgICAvLyBUT0RPOiBtb3ZlIHdhcm11cC9ydW4gdG8gY2FsaXBlcnJjCi0gICAgICB9IGVsc2UgaWYgKCItLWNhcHR1cmVWbUxvZyIuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgcmVzdWx0LmNhcHR1cmVWbUxvZyA9IHRydWU7Ci0gICAgICAgIHN0YW5kYXJkUnVuID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoIi0td2FybXVwTWlsbGlzIi5lcXVhbHMoYXJnKSkgewotICAgICAgICByZXN1bHQud2FybXVwTWlsbGlzID0gTG9uZy5wYXJzZUxvbmcoYXJncy5uZXh0KCkpOwotICAgICAgICBzdGFuZGFyZFJ1biA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKCItLXJ1bk1pbGxpcyIuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgcmVzdWx0LnJ1bk1pbGxpcyA9IExvbmcucGFyc2VMb25nKGFyZ3MubmV4dCgpKTsKLSAgICAgICAgc3RhbmRhcmRSdW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmICgiLS10cmlhbHMiLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGFyZ3MubmV4dCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3VsdC50cmlhbHMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICBpZiAocmVzdWx0LnRyaWFscyA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uLkludmFsaWRUcmlhbHNFeGNlcHRpb24odmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbi5JbnZhbGlkVHJpYWxzRXhjZXB0aW9uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBzdGFuZGFyZFJ1biA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKCItLXZtIi5lcXVhbHMoYXJnKSkgewotICAgICAgICBpZiAodm1TdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uLkR1cGxpY2F0ZVBhcmFtZXRlckV4Y2VwdGlvbihhcmcpOwotICAgICAgICB9Ci0gICAgICAgIHZtU3RyaW5nID0gYXJncy5uZXh0KCk7Ci0gICAgICAgIHN0YW5kYXJkUnVuID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoIi0tZGVsaW1pdGVyIi5lcXVhbHMoYXJnKSkgewotICAgICAgICBkZWxpbWl0ZXIgPSBhcmdzLm5leHQoKTsKLSAgICAgICAgc3RhbmRhcmRSdW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmICgiLS10aW1lVW5pdCIuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgcmVzdWx0LnRpbWVVbml0ID0gYXJncy5uZXh0KCk7Ci0gICAgICAgIHN0YW5kYXJkUnVuID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoIi0taW5zdGFuY2VVbml0Ii5lcXVhbHMoYXJnKSkgewotICAgICAgICByZXN1bHQuaW5zdGFuY2VVbml0ID0gYXJncy5uZXh0KCk7Ci0gICAgICAgIHN0YW5kYXJkUnVuID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoIi0tbWVtb3J5VW5pdCIuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgcmVzdWx0Lm1lbW9yeVVuaXQgPSBhcmdzLm5leHQoKTsKLSAgICAgICAgc3RhbmRhcmRSdW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmICgiLS1zYXZlUmVzdWx0cyIuZXF1YWxzKGFyZykgfHwgIi0teG1sU2F2ZSIuZXF1YWxzKGFyZykpIHsKLSAgICAgICAgLy8gVE9ETzogdW5zdXBwb3J0IGxlZ2FjeSAtLXhtbFNhdmUKLSAgICAgICAgcmVzdWx0LnNhdmVSZXN1bHRzRmlsZSA9IG5ldyBGaWxlKGFyZ3MubmV4dCgpKTsKLSAgICAgICAgc3RhbmRhcmRSdW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmICgiLS11cGxvYWRSZXN1bHRzIi5lcXVhbHMoYXJnKSkgewotICAgICAgICByZXN1bHQudXBsb2FkUmVzdWx0c0ZpbGUgPSBuZXcgRmlsZShhcmdzLm5leHQoKSk7Ci0gICAgICB9IGVsc2UgaWYgKCItLXByaW50U2NvcmUiLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgIHJlc3VsdC5wcmludFNjb3JlID0gdHJ1ZTsKLSAgICAgICAgc3RhbmRhcmRSdW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmICgiLS1tZWFzdXJlTWVtb3J5Ii5lcXVhbHMoYXJnKSkgewotICAgICAgICByZXN1bHQubWVhc3VyZU1lbW9yeSA9IHRydWU7Ci0gICAgICAgIHN0YW5kYXJkUnVuID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoIi0tZGVidWciLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgIHJlc3VsdC5kZWJ1ZyA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKCItLWRlYnVnLXJlcHMiLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGFyZ3MubmV4dCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3VsdC5kZWJ1Z1JlcHMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICBpZiAocmVzdWx0LmRlYnVnUmVwcyA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXhjZXB0aW9uLkludmFsaWREZWJ1Z1JlcHNFeGNlcHRpb24odmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVXNlckV4Y2VwdGlvbi5JbnZhbGlkRGVidWdSZXBzRXhjZXB0aW9uKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICgiLS1tYXJrZXIiLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgIHJlc3VsdC5tYXJrZXIgPSBhcmdzLm5leHQoKTsKLSAgICAgIH0gZWxzZSBpZiAoIi0tbWVhc3VyZW1lbnRUeXBlIi5lcXVhbHMoYXJnKSkgewotICAgICAgICBTdHJpbmcgbWVhc3VyZW1lbnRUeXBlID0gYXJncy5uZXh0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgcmVzdWx0Lm1lYXN1cmVtZW50VHlwZSA9IE1lYXN1cmVtZW50VHlwZS52YWx1ZU9mKG1lYXN1cmVtZW50VHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUV4Y2VwdGlvbihhcmcsIG1lYXN1cmVtZW50VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhbmRhcmRSdW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmICgiLS1wcmltYXJ5TWVhc3VyZW1lbnRUeXBlIi5lcXVhbHMoYXJnKSkgewotICAgICAgICBTdHJpbmcgbWVhc3VyZW1lbnRUeXBlID0gYXJncy5uZXh0KCkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXN1bHQucHJpbWFyeU1lYXN1cmVtZW50VHlwZSA9IE1lYXN1cmVtZW50VHlwZS52YWx1ZU9mKG1lYXN1cmVtZW50VHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUV4Y2VwdGlvbihhcmcsIG1lYXN1cmVtZW50VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhbmRhcmRSdW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnJlY29nbml6ZWRPcHRpb25FeGNlcHRpb24oYXJnKTsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHJlc3VsdC5zdWl0ZUNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE11bHRpcGxlQmVuY2htYXJrQ2xhc3Nlc0V4Y2VwdGlvbihyZXN1bHQuc3VpdGVDbGFzc05hbWUsIGFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnN1aXRlQ2xhc3NOYW1lID0gYXJnOwotICAgICAgfQotICAgIH0KLQotICAgIFNwbGl0dGVyIGRlbGltaXRlclNwbGl0dGVyID0gU3BsaXR0ZXIub24oZGVsaW1pdGVyKTsKLQotICAgIGlmICh2bVN0cmluZyAhPSBudWxsKSB7Ci0gICAgICBJdGVyYWJsZXMuYWRkQWxsKHJlc3VsdC51c2VyVm1zLCBkZWxpbWl0ZXJTcGxpdHRlci5zcGxpdCh2bVN0cmluZykpOwotICAgIH0KLQotICAgIFNldDxTdHJpbmc+IGR1cGxpY2F0ZXMgPSBTZXRzLmludGVyc2VjdGlvbigKLSAgICAgICAgdXNlclBhcmFtZXRlclN0cmluZ3Mua2V5U2V0KCksIHZtUGFyYW1ldGVyU3RyaW5ncy5rZXlTZXQoKSk7Ci0gICAgaWYgKCFkdXBsaWNhdGVzLmlzRW1wdHkoKSkgewotICAgICAgdGhyb3cgbmV3IFVzZXJFeGNlcHRpb24uRHVwbGljYXRlUGFyYW1ldGVyRXhjZXB0aW9uKGR1cGxpY2F0ZXMpOwotICAgIH0KLQotICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHVzZXJQYXJhbWV0ZXJTdHJpbmdzLmVudHJ5U2V0KCkpIHsKLSAgICAgIHJlc3VsdC51c2VyUGFyYW1ldGVycy5wdXRBbGwoZW50cnkuZ2V0S2V5KCksIGRlbGltaXRlclNwbGl0dGVyLnNwbGl0KGVudHJ5LmdldFZhbHVlKCkpKTsKLSAgICB9Ci0gICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogdm1QYXJhbWV0ZXJTdHJpbmdzLmVudHJ5U2V0KCkpIHsKLSAgICAgIHJlc3VsdC52bVBhcmFtZXRlcnMucHV0QWxsKGVudHJ5LmdldEtleSgpLCBkZWxpbWl0ZXJTcGxpdHRlci5zcGxpdChlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0gICAgfQotCi0gICAgaWYgKHN0YW5kYXJkUnVuICYmIHJlc3VsdC51cGxvYWRSZXN1bHRzRmlsZSAhPSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSW5jb21wYXRpYmxlQXJndW1lbnRzRXhjZXB0aW9uKCItLXVwbG9hZFJlc3VsdHMiKTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0LnN1aXRlQ2xhc3NOYW1lID09IG51bGwgJiYgcmVzdWx0LnVwbG9hZFJlc3VsdHNGaWxlID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBOb0JlbmNobWFya0NsYXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdC5wcmltYXJ5TWVhc3VyZW1lbnRUeXBlICE9IG51bGwKLSAgICAgICAgJiYgcmVzdWx0LnByaW1hcnlNZWFzdXJlbWVudFR5cGUgIT0gTWVhc3VyZW1lbnRUeXBlLlRJTUUgJiYgIXJlc3VsdC5tZWFzdXJlTWVtb3J5KSB7Ci0gICAgICB0aHJvdyBuZXcgSW5jb21wYXRpYmxlQXJndW1lbnRzRXhjZXB0aW9uKAotICAgICAgICAgICItLXByaW1hcnlNZWFzdXJlbWVudFR5cGUgIiArIHJlc3VsdC5wcmltYXJ5TWVhc3VyZW1lbnRUeXBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IFJ1bm5lciBbT1BUSU9OUy4uLl0gPGJlbmNobWFyaz4iKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgPGJlbmNobWFyaz46IGEgYmVuY2htYXJrIGNsYXNzIG9yIHN1aXRlIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJPUFRJT05TIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1EPHBhcmFtPj08dmFsdWU+OiBmaXggYSBiZW5jaG1hcmsgcGFyYW1ldGVyIHRvIGEgZ2l2ZW4gdmFsdWUuIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIE11bHRpcGxlIHZhbHVlcyBjYW4gYmUgc3VwcGxpZWQgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggdGhlIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIGRlbGltaXRlciBzcGVjaWZpZWQgaW4gdGhlIC0tZGVsaW1pdGVyIGFyZ3VtZW50LiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBGb3IgZXhhbXBsZTogXCItRGZvbz1iYXIsYmF6LGJhdFwiIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIFwiYmVuY2htYXJrXCIgaXMgYSBzcGVjaWFsIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkiKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgd2hpY2ggYmVuY2htYXJrIG1ldGhvZHMgdG8gcnVuLiBGb3IgZXhhbXBsZSwgaWYgYSBiZW5jaG1hcmsgaGFzIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIHRoZSBtZXRob2QgXCJ0aW1lRm9vXCIsIGl0IGNhbiBiZSBydW4gYWxvbmUgYnkgdXNpbmciKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgXCItRGJlbmNobWFyaz1Gb29cIi4gXCJiZW5jaG1hcmtcIiBhbHNvIGFjY2VwdHMgYSBkZWxpbWl0ZXIiKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgc2VwYXJhdGVkIGxpc3Qgb2YgbWV0aG9kcyB0byBydW4uIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1KPHBhcmFtPj08dmFsdWU+OiBzZXQgYSBKVk0gYXJndW1lbnQgdG8gdGhlIGdpdmVuIHZhbHVlLiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIHN1cHBsaWVkIGJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIHRoZSIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBkZWxpbWl0ZXIgc3BlY2lmaWVkIGluIHRoZSAtLWRlbGltaXRlciBhcmd1bWVudC4iKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgRm9yIGV4YW1wbGU6IFwiLUptZW1vcnlNYXg9LVhteDMyTSwtWG14NTEyTVwiIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tZGVsaW1pdGVyIDxkZWxpbWl0ZXI+OiBjaGFyYWN0ZXIgb3Igc3RyaW5nIHRvIHVzZSBhcyBhIGRlbGltaXRlciIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBmb3IgcGFyYW1ldGVyIGFuZCB2bSB2YWx1ZXMuIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIERlZmF1bHQ6IFwiIiArIGRlZmF1bHREZWxpbWl0ZXIgKyAiXCIiKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS13YXJtdXBNaWxsaXMgPG1pbGxpcz46IGR1cmF0aW9uIHRvIHdhcm11cCBlYWNoIGJlbmNobWFyayIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXJ1bk1pbGxpcyA8bWlsbGlzPjogZHVyYXRpb24gdG8gZXhlY3V0ZSBlYWNoIGJlbmNobWFyayIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWNhcHR1cmVWbUxvZzogcmVjb3JkIHRoZSBWTSdzIGp1c3QtaW4tdGltZSBjb21waWxlciBhbmQgR0MgbG9ncy4iKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgVGhpcyBtYXkgc2xvdyBkb3duIG9yIGJyZWFrIGJlbmNobWFyayBkaXNwbGF5IHRvb2xzLiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLW1lYXN1cmVNZW1vcnk6IG1lYXN1cmUgdGhlIG51bWJlciBvZiBhbGxvY2F0aW9ucyBkb25lIGFuZCB0aGUgYW1vdW50IG9mIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIG1lbW9yeSB1c2VkIGJ5IGludm9jYXRpb25zIG9mIHRoZSBiZW5jaG1hcmsuIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIERlZmF1bHQ6IG9mZiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXZtIDx2bT46IGV4ZWN1dGFibGUgdG8gdGVzdCBiZW5jaG1hcmsgb24uIE11bHRpcGxlIFZNcyBtYXkgYmUgcGFzc2VkIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIGluIGFzIGEgbGlzdCBzZXBhcmF0ZWQgYnkgdGhlIGRlbGltaXRlciBzcGVjaWZpZWQgaW4gdGhlIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIC0tZGVsaW1pdGVyIGFyZ3VtZW50LiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXRpbWVVbml0IDx1bml0PjogdW5pdCBvZiB0aW1lIHRvIHVzZSBmb3IgcmVzdWx0LiBEZXBlbmRzIG9uIHRoZSB1bml0cyIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBkZWZpbmVkIGluIHRoZSBiZW5jaG1hcmsncyBnZXRUaW1lVW5pdE5hbWVzKCkgbWV0aG9kLCBpZiBkZWZpbmVkLiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBEZWZhdWx0IE9wdGlvbnM6IG5zLCB1cywgbXMsIHMiKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1pbnN0YW5jZVVuaXQgPHVuaXQ+OiB1bml0IHRvIHVzZSBmb3IgYWxsb2NhdGlvbiBpbnN0YW5jZXMgcmVzdWx0LiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBEZXBlbmRzIG9uIHRoZSB1bml0cyBkZWZpbmVkIGluIHRoZSBiZW5jaG1hcmsncyIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBnZXRJbnN0YW5jZVVuaXROYW1lcygpIG1ldGhvZCwgaWYgZGVmaW5lZC4iKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgRGVmYXVsdCBPcHRpb25zOiBpbnN0YW5jZXMsIEsgaW5zdGFuY2VzLCBNIGluc3RhbmNlcywgQiBpbnN0YW5jZXMiKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1tZW1vcnlVbml0IDx1bml0PjogdW5pdCB0byB1c2UgZm9yIGFsbG9jYXRpb24gbWVtb3J5IHNpemUgcmVzdWx0LiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBEZXBlbmRzIG9uIHRoZSB1bml0cyBkZWZpbmVkIGluIHRoZSBiZW5jaG1hcmsncyIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBnZXRNZW1vcnlVbml0TmFtZXMoKSBtZXRob2QsIGlmIGRlZmluZWQuIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIERlZmF1bHQgT3B0aW9uczogQiwgS0IsIE1CLCBHQiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXNhdmVSZXN1bHRzIDxmaWxlL2Rpcj46IHdyaXRlIHJlc3VsdHMgdG8gdGhpcyBmaWxlIG9yIGRpcmVjdG9yeSIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXByaW50U2NvcmU6IGlmIHByZXNlbnQsIGFsc28gZGlzcGxheSBhbiBhZ2dyZWdhdGUgc2NvcmUgZm9yIHRoaXMgcnVuLCIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICB3aGVyZSBoaWdoZXIgaXMgYmV0dGVyLiBUaGlzIG51bWJlciBoYXMgbm8gcGFydGljdWxhciBtZWFuaW5nLCIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICBidXQgY2FuIGJlIGNvbXBhcmVkIHRvIHNjb3JlcyBmcm9tIG90aGVyIHJ1bnMgdGhhdCB1c2UgdGhlIGV4YWN0Iik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIHNhbWUgYXJndW1lbnRzLiIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXVwbG9hZFJlc3VsdHMgPGZpbGUvZGlyPjogdXBsb2FkIHRoaXMgZmlsZSBvciBkaXJlY3Rvcnkgb2YgZmlsZXMiKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgdG8gdGhlIHdlYiBhcHAuIFRoaXMgYXJndW1lbnQgZW5kcyBDYWxpcGVyIGVhcmx5IGFuZCBpcyB0aHVzIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlciBhcmd1bWVudHMuIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tZGVidWc6IHJ1biB3aXRob3V0IG1lYXN1cmVtZW50IGZvciB1c2Ugd2l0aCBkZWJ1Z2dlciBvciBwcm9maWxpbmcuIik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tZGVidWctcmVwczogZml4ZWQgbnVtYmVyIG9mIHJlcHMgdG8gcnVuIHdpdGggLS1kZWJ1Zy4iKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgRGVmYXVsdDogXCIiICsgZGVmYXVsdERlYnVnUmVwcyArICJcIiIpOwotCi0gICAgLy8gYWRkaW5nIG5ldyBvcHRpb25zPyBkb24ndCBmb3JnZXQgdG8gdXBkYXRlIGV4ZWN1dGVGb3JrZWQoKQotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0JlZm9yZUV4cGVyaW1lbnQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQmVmb3JlRXhwZXJpbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjdmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0JlZm9yZUV4cGVyaW1lbnQuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEFuIGFubm90YXRpb24gZm9yIG1ldGhvZHMgdG8gYmUgcnVuIGJlZm9yZSBhbiBleHBlcmltZW50IGhhcyBiZWVuIHBlcmZvcm1lZC4KKyAqCisgKiBAc2VlIEFmdGVyRXhwZXJpbWVudAorICovCitAVGFyZ2V0KE1FVEhPRCkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEJlZm9yZUV4cGVyaW1lbnQgeworICAvKioKKyAgICogQSBxdWFsaWZpZXIgZm9yIHdoaWNoIHR5cGVzIG9mIGV4cGVyaW1lbnRzIHRoaXMgbWV0aG9kIHNob3VsZCBydW4uIEZvciBleGFtcGxlLCBhbm5vdGF0aW5nIGEKKyAgICogbWV0aG9kIHdpdGgge0Bjb2RlIEBCZWZvcmVFeHBlcmltZW50KEJlbmNobWFyay5jbGFzcyl9IHdpbGwgY2F1c2UgaXQgdG8gb25seSBydW4gZm9yCisgICAqIHtAbGluayBCZW5jaG1hcmt9IGV4cGVyaW1lbnRzLiBCeSBkZWZhdWx0LCBhbm5vdGF0ZWQgbWV0aG9kcyBydW4gZm9yIGFsbCBleHBlcmltZW50cy4KKyAgICovCisgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB2YWx1ZSgpIGRlZmF1bHQgQWxsLmNsYXNzOworfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9CZW5jaG1hcmsuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQmVuY2htYXJrLmphdmEKaW5kZXggMDZiZGE4Mi4uMjUyMDE3YyAxMDA2NDQKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9CZW5jaG1hcmsuamF2YQorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0JlbmNobWFyay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiw0MCArMTYsNjQgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7CiAKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwogCiAvKioKLSAqIEEgY29sbGVjdGlvbiBvZiBiZW5jaG1hcmtzIHRoYXQgc2hhcmUgYSBzZXQgb2YgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorICogQW5ub3RhdGlvbiBmb3IgYmVuY2htYXJrIG1ldGhvZHMuIFRvIHdyaXRlIGEgYmVuY2htYXJrOgorICoKKyAqIDxvbD4KKyAqICAgPGxpPkFubm90YXRlIG9uZSBvciBtb3JlIG1ldGhvZHMgd2l0aCB0aGlzIGFubm90YXRpb24uCisgKiAgIDxsaT5Bbm5vdGF0ZSBhbnkgZmllbGRzIHdpdGgge0BsaXRlcmFsIEB9e0BsaW5rIFBhcmFtfSB0aGF0IHNob3VsZCBoYXZlIHBhcmFtZXRlciB2YWx1ZXMKKyAqICAgICAgIGluamVjdGVkIChzZWUge0BsaXRlcmFsIEB9e0BsaW5rIFBhcmFtfSBmb3IgbW9yZSBkZXRhaWxzKQorICogICA8bGk+T3B0aW9uYWxseSB1c2Uge0BsaW5rIEJlZm9yZUV4cGVyaW1lbnR9IGFuZCB7QGxpbmsgQWZ0ZXJFeHBlcmltZW50fSBvbiBzZXR1cCBhbmQgdGVhcmRvd24KKyAqICAgICAgIG1ldGhvZHMKKyAqIDwvb2w+CisgKgorICogPHA+U2luY2UgbWFueSBiZW5jaG1hcmtzIG1heSBleGVjdXRlIGluIGEgc2hvcnRlciBkdXJhdGlvbiB0aGFuIGlzIGFjY3VyYXRlbHkgbWVhc3VyZWQgYnkKKyAqIGF2YWlsYWJsZSB0aW1lcnMsIGJlbmNobWFyayBtZXRob2RzIDxpPm1heTwvaT4gdGFrZSBlaXRoZXIgYW4ge0Bjb2RlIGludH0gb3Ige0Bjb2RlIGxvbmd9CisgKiBhcmd1bWVudCByZXByZXNlbnRpbmcgYSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgdG8gcGVyZm9ybSBpbiBhIGdpdmVuIGV4ZWN1dGlvbi4gSXQgaXMgY3JpdGljYWwKKyAqIHRoYXQgdGhlIHdvcmsgZG9uZSBpbiB0aGUgYmVuY2htYXJrIG1ldGhvZCBzY2FsZSBsaW5lYXJseSB0byB0aGUgbnVtYmVyIG9mIHJlcGV0aXRpb25zLgorICoKKyAqIDxwPkJlbmNobWFyayBtZXRob2RzIG1heSByZXR1cm4gYW55IHZhbHVlLiBJdCB3aWxsIGJlIGlnbm9yZWQuCisgKgorICogPHA+VGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgYW5kIGluamVjdGVkIG9ubHkgb25jZSBwZXIgY2hpbGQgVk0gaW52b2NhdGlvbiwgdG8gbWVhc3VyZSBvbmUKKyAqIHBhcnRpY3VsYXIgY29tYmluYXRpb24gb2YgcGFyYW1ldGVycy4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZTogPHByZT4gICB7QGNvZGUKKyAqICAgcHVibGljIGZpbmFsIGNsYXNzIE15QmVuY2htYXJrIHsKKyAqICAgICB7QGxpdGVyYWwgQH1QYXJhbSBGZWF0dXJlRW51bSBmZWF0dXJlOworICogICAgIHtAbGl0ZXJhbCBAfVBhcmFtKHsiMSIsICIxMCIsICIxMDAifSkgaW50IHNpemU7CisgKiAgICAgcHJpdmF0ZSBNeU9iamVjdCBvYmplY3RUb0JlbmNobWFyazsKKyAqCisgKiAgICAge0BsaXRlcmFsIEB9QmVmb3JlRXhwZXJpbWVudCB2b2lkIGluaXRpYWxpemVPYmplY3QoKSB7CisgKiAgICAgICBvYmplY3RUb0JlbmNobWFyayA9IG5ldyBNeU9iamVjdChzaXplKTsKKyAqICAgICB9CisgKgorICogICAgIHtAbGl0ZXJhbCBAfUJlbmNobWFyayBpbnQgZm9vKGludCByZXBzKSB7CisgKiAgICAgICBNeU9iamVjdCBvYmplY3QgPSBvYmplY3RUb0JlbmNobWFyazsgIC8vIGNvcHkgdG8gbG9jYWwgdG8gYXZvaWQgZmllbGQgYWNjZXNzIG92ZXJoZWFkCisgKiAgICAgICBpbnQgZHVtbXkgPSAwOworICogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAqICAgICAgICAgZHVtbXkgKz0gb2JqZWN0LmZvbyhmZWF0dXJlKTsKKyAqICAgICAgIH0KKyAqICAgICAgIC8vIHJldHVybiBhIGR1bW15IHZhbHVlIHNvIHRoZSBKSVQgY29tcGlsZXIgZG9lc24ndCBvcHRpbWl6ZSBhd2F5IHRoZSBlbnRpcmUgbWV0aG9kLgorICogICAgICAgcmV0dXJuIGR1bW15OworICogICAgIH0KKyAqCisgKiAgICAge0BsaXRlcmFsIEB9QmVuY2htYXJrIGludCBiYXIoKSB7CisgKiAgICAgICAvLyBiZW5jaG1hcmsgYW5vdGhlciBvcGVyYXRpb24gb2YgTXlPYmplY3QgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSByZXBzIHBhcmFtZXRlcgorICogICAgIH0KKyAqICAgfQorICogPC9wcmU+CisgKgorICogPHA+VGhlIGJlbmNobWFyayBjbGFzcyBNeUJlbmNobWFyayBoYXMgdHdvIGJlbmNobWFyayBtZXRob2RzICh7QGNvZGUgZm9vfSBhbmQge0Bjb2RlIGJhcn0pIGFuZAorICogdHdvIHtAbGluayBQYXJhbSBQYXJhbXN9ICh7QGNvZGUgZmVhdHVyZX0gYW5kIHtAY29kZSBzaXplfSkuIEZvciBlYWNoIGV4cGVyaW1lbnQgcGVyZm9ybWVkIGJ5CisgKiBDYWxpcGVyIChlLmcuIHtAY29kZSBmb299IHdpdGgge0Bjb2RlIGZlYXR1cmUgPT0gRmVhdHVyZUVudW0uQX0gYW5kIHtAY29kZSBzaXplID09IDEwMH0pLAorICoge0Bjb2RlIGluaXRpYWxpemVPYmplY3R9IHdpbGwgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSwgYnV0IHtAY29kZSBmb299IG1heSBiZSBjYWxsZWQgbWFueSB0aW1lcy4KICAqLwotcHVibGljIGludGVyZmFjZSBCZW5jaG1hcmsgewotCi0gIFNldDxTdHJpbmc+IHBhcmFtZXRlck5hbWVzKCk7Ci0KLSAgU2V0PFN0cmluZz4gcGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbWV0ZXJOYW1lKTsKLQotICBDb25maWd1cmVkQmVuY2htYXJrIGNyZWF0ZUJlbmNobWFyayhNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlclZhbHVlcyk7Ci0KLSAgLyoqCi0gICAqIEEgbWFwcGluZyBvZiB1bml0cyB0byB0aGVpciB2YWx1ZXMuIFRoZWlyIHZhbHVlcyBtdXN0IGJlIGludGVnZXJzLCBidXQgYWxsIHZhbHVlcyBhcmUgcmVsYXRpdmUsCi0gICAqIHNvIGlmIG9uZSB1bml0IGlzIDEuNSB0aW1lcyB0aGUgc2l6ZSBvZiBhbm90aGVyLCB0aGVuIHRoZXNlIHVuaXRzIGNhbiBiZSBleHByZXNzZWQgYXMKLSAgICogeyJ1bml0MSI9MTAsInVuaXQyIj0xNX0uIFRoZSBzbWFsbGVzdCB1bml0IGdpdmVuIGJ5IHRoZSBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheQotICAgKiBpbW1lZGlhdGUgcmVzdWx0cyB3aGVuIHJ1bm5pbmcgYXQgdGhlIGNvbW1hbmQgbGluZS4KLSAgICoKLSAgICogZS5nLiAwJSBTY2VuYXJpb3suLi59IDE2LjA4PFNNQUxMRVNULVVOSVQ+OyDPgz0xLjcyPFNNQUxMRVNULVVOSVQ+IEAgMyB0cmlhbHMKLSAgICovCi0gIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldFRpbWVVbml0TmFtZXMoKTsKLQotICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRJbnN0YW5jZVVuaXROYW1lcygpOwotCi0gIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldE1lbW9yeVVuaXROYW1lcygpOwotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBuYW5vc2Vjb25kcyB0byB0aGUgc21hbGxlc3QgdW5pdCBkZWZpbmVkIGluIHtAbGluayAjZ2V0VGltZVVuaXROYW1lcygpfS4KLSAgICovCi0gIGRvdWJsZSBuYW5vc1RvVW5pdHMoZG91YmxlIG5hbm9zKTsKLQotICBkb3VibGUgaW5zdGFuY2VzVG9Vbml0cyhsb25nIGluc3RhbmNlcyk7Ci0KLSAgZG91YmxlIGJ5dGVzVG9Vbml0cyhsb25nIGJ5dGVzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitAVGFyZ2V0KE1FVEhPRCkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEJlbmNobWFyayB7fQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9DYWxpcGVyUmMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQ2FsaXBlclJjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTI4M2YuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9DYWxpcGVyUmMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIENhbGlwZXJSYyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2FsaXBlclJjIElOU1RBTkNFID0gbmV3IENhbGlwZXJSYygpOwotCi0gIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICBwcml2YXRlIENhbGlwZXJSYygpIHsKLSAgICB0cnkgewotICAgICAgU3RyaW5nIGNhbGlwZXJSY0VudlZhciA9IFN5c3RlbS5nZXRlbnYoIkNBTElQRVJSQyIpOwotICAgICAgRmlsZSBjYWxpcGVyUmNGaWxlID0gKGNhbGlwZXJSY0VudlZhciA9PSBudWxsKQotICAgICAgICAgID8gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSwgIi5jYWxpcGVycmMiKQotICAgICAgICAgIDogbmV3IEZpbGUoY2FsaXBlclJjRW52VmFyKTsKLSAgICAgIGlmIChjYWxpcGVyUmNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjYWxpcGVyUmNGaWxlKTsKLSAgICAgICAgcHJvcGVydGllcy5sb2FkKGluKTsKLSAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBpdCB3aXRoIGEgdGVtcGxhdGUKLSAgICAgIH0KLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEFwaUtleSgpIHsKLSAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgiYXBpS2V5Iik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBvc3RVcmwoKSB7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoInBvc3RVcmwiKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgSFRUUCBwcm94eSBob3N0IG5hbWUgYW5kIHBvcnQgbnVtYmVyIHNlcGFyYXRlZCBieSBhIGNvbG9uLCBzdWNoIGFzCi0gICAqIGZvby5jb206ODA4MAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm94eSgpIHsKLSAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgicHJveHkiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Db25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhMzVlYy4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi0vKioKLSAqIFRocm93biB1cG9uIG9jY3VycmVuY2Ugb2YgYSBjb25maWd1cmF0aW9uIGVycm9yLgotICovCi1maW5hbCBjbGFzcyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLSAgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgcykgewotICAgIHN1cGVyKHMpOwotICB9Ci0KLSAgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICBzdXBlcihjYXVzZSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOwotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Db25maWd1cmVkQmVuY2htYXJrLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0NvbmZpZ3VyZWRCZW5jaG1hcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1MGVjMS4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0NvbmZpZ3VyZWRCZW5jaG1hcmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25maWd1cmVkQmVuY2htYXJrIHsKLQotICBwcml2YXRlIGZpbmFsIEJlbmNobWFyayB1bmRlcmx5aW5nQmVuY2htYXJrOwotCi0gIHByb3RlY3RlZCBDb25maWd1cmVkQmVuY2htYXJrKEJlbmNobWFyayB1bmRlcmx5aW5nQmVuY2htYXJrKSB7Ci0gICAgdGhpcy51bmRlcmx5aW5nQmVuY2htYXJrID0gdW5kZXJseWluZ0JlbmNobWFyazsKLSAgfQotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBiZW5jaG1hcmsgdGhyb3VnaCB7QGNvZGUgcmVwc30gaXRlcmF0aW9ucy4KLSAgICoKLSAgICogQHJldHVybiBhbnkgb2JqZWN0IG9yIG51bGwuIEJlbmNobWFyayBpbXBsZW1lbnRvcnMgbWF5IGtlZXAgYW4gYWNjdW11bGF0aW5nCi0gICAqICAgICAgdmFsdWUgdG8gcHJldmVudCB0aGUgcnVudGltZSBmcm9tIG9wdGltaXppbmcgYXdheSB0aGUgY29kZSB1bmRlciB0ZXN0LgotICAgKiAgICAgIFN1Y2ggYW4gYWNjdW11bGF0b3IgdmFsdWUgY2FuIGJlIHJldHVybmVkIGhlcmUuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHJ1bihpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgcHVibGljIGZpbmFsIEJlbmNobWFyayBnZXRCZW5jaG1hcmsoKSB7Ci0gICAgcmV0dXJuIHVuZGVybHlpbmdCZW5jaG1hcms7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgZG91YmxlIG5hbm9zVG9Vbml0cyhkb3VibGUgbmFub3MpIHsKLSAgICByZXR1cm4gdW5kZXJseWluZ0JlbmNobWFyay5uYW5vc1RvVW5pdHMobmFub3MpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IHRpbWVVbml0TmFtZXMoKSB7Ci0gICAgcmV0dXJuIHVuZGVybHlpbmdCZW5jaG1hcmsuZ2V0VGltZVVuaXROYW1lcygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGRvdWJsZSBpbnN0YW5jZXNUb1VuaXRzKGxvbmcgaW5zdGFuY2VzKSB7Ci0gICAgcmV0dXJuIHVuZGVybHlpbmdCZW5jaG1hcmsuaW5zdGFuY2VzVG9Vbml0cyhpbnN0YW5jZXMpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IGluc3RhbmNlVW5pdE5hbWVzKCkgewotICAgIHJldHVybiB1bmRlcmx5aW5nQmVuY2htYXJrLmdldEluc3RhbmNlVW5pdE5hbWVzKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgZG91YmxlIGJ5dGVzVG9Vbml0cyhsb25nIGJ5dGVzKSB7Ci0gICAgcmV0dXJuIHVuZGVybHlpbmdCZW5jaG1hcmsuYnl0ZXNUb1VuaXRzKGJ5dGVzKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtZW1vcnlVbml0TmFtZXMoKSB7Ci0gICAgcmV0dXJuIHVuZGVybHlpbmdCZW5jaG1hcmsuZ2V0TWVtb3J5VW5pdE5hbWVzKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQ29uc29sZVJlcG9ydC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Db25zb2xlUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDliZGEuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Db25zb2xlUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuTGluZWFyVHJhbnNsYXRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZEhhc2hNdWx0aW1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT3JkZXJpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKioKLSAqIFByaW50cyBhIHJlcG9ydCBjb250YWluaW5nIHRoZSB0ZXN0ZWQgdmFsdWVzIGFuZCB0aGUgY29ycmVzcG9uZGluZwotICogbWVhc3VyZW1lbnRzLiBNZWFzdXJlbWVudHMgYXJlIGdyb3VwZWQgYnkgdmFyaWFibGUgdXNpbmcgaW5kZW50YXRpb24uCi0gKiBBbG9uZ3NpZGUgbnVtZXJpYyB2YWx1ZXMsIHF1aWNrLWdsYW5jZSBhc2NpaSBhcnQgYmFyIGNoYXJ0cyBhcmUgcHJpbnRlZC4KLSAqIFNhbXBsZSBvdXRwdXQgKHRoaXMgbWF5IG5vdCByZXByZXNlbnQgdGhlIGV4YWN0IGZvcm0gdGhhdCBpcyBwcm9kdWNlZCk6Ci0gKiA8cHJlPgotICogICAgICAgICAgICAgIGJlbmNobWFyayAgICAgICAgICBkICAgICBucyBsaW5lYXIgcnVudGltZQotICogQ29uY2F0ZW5hdGlvbkJlbmNobWFyayAzLjE0MTU5MjY1ICAgNDM5NyA9PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbmNhdGVuYXRpb25CZW5jaG1hcmsgICAgICAgLTAuMCAgICAyMjMgPT09PT09PT09PT09PT09Ci0gKiAgICAgRm9ybWF0dGVyQmVuY2htYXJrIDMuMTQxNTkyNjUgIDMzOTk5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogICAgIEZvcm1hdHRlckJlbmNobWFyayAgICAgICAtMC4wICAyNjM5OSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogPC9wcmU+Ci0gKi8KLWZpbmFsIGNsYXNzIENvbnNvbGVSZXBvcnQgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBiYXJHcmFwaFdpZHRoID0gMzA7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOSVRTX0ZPUl9TQ09SRV8xMDAgPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5JVFNfRk9SX1NDT1JFXzEwID0gMTAwMDAwMDAwMDsgLy8gMSBzCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGluZWFyVHJhbnNsYXRpb24gc2NvcmVUcmFuc2xhdGlvbiA9Ci0gICAgICBuZXcgTGluZWFyVHJhbnNsYXRpb24oTWF0aC5sb2coVU5JVFNfRk9SX1NDT1JFXzEwKSwgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5sb2coVU5JVFNfRk9SX1NDT1JFXzEwMCksIDEwMCk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBPcmRlcmluZzxFbnRyeTxTdHJpbmcsIEludGVnZXI+PiBVTklUX09SREVSSU5HID0KLSAgICAgIG5ldyBPcmRlcmluZzxFbnRyeTxTdHJpbmcsIEludGVnZXI+PigpIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgY29tcGFyZShFbnRyeTxTdHJpbmcsIEludGVnZXI+IGEsIEVudHJ5PFN0cmluZywgSW50ZWdlcj4gYikgewotICAgICAgICAgIHJldHVybiBhLmdldFZhbHVlKCkuY29tcGFyZVRvKGIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PFZhcmlhYmxlPiB2YXJpYWJsZXM7Ci0gIHByaXZhdGUgZmluYWwgUnVuIHJ1bjsKLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNjZW5hcmlvPiBzY2VuYXJpb3M7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1lYXN1cmVtZW50VHlwZT4gb3JkZXJlZE1lYXN1cmVtZW50VHlwZXM7Ci0gIHByaXZhdGUgZmluYWwgTWVhc3VyZW1lbnRUeXBlIHR5cGU7Ci0gIHByaXZhdGUgZmluYWwgZG91YmxlIG1heFZhbHVlOwotICBwcml2YXRlIGZpbmFsIGRvdWJsZSBsb2dNaW5WYWx1ZTsKLSAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgbG9nTWF4VmFsdWU7Ci0gIHByaXZhdGUgZmluYWwgRW51bU1hcDxNZWFzdXJlbWVudFR5cGUsIEludGVnZXI+IGRlY2ltYWxEaWdpdHNNYXAgPQotICAgICAgbmV3IEVudW1NYXA8TWVhc3VyZW1lbnRUeXBlLCBJbnRlZ2VyPihNZWFzdXJlbWVudFR5cGUuY2xhc3MpOwotICBwcml2YXRlIGZpbmFsIEVudW1NYXA8TWVhc3VyZW1lbnRUeXBlLCBEb3VibGU+IGRpdmlkZUJ5TWFwID0KLSAgICAgIG5ldyBFbnVtTWFwPE1lYXN1cmVtZW50VHlwZSwgRG91YmxlPihNZWFzdXJlbWVudFR5cGUuY2xhc3MpOwotICBwcml2YXRlIGZpbmFsIEVudW1NYXA8TWVhc3VyZW1lbnRUeXBlLCBTdHJpbmc+IHVuaXRNYXAgPQotICAgICAgbmV3IEVudW1NYXA8TWVhc3VyZW1lbnRUeXBlLCBTdHJpbmc+KE1lYXN1cmVtZW50VHlwZS5jbGFzcyk7Ci0gIHByaXZhdGUgZmluYWwgRW51bU1hcDxNZWFzdXJlbWVudFR5cGUsIEludGVnZXI+IG1lYXN1cmVtZW50Q29sdW1uTGVuZ3RoTWFwID0KLSAgICAgIG5ldyBFbnVtTWFwPE1lYXN1cmVtZW50VHlwZSwgSW50ZWdlcj4oTWVhc3VyZW1lbnRUeXBlLmNsYXNzKTsKLSAgcHJpdmF0ZSBib29sZWFuIHByaW50U2NvcmU7Ci0KLSAgQ29uc29sZVJlcG9ydChSdW4gcnVuLCBBcmd1bWVudHMgYXJndW1lbnRzKSB7Ci0gICAgdGhpcy5ydW4gPSBydW47Ci0gICAgdW5pdE1hcC5wdXQoTWVhc3VyZW1lbnRUeXBlLlRJTUUsIGFyZ3VtZW50cy5nZXRUaW1lVW5pdCgpKTsKLSAgICB1bml0TWFwLnB1dChNZWFzdXJlbWVudFR5cGUuSU5TVEFOQ0UsIGFyZ3VtZW50cy5nZXRJbnN0YW5jZVVuaXQoKSk7Ci0gICAgdW5pdE1hcC5wdXQoTWVhc3VyZW1lbnRUeXBlLk1FTU9SWSwgYXJndW1lbnRzLmdldE1lbW9yeVVuaXQoKSk7Ci0KLSAgICBpZiAoYXJndW1lbnRzLmdldE1lYXN1cmVNZW1vcnkoKSkgewotICAgICAgb3JkZXJlZE1lYXN1cmVtZW50VHlwZXMgPSBBcnJheXMuYXNMaXN0KAotICAgICAgICAgIE1lYXN1cmVtZW50VHlwZS5USU1FLCBNZWFzdXJlbWVudFR5cGUuSU5TVEFOQ0UsIE1lYXN1cmVtZW50VHlwZS5NRU1PUlkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvcmRlcmVkTWVhc3VyZW1lbnRUeXBlcyA9IEFycmF5cy5hc0xpc3QoTWVhc3VyZW1lbnRUeXBlLlRJTUUpOwotICAgIH0KLQotICAgIGlmIChhcmd1bWVudHMuZ2V0UHJpbWFyeU1lYXN1cmVtZW50VHlwZSgpICE9IG51bGwpIHsKLSAgICAgIHRoaXMudHlwZSA9IGFyZ3VtZW50cy5nZXRQcmltYXJ5TWVhc3VyZW1lbnRUeXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMudHlwZSA9IE1lYXN1cmVtZW50VHlwZS5USU1FOwotICAgIH0KLQotICAgIGRvdWJsZSBtaW4gPSBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFk7Ci0gICAgZG91YmxlIG1heCA9IDA7Ci0KLSAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZVRvVmFsdWVzID0gTGlua2VkSGFzaE11bHRpbWFwLmNyZWF0ZSgpOwotICAgIExpc3Q8VmFyaWFibGU+IHZhcmlhYmxlc0J1aWxkZXIgPSBuZXcgQXJyYXlMaXN0PFZhcmlhYmxlPigpOwotICAgIGZvciAoRW50cnk8U2NlbmFyaW8sIFNjZW5hcmlvUmVzdWx0PiBlbnRyeSA6IHRoaXMucnVuLmdldE1lYXN1cmVtZW50cygpLmVudHJ5U2V0KCkpIHsKLSAgICAgIFNjZW5hcmlvIHNjZW5hcmlvID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBkb3VibGUgZCA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0TWVhc3VyZW1lbnRTZXQodHlwZSkubWVkaWFuVW5pdHMoKTsKLQotICAgICAgbWluID0gTWF0aC5taW4obWluLCBkKTsKLSAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgZCk7Ci0KLSAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IHZhcmlhYmxlIDogc2NlbmFyaW8uZ2V0VmFyaWFibGVzKCkuZW50cnlTZXQoKSkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHZhcmlhYmxlLmdldEtleSgpOwotICAgICAgICBuYW1lVG9WYWx1ZXMucHV0KG5hbWUsIHZhcmlhYmxlLmdldFZhbHVlKCkpOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoRW50cnk8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IGVudHJ5IDogbmFtZVRvVmFsdWVzLmFzTWFwKCkuZW50cnlTZXQoKSkgewotICAgICAgVmFyaWFibGUgdmFyaWFibGUgPSBuZXcgVmFyaWFibGUoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgdmFyaWFibGVzQnVpbGRlci5hZGQodmFyaWFibGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRmlndXJlIG91dCBob3cgbXVjaCBpbmZsdWVuY2UgZWFjaCB2YXJpYWJsZSBoYXMgb24gdGhlIG1lYXN1cmVkIHZhbHVlLgotICAgICAqIFdlIHN1bSB0aGUgbWVhc3VyZW1lbnRzIHRha2VuIHdpdGggZWFjaCB2YWx1ZSBvZiBlYWNoIHZhcmlhYmxlLiBGb3IKLSAgICAgKiB2YXJpYWJsZSB0aGF0IGhhdmUgaW5mbHVlbmNlIG9uIHRoZSBtZWFzdXJlbWVudCwgdGhlIHN1bXMgd2lsbCBkaWZmZXIKLSAgICAgKiBieSB2YWx1ZS4gSWYgdGhlIHZhcmlhYmxlIGhhcyBsaXR0bGUgaW5mbHVlbmNlLCB0aGUgc3VtcyB3aWxsIGJlIHNpbWlsYXIKLSAgICAgKiB0byBvbmUgYW5vdGhlciBhbmQgY2xvc2UgdG8gdGhlIG92ZXJhbGwgYXZlcmFnZS4gV2UgdGFrZSB0aGUgc3RhbmRhcmQKLSAgICAgKiBkZXZpYXRpb24gYWNyb3NzIGVhY2ggdmFyaWFibGUncyBjb2xsZWN0aW9uIG9mIHN1bXMuIEhpZ2hlciBzdGFuZGFyZAotICAgICAqIGRldmlhdGlvbiBpbXBsaWVzIGhpZ2hlciBpbmZsdWVuY2Ugb24gdGhlIG1lYXN1cmVkIHJlc3VsdC4KLSAgICAgKi8KLSAgICBkb3VibGUgc3VtT2ZBbGxNZWFzdXJlbWVudHMgPSAwOwotICAgIGZvciAoU2NlbmFyaW9SZXN1bHQgbWVhc3VyZW1lbnQgOiB0aGlzLnJ1bi5nZXRNZWFzdXJlbWVudHMoKS52YWx1ZXMoKSkgewotICAgICAgc3VtT2ZBbGxNZWFzdXJlbWVudHMgKz0gbWVhc3VyZW1lbnQuZ2V0TWVhc3VyZW1lbnRTZXQodHlwZSkubWVkaWFuVW5pdHMoKTsKLSAgICB9Ci0gICAgZm9yIChWYXJpYWJsZSB2YXJpYWJsZSA6IHZhcmlhYmxlc0J1aWxkZXIpIHsKLSAgICAgIGludCBudW1WYWx1ZXMgPSB2YXJpYWJsZS52YWx1ZXMuc2l6ZSgpOwotICAgICAgZG91YmxlW10gc3VtRm9yVmFsdWUgPSBuZXcgZG91YmxlW251bVZhbHVlc107Ci0gICAgICBmb3IgKEVudHJ5PFNjZW5hcmlvLCBTY2VuYXJpb1Jlc3VsdD4gZW50cnkKLSAgICAgICAgICA6IHRoaXMucnVuLmdldE1lYXN1cmVtZW50cygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgU2NlbmFyaW8gc2NlbmFyaW8gPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgc3VtRm9yVmFsdWVbdmFyaWFibGUuaW5kZXgoc2NlbmFyaW8pXSArPQotICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKS5nZXRNZWFzdXJlbWVudFNldCh0eXBlKS5tZWRpYW5Vbml0cygpOwotICAgICAgfQotICAgICAgZG91YmxlIG1lYW4gPSBzdW1PZkFsbE1lYXN1cmVtZW50cyAvIHN1bUZvclZhbHVlLmxlbmd0aDsKLSAgICAgIGRvdWJsZSBzdGREZXZpYXRpb25TcXVhcmVkID0gMDsKLSAgICAgIGZvciAoZG91YmxlIHZhbHVlIDogc3VtRm9yVmFsdWUpIHsKLSAgICAgICAgZG91YmxlIGRpc3RhbmNlID0gdmFsdWUgLSBtZWFuOwotICAgICAgICBzdGREZXZpYXRpb25TcXVhcmVkICs9IGRpc3RhbmNlICogZGlzdGFuY2U7Ci0gICAgICB9Ci0gICAgICB2YXJpYWJsZS5zdGREZXZpYXRpb24gPSBNYXRoLnNxcnQoc3RkRGV2aWF0aW9uU3F1YXJlZCAvIG51bVZhbHVlcyk7Ci0gICAgfQotCi0gICAgdGhpcy52YXJpYWJsZXMgPSBuZXcgU3RhbmRhcmREZXZpYXRpb25PcmRlcmluZygpLnJldmVyc2UoKS5zb3J0ZWRDb3B5KHZhcmlhYmxlc0J1aWxkZXIpOwotICAgIHRoaXMuc2NlbmFyaW9zID0gbmV3IEJ5VmFyaWFibGVzT3JkZXJpbmcoKS5zb3J0ZWRDb3B5KHRoaXMucnVuLmdldE1lYXN1cmVtZW50cygpLmtleVNldCgpKTsKLSAgICB0aGlzLm1heFZhbHVlID0gbWF4OwotICAgIHRoaXMubG9nTWluVmFsdWUgPSBNYXRoLmxvZyhtaW4pOwotICAgIHRoaXMubG9nTWF4VmFsdWUgPSBNYXRoLmxvZyhtYXgpOwotCi0gICAgRW51bU1hcDxNZWFzdXJlbWVudFR5cGUsIEludGVnZXI+IGRpZ2l0c0JlZm9yZURlY2ltYWxNYXAgPQotICAgICAgbmV3IEVudW1NYXA8TWVhc3VyZW1lbnRUeXBlLCBJbnRlZ2VyPihNZWFzdXJlbWVudFR5cGUuY2xhc3MpOwotICAgIEVudW1NYXA8TWVhc3VyZW1lbnRUeXBlLCBJbnRlZ2VyPiBkZWNpbWFsUG9pbnRNYXAgPQotICAgICAgbmV3IEVudW1NYXA8TWVhc3VyZW1lbnRUeXBlLCBJbnRlZ2VyPihNZWFzdXJlbWVudFR5cGUuY2xhc3MpOwotICAgIGZvciAoTWVhc3VyZW1lbnRUeXBlIG1lYXN1cmVtZW50VHlwZSA6IG9yZGVyZWRNZWFzdXJlbWVudFR5cGVzKSB7Ci0gICAgICBkb3VibGUgbWF4Rm9yVHlwZSA9IDA7Ci0gICAgICBkb3VibGUgbWluRm9yVHlwZSA9IERvdWJsZS5QT1NJVElWRV9JTkZJTklUWTsKLSAgICAgIGZvciAoRW50cnk8U2NlbmFyaW8sIFNjZW5hcmlvUmVzdWx0PiBlbnRyeSA6IHRoaXMucnVuLmdldE1lYXN1cmVtZW50cygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgZG91YmxlIGQgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldE1lYXN1cmVtZW50U2V0KG1lYXN1cmVtZW50VHlwZSkubWVkaWFuVW5pdHMoKTsKLSAgICAgICAgbWluRm9yVHlwZSA9IE1hdGgubWluKG1pbkZvclR5cGUsIGQpOwotICAgICAgICBtYXhGb3JUeXBlID0gTWF0aC5tYXgobWF4Rm9yVHlwZSwgZCk7Ci0gICAgICB9Ci0KLSAgICAgIHVuaXRNYXAucHV0KG1lYXN1cmVtZW50VHlwZSwKLSAgICAgICAgICBnZXRVbml0KHVuaXRNYXAuZ2V0KG1lYXN1cmVtZW50VHlwZSksIG1lYXN1cmVtZW50VHlwZSwgbWluRm9yVHlwZSkpOwotCi0gICAgICBkaXZpZGVCeU1hcC5wdXQobWVhc3VyZW1lbnRUeXBlLAotICAgICAgICAgIChkb3VibGUpIGdldFVuaXRzKG1lYXN1cmVtZW50VHlwZSkuZ2V0KHVuaXRNYXAuZ2V0KG1lYXN1cmVtZW50VHlwZSkpKTsKLQotICAgICAgaW50IG51bURpZ2l0c0luTWluID0gY2VpbChNYXRoLmxvZzEwKG1pbkZvclR5cGUpKTsKLSAgICAgIGRlY2ltYWxEaWdpdHNNYXAucHV0KG1lYXN1cmVtZW50VHlwZSwKLSAgICAgICAgICBjZWlsKE1hdGgubWF4KDAsIGNlaWwoTWF0aC5sb2cxMChkaXZpZGVCeU1hcC5nZXQobWVhc3VyZW1lbnRUeXBlKSkpICsgMyAtIG51bURpZ2l0c0luTWluKSkpOwotCi0gICAgICBkaWdpdHNCZWZvcmVEZWNpbWFsTWFwLnB1dChtZWFzdXJlbWVudFR5cGUsCi0gICAgICAgICAgTWF0aC5tYXgoMSwgY2VpbChNYXRoLmxvZzEwKG1heEZvclR5cGUgLyBkaXZpZGVCeU1hcC5nZXQobWVhc3VyZW1lbnRUeXBlKSkpKSk7Ci0KLSAgICAgIGRlY2ltYWxQb2ludE1hcC5wdXQobWVhc3VyZW1lbnRUeXBlLCBkZWNpbWFsRGlnaXRzTWFwLmdldChtZWFzdXJlbWVudFR5cGUpID4gMCA/IDEgOiAwKTsKLQotICAgICAgbWVhc3VyZW1lbnRDb2x1bW5MZW5ndGhNYXAucHV0KG1lYXN1cmVtZW50VHlwZSwgTWF0aC5tYXgobWF4Rm9yVHlwZSA+IDAKLSAgICAgICAgICA/ICBkaWdpdHNCZWZvcmVEZWNpbWFsTWFwLmdldChtZWFzdXJlbWVudFR5cGUpICsgZGVjaW1hbFBvaW50TWFwLmdldChtZWFzdXJlbWVudFR5cGUpCi0gICAgICAgICAgICAgICsgZGVjaW1hbERpZ2l0c01hcC5nZXQobWVhc3VyZW1lbnRUeXBlKQotICAgICAgICAgIDogMSwgdW5pdE1hcC5nZXQobWVhc3VyZW1lbnRUeXBlKS50cmltKCkubGVuZ3RoKCkpKTsKLSAgICB9Ci0KLSAgICB0aGlzLnByaW50U2NvcmUgPSBhcmd1bWVudHMucHJpbnRTY29yZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pdChTdHJpbmcgdXNlclN1cHBsaWVkVW5pdCwgTWVhc3VyZW1lbnRUeXBlIG1lYXN1cmVtZW50VHlwZSwgZG91YmxlIG1pbikgewotICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IHVuaXRzID0gZ2V0VW5pdHMobWVhc3VyZW1lbnRUeXBlKTsKLQotICAgIGlmICh1c2VyU3VwcGxpZWRVbml0ID09IG51bGwpIHsKLSAgICAgIExpc3Q8RW50cnk8U3RyaW5nLCBJbnRlZ2VyPj4gZW50cmllcyA9IFVOSVRfT1JERVJJTkcucmV2ZXJzZSgpLnNvcnRlZENvcHkodW5pdHMuZW50cnlTZXQoKSk7Ci0gICAgICBmb3IgKEVudHJ5PFN0cmluZywgSW50ZWdlcj4gZW50cnkgOiBlbnRyaWVzKSB7Ci0gICAgICAgIGlmIChtaW4gLyBlbnRyeS5nZXRWYWx1ZSgpID49IDEpIHsKLSAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGlmIG5vIHVuaXQgd29ya3MsIGp1c3QgdXNlIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgdW5pdC4KLSAgICAgIHJldHVybiBlbnRyaWVzLmdldChlbnRyaWVzLnNpemUoKSAtIDEpLmdldEtleSgpOwotICAgIH0KLQotICAgIGlmICghdW5pdHMua2V5U2V0KCkuY29udGFpbnModXNlclN1cHBsaWVkVW5pdCkpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJcIiIgKyB1bml0TWFwLmdldChtZWFzdXJlbWVudFR5cGUpICsgIlwiIGlzIG5vdCBhIHZhbGlkIHVuaXQuIik7Ci0gICAgfQotICAgIHJldHVybiB1c2VyU3VwcGxpZWRVbml0OwotICB9Ci0KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRVbml0cyhNZWFzdXJlbWVudFR5cGUgbWVhc3VyZW1lbnRUeXBlKSB7Ci0gICAgTWFwPFN0cmluZywgSW50ZWdlcj4gdW5pdHMgPSBudWxsOwotICAgIGZvciAoRW50cnk8U2NlbmFyaW8sIFNjZW5hcmlvUmVzdWx0PiBlbnRyeSA6IHJ1bi5nZXRNZWFzdXJlbWVudHMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICBpZiAodW5pdHMgPT0gbnVsbCkgewotICAgICAgICB1bml0cyA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0TWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRUeXBlKS5nZXRVbml0TmFtZXMoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghdW5pdHMuZXF1YWxzKGVudHJ5LmdldFZhbHVlKCkuZ2V0TWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRUeXBlKS5nZXRVbml0TmFtZXMoKSkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibWVhc3VyZW1lbnQgc2V0cyBmb3IgcnVuIGNvbnRhaW4gbXVsdGlwbGUsIGluY29tcGF0aWJsZSB1bml0IgotICAgICAgICAgICAgICArICIgc2V0cy4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAodW5pdHMgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInJ1biBoYXMgbm8gbWVhc3VyZW1lbnRzLiIpOwotICAgIH0KLSAgICBpZiAodW5pdHMuaXNFbXB0eSgpKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibm8gdW5pdHMgc3BlY2lmaWVkLiIpOwotICAgIH0KLSAgICByZXR1cm4gdW5pdHM7Ci0gIH0KLQotICAvKioKLSAgICogQSB2YXJpYWJsZSBhbmQgdGhlIHNldCBvZiB2YWx1ZXMgdG8gd2hpY2ggaXQgaGFzIGJlZW4gYXNzaWduZWQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWYXJpYWJsZSB7Ci0gICAgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgZmluYWwgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IHZhbHVlczsKLSAgICBmaW5hbCBpbnQgbWF4TGVuZ3RoOwotICAgIGRvdWJsZSBzdGREZXZpYXRpb247Ci0KLSAgICBWYXJpYWJsZShTdHJpbmcgbmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgIHRoaXMudmFsdWVzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2YodmFsdWVzKTsKLQotICAgICAgaW50IG1heExlbiA9IG5hbWUubGVuZ3RoKCk7Ci0gICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICBtYXhMZW4gPSBNYXRoLm1heChtYXhMZW4sIHZhbHVlLmxlbmd0aCgpKTsKLSAgICAgIH0KLSAgICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuOwotICAgIH0KLQotICAgIFN0cmluZyBnZXQoU2NlbmFyaW8gc2NlbmFyaW8pIHsKLSAgICAgIHJldHVybiBzY2VuYXJpby5nZXRWYXJpYWJsZXMoKS5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgaW50IGluZGV4KFNjZW5hcmlvIHNjZW5hcmlvKSB7Ci0gICAgICByZXR1cm4gdmFsdWVzLmluZGV4T2YoZ2V0KHNjZW5hcmlvKSk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc0ludGVyZXN0aW5nKCkgewotICAgICAgcmV0dXJuIHZhbHVlcy5zaXplKCkgPiAxOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBPcmRlcnMgdGhlIGRpZmZlcmVudCB2YXJpYWJsZXMgYnkgdGhlaXIgc3RhbmRhcmQgZGV2aWF0aW9uLiBUaGlzIHJlc3VsdHMKLSAgICogaW4gYW4gYXBwcm9wcmlhdGUgZ3JvdXBpbmcgb2Ygb3V0cHV0IHZhbHVlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YW5kYXJkRGV2aWF0aW9uT3JkZXJpbmcgZXh0ZW5kcyBPcmRlcmluZzxWYXJpYWJsZT4gewotICAgIHB1YmxpYyBpbnQgY29tcGFyZShWYXJpYWJsZSBhLCBWYXJpYWJsZSBiKSB7Ci0gICAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUoYS5zdGREZXZpYXRpb24sIGIuc3RkRGV2aWF0aW9uKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogT3JkZXJzIHNjZW5hcmlvcyBieSB0aGUgdmFyaWFibGVzLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBCeVZhcmlhYmxlc09yZGVyaW5nIGV4dGVuZHMgT3JkZXJpbmc8U2NlbmFyaW8+IHsKLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoU2NlbmFyaW8gYSwgU2NlbmFyaW8gYikgewotICAgICAgZm9yIChWYXJpYWJsZSB2YXJpYWJsZSA6IHZhcmlhYmxlcykgewotICAgICAgICBpbnQgYVZhbHVlID0gdmFyaWFibGUudmFsdWVzLmluZGV4T2YodmFyaWFibGUuZ2V0KGEpKTsKLSAgICAgICAgaW50IGJWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlcy5pbmRleE9mKHZhcmlhYmxlLmdldChiKSk7Ci0gICAgICAgIGludCBkaWZmID0gYVZhbHVlIC0gYlZhbHVlOwotICAgICAgICBpZiAoZGlmZiAhPSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIGRpZmY7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIHZvaWQgZGlzcGxheVJlc3VsdHMoKSB7Ci0gICAgcHJpbnRWYWx1ZXMoKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICBwcmludFVuaW50ZXJlc3RpbmdWYXJpYWJsZXMoKTsKLSAgICBwcmludENoYXJDb3VudHMoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcmludENoYXJDb3VudHMoKSB7Ci0gICAgaW50IHN5c3RlbU91dENoYXJDb3VudCA9IDA7Ci0gICAgaW50IHN5c3RlbUVyckNoYXJDb3VudCA9IDA7Ci0gICAgZm9yIChTY2VuYXJpb1Jlc3VsdCBzY2VuYXJpb1Jlc3VsdCA6IHJ1bi5nZXRNZWFzdXJlbWVudHMoKS52YWx1ZXMoKSkgewotICAgICAgZm9yIChNZWFzdXJlbWVudFR5cGUgbWVhc3VyZW1lbnRUeXBlIDogTWVhc3VyZW1lbnRUeXBlLnZhbHVlcygpKSB7Ci0gICAgICAgIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0ID0gc2NlbmFyaW9SZXN1bHQuZ2V0TWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRUeXBlKTsKLSAgICAgICAgaWYgKG1lYXN1cmVtZW50U2V0ICE9IG51bGwpIHsKLSAgICAgICAgICBzeXN0ZW1PdXRDaGFyQ291bnQgKz0gbWVhc3VyZW1lbnRTZXQuZ2V0U3lzdGVtT3V0Q2hhckNvdW50KCk7Ci0gICAgICAgICAgc3lzdGVtRXJyQ2hhckNvdW50ICs9IG1lYXN1cmVtZW50U2V0LmdldFN5c3RlbUVyckNoYXJDb3VudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChzeXN0ZW1PdXRDaGFyQ291bnQgPiAwIHx8IHN5c3RlbUVyckNoYXJDb3VudCA+IDApIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb3RlOiBiZW5jaG1hcmtzIHByaW50ZWQgIiArIHN5c3RlbU91dENoYXJDb3VudAotICAgICAgICAgICsgIiBjaGFyYWN0ZXJzIHRvIFN5c3RlbS5vdXQgYW5kICIgKyBzeXN0ZW1FcnJDaGFyQ291bnQgKyAiIGNoYXJhY3RlcnMgdG8gU3lzdGVtLmVyci4iCi0gICAgICAgICAgKyAiIFVzZSAtLWRlYnVnIHRvIHNlZSB0aGlzIG91dHB1dC4iKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnRzIGEgdGFibGUgb2YgdmFsdWVzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHByaW50VmFsdWVzKCkgewotICAgIC8vIGhlYWRlcgotICAgIGZvciAoVmFyaWFibGUgdmFyaWFibGUgOiB2YXJpYWJsZXMpIHsKLSAgICAgIGlmICh2YXJpYWJsZS5pc0ludGVyZXN0aW5nKCkpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiUiICsgdmFyaWFibGUubWF4TGVuZ3RoICsgInMgIiwgdmFyaWFibGUubmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBzaG93IGdyYXBocyBhdCBhbGwgZm9yIDEKLSAgICAvLyBzY2VuYXJpbywgc2luY2UgaXQgbGVhZHMgdG8gdmFjdW91cyBncmFwaHMuCi0gICAgYm9vbGVhbiBzaG93R3JhcGhzID0gc2NlbmFyaW9zLnNpemUoKSA+IDE7Ci0KLSAgICBFbnVtTWFwPE1lYXN1cmVtZW50VHlwZSwgU3RyaW5nPiBudW1iZXJzRm9ybWF0TWFwID0KLSAgICAgICAgbmV3IEVudW1NYXA8TWVhc3VyZW1lbnRUeXBlLCBTdHJpbmc+KE1lYXN1cmVtZW50VHlwZS5jbGFzcyk7Ci0gICAgZm9yIChNZWFzdXJlbWVudFR5cGUgbWVhc3VyZW1lbnRUeXBlIDogb3JkZXJlZE1lYXN1cmVtZW50VHlwZXMpIHsKLSAgICAgIGlmIChtZWFzdXJlbWVudFR5cGUgIT0gdHlwZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJSIgKyBtZWFzdXJlbWVudENvbHVtbkxlbmd0aE1hcC5nZXQobWVhc3VyZW1lbnRUeXBlKSArICJzICIsCi0gICAgICAgICAgICB1bml0TWFwLmdldChtZWFzdXJlbWVudFR5cGUpLnRyaW0oKSk7Ci0gICAgICB9Ci0KLSAgICAgIG51bWJlcnNGb3JtYXRNYXAucHV0KG1lYXN1cmVtZW50VHlwZSwKLSAgICAgICAgICAiJSIgKyBtZWFzdXJlbWVudENvbHVtbkxlbmd0aE1hcC5nZXQobWVhc3VyZW1lbnRUeXBlKQotICAgICAgICAgICAgICArICIuIiArIGRlY2ltYWxEaWdpdHNNYXAuZ2V0KG1lYXN1cmVtZW50VHlwZSkgKyAiZiIKLSAgICAgICAgICAgICAgKyAodHlwZSA9PSBtZWFzdXJlbWVudFR5cGUgPyAiIiA6ICIgIikpOwotICAgIH0KLQotICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlIiArIG1lYXN1cmVtZW50Q29sdW1uTGVuZ3RoTWFwLmdldCh0eXBlKSArICJzIiwgdW5pdE1hcC5nZXQodHlwZSkudHJpbSgpKTsKLSAgICBpZiAoc2hvd0dyYXBocykgewotICAgICAgU3lzdGVtLm91dC5wcmludCgiIGxpbmVhciBydW50aW1lIik7Ci0gICAgfQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0gICAgZG91YmxlIHN1bU9mTG9ncyA9IDAuMDsKLQotICAgIGZvciAoU2NlbmFyaW8gc2NlbmFyaW8gOiBzY2VuYXJpb3MpIHsKLSAgICAgIGZvciAoVmFyaWFibGUgdmFyaWFibGUgOiB2YXJpYWJsZXMpIHsKLSAgICAgICAgaWYgKHZhcmlhYmxlLmlzSW50ZXJlc3RpbmcoKSkgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlIiArIHZhcmlhYmxlLm1heExlbmd0aCArICJzICIsIHZhcmlhYmxlLmdldChzY2VuYXJpbykpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBTY2VuYXJpb1Jlc3VsdCBtZWFzdXJlbWVudCA9IHJ1bi5nZXRNZWFzdXJlbWVudHMoKS5nZXQoc2NlbmFyaW8pOwotICAgICAgc3VtT2ZMb2dzICs9IE1hdGgubG9nKG1lYXN1cmVtZW50LmdldE1lYXN1cmVtZW50U2V0KHR5cGUpLm1lZGlhblVuaXRzKCkpOwotCi0gICAgICBmb3IgKE1lYXN1cmVtZW50VHlwZSBtZWFzdXJlbWVudFR5cGUgOiBvcmRlcmVkTWVhc3VyZW1lbnRUeXBlcykgewotICAgICAgICBpZiAobWVhc3VyZW1lbnRUeXBlICE9IHR5cGUpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZihudW1iZXJzRm9ybWF0TWFwLmdldChtZWFzdXJlbWVudFR5cGUpLAotICAgICAgICAgICAgICBtZWFzdXJlbWVudC5nZXRNZWFzdXJlbWVudFNldChtZWFzdXJlbWVudFR5cGUpLm1lZGlhblVuaXRzKCkgLyBkaXZpZGVCeU1hcC5nZXQobWVhc3VyZW1lbnRUeXBlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgU3lzdGVtLm91dC5wcmludGYobnVtYmVyc0Zvcm1hdE1hcC5nZXQodHlwZSksCi0gICAgICAgICAgbWVhc3VyZW1lbnQuZ2V0TWVhc3VyZW1lbnRTZXQodHlwZSkubWVkaWFuVW5pdHMoKSAvIGRpdmlkZUJ5TWFwLmdldCh0eXBlKSk7Ci0gICAgICBpZiAoc2hvd0dyYXBocykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICVzIiwgYmFyR3JhcGgobWVhc3VyZW1lbnQuZ2V0TWVhc3VyZW1lbnRTZXQodHlwZSkubWVkaWFuVW5pdHMoKSkpOwotICAgICAgfQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgfQotCi0gICAgaWYgKHByaW50U2NvcmUpIHsKLSAgICAgIC8vIGFyaXRobWV0aWMgbWVhbiBvZiBsb2dzLCBha2EgbG9nIG9mIGdlb21ldHJpYyBtZWFuCi0gICAgICBkb3VibGUgbWVhbkxvZ1VuaXRzID0gc3VtT2ZMb2dzIC8gc2NlbmFyaW9zLnNpemUoKTsKLSAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCIlblNjb3JlOiAlLjNmJW4iLCBzY29yZVRyYW5zbGF0aW9uLnRyYW5zbGF0ZShtZWFuTG9nVW5pdHMpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnRzIHZhcmlhYmxlcyB3aXRoIG9ubHkgb25lIHVuaXF1ZSB2YWx1ZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwcmludFVuaW50ZXJlc3RpbmdWYXJpYWJsZXMoKSB7Ci0gICAgZm9yIChWYXJpYWJsZSB2YXJpYWJsZSA6IHZhcmlhYmxlcykgewotICAgICAgaWYgKCF2YXJpYWJsZS5pc0ludGVyZXN0aW5nKCkpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHZhcmlhYmxlLm5hbWUgKyAiOiAiICsgSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KHZhcmlhYmxlLnZhbHVlcykpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBiYXIgb2YgcHJvcG9ydGlvbmFsIHdpZHRoIHRvIHRoZSBzcGVjaWZpZWQKLSAgICogdmFsdWUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBiYXJHcmFwaChkb3VibGUgdmFsdWUpIHsKLSAgICBpbnQgZ3JhcGhMZW5ndGggPSBmbG9vcih2YWx1ZSAvIG1heFZhbHVlICogYmFyR3JhcGhXaWR0aCk7Ci0gICAgZ3JhcGhMZW5ndGggPSBNYXRoLm1heCgxLCBncmFwaExlbmd0aCk7Ci0gICAgZ3JhcGhMZW5ndGggPSBNYXRoLm1pbihiYXJHcmFwaFdpZHRoLCBncmFwaExlbmd0aCk7Ci0gICAgcmV0dXJuIFN0cmluZ3MucmVwZWF0KCI9IiwgZ3JhcGhMZW5ndGgpOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoIk51bWVyaWNDYXN0VGhhdExvc2VzUHJlY2lzaW9uIikKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGZsb29yKGRvdWJsZSBkKSB7Ci0gICAgcmV0dXJuIChpbnQpIGQ7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygiTnVtZXJpY0Nhc3RUaGF0TG9zZXNQcmVjaXNpb24iKQotICBwcml2YXRlIHN0YXRpYyBpbnQgY2VpbChkb3VibGUgZCkgewotICAgIHJldHVybiAoaW50KSBNYXRoLmNlaWwoZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQ291bnRpbmdQcmludFN0cmVhbS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Db3VudGluZ1ByaW50U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTlhNjEuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Db3VudGluZ1ByaW50U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLS8qKgotICogQ291bnRzIGhvdyBtYW55IGNoYXJhY3RlcnMgd2VyZSB3cml0dGVuLgotICovCi1maW5hbCBjbGFzcyBDb3VudGluZ1ByaW50U3RyZWFtIGV4dGVuZHMgUHJpbnRTdHJlYW0gewotCi0gIHByaXZhdGUgZmluYWwgUHJpbnRTdHJlYW0gZGVsZWdhdGU7Ci0gIHByaXZhdGUgaW50IGNvdW50OwotCi0gIENvdW50aW5nUHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gZGVsZWdhdGUpIHsKLSAgICBzdXBlcihkZWxlZ2F0ZSk7Ci0gICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICByZXR1cm4gY291bnQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgZGVsZWdhdGUuZmx1c2goKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICBkZWxlZ2F0ZS5jbG9zZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGNoZWNrRXJyb3IoKSB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlLmNoZWNrRXJyb3IoKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvcigpIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBjbGVhckVycm9yKCkgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7Ci0gICAgY291bnQrKzsKLSAgICBkZWxlZ2F0ZS53cml0ZShiKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgY291bnQgKz0gbGVuZ3RoOwotICAgIGRlbGVnYXRlLndyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHByaW50KGNoYXJbXSBjaGFycykgewotICAgIGNvdW50ICs9IGNoYXJzLmxlbmd0aDsKLSAgICBkZWxlZ2F0ZS5wcmludChjaGFycyk7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHMpIHsKLSAgICBjb3VudCArPSBzLmxlbmd0aCgpOwotICAgIGRlbGVnYXRlLnByaW50KHMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0RhbHZpa1ZtLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0RhbHZpa1ZtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OWNjMjguLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9EYWx2aWtWbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUgZGFsdmlrdm0gcnVuIG9uIEFuZHJvaWQgZGV2aWNlcyB2aWEgdGhlIGFwcF9wcm9jZXNzIGV4ZWN1dGFibGUuCi0gKi8KLWZpbmFsIGNsYXNzIERhbHZpa1ZtIGV4dGVuZHMgVm0gewotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RhbHZpa1ZtKCkgewotICAgIHJldHVybiAiRGFsdmlrIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyB2bU5hbWUoKSB7Ci0gICAgcmV0dXJuICJhcHBfcHJvY2VzcyI7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWbVNwZWNpZmljT3B0aW9ucyhNZWFzdXJlbWVudFR5cGUgdHlwZSwgQXJndW1lbnRzIGFyZ3VtZW50cykgewotICAgIGlmICghYXJndW1lbnRzLmdldENhcHR1cmVWbUxvZygpKSB7Ci0gICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZigpOwotICAgIH0KLQotICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBpZiAoYXJndW1lbnRzLmdldENhcHR1cmVWbUxvZygpKSB7Ci0gICAgICAvLyBUT0RPOiBjdXJyZW50bHkgR0MgZ29lcyB0byBsb2djYXQuCi0gICAgICAvLyByZXN1bHQuYWRkKCItdmVyYm9zZTpnYyIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBQcm9jZXNzQnVpbGRlciBuZXdQcm9jZXNzQnVpbGRlcihGaWxlIHdvcmtpbmdEaXJlY3RvcnksIFN0cmluZyBjbGFzc1BhdGgsCi0gICAgICBJbW11dGFibGVMaXN0PFN0cmluZz4gdm1BcmdzLCBTdHJpbmcgY2xhc3NOYW1lLCBJbW11dGFibGVMaXN0PFN0cmluZz4gYXBwbGljYXRpb25BcmdzKSB7Ci0gICAgUHJvY2Vzc0J1aWxkZXIgcmVzdWx0ID0gbmV3IFByb2Nlc3NCdWlsZGVyKCk7Ci0gICAgcmVzdWx0LmRpcmVjdG9yeSh3b3JraW5nRGlyZWN0b3J5KTsKLSAgICByZXN1bHQuY29tbWFuZCgpLmFkZEFsbCh2bUFyZ3MpOwotICAgIHJlc3VsdC5jb21tYW5kKCkuYWRkKCItRGphdmEuY2xhc3MucGF0aD0iICsgY2xhc3NQYXRoKTsKLSAgICByZXN1bHQuY29tbWFuZCgpLmFkZCh3b3JraW5nRGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0gICAgcmVzdWx0LmNvbW1hbmQoKS5hZGQoY2xhc3NOYW1lKTsKLSAgICByZXN1bHQuY29tbWFuZCgpLmFkZEFsbChhcHBsaWNhdGlvbkFyZ3MpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvRGVidWdNZWFzdXJlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9EZWJ1Z01lYXN1cmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDRiN2YuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9EZWJ1Z01lYXN1cmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3VwcGxpZXI7Ci0KLS8qKgotICogTWVhc3VyZSdzIHRoZSBiZW5jaG1hcmsncyBwZXItdHJpYWwgZXhlY3V0aW9uIHRpbWUuCi0gKi8KLWNsYXNzIERlYnVnTWVhc3VyZXIgZXh0ZW5kcyBNZWFzdXJlciB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgcmVwczsKLQotICBEZWJ1Z01lYXN1cmVyKGludCByZXBzKSB7Ci0gICAgY2hlY2tBcmd1bWVudChyZXBzID4gMCk7Ci0gICAgdGhpcy5yZXBzID0gcmVwczsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgTWVhc3VyZW1lbnRTZXQgcnVuKFN1cHBsaWVyPENvbmZpZ3VyZWRCZW5jaG1hcms+IHRlc3RTdXBwbGllcikKLSAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgIENvbmZpZ3VyZWRCZW5jaG1hcmsgYmVuY2htYXJrID0gdGVzdFN1cHBsaWVyLmdldCgpOwotICAgIGJlbmNobWFyay5ydW4ocmVwcyk7Ci0gICAgYmVuY2htYXJrLmNsb3NlKCk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvRW52aXJvbm1lbnQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjMjgxMy4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0Vudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgZGVzY3JpcHRpb24gb2YgYW4gZW52aXJvbm1lbnQgaW4gd2hpY2ggYmVuY2htYXJrcyBhcmUgcnVuLgotICoKLSAqIFdBUk5JTkc6IGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHN0b3JlZCBvbiB0aGUgYXBwIGVuZ2luZSBzZXJ2ZXIuIElmIGFueSBjaGFuZ2VzCi0gKiBhcmUgbWFkZSB0byB0aGlzIGNsYXNzLCBhIGRlc2VyaWFsaXphdGlvbiBhZGFwdGVyIG11c3QgYmUgd3JpdHRlbiBmb3IgdGhpcyBjbGFzcyB0byBlbnN1cmUKLSAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotICoKLSAqIDxwPkd3dC1zYWZlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotQEd3dENvbXBhdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnZpcm9ubWVudAotICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIC8qIGZvciBHV1QgU2VyaWFsaXphdGlvbiAqLyB7Ci0gIHByaXZhdGUgLypmaW5hbCovIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlNYXA7Ci0KLSAgcHVibGljIEVudmlyb25tZW50KE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlNYXApIHsKLSAgICB0aGlzLnByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KHByb3BlcnR5TWFwKTsKLSAgfQotCi0gIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgcmV0dXJuIHByb3BlcnR5TWFwOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIHJldHVybiBvIGluc3RhbmNlb2YgRW52aXJvbm1lbnQKLSAgICAgICAgJiYgKChFbnZpcm9ubWVudCkgbykucHJvcGVydHlNYXAuZXF1YWxzKHByb3BlcnR5TWFwKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIHJldHVybiBwcm9wZXJ0eU1hcC5oYXNoQ29kZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIHByb3BlcnR5TWFwLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgcHJpdmF0ZSBFbnZpcm9ubWVudCgpIHt9IC8vIGZvciBHV1QgU2VyaWFsaXphdGlvbgotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9FbnZpcm9ubWVudEdldHRlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9FbnZpcm9ubWVudEdldHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjcxNTBiLi4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvRW52aXJvbm1lbnRHZXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTXVsdGltYXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNdWx0aXNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEVudmlyb25tZW50R2V0dGVyIHsKLQotICBwdWJsaWMgRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnRTbmFwc2hvdCgpIHsKLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHN5c1Byb3BzID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pIChNYXApIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvLyBTb21ldGltZXMgamF2YS5ydW50aW1lLnZlcnNpb24gaXMgbW9yZSBkZXNjcmlwdGl2ZSB0aGFuIGphdmEudmVyc2lvbgotICAgIFN0cmluZyB2ZXJzaW9uID0gc3lzUHJvcHMuZ2V0KCJqYXZhLnZlcnNpb24iKTsKLSAgICBTdHJpbmcgYWx0ZXJuYXRlVmVyc2lvbiA9IHN5c1Byb3BzLmdldCgiamF2YS5ydW50aW1lLnZlcnNpb24iKTsKLSAgICBpZiAoYWx0ZXJuYXRlVmVyc2lvbiAhPSBudWxsICYmIGFsdGVybmF0ZVZlcnNpb24ubGVuZ3RoKCkgPiB2ZXJzaW9uLmxlbmd0aCgpKSB7Ci0gICAgICB2ZXJzaW9uID0gYWx0ZXJuYXRlVmVyc2lvbjsKLSAgICB9Ci0gICAgcHJvcGVydHlNYXAucHV0KCJqcmUudmVyc2lvbiIsIHZlcnNpb24pOwotCi0gICAgcHJvcGVydHlNYXAucHV0KCJqcmUudm1uYW1lIiwgc3lzUHJvcHMuZ2V0KCJqYXZhLnZtLm5hbWUiKSk7Ci0gICAgcHJvcGVydHlNYXAucHV0KCJqcmUudm12ZXJzaW9uIiwgc3lzUHJvcHMuZ2V0KCJqYXZhLnZtLnZlcnNpb24iKSk7Ci0gICAgcHJvcGVydHlNYXAucHV0KCJqcmUuYXZhaWxhYmxlUHJvY2Vzc29ycyIsCi0gICAgICAgIEludGVnZXIudG9TdHJpbmcoUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpKSk7Ci0KLSAgICBTdHJpbmcgb3NOYW1lID0gc3lzUHJvcHMuZ2V0KCJvcy5uYW1lIik7Ci0gICAgcHJvcGVydHlNYXAucHV0KCJvcy5uYW1lIiwgb3NOYW1lKTsKLSAgICBwcm9wZXJ0eU1hcC5wdXQoIm9zLnZlcnNpb24iLCBzeXNQcm9wcy5nZXQoIm9zLnZlcnNpb24iKSk7Ci0gICAgcHJvcGVydHlNYXAucHV0KCJvcy5hcmNoIiwgc3lzUHJvcHMuZ2V0KCJvcy5hcmNoIikpOwotCi0gICAgdHJ5IHsKLSAgICAgIHByb3BlcnR5TWFwLnB1dCgiaG9zdC5uYW1lIiwgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKSk7Ci0gICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gaWdub3JlZCkgewotICAgIH0KLQotICAgIGlmIChvc05hbWUuZXF1YWxzKCJMaW51eCIpKSB7Ci0gICAgICBnZXRMaW51eEVudmlyb25tZW50KHByb3BlcnR5TWFwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IEVudmlyb25tZW50KHByb3BlcnR5TWFwKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnZXRMaW51eEVudmlyb25tZW50KE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlNYXApIHsKLSAgICAvLyB0aGUgZm9sbG93aW5nIHByb2JhYmx5IGRvZXNuJ3Qgd29yayBvbiBBTEwgbGludXgKLSAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gY3B1SW5mbyA9IHByb3BlcnRpZXNGcm9tTGludXhGaWxlKCIvcHJvYy9jcHVpbmZvIik7Ci0gICAgcHJvcGVydHlNYXAucHV0KCJob3N0LmNwdXMiLCBJbnRlZ2VyLnRvU3RyaW5nKGNwdUluZm8uZ2V0KCJwcm9jZXNzb3IiKS5zaXplKCkpKTsKLSAgICBTdHJpbmcgcyA9ICJjcHUgY29yZXMiOwotICAgIHByb3BlcnR5TWFwLnB1dCgiaG9zdC5jcHUuY29yZXMiLCBkZXNjcmliZShjcHVJbmZvLCBzKSk7Ci0gICAgcHJvcGVydHlNYXAucHV0KCJob3N0LmNwdS5uYW1lcyIsIGRlc2NyaWJlKGNwdUluZm8sICJtb2RlbCBuYW1lIikpOwotICAgIHByb3BlcnR5TWFwLnB1dCgiaG9zdC5jcHUuY2FjaGVzaXplIiwgZGVzY3JpYmUoY3B1SW5mbywgImNhY2hlIHNpemUiKSk7Ci0KLSAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gbWVtSW5mbyA9IHByb3BlcnRpZXNGcm9tTGludXhGaWxlKCIvcHJvYy9tZW1pbmZvIik7Ci0gICAgLy8gVE9ETyByZWRvIG1lbUluZm8udG9TdHJpbmcoKSBzbyB3ZSBkb24ndCBnZXQgc3F1YXJlIGJyYWNrZXRzCi0gICAgcHJvcGVydHlNYXAucHV0KCJob3N0Lm1lbW9yeS5waHlzaWNhbCIsIG1lbUluZm8uZ2V0KCJNZW1Ub3RhbCIpLnRvU3RyaW5nKCkpOwotICAgIHByb3BlcnR5TWFwLnB1dCgiaG9zdC5tZW1vcnkuc3dhcCIsIG1lbUluZm8uZ2V0KCJTd2FwVG90YWwiKS50b1N0cmluZygpKTsKLQotICAgIGdldEFuZHJvaWRFbnZpcm9ubWVudChwcm9wZXJ0eU1hcCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ2V0QW5kcm9pZEVudmlyb25tZW50KE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlNYXApIHsKLSAgICB0cnkgewotICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBnZXRBbmRyb2lkUHJvcGVydGllcygpOwotICAgICAgU3RyaW5nIG1hbnVmYWN0dXJlciA9IG1hcC5nZXQoInJvLnByb2R1Y3QubWFudWZhY3R1cmVyIik7Ci0gICAgICBTdHJpbmcgZGV2aWNlID0gbWFwLmdldCgicm8ucHJvZHVjdC5kZXZpY2UiKTsKLSAgICAgIHByb3BlcnR5TWFwLnB1dCgiYW5kcm9pZC5kZXZpY2UiLCBtYW51ZmFjdHVyZXIgKyAiICIgKyBkZXZpY2UpOyAvLyAiTW90b3JvbGEgc2hvbGVzIgotCi0gICAgICBTdHJpbmcgYnJhbmQgPSBtYXAuZ2V0KCJyby5wcm9kdWN0LmJyYW5kIik7Ci0gICAgICBTdHJpbmcgbW9kZWwgPSBtYXAuZ2V0KCJyby5wcm9kdWN0Lm1vZGVsIik7Ci0gICAgICBwcm9wZXJ0eU1hcC5wdXQoImFuZHJvaWQubW9kZWwiLCBicmFuZCArICIgIiArIG1vZGVsKTsgLy8gInZlcml6b24gRHJvaWQiCi0KLSAgICAgIFN0cmluZyByZWxlYXNlID0gbWFwLmdldCgicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIik7Ci0gICAgICBTdHJpbmcgaWQgPSBtYXAuZ2V0KCJyby5idWlsZC5pZCIpOwotICAgICAgcHJvcGVydHlNYXAucHV0KCJhbmRyb2lkLnJlbGVhc2UiLCByZWxlYXNlICsgIiAiICsgaWQpOyAvLyAiR2luZ2VyYnJlYWQgR1JIMDdCIgotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVzY3JpYmUoTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGNwdUluZm8sIFN0cmluZyBzKSB7Ci0gICAgQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBjcHVJbmZvLmdldChzKTsKLSAgICAvLyBUT0RPIHJlZG8gdGhlIEltbXV0YWJsZU11bHRpc2V0LnRvU3RyaW5nKCkgY2FsbCBzbyB3ZSBkb24ndCBnZXQgc3F1YXJlIGJyYWNrZXRzCi0gICAgcmV0dXJuIChzdHJpbmdzLnNpemUoKSA9PSAxKQotICAgICAgICA/IHN0cmluZ3MuaXRlcmF0b3IoKS5uZXh0KCkKLSAgICAgICAgOiBJbW11dGFibGVNdWx0aXNldC5jb3B5T2Yoc3RyaW5ncykudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMtZmlsZSBsaWtlCi0gICAqIHJlYWRlci4gVW5saWtlIHN0YW5kYXJkIEphdmEgcHJvcGVydGllcyBmaWxlcywge0Bjb2RlIHJlYWRlcn0gaXMgYWxsb3dlZAotICAgKiB0byBsaXN0IHRoZSBzYW1lIHByb3BlcnR5IG11bHRpcGxlIHRpbWVzLiBDb21tZW50cyBldGMuIGFyZSB1bnN1cHBvcnRlZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzRmlsZVRvTXVsdGltYXAoUmVhZGVyIHJlYWRlcikKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgSW1tdXRhYmxlTXVsdGltYXAuQnVpbGRlcjxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gSW1tdXRhYmxlTXVsdGltYXAuYnVpbGRlcigpOwotICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0KLSAgICBTdHJpbmcgbGluZTsKLSAgICB3aGlsZSgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgIFN0cmluZ1tdIHBhcnRzID0gbGluZS5zcGxpdCgiXFxzKlxcOlxccyoiLCAyKTsKLSAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMikgewotICAgICAgICByZXN1bHQucHV0KHBhcnRzWzBdLCBwYXJ0c1sxXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGluLmNsb3NlKCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0LmJ1aWxkKCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllc0Zyb21MaW51eEZpbGUoU3RyaW5nIGZpbGUpIHsKLSAgICB0cnkgewotICAgICAgUHJvY2VzcyBwcm9jZXNzID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhuZXcgU3RyaW5nW117Ii9iaW4vY2F0IiwgZmlsZX0pOwotICAgICAgcmV0dXJuIHByb3BlcnRpZXNGaWxlVG9NdWx0aW1hcCgKLSAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLCAiSVNPLTg4NTktMSIpKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gSW1tdXRhYmxlTXVsdGltYXAub2YoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgRW52aXJvbm1lbnQgc25hcHNob3QgPSBuZXcgRW52aXJvbm1lbnRHZXR0ZXIoKS5nZXRFbnZpcm9ubWVudFNuYXBzaG90KCk7Ci0gICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogc25hcHNob3QuZ2V0UHJvcGVydGllcygpLmVudHJ5U2V0KCkpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlbnRyeS5nZXRLZXkoKSArICIgIiArIGVudHJ5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbmRyb2lkIHByb3BlcnRpZXMgYXJlIGF2YWlsYWJsZSBmcm9tIGFkYiBzaGVsbCAvc3lzdGVtL2Jpbi9nZXRwcm9wLiBUaGF0Ci0gICAqIHByb2dyYW0gcHJpbnRzIEFuZHJvaWQgc3lzdGVtIHByb3BlcnRpZXMgaW4gdGhpcyBmb3JtYXQ6Ci0gICAqIFtyby5wcm9kdWN0Lm1vZGVsXTogW0Ryb2lkXQotICAgKiBbcm8ucHJvZHVjdC5icmFuZF06IFt2ZXJpem9uXQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBbmRyb2lkUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgIFByb2Nlc3MgcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHsiL3N5c3RlbS9iaW4vZ2V0cHJvcCJ9KTsKLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0gICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jZXNzLmdldElucHV0U3RyZWFtKCksICJJU08tODg1OS0xIikpOwotCi0gICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXFsoW15cXF1dKilcXF06IFxcWyhbXlxcXV0qKVxcXSIpOwotICAgIFN0cmluZyBsaW5lOwotICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0gICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgcmVzdWx0LnB1dChtYXRjaGVyLmdyb3VwKDEpLCBtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9JblByb2Nlc3NSdW5uZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvSW5Qcm9jZXNzUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjQ3ODguLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9JblByb2Nlc3NSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLkV4Y2VwdGlvbkZyb21Vc2VyQ29kZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN1cHBsaWVyOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBFeGVjdXRlcyBhIGJlbmNobWFyayBpbiB0aGUgY3VycmVudCBWTS4KLSAqLwotZmluYWwgY2xhc3MgSW5Qcm9jZXNzUnVubmVyIHsKLQotICBwdWJsaWMgdm9pZCBydW4oU3RyaW5nLi4uIGFyZ3MpIHsKLSAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gQXJndW1lbnRzLnBhcnNlKGFyZ3MpOwotCi0gICAgU2NlbmFyaW9TZWxlY3Rpb24gc2NlbmFyaW9TZWxlY3Rpb24gPSBuZXcgU2NlbmFyaW9TZWxlY3Rpb24oYXJndW1lbnRzKTsKLQotICAgIHRyeSB7Ci0gICAgICBNZWFzdXJlciBtZWFzdXJlciA9IGdldE1lYXN1cmVyKGFyZ3VtZW50cyk7Ci0gICAgICBMaXN0PFNjZW5hcmlvPiBzY2VuYXJpb3MgPSBzY2VuYXJpb1NlbGVjdGlvbi5zZWxlY3QoKTsKLSAgICAgIC8vIFdlIG9ubHkgZXhwZWN0IG9uZSBzY2VuYXJpbyByaWdodCBub3cgLSBpZiB3ZSBoYXZlIG1vcmUsIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZy4KLSAgICAgIC8vIFRoaXMgbWF0dGVycyBmb3IgdGhpbmdzIGxpa2UgcmVhZGluZyB0aGUgbWVhc3VyZW1lbnRzLiBUaGlzIGlzIG9ubHkgZG9uZSBvbmNlLCBzbyBpZgotICAgICAgLy8gbXVsdGlwbGUgc2NlbmFyaW9zIGFyZSBleGVjdXRlZCwgdGhleSB3aWxsIGJlIGlnbm9yZWQhCi0gICAgICBpZiAoc2NlbmFyaW9zLnNpemUoKSAhPSAxKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYXJndW1lbnRzIHRvIHN1YnByb2Nlc3MuIEV4cGVjdGVkIGV4YWN0bHkgb25lICIKLSAgICAgICAgICAgICsgInNjZW5hcmlvIGJ1dCBnb3QgIiArIHNjZW5hcmlvcy5zaXplKCkpOwotICAgICAgfQotICAgICAgU2NlbmFyaW8gc2NlbmFyaW8gPSBzY2VuYXJpb3MuZ2V0KDApOwotCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0aW5nICIgKyBzY2VuYXJpbyk7Ci0gICAgICBNZWFzdXJlbWVudFNldCBtZWFzdXJlbWVudFNldCA9IHJ1bihzY2VuYXJpb1NlbGVjdGlvbiwgc2NlbmFyaW8sIG1lYXN1cmVyKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhcmd1bWVudHMuZ2V0TWFya2VyKCkgKyBKc29uLm1lYXN1cmVtZW50U2V0VG9Kc29uKG1lYXN1cmVtZW50U2V0KSk7Ci0gICAgfSBjYXRjaCAoVXNlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBlOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uRnJvbVVzZXJDb2RlRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBNZWFzdXJlbWVudFNldCBydW4oZmluYWwgU2NlbmFyaW9TZWxlY3Rpb24gc2NlbmFyaW9TZWxlY3Rpb24sIGZpbmFsIFNjZW5hcmlvIHNjZW5hcmlvLAotICAgICAgTWVhc3VyZXIgbWVhc3VyZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgIFN1cHBsaWVyPENvbmZpZ3VyZWRCZW5jaG1hcms+IHN1cHBsaWVyID0gbmV3IFN1cHBsaWVyPENvbmZpZ3VyZWRCZW5jaG1hcms+KCkgewotICAgICAgQE92ZXJyaWRlIHB1YmxpYyBDb25maWd1cmVkQmVuY2htYXJrIGdldCgpIHsKLSAgICAgICAgcmV0dXJuIHNjZW5hcmlvU2VsZWN0aW9uLmNyZWF0ZUJlbmNobWFyayhzY2VuYXJpbyk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7Ci0gICAgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKLSAgICBtZWFzdXJlci5zZXRMb2dTdHJlYW0ob3V0KTsKLSAgICBDb3VudGluZ1ByaW50U3RyZWFtIGNvdW50ZWRPdXQgPSBuZXcgQ291bnRpbmdQcmludFN0cmVhbShvdXQpOwotICAgIENvdW50aW5nUHJpbnRTdHJlYW0gY291bnRlZEVyciA9IG5ldyBDb3VudGluZ1ByaW50U3RyZWFtKGVycik7Ci0gICAgU3lzdGVtLnNldE91dChjb3VudGVkT3V0KTsKLSAgICBTeXN0ZW0uc2V0RXJyKGNvdW50ZWRFcnIpOwotICAgIHRyeSB7Ci0gICAgICBNZWFzdXJlbWVudFNldCBtZWFzdXJlbWVudFNldCA9IG1lYXN1cmVyLnJ1bihzdXBwbGllcik7Ci0gICAgICBpZiAobWVhc3VyZW1lbnRTZXQgIT0gbnVsbCkgewotICAgICAgICBtZWFzdXJlbWVudFNldCA9IG1lYXN1cmVtZW50U2V0LnBsdXNDaGFyQ291bnRzKAotICAgICAgICAgICAgY291bnRlZE91dC5nZXRDb3VudCgpLCBjb3VudGVkRXJyLmdldENvdW50KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIG1lYXN1cmVtZW50U2V0OwotICAgIH0gZmluYWxseSB7Ci0gICAgICBTeXN0ZW0uc2V0T3V0KG91dCk7Ci0gICAgICBTeXN0ZW0uc2V0RXJyKGVycik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBNZWFzdXJlciBnZXRNZWFzdXJlcihBcmd1bWVudHMgYXJndW1lbnRzKSB7Ci0gICAgaWYgKGFyZ3VtZW50cy5nZXRNZWFzdXJlbWVudFR5cGUoKSA9PSBNZWFzdXJlbWVudFR5cGUuVElNRSkgewotICAgICAgcmV0dXJuIG5ldyBUaW1lTWVhc3VyZXIoYXJndW1lbnRzLmdldFdhcm11cE1pbGxpcygpLCBhcmd1bWVudHMuZ2V0UnVuTWlsbGlzKCkpOwotICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmdldE1lYXN1cmVtZW50VHlwZSgpID09IE1lYXN1cmVtZW50VHlwZS5JTlNUQU5DRSkgewotICAgICAgcmV0dXJuIG5ldyBJbnN0YW5jZXNBbGxvY2F0aW9uTWVhc3VyZXIoKTsKLSAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5nZXRNZWFzdXJlbWVudFR5cGUoKSA9PSBNZWFzdXJlbWVudFR5cGUuTUVNT1JZKSB7Ci0gICAgICByZXR1cm4gbmV3IE1lbW9yeUFsbG9jYXRpb25NZWFzdXJlcigpOwotICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmdldE1lYXN1cmVtZW50VHlwZSgpID09IE1lYXN1cmVtZW50VHlwZS5ERUJVRykgewotICAgICAgcmV0dXJuIG5ldyBEZWJ1Z01lYXN1cmVyKGFyZ3VtZW50cy5nZXREZWJ1Z1JlcHMoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVucmVjb2duaXplZCBtZWFzdXJlbWVudCB0eXBlOiAiCi0gICAgICAgICAgKyBhcmd1bWVudHMuZ2V0TWVhc3VyZW1lbnRUeXBlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgbmV3IEluUHJvY2Vzc1J1bm5lcigpLnJ1bihhcmdzKTsKLSAgICAgIFN5c3RlbS5leGl0KDApOyAvLyB1c2VyIGNvZGUgbWF5IGhhdmUgbGVhdmUgbm9uLWRhZW1vbiB0aHJlYWRzIGJlaGluZCEKLSAgICB9IGNhdGNoIChVc2VyRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUuZGlzcGxheSgpOyAvLyBUT0RPOiBzZW5kIHRoaXMgdG8gdGhlIGhvc3QgcHJvY2VzcwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKExvZ0NvbnN0YW50cy5DQUxJUEVSX0xPR19QUkVGSVggKyBMb2dDb25zdGFudHMuU0NFTkFSSU9TX0ZJTklTSEVEKTsKLSAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBQcmludFN0cmVhbSBudWxsUHJpbnRTdHJlYW0oKSB7Ci0gICAgcmV0dXJuIG5ldyBQcmludFN0cmVhbShuZXcgT3V0cHV0U3RyZWFtKCkgewotICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHt9Ci0gICAgfSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvSW5zdGFuY2VzQWxsb2NhdGlvbk1lYXN1cmVyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0luc3RhbmNlc0FsbG9jYXRpb25NZWFzdXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmU4OWM3Li4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvSW5zdGFuY2VzQWxsb2NhdGlvbk1lYXN1cmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEluc3RhbmNlc0FsbG9jYXRpb25NZWFzdXJlciBleHRlbmRzIEFsbG9jYXRpb25NZWFzdXJlciB7Ci0KLSAgSW5zdGFuY2VzQWxsb2NhdGlvbk1lYXN1cmVyKCkgewotICAgIHR5cGUgPSAiaW5zdGFuY2UiOwotICB9Ci0KLSAgQE92ZXJyaWRlIHByb3RlY3RlZCBsb25nIGluY3JlbWVudEFsbG9jYXRpb25Db3VudChsb25nIG9sZEFsbG9jYXRpb25Db3VudCwgaW50IGFycmF5Q291bnQsCi0gICAgICBsb25nIHNpemUpIHsKLSAgICByZXR1cm4gb2xkQWxsb2NhdGlvbkNvdW50ICsgMTsKLSAgfQotCi0gIEBPdmVycmlkZSBwcm90ZWN0ZWQgTWVhc3VyZW1lbnQgZ2V0TWVhc3VyZW1lbnQoQ29uZmlndXJlZEJlbmNobWFyayBiZW5jaG1hcmssIGxvbmcgYWxsb2NhdGlvbnMpIHsKLSAgICByZXR1cm4gbmV3IE1lYXN1cmVtZW50KGJlbmNobWFyay5pbnN0YW5jZVVuaXROYW1lcygpLCBhbGxvY2F0aW9ucywKLSAgICAgICAgYmVuY2htYXJrLmluc3RhbmNlc1RvVW5pdHMoYWxsb2NhdGlvbnMpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Kc29uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0pzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzZjgwOS4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0pzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkRlc2VyaWFsaXphdGlvbkNvbnRleHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25EZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QcmltaXRpdmU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25TZXJpYWxpemF0aW9uQ29udGV4dDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblNlcmlhbGl6ZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0vKioKLSAqIE9yZGluYXJpbHkgc2VyaWFsaXphdGlvbiBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGNsYXNzIHRoYXQgaXMgYmVpbmcgc2VyaWFsaXplZC4gSG93ZXZlciwKLSAqIG1hbnkgb2YgdGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBieSBHV1QsIHdoaWNoIGRpZXMgd2hlbiBpdCBzZWVzIEdzb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKc29uIHsKLSAgLyoqCi0gICAqIFRoaXMgR3NvbiBpbnN0YW5jZSBtdXN0IGJlIHVzZWQgd2hlbiBzZXJpYWxpemluZyBhIGNsYXNzIHRoYXQgaW5jbHVkZXMgYSBSdW4gYXMgYSBtZW1iZXIKLSAgICogb3IgYXMgYSBtZW1iZXIgb2YgYSBtZW1iZXIgKGV0Yy4pLCBvdGhlcndpc2UgdGhlIE1hcDxTY2VuYXJpbywgU2NlbmFyaW9SZXN1bHQ+IHdpbGwgbm90Ci0gICAqIGJlIGNvcnJlY3RseSBzZXJpYWxpemVkLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3NvbiBHU09OX0lOU1RBTkNFID0KLSAgICAgIG5ldyBHc29uQnVpbGRlcigpCi0gICAgICAgICAgLnJlZ2lzdGVyVHlwZUFkYXB0ZXIoRGF0ZS5jbGFzcywgbmV3IERhdGVUeXBlQWRhcHRlcigpKQotICAgICAgICAgIC5yZWdpc3RlclR5cGVBZGFwdGVyKFJ1bi5jbGFzcywgbmV3IFJ1blR5cGVBZGFwdGVyKCkpCi0gICAgICAgICAgLnJlZ2lzdGVyVHlwZUFkYXB0ZXIoTWVhc3VyZW1lbnQuY2xhc3MsIG5ldyBNZWFzdXJlbWVudERlc2VyaWFsaXplcigpKQotICAgICAgICAgIC5jcmVhdGUoKTsKLQotICBwdWJsaWMgc3RhdGljIEdzb24gZ2V0R3Nvbkluc3RhbmNlKCkgewotICAgIHJldHVybiBHU09OX0lOU1RBTkNFOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWVhc3VyZW1lbnRTZXRUb0pzb24oTWVhc3VyZW1lbnRTZXQgbWVhc3VyZW1lbnRTZXQpIHsKLSAgICByZXR1cm4gbmV3IEdzb24oKS50b0pzb24obWVhc3VyZW1lbnRTZXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHRzIHRvIGV4dHJhY3QgYSBNZWFzdXJlbWVudFNldCBmcm9tIGEgc3RyaW5nLCBhc3N1bWluZyBpdCBpcyBKU09OLiBJZiB0aGlzIGZhaWxzLCBpdAotICAgKiB0cmllcyB0byBleHRyYWN0IGl0IGZyb20gdGhlIHN0cmluZyBhc3N1bWluZyBpdCBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGRvdWJsZSB2YWx1ZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0RnJvbUpzb24oU3RyaW5nIG1lYXN1cmVtZW50U2V0SnNvbikgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gZ2V0R3Nvbkluc3RhbmNlKCkuZnJvbUpzb24obWVhc3VyZW1lbnRTZXRKc29uLCBNZWFzdXJlbWVudFNldC5jbGFzcyk7Ci0gICAgfSBjYXRjaCAoSnNvblBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIG1pZ2h0IGJlIGFuIG9sZCBNZWFzdXJlbWVudFNldCwgc28gZmFsbCBiYWNrIG9uIGZhaWx1cmUgdG8gdGhlIG9sZCwgc3BhY2Ugc2VwYXJhdGVkCi0gICAgICAvLyBzZXJpYWxpemF0aW9uIG1ldGhvZC4KLSAgICAgIHRyeSB7Ci0gICAgICAgIFN0cmluZ1tdIG1lYXN1cmVtZW50U3RyaW5ncyA9IG1lYXN1cmVtZW50U2V0SnNvbi5zcGxpdCgiXFxzKyIpOwotICAgICAgICBMaXN0PE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE1lYXN1cmVtZW50PigpOwotICAgICAgICBmb3IgKFN0cmluZyBzIDogbWVhc3VyZW1lbnRTdHJpbmdzKSB7Ci0gICAgICAgICAgbWVhc3VyZW1lbnRzLmFkZCgKLSAgICAgICAgICAgICAgbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigibnMiLCAxLCAidXMiLCAxMDAwLCAibXMiLCAxMDAwMDAwLCAicyIsIDEwMDAwMDAwMDApLAotICAgICAgICAgICAgICBEb3VibGUudmFsdWVPZihzKSwgRG91YmxlLnZhbHVlT2YocykpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBzZWNvbmRzIGFuZCB2YXJpYXRpb25zIGlzIHRoZSBkZWZhdWx0IHVuaXQKLSAgICAgICAgcmV0dXJuIG5ldyBNZWFzdXJlbWVudFNldChtZWFzdXJlbWVudHMudG9BcnJheShuZXcgTWVhc3VyZW1lbnRbbWVhc3VyZW1lbnRzLnNpemUoKV0pKTsKLSAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IGEgbWVhc3VyZW1lbnQgc2V0OiAiICsgbWVhc3VyZW1lbnRTZXRKc29uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0RnJvbUpzb24oSnNvbk9iamVjdCBtZWFzdXJlbWVudFNldEpzb24pIHsKLSAgICByZXR1cm4gZ2V0R3Nvbkluc3RhbmNlKCkuZnJvbUpzb24obWVhc3VyZW1lbnRTZXRKc29uLCBNZWFzdXJlbWVudFNldC5jbGFzcyk7Ci0gIH0KLQotICAvKioKLSAgICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkhCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZWFzdXJlbWVudERlc2VyaWFsaXplciBpbXBsZW1lbnRzIEpzb25EZXNlcmlhbGl6ZXI8TWVhc3VyZW1lbnQ+IHsKLSAgICBAT3ZlcnJpZGUgcHVibGljIE1lYXN1cmVtZW50IGRlc2VyaWFsaXplKEpzb25FbGVtZW50IGpzb25FbGVtZW50LCBUeXBlIHR5cGUsCi0gICAgICAgIEpzb25EZXNlcmlhbGl6YXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBKc29uUGFyc2VFeGNlcHRpb24gewotICAgICAgSnNvbk9iamVjdCBvYmogPSBqc29uRWxlbWVudC5nZXRBc0pzb25PYmplY3QoKTsKLSAgICAgIGlmIChvYmouaGFzKCJyYXciKSAmJiBvYmouaGFzKCJwcm9jZXNzZWQiKSkgewotICAgICAgICByZXR1cm4gbmV3IE1lYXN1cmVtZW50KAotICAgICAgICAgICAgY29udGV4dC48TWFwPFN0cmluZywgSW50ZWdlcj4+ZGVzZXJpYWxpemUob2JqLmdldCgidW5pdE5hbWVzIiksCi0gICAgICAgICAgICAgICAgbmV3IFR5cGVUb2tlbjxNYXA8U3RyaW5nLCBJbnRlZ2VyPj4oKSB7fS5nZXRUeXBlKCkpLAotICAgICAgICAgICAgY29udGV4dC48RG91YmxlPmRlc2VyaWFsaXplKG9iai5nZXQoInJhdyIpLCBEb3VibGUuY2xhc3MpLAotICAgICAgICAgICAgY29udGV4dC48RG91YmxlPmRlc2VyaWFsaXplKG9iai5nZXQoInByb2Nlc3NlZCIpLCBEb3VibGUuY2xhc3MpKTsKLSAgICAgIH0KLSAgICAgIGlmIChvYmouaGFzKCJuYW5vc1BlclJlcCIpICYmIG9iai5oYXMoInVuaXRzUGVyUmVwIikgJiYgb2JqLmhhcygidW5pdE5hbWVzIikpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWFzdXJlbWVudCgKLSAgICAgICAgICAgIGNvbnRleHQuPE1hcDxTdHJpbmcsIEludGVnZXI+PmRlc2VyaWFsaXplKG9iai5nZXQoInVuaXROYW1lcyIpLAotICAgICAgICAgICAgICAgIG5ldyBUeXBlVG9rZW48TWFwPFN0cmluZywgSW50ZWdlcj4+KCkge30uZ2V0VHlwZSgpKSwKLSAgICAgICAgICAgIGNvbnRleHQuPERvdWJsZT5kZXNlcmlhbGl6ZShvYmouZ2V0KCJuYW5vc1BlclJlcCIpLCBEb3VibGUuY2xhc3MpLAotICAgICAgICAgICAgY29udGV4dC48RG91YmxlPmRlc2VyaWFsaXplKG9iai5nZXQoInVuaXRzUGVyUmVwIiksIERvdWJsZS5jbGFzcykpOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IEpzb25QYXJzZUV4Y2VwdGlvbihvYmoudG9TdHJpbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgYWRhcHRlciBpcyBuZWNlc3NhcnkgYmVjYXVzZSBnc29uIGRvZXNuJ3QgaGFuZGxlIE1hcHMgbW9yZSBjb21wbGV4IHRoYW4gTWFwPFN0cmluZywgLi4uPgotICAgKiBpbiBhIHVzZWZ1bCB3YXkuIEZvciBleGFtcGxlLCBNYXA8U2NlbmFyaW8sIFNjZW5hcmlvUmVzdWx0PidzIHNlcmlhbGl6ZWQgdmVyc2lvbiBzaW1wbHkgdXNlcwotICAgKiBTY2VuYXJpby50b1N0cmluZygpIGFzIHRoZSBrZXlzLiBUaGlzIGFkYXB0ZXIgc3RvcmVzIHRoaXMgTWFwIGFzIGxpc3RzIG9mCi0gICAqIEtleVZhbHVlUGFpcjxTY2VuYXJpbywgU2NlbmFyaW9SZXN1bHQ+IGluc3RlYWQsIHRvIHByZXNlcnZlIHRoZSBTY2VuYXJpbyBvYmplY3RzIG9uCi0gICAqIGRlc2VyaWFsaXphdGlvbi4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1blR5cGVBZGFwdGVyIGltcGxlbWVudHMgSnNvblNlcmlhbGl6ZXI8UnVuPiwgSnNvbkRlc2VyaWFsaXplcjxSdW4+IHsKLQotICAgIEBPdmVycmlkZSBwdWJsaWMgUnVuIGRlc2VyaWFsaXplKEpzb25FbGVtZW50IGpzb25FbGVtZW50LCBUeXBlIHR5cGUsCi0gICAgICAgIEpzb25EZXNlcmlhbGl6YXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBKc29uUGFyc2VFeGNlcHRpb24gewotCi0gICAgICBMaXN0PEtleVZhbHVlUGFpcjxTY2VuYXJpbywgU2NlbmFyaW9SZXN1bHQ+PiBtYXBMaXN0ID0gY29udGV4dC5kZXNlcmlhbGl6ZSgKLSAgICAgICAgICBqc29uRWxlbWVudC5nZXRBc0pzb25PYmplY3QoKS5nZXQoIm1lYXN1cmVtZW50cyIpLAotICAgICAgICAgIG5ldyBUeXBlVG9rZW48TGlzdDxLZXlWYWx1ZVBhaXI8U2NlbmFyaW8sIFNjZW5hcmlvUmVzdWx0Pj4+KCkge30uZ2V0VHlwZSgpKTsKLSAgICAgIE1hcDxTY2VuYXJpbywgU2NlbmFyaW9SZXN1bHQ+IG1lYXN1cmVtZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPFNjZW5hcmlvLCBTY2VuYXJpb1Jlc3VsdD4oKTsKLSAgICAgIGZvciAoS2V5VmFsdWVQYWlyPFNjZW5hcmlvLCBTY2VuYXJpb1Jlc3VsdD4gZW50cnkgOiBtYXBMaXN0KSB7Ci0gICAgICAgIG1lYXN1cmVtZW50cy5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgYmVuY2htYXJrTmFtZSA9Ci0gICAgICAgICAgY29udGV4dC5kZXNlcmlhbGl6ZShqc29uRWxlbWVudC5nZXRBc0pzb25PYmplY3QoKS5nZXQoImJlbmNobWFya05hbWUiKSwgU3RyaW5nLmNsYXNzKTsKLQotICAgICAgRGF0ZSBleGVjdXRlZFRpbWVzdGFtcCA9IGNvbnRleHQuZGVzZXJpYWxpemUoCi0gICAgICAgICAganNvbkVsZW1lbnQuZ2V0QXNKc29uT2JqZWN0KCkuZ2V0KCJleGVjdXRlZFRpbWVzdGFtcCIpLCBEYXRlLmNsYXNzKTsKLQotICAgICAgcmV0dXJuIG5ldyBSdW4obWVhc3VyZW1lbnRzLCBiZW5jaG1hcmtOYW1lLCBleGVjdXRlZFRpbWVzdGFtcCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHB1YmxpYyBKc29uRWxlbWVudCBzZXJpYWxpemUoUnVuIHJ1biwgVHlwZSB0eXBlLCBKc29uU2VyaWFsaXphdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgSnNvbk9iamVjdCByZXN1bHQgPSBuZXcgSnNvbk9iamVjdCgpOwotICAgICAgcmVzdWx0LmFkZCgiYmVuY2htYXJrTmFtZSIsIGNvbnRleHQuc2VyaWFsaXplKHJ1bi5nZXRCZW5jaG1hcmtOYW1lKCkpKTsKLSAgICAgIHJlc3VsdC5hZGQoImV4ZWN1dGVkVGltZXN0YW1wIiwgY29udGV4dC5zZXJpYWxpemUocnVuLmdldEV4ZWN1dGVkVGltZXN0YW1wKCkpKTsKLQotICAgICAgTGlzdDxLZXlWYWx1ZVBhaXI8U2NlbmFyaW8sIFNjZW5hcmlvUmVzdWx0Pj4gbWFwTGlzdCA9Ci0gICAgICAgICAgbmV3IEFycmF5TGlzdDxLZXlWYWx1ZVBhaXI8U2NlbmFyaW8sIFNjZW5hcmlvUmVzdWx0Pj4oKTsKLSAgICAgIGZvciAoTWFwLkVudHJ5PFNjZW5hcmlvLCBTY2VuYXJpb1Jlc3VsdD4gZW50cnkgOiBydW4uZ2V0TWVhc3VyZW1lbnRzKCkuZW50cnlTZXQoKSkgewotICAgICAgICBtYXBMaXN0LmFkZChuZXcgS2V5VmFsdWVQYWlyPFNjZW5hcmlvLCBTY2VuYXJpb1Jlc3VsdD4oZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdC5hZGQoIm1lYXN1cmVtZW50cyIsIGNvbnRleHQuc2VyaWFsaXplKG1hcExpc3QsCi0gICAgICAgICAgbmV3IFR5cGVUb2tlbjxMaXN0PEtleVZhbHVlUGFpcjxTY2VuYXJpbywgU2NlbmFyaW9SZXN1bHQ+Pj4oKSB7fS5nZXRUeXBlKCkpKTsKLQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEYXRlVHlwZUFkYXB0ZXIgaW1wbGVtZW50cyBKc29uU2VyaWFsaXplcjxEYXRlPiwgSnNvbkRlc2VyaWFsaXplcjxEYXRlPiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEYXRlRm9ybWF0IGRhdGVGb3JtYXQ7Ci0KLSAgICBwcml2YXRlIERhdGVUeXBlQWRhcHRlcigpIHsKLSAgICAgIGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzeiIsIExvY2FsZS5VUyk7Ci0gICAgICBkYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHB1YmxpYyBzeW5jaHJvbml6ZWQgSnNvbkVsZW1lbnQgc2VyaWFsaXplKERhdGUgZGF0ZSwgVHlwZSB0eXBlLAotICAgICAgICBKc29uU2VyaWFsaXphdGlvbkNvbnRleHQganNvblNlcmlhbGl6YXRpb25Db250ZXh0KSB7Ci0gICAgICByZXR1cm4gbmV3IEpzb25QcmltaXRpdmUoZGF0ZUZvcm1hdC5mb3JtYXQoZGF0ZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwdWJsaWMgc3luY2hyb25pemVkIERhdGUgZGVzZXJpYWxpemUoSnNvbkVsZW1lbnQganNvbkVsZW1lbnQsIFR5cGUgdHlwZSwKLSAgICAgICAgSnNvbkRlc2VyaWFsaXphdGlvbkNvbnRleHQganNvbkRlc2VyaWFsaXphdGlvbkNvbnRleHQpIHsKLSAgICAgIFN0cmluZyBkYXRlU3RyaW5nID0ganNvbkVsZW1lbnQuZ2V0QXNTdHJpbmcoKTsKLSAgICAgIC8vIGZpcnN0IHRyeSB0byBwYXJzZSBhcyBhbiBJU08gODYwMSBkYXRlCi0gICAgICB0cnkgewotICAgICAgICByZXR1cm4gZGF0ZUZvcm1hdC5wYXJzZShkYXRlU3RyaW5nKTsKLSAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgIH0KLSAgICAgIC8vIG5leHQsIHRyeSBhIEdTT04tc3R5bGUgbG9jYWxlLXNwZWNpZmljIGRhdGVzIChmb3IgQ2FsaXBlciByMjgyIGFuZCBlYXJsaWVyKQotICAgICAgdHJ5IHsKLSAgICAgICAgcmV0dXJuIERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpLnBhcnNlKGRhdGVTdHJpbmcpOwotICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgfQotICAgICAgdGhyb3cgbmV3IEpzb25QYXJzZUV4Y2VwdGlvbihkYXRlU3RyaW5nKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBNYXAuRW50cnkgY2xhc3MsIGJ1dCBpcyBuZWNlc3Nhcnkgc2luY2UgRW50cnlzIGFyZSBub3Qgc3VwcG9ydGVkCi0gICAqIGJ5IGdzb24uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBLZXlWYWx1ZVBhaXI8SywgVj4gewotICAgIHByaXZhdGUgSyBrOwotICAgIHByaXZhdGUgViB2OwotCi0gICAgS2V5VmFsdWVQYWlyKEsgaywgViB2KSB7Ci0gICAgICB0aGlzLmsgPSBrOwotICAgICAgdGhpcy52ID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSyBnZXRLZXkoKSB7Ci0gICAgICByZXR1cm4gazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLSAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgS2V5VmFsdWVQYWlyKCkge30gLy8gZm9yIGdzb24KLSAgfQotCi0gIHByaXZhdGUgSnNvbigpIHt9IC8vIHN0YXRpYyBjbGFzcwotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Mb2dDb25zdGFudHMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YWNlYmUuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Mb2dDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTG9nQ29uc3RhbnRzIHsKLSAgLyoqCi0gICAqIE11c3QgYmUgcHJlcGVuZGVkIHRvIGxpbmUgb2YgWE1MIHRoYXQgcmVwcmVzZW50cyBub3JtYWxpemVkIHNjZW5hcmlvLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NFTkFSSU9fSlNPTl9QUkVGSVggPSAiW3NjZW5hcmlvXSAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRUFTVVJFTUVOVF9KU09OX1BSRUZJWCA9ICJbbWVhc3VyZW1lbnRdICI7Ci0KLSAgLyoqCi0gICAqIE11c3QgYmUgcHJlcGVuZGVkIHRvIGFueSBsb2dzIHRoYXQgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBydW4gZXZlbnQgbG9nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMSVBFUl9MT0dfUFJFRklYID0gIltjYWxpcGVyXSAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0VOQVJJT1NfU1RBUlRJTkcgPSAiW3N0YXJ0aW5nIHNjZW5hcmlvc10iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVElOR19TQ0VOQVJJT19QUkVGSVggPSAiW3N0YXJ0aW5nIHNjZW5hcmlvXSAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0VOQVJJT19GSU5JU0hFRCA9ICJbc2NlbmFyaW8gZmluaXNoZWRdIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NFTkFSSU9TX0ZJTklTSEVEID0gIltzY2VuYXJpb3MgZmluaXNoZWRdIjsKLQotICAvKioKLSAgICogQWxsIGV2ZW50cyB3aWxsIGJlIGxvZ2dlZCBmcm9tIHdoZW4ge0Bjb2RlIE1FQVNVUkVEX1NFQ1RJT05fU1RBUlRJTkd9IGlzIGxvZ2dlZCB1bnRpbAotICAgKiB7QGNvZGUgTUVBU1VSRURfU0VDVElPTl9ET05FfSBpcyBsb2dnZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRUFTVVJFRF9TRUNUSU9OX1NUQVJUSU5HID0gIltzdGFydGluZyBtZWFzdXJlZCBzZWN0aW9uXSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FQVNVUkVEX1NFQ1RJT05fRE9ORSA9ICJbZG9uZSBtZWFzdXJlZCBzZWN0aW9uXSI7Ci0KLSAgcHJpdmF0ZSBMb2dDb25zdGFudHMoKSB7fQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg2NWI2Li4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIG1lYXN1cmVtZW50IG9mIGEgc2luZ2xlIHJ1biBvZiBhIGJlbmNobWFyay4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi1AR3d0Q29tcGF0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIE1lYXN1cmVtZW50Ci0gIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIC8qIGZvciBHV1QgKi8gewotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxNZWFzdXJlbWVudD4gU09SVF9CWV9OQU5PUyA9IG5ldyBDb21wYXJhdG9yPE1lYXN1cmVtZW50PigpIHsKLSAgICBAT3ZlcnJpZGUgcHVibGljIGludCBjb21wYXJlKE1lYXN1cmVtZW50IGEsIE1lYXN1cmVtZW50IGIpIHsKLSAgICAgIGRvdWJsZSBhTmFub3MgPSBhLmdldFJhdygpOwotICAgICAgZG91YmxlIGJOYW5vcyA9IGIuZ2V0UmF3KCk7Ci0gICAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUoYU5hbm9zLCBiTmFub3MpOwotICAgIH0KLSAgfTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8TWVhc3VyZW1lbnQ+IFNPUlRfQllfVU5JVFMgPSBuZXcgQ29tcGFyYXRvcjxNZWFzdXJlbWVudD4oKSB7Ci0gICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgY29tcGFyZShNZWFzdXJlbWVudCBhLCBNZWFzdXJlbWVudCBiKSB7Ci0gICAgICBkb3VibGUgYU5hbm9zID0gYS5nZXRQcm9jZXNzZWQoKTsKLSAgICAgIGRvdWJsZSBiTmFub3MgPSBiLmdldFByb2Nlc3NlZCgpOwotICAgICAgcmV0dXJuIERvdWJsZS5jb21wYXJlKGFOYW5vcywgYk5hbm9zKTsKLSAgICB9Ci0gIH07Ci0KLSAgcHJpdmF0ZSAvKmZpbmFsKi8gZG91YmxlIHJhdzsKLSAgcHJpdmF0ZSAvKmZpbmFsKi8gZG91YmxlIHByb2Nlc3NlZDsKLSAgcHJpdmF0ZSAvKmZpbmFsKi8gTWFwPFN0cmluZywgSW50ZWdlcj4gdW5pdE5hbWVzOwotCi0gIHB1YmxpYyBNZWFzdXJlbWVudChNYXA8U3RyaW5nLCBJbnRlZ2VyPiB1bml0TmFtZXMsIGRvdWJsZSByYXcsIGRvdWJsZSBwcm9jZXNzZWQpIHsKLSAgICB0aGlzLnVuaXROYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4odW5pdE5hbWVzKTsKLSAgICB0aGlzLnJhdyA9IHJhdzsKLSAgICB0aGlzLnByb2Nlc3NlZCA9IHByb2Nlc3NlZDsKLSAgfQotCi0gIHB1YmxpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRVbml0TmFtZXMoKSB7Ci0gICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4odW5pdE5hbWVzKTsKLSAgfQotCi0gIHB1YmxpYyBkb3VibGUgZ2V0UmF3KCkgewotICAgIHJldHVybiByYXc7Ci0gIH0KLQotICBwdWJsaWMgZG91YmxlIGdldFByb2Nlc3NlZCgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc2VkOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIHJldHVybiBvIGluc3RhbmNlb2YgTWVhc3VyZW1lbnQKLSAgICAgICAgJiYgKChNZWFzdXJlbWVudCkgbykucmF3ID09IHJhdwotICAgICAgICAmJiAoKE1lYXN1cmVtZW50KSBvKS5wcm9jZXNzZWQgPT0gcHJvY2Vzc2VkCi0gICAgICAgICYmICgoTWVhc3VyZW1lbnQpIG8pLnVuaXROYW1lcy5lcXVhbHModW5pdE5hbWVzKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIHJldHVybiAoaW50KSByYXcgLy8gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMgZG9lc24ndCBleGlzdCBvbiBHV1QKLSAgICAgICAgKyAoaW50KSBwcm9jZXNzZWQgKiAzNwotICAgICAgICArIHVuaXROYW1lcy5oYXNoQ29kZSgpICogMTM3MzsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAocmF3ICE9IHByb2Nlc3NlZAotICAgICAgICA/IHJhdyArICIvIiArIHByb2Nlc3NlZAotICAgICAgICA6IERvdWJsZS50b1N0cmluZyhyYXcpKTsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICBwcml2YXRlIE1lYXN1cmVtZW50KCkge30gLyogZm9yIEdXVCAqLwotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFNldC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjBiNDJhLi4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBjb2xsZWN0aW9uIG9mIG1lYXN1cmVtZW50cyBvZiB0aGUgc2FtZSBzY2VuYXJpby4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi1AR3d0Q29tcGF0aWJsZQotcHVibGljIGZpbmFsIGNsYXNzIE1lYXN1cmVtZW50U2V0Ci0gICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgLyogZm9yIEdXVCBTZXJpYWxpemF0aW9uICovIHsKLQotICBwcml2YXRlIC8qZmluYWwqLyBMaXN0PE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHM7Ci0gIC8qKgotICAgKiBNYXBwaW5nIG9mIHVzZXItZGVmaW5lZCB1bml0cyB0byByZWxhdGl2ZSBzaXplcy4KLSAgICovCi0gIHByaXZhdGUgLypmaW5hbCovIE1hcDxTdHJpbmcsIEludGVnZXI+IHVuaXROYW1lczsKLQotICBwcml2YXRlIC8qZmluYWwqLyBpbnQgc3lzdGVtT3V0Q2hhckNvdW50OwotICBwcml2YXRlIC8qZmluYWwqLyBpbnQgc3lzdGVtRXJyQ2hhckNvdW50OwotCi0gIHB1YmxpYyBNZWFzdXJlbWVudFNldChNZWFzdXJlbWVudC4uLiBtZWFzdXJlbWVudHMpIHsKLSAgICB0aGlzKDAsIDAsIGdldFVuaXROYW1lc0Zyb21NZWFzdXJlbWVudHMobWVhc3VyZW1lbnRzKSwgQXJyYXlzLmFzTGlzdChtZWFzdXJlbWVudHMpKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldFVuaXROYW1lc0Zyb21NZWFzdXJlbWVudHMoTWVhc3VyZW1lbnQuLi4gbWVhc3VyZW1lbnRzKSB7Ci0gICAgTWFwPFN0cmluZywgSW50ZWdlcj4gdW5pdE5hbWVUb0Fzc2lnbiA9IG51bGw7Ci0gICAgZm9yIChNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA6IG1lYXN1cmVtZW50cykgewotICAgICAgaWYgKHVuaXROYW1lVG9Bc3NpZ24gPT0gbnVsbCkgewotICAgICAgICB1bml0TmFtZVRvQXNzaWduID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPihtZWFzdXJlbWVudC5nZXRVbml0TmFtZXMoKSk7Ci0gICAgICB9IGVsc2UgaWYgKCF1bml0TmFtZVRvQXNzaWduLmVxdWFscyhtZWFzdXJlbWVudC5nZXRVbml0TmFtZXMoKSkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5jb21wYXRpYmxlIHVuaXQgbmFtZXM6ICIgKyB1bml0TmFtZVRvQXNzaWduICsgIiBhbmQgIgotICAgICAgICAgICAgKyBtZWFzdXJlbWVudC5nZXRVbml0TmFtZXMoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB1bml0TmFtZVRvQXNzaWduOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHRvIHVzZSBkaXJlY3RseSBmcm9tIHBsdXNNZWFzdXJlbWVudC4gU2tpcHMgc29tZSBleGNlc3NpdmUgY2hlY2tpbmcgYW5kIHRha2VzIGEKLSAgICogbGlzdCBkaXJlY3RseS4KLSAgICovCi0gIHByaXZhdGUgTWVhc3VyZW1lbnRTZXQoaW50IHN5c3RlbU91dENoYXJDb3VudCwgaW50IHN5c3RlbUVyckNoYXJDb3VudCwKLSAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IHVuaXROYW1lcywgTGlzdDxNZWFzdXJlbWVudD4gbWVhc3VyZW1lbnRzKSB7Ci0gICAgdGhpcy5zeXN0ZW1PdXRDaGFyQ291bnQgPSBzeXN0ZW1PdXRDaGFyQ291bnQ7Ci0gICAgdGhpcy5zeXN0ZW1FcnJDaGFyQ291bnQgPSBzeXN0ZW1FcnJDaGFyQ291bnQ7Ci0gICAgdGhpcy51bml0TmFtZXMgPSB1bml0TmFtZXM7Ci0gICAgdGhpcy5tZWFzdXJlbWVudHMgPSBtZWFzdXJlbWVudHM7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBnZXRVbml0TmFtZXMoKSwgYnV0IGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbiB0aGUgc2VydmVyCi0gICAqIHdoZW4gbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMgbmVlZCB0byBiZSBhdm9pZGVkLgotICAgKi8KLSAgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldFVuaXROYW1lcyhNYXA8U3RyaW5nLCBJbnRlZ2VyPiBkZWZhdWx0VmFsdWUpIHsKLSAgICBpZiAodW5pdE5hbWVzID09IG51bGwpIHsKLSAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KHVuaXROYW1lcyk7Ci0gIH0KLQotICBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0VW5pdE5hbWVzKCkgewotICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KHVuaXROYW1lcyk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxNZWFzdXJlbWVudD4gZ2V0TWVhc3VyZW1lbnRzKCkgewotICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE1lYXN1cmVtZW50PihtZWFzdXJlbWVudHMpOwotICB9Ci0KLSAgcHVibGljIGludCBzaXplKCkgewotICAgIHJldHVybiBtZWFzdXJlbWVudHMuc2l6ZSgpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRTeXN0ZW1PdXRDaGFyQ291bnQoKSB7Ci0gICAgcmV0dXJuIHN5c3RlbU91dENoYXJDb3VudDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0U3lzdGVtRXJyQ2hhckNvdW50KCkgewotICAgIHJldHVybiBzeXN0ZW1FcnJDaGFyQ291bnQ7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxEb3VibGU+IGdldE1lYXN1cmVtZW50c1JhdygpIHsKLSAgICBMaXN0PERvdWJsZT4gbWVhc3VyZW1lbnRSYXcgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKLSAgICBmb3IgKE1lYXN1cmVtZW50IG1lYXN1cmVtZW50IDogbWVhc3VyZW1lbnRzKSB7Ci0gICAgICBtZWFzdXJlbWVudFJhdy5hZGQobWVhc3VyZW1lbnQuZ2V0UmF3KCkpOwotICAgIH0KLSAgICByZXR1cm4gbWVhc3VyZW1lbnRSYXc7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxEb3VibGU+IGdldE1lYXN1cmVtZW50VW5pdHMoKSB7Ci0gICAgTGlzdDxEb3VibGU+IG1lYXN1cmVtZW50VW5pdHMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKLSAgICBmb3IgKE1lYXN1cmVtZW50IG1lYXN1cmVtZW50IDogbWVhc3VyZW1lbnRzKSB7Ci0gICAgICBtZWFzdXJlbWVudFVuaXRzLmFkZChtZWFzdXJlbWVudC5nZXRQcm9jZXNzZWQoKSk7Ci0gICAgfQotICAgIHJldHVybiBtZWFzdXJlbWVudFVuaXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1lZGlhbiBtZWFzdXJlbWVudCwgd2l0aCByZXNwZWN0IHRvIHJhdyB1bml0cy4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbWVkaWFuUmF3KCkgewotICAgIHJldHVybiBtZWRpYW4oZ2V0TWVhc3VyZW1lbnRzUmF3KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1lZGlhbiBtZWFzdXJlbWVudCwgd2l0aCByZXNwZWN0IHRvIHVzZXItZGVmaW5lZCB1bml0cy4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbWVkaWFuVW5pdHMoKSB7Ci0gICAgcmV0dXJuIG1lZGlhbihnZXRNZWFzdXJlbWVudFVuaXRzKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBkb3VibGUgbWVkaWFuKExpc3Q8RG91YmxlPiBkb3VibGVzKSB7Ci0gICAgQ29sbGVjdGlvbnMuc29ydChkb3VibGVzKTsKLSAgICBpbnQgbiA9IGRvdWJsZXMuc2l6ZSgpOwotICAgIHJldHVybiAobiAlIDIgPT0gMCkKLSAgICAgICAgPyAoZG91Ymxlcy5nZXQobiAvIDIgLSAxKSArIGRvdWJsZXMuZ2V0KG4gLyAyKSkgLyAyCi0gICAgICAgIDogZG91Ymxlcy5nZXQobiAvIDIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGF2ZXJhZ2UgbWVhc3VyZW1lbnQgd2l0aCByZXNwZWN0IHRvIHJhdyB1bml0cy4KLSAgICovCi0gIHB1YmxpYyBkb3VibGUgbWVhblJhdygpIHsKLSAgICByZXR1cm4gbWVhbihnZXRNZWFzdXJlbWVudHNSYXcoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYXZlcmFnZSBtZWFzdXJlbWVudCB3aXRoIHJlc3BlY3QgdG8gdXNlci1kZWZpbmVkIHVuaXRzLgotICAgKi8KLSAgcHVibGljIGRvdWJsZSBtZWFuVW5pdHMoKSB7Ci0gICAgcmV0dXJuIG1lYW4oZ2V0TWVhc3VyZW1lbnRVbml0cygpKTsKLSAgfQotCi0gIHByaXZhdGUgZG91YmxlIG1lYW4oTGlzdDxEb3VibGU+IGRvdWJsZXMpIHsKLSAgICBkb3VibGUgc3VtID0gMDsKLSAgICBmb3IgKGRvdWJsZSBkIDogZG91YmxlcykgewotICAgICAgc3VtICs9IGQ7Ci0gICAgfQotICAgIHJldHVybiBzdW0gLyBkb3VibGVzLnNpemUoKTsKLSAgfQotCi0gIHB1YmxpYyBkb3VibGUgc3RhbmRhcmREZXZpYXRpb25SYXcoKSB7Ci0gICAgcmV0dXJuIHN0YW5kYXJkRGV2aWF0aW9uKGdldE1lYXN1cmVtZW50c1JhdygpKTsKLSAgfQotCi0gIHB1YmxpYyBkb3VibGUgc3RhbmRhcmREZXZpYXRpb25Vbml0cygpIHsKLSAgICByZXR1cm4gc3RhbmRhcmREZXZpYXRpb24oZ2V0TWVhc3VyZW1lbnRVbml0cygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYXN1cmVtZW50cy4KLSAgICovCi0gIHByaXZhdGUgZG91YmxlIHN0YW5kYXJkRGV2aWF0aW9uKExpc3Q8RG91YmxlPiBkb3VibGVzKSB7Ci0gICAgZG91YmxlIG1lYW4gPSBtZWFuKGRvdWJsZXMpOwotICAgIGRvdWJsZSBzdW1PZlNxdWFyZXMgPSAwOwotICAgIGZvciAoZG91YmxlIGQgOiBkb3VibGVzKSB7Ci0gICAgICBkb3VibGUgZGVsdGEgPSAoZCAtIG1lYW4pOwotICAgICAgc3VtT2ZTcXVhcmVzICs9IChkZWx0YSAqIGRlbHRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIE1hdGguc3FydChzdW1PZlNxdWFyZXMgLyAoZG91Ymxlcy5zaXplKCkgLSAxKSk7Ci0gIH0KLQotICBwdWJsaWMgZG91YmxlIG1pblJhdygpIHsKLSAgICByZXR1cm4gbWluKGdldE1lYXN1cmVtZW50c1JhdygpKTsKLSAgfQotCi0gIHB1YmxpYyBkb3VibGUgbWluVW5pdHMoKSB7Ci0gICAgcmV0dXJuIG1pbihnZXRNZWFzdXJlbWVudFVuaXRzKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1pbmltdW0gbWVhc3VyZW1lbnQuCi0gICAqLwotICBwcml2YXRlIGRvdWJsZSBtaW4oTGlzdDxEb3VibGU+IGRvdWJsZXMpIHsKLSAgICBDb2xsZWN0aW9ucy5zb3J0KGRvdWJsZXMpOwotICAgIHJldHVybiBkb3VibGVzLmdldCgwKTsKLSAgfQotCi0gIHB1YmxpYyBkb3VibGUgbWF4UmF3KCkgewotICAgIHJldHVybiBtYXgoZ2V0TWVhc3VyZW1lbnRzUmF3KCkpOwotICB9Ci0KLSAgcHVibGljIGRvdWJsZSBtYXhVbml0cygpIHsKLSAgICByZXR1cm4gbWF4KGdldE1lYXN1cmVtZW50VW5pdHMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWF4aW11bSBtZWFzdXJlbWVudC4KLSAgICovCi0gIHByaXZhdGUgZG91YmxlIG1heChMaXN0PERvdWJsZT4gZG91YmxlcykgewotICAgIENvbGxlY3Rpb25zLnNvcnQoZG91YmxlcywgQ29sbGVjdGlvbnMucmV2ZXJzZU9yZGVyKCkpOwotICAgIHJldHVybiBkb3VibGVzLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG1lYXN1cmVtZW50IHNldCB0aGF0IGNvbnRhaW5zIHRoZSBtZWFzdXJlbWVudHMgaW4gdGhpcyBzZXQKLSAgICogcGx1cyB0aGUgZ2l2ZW4gYWRkaXRpb25hbCBtZWFzdXJlbWVudC4KLSAgICovCi0gIHB1YmxpYyBNZWFzdXJlbWVudFNldCBwbHVzTWVhc3VyZW1lbnQoTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQpIHsKLSAgICAvLyB2ZXJpZnkgdGhhdCB0aGlzIE1lYXN1cmVtZW50IGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1lYXN1cmVtZW50U2V0Ci0gICAgaWYgKHVuaXROYW1lcyAhPSBudWxsICYmICF1bml0TmFtZXMuZXF1YWxzKG1lYXN1cmVtZW50LmdldFVuaXROYW1lcygpKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmV3IG1lYXN1cmVtZW50IGluY29tcGF0aWJsZSB3aXRoIHVuaXRzIG9mIG1lYXN1cmVtZW50ICIKLSAgICAgICAgICArICJzZXQuIEV4cGVjdGVkICIgKyB1bml0TmFtZXMgKyAiIGJ1dCBnb3QgIiArIG1lYXN1cmVtZW50LmdldFVuaXROYW1lcygpKTsKLSAgICB9Ci0KLSAgICBMaXN0PE1lYXN1cmVtZW50PiByZXN1bHRNZWFzdXJlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE1lYXN1cmVtZW50PihtZWFzdXJlbWVudHMpOwotICAgIHJlc3VsdE1lYXN1cmVtZW50cy5hZGQobWVhc3VyZW1lbnQpOwotICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IG5ld1VuaXROYW1lcyA9IHVuaXROYW1lcyA9PSBudWxsID8gbWVhc3VyZW1lbnQuZ2V0VW5pdE5hbWVzKCkgOiB1bml0TmFtZXM7Ci0gICAgcmV0dXJuIG5ldyBNZWFzdXJlbWVudFNldChzeXN0ZW1PdXRDaGFyQ291bnQsIHN5c3RlbUVyckNoYXJDb3VudCwKLSAgICAgICAgbmV3VW5pdE5hbWVzLCByZXN1bHRNZWFzdXJlbWVudHMpOwotICB9Ci0KLSAgcHVibGljIE1lYXN1cmVtZW50U2V0IHBsdXNDaGFyQ291bnRzKGludCBzeXN0ZW1PdXRDaGFyQ291bnQsIGludCBzeXN0ZW1FcnJDaGFyQ291bnQpIHsKLSAgICByZXR1cm4gbmV3IE1lYXN1cmVtZW50U2V0KHRoaXMuc3lzdGVtT3V0Q2hhckNvdW50ICsgc3lzdGVtT3V0Q2hhckNvdW50LAotICAgICAgICB0aGlzLnN5c3RlbUVyckNoYXJDb3VudCArIHN5c3RlbUVyckNoYXJDb3VudCwgdW5pdE5hbWVzLCBtZWFzdXJlbWVudHMpOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIHJldHVybiBvIGluc3RhbmNlb2YgTWVhc3VyZW1lbnRTZXQKLSAgICAgICAgJiYgKChNZWFzdXJlbWVudFNldCkgbykubWVhc3VyZW1lbnRzLmVxdWFscyhtZWFzdXJlbWVudHMpCi0gICAgICAgICYmICgoTWVhc3VyZW1lbnRTZXQpIG8pLnVuaXROYW1lcy5lcXVhbHModW5pdE5hbWVzKQotICAgICAgICAmJiAoKE1lYXN1cmVtZW50U2V0KSBvKS5zeXN0ZW1PdXRDaGFyQ291bnQgPT0gc3lzdGVtT3V0Q2hhckNvdW50Ci0gICAgICAgICYmICgoTWVhc3VyZW1lbnRTZXQpIG8pLnN5c3RlbUVyckNoYXJDb3VudCA9PSBzeXN0ZW1FcnJDaGFyQ291bnQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gbWVhc3VyZW1lbnRzLmhhc2hDb2RlKCkKLSAgICAgICAgKyB1bml0TmFtZXMuaGFzaENvZGUoKSAqIDM3Ci0gICAgICAgICsgc3lzdGVtT3V0Q2hhckNvdW50ICogMTM3MwotICAgICAgICArIHN5c3RlbUVyckNoYXJDb3VudCAqIDUzNTQ5OwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIG1lYXN1cmVtZW50cy50b1N0cmluZygpICsgIiAiICsgdW5pdE5hbWVzICsgIiAiCi0gICAgICAgICsgc3lzdGVtT3V0Q2hhckNvdW50ICsgIi8iICsgc3lzdGVtRXJyQ2hhckNvdW50OwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gIHByaXZhdGUgTWVhc3VyZW1lbnRTZXQoKSB7fSAvLyBmb3IgR1dUIFNlcmlhbGl6YXRpb24KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMDJlNi4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL01lYXN1cmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3VwcGxpZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1hYnN0cmFjdCBjbGFzcyBNZWFzdXJlciB7Ci0KLSAgcHJpdmF0ZSBQcmludFN0cmVhbSBsb2dTdHJlYW0gPSBTeXN0ZW0ub3V0OwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzdHJlYW0gdXNlZCB0byBsb2cgY2FsaXBlciBldmVudHMuCi0gICAqLwotICB2b2lkIHNldExvZ1N0cmVhbShQcmludFN0cmVhbSBsb2dTdHJlYW0pIHsKLSAgICB0aGlzLmxvZ1N0cmVhbSA9IGxvZ1N0cmVhbTsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBNZWFzdXJlbWVudFNldCBydW4oU3VwcGxpZXI8Q29uZmlndXJlZEJlbmNobWFyaz4gdGVzdFN1cHBsaWVyKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gIHByb3RlY3RlZCB2b2lkIHByZXBhcmVGb3JUZXN0KCkgewotICAgIFN5c3RlbS5nYygpOwotICAgIFN5c3RlbS5nYygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgbG9nU3RyZWFtLnByaW50bG4oTG9nQ29uc3RhbnRzLkNBTElQRVJfTE9HX1BSRUZJWCArIG1lc3NhZ2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL01lbW9yeUFsbG9jYXRpb25NZWFzdXJlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZW1vcnlBbGxvY2F0aW9uTWVhc3VyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4YWFiZi4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL01lbW9yeUFsbG9jYXRpb25NZWFzdXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZW1vcnlBbGxvY2F0aW9uTWVhc3VyZXIgZXh0ZW5kcyBBbGxvY2F0aW9uTWVhc3VyZXIgewotCi0gIHB1YmxpYyBNZW1vcnlBbGxvY2F0aW9uTWVhc3VyZXIoKSB7Ci0gICAgdHlwZSA9ICJieXRlIjsKLSAgfQotCi0gIEBPdmVycmlkZSBwcm90ZWN0ZWQgbG9uZyBpbmNyZW1lbnRBbGxvY2F0aW9uQ291bnQobG9uZyBvbGRBbGxvY2F0aW9uQ291bnQsIGludCBhcnJheUNvdW50LAotICAgICAgbG9uZyBzaXplKSB7Ci0gICAgcmV0dXJuIG9sZEFsbG9jYXRpb25Db3VudCArIHNpemU7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHJvdGVjdGVkIE1lYXN1cmVtZW50IGdldE1lYXN1cmVtZW50KENvbmZpZ3VyZWRCZW5jaG1hcmsgYmVuY2htYXJrLCBsb25nIGFsbG9jYXRpb25zKSB7Ci0gICAgcmV0dXJuIG5ldyBNZWFzdXJlbWVudChiZW5jaG1hcmsubWVtb3J5VW5pdE5hbWVzKCksIGFsbG9jYXRpb25zLAotICAgICAgICBiZW5jaG1hcmsuYnl0ZXNUb1VuaXRzKGFsbG9jYXRpb25zKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvUGFyYW0uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvUGFyYW0uamF2YQppbmRleCBmNGNkZjQ1Li44MmUzNDcxIDEwMDY0NAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1BhcmFtLmphdmEKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9QYXJhbS5qYXZhCkBAIC0yOSwxMiArMjksNiBAQAogICogPHVsPgogICogPGxpPlRoZSBjb21tYW5kIGxpbmUsIGlmIHNwZWNpZmllZCB1c2luZyB7QGNvZGUgLURuYW1lPXZhbHVlMSx2YWx1ZTIsdmFsdWUzfQogICogPGxpPk90aGVyd2lzZSwgdGhlIHtAbGluayAjdmFsdWUoKX0gbGlzdCBnaXZlbiBpbiB0aGUgYW5ub3RhdGlvbgotICogPGxpPk90aGVyd2lzZSwgQ2FsaXBlciBsb29rcyBmb3IgYSBzdGF0aWMgbWV0aG9kIG5hbWVkIHtAY29kZSBwYXJhbU5hbWUgKyAiVmFsdWVzIn0gKGZvcgotICogICAgIGV4YW1wbGUsIGlmIHRoZSBwYXJhbWV0ZXIgZmllbGQgaXMge0Bjb2RlIHNpemV9LCBpdCBsb29rcyBmb3Ige0Bjb2RlIHNpemVWYWx1ZXMoKX0pLiBUaGUKLSAqICAgICBtZXRob2QgY2FuIHJldHVybiBhbnkgc3VidHlwZSBvZiB7QGxpbmsgSXRlcmFibGV9LiBUaGUgY29udGVudHMgb2YgdGhhdCBpdGVyYWJsZSBhcmUgdXNlZCBhcwotICogICAgIHRoZSBwYXJhbWV0ZXIgdmFsdWVzLgotICogPGxpPk90aGVyd2lzZSwgQ2FsaXBlciByZXBlYXRzIHRoZSBwcmV2aW91cyBjaGVjayBsb29raW5nIGZvciBhIHN0YXRpYyA8ZW0+ZmllbGQ8L2VtPiBpbnN0ZWFkCi0gKiAgICAgb2YgYSBtZXRob2QuCiAgKiA8bGk+T3RoZXJ3aXNlLCBpZiB0aGUgcGFyYW1ldGVyIHR5cGUgaXMgZWl0aGVyIHtAY29kZSBib29sZWFufSBvciBhbiB7QGNvZGUgZW51bX0gdHlwZSwgQ2FsaXBlcgogICogICAgIGFzc3VtZXMgeW91IHdhbnQgYWxsIHBvc3NpYmxlIHZhbHVlcy4KICAqIDxsaT5GaW5hbGx5LCBpZiBub25lIG9mIHRoZSBhYm92ZSBtYXRjaCwgQ2FsaXBlciB3aWxsIGRpc3BsYXkgYW4gZXJyb3IgYW5kIGV4aXQuCkBAIC00Nyw3ICs0MSw3IEBACiAgKgogICogPHA+Q2FsaXBlciB3aWxsIHRlc3QgZXZlcnkgcG9zc2libGUgY29tYmluYXRpb24gb2YgcGFyYW1ldGVyIHZhbHVlcyBmb3IgeW91ciBiZW5jaG1hcmsuIEZvcgogICogZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIHBhcmFtZXRlcnMsIHtAY29kZSAtRGxldHRlcj1hLGIsYyAtRG51bWJlcj0xLDJ9LCBDYWxpcGVyIHdpbGwgY29uc3RydWN0Ci0gKiBzaXggaW5kZXBlbmRlbnQgInNjZW5hcmlvcyIgYW5kIHBlcmZvcm0gbWVhc3VyZW1lbnQgZm9yIGVhY2ggb25lLiAKKyAqIHNpeCBpbmRlcGVuZGVudCAic2NlbmFyaW9zIiBhbmQgcGVyZm9ybSBtZWFzdXJlbWVudCBmb3IgZWFjaCBvbmUuCiAgKi8KIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCiBAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9QYXJhbWV0ZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OWJjODYuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBBIHBhcmFtZXRlciBpbiBhIHtAbGluayBTaW1wbGVCZW5jaG1hcmt9LgotICoKLSAqIEBwYXJhbSA8VD4gdGhlIChwb3NzaWJseSB3cmFwcGVkKSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgZmllbGQsIHN1Y2ggYXMge0BsaW5rCi0gKiAgICAgU3RyaW5nfSBvciB7QGxpbmsgSW50ZWdlcn0KLSAqLwotYWJzdHJhY3QgY2xhc3MgUGFyYW1ldGVyPFQ+IHsKLQotICBwcml2YXRlIGZpbmFsIEZpZWxkIGZpZWxkOwotCi0gIHByaXZhdGUgUGFyYW1ldGVyKEZpZWxkIGZpZWxkKSB7Ci0gICAgdGhpcy5maWVsZCA9IGZpZWxkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYWxsIHBhcmFtZXRlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUGFyYW1ldGVyPD8+PiBmb3JDbGFzcyhDbGFzczw/IGV4dGVuZHMgQmVuY2htYXJrPiBzdWl0ZUNsYXNzKSB7Ci0gICAgTWFwPFN0cmluZywgUGFyYW1ldGVyPD8+PiBwYXJhbWV0ZXJzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBQYXJhbWV0ZXI8Pz4+KCk7Ci0gICAgZm9yIChGaWVsZCBmaWVsZCA6IHN1aXRlQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkgewotICAgICAgaWYgKGZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW0uY2xhc3MpKSB7Ci0gICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIFBhcmFtZXRlcjw/PiBwYXJhbWV0ZXIgPSBmb3JGaWVsZChzdWl0ZUNsYXNzLCBmaWVsZCk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KHBhcmFtZXRlci5nZXROYW1lKCksIHBhcmFtZXRlcik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwYXJhbWV0ZXJzOwotICB9Ci0KLSAgQFZpc2libGVGb3JUZXN0aW5nCi0gIHN0YXRpYyBQYXJhbWV0ZXI8Pz4gZm9yRmllbGQoCi0gICAgICBDbGFzczw/IGV4dGVuZHMgQmVuY2htYXJrPiBzdWl0ZUNsYXNzLCBmaW5hbCBGaWVsZCBmaWVsZCkgewotICAgIC8vIEZpcnN0IGNoZWNrIGZvciBTdHJpbmcgdmFsdWVzIG9uIHRoZSBhbm5vdGF0aW9uIGl0c2VsZgotICAgIGZpbmFsIE9iamVjdFtdIGRlZmF1bHRzID0gZmllbGQuZ2V0QW5ub3RhdGlvbihQYXJhbS5jbGFzcykudmFsdWUoKTsKLSAgICBpZiAoZGVmYXVsdHMubGVuZ3RoID4gMCkgewotICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXI8T2JqZWN0PihmaWVsZCkgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEl0ZXJhYmxlPE9iamVjdD4gdmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZGVmYXVsdHMpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgLy8gVE9ETzogb3Igc2hvdWxkIHdlIGNvbnRpbnVlIHNvIHdlIGNhbiBnaXZlIGFuIGVycm9yL3dhcm5pbmcgaWYgcGFyYW1zIGFyZSBhbHNvIGdpdmUgaW4gYQotICAgICAgLy8gbWV0aG9kIG9yIGZpZWxkPwotICAgIH0KLQotICAgIFBhcmFtZXRlcjw/PiByZXN1bHQgPSBudWxsOwotICAgIFR5cGUgcmV0dXJuVHlwZSA9IG51bGw7Ci0gICAgTWVtYmVyIG1lbWJlciA9IG51bGw7Ci0KLSAgICAvLyBOb3cgY2hlY2sgZm9yIGEgZm9vVmFsdWVzKCkgbWV0aG9kCi0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIE1ldGhvZCB2YWx1ZXNNZXRob2QgPSBzdWl0ZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKGZpZWxkLmdldE5hbWUoKSArICJWYWx1ZXMiKTsKLSAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWModmFsdWVzTWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVmFsdWVzIG1ldGhvZCBtdXN0IGJlIHN0YXRpYyAiICsgbWVtYmVyKTsKLSAgICAgIH0KLSAgICAgIHZhbHVlc01ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgbWVtYmVyID0gdmFsdWVzTWV0aG9kOwotICAgICAgcmV0dXJuVHlwZSA9IHZhbHVlc01ldGhvZC5nZXRHZW5lcmljUmV0dXJuVHlwZSgpOwotICAgICAgcmVzdWx0ID0gbmV3IFBhcmFtZXRlcjxPYmplY3Q+KGZpZWxkKSB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBndWFyZGVkIGJlbG93Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgSXRlcmFibGU8T2JqZWN0PiB2YWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICByZXR1cm4gKEl0ZXJhYmxlPE9iamVjdD4pIHZhbHVlc01ldGhvZC5pbnZva2UobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICB9Ci0KLSAgICAvLyBOb3cgY2hlY2sgZm9yIGEgZm9vVmFsdWVzIGZpZWxkCi0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIEZpZWxkIHZhbHVlc0ZpZWxkID0gc3VpdGVDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkLmdldE5hbWUoKSArICJWYWx1ZXMiKTsKLSAgICAgIGlmICghTW9kaWZpZXIuaXNTdGF0aWModmFsdWVzRmllbGQuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJWYWx1ZXMgZmllbGQgbXVzdCBiZSBzdGF0aWMgIiArIG1lbWJlcik7Ci0gICAgICB9Ci0gICAgICB2YWx1ZXNGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgbWVtYmVyID0gdmFsdWVzRmllbGQ7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIlR3byB2YWx1ZXMgbWVtYmVycyBkZWZpbmVkIGZvciAiICsgZmllbGQpOwotICAgICAgfQotICAgICAgcmV0dXJuVHlwZSA9IHZhbHVlc0ZpZWxkLmdldEdlbmVyaWNUeXBlKCk7Ci0gICAgICByZXN1bHQgPSBuZXcgUGFyYW1ldGVyPE9iamVjdD4oZmllbGQpIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIGd1YXJkZWQgYmVsb3cKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBJdGVyYWJsZTxPYmplY3Q+IHZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgIHJldHVybiAoSXRlcmFibGU8T2JqZWN0PikgdmFsdWVzRmllbGQuZ2V0KG51bGwpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBpc24ndCBhIHZhbHVlcyBtZW1iZXIgYnV0IHRoZSBwYXJhbWV0ZXIgaXMgYW4gZW51bSwgd2UgZGVmYXVsdAotICAgIC8vIHRvIEVudW1TZXQuYWxsT2YuCi0gICAgaWYgKG1lbWJlciA9PSBudWxsICYmIGZpZWxkLmdldFR5cGUoKS5pc0VudW0oKSkgewotICAgICAgcmV0dXJuVHlwZSA9IENvbGxlY3Rpb24uY2xhc3M7Ci0gICAgICByZXN1bHQgPSBuZXcgUGFyYW1ldGVyPE9iamVjdD4oZmllbGQpIHsKLSAgICAgICAgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgc2ltcGxlc3Qgd2F5IHRvIG1ha2UgdGhpcyBjb21waWxlIGFuZCBiZSBncmVlbiBpbiBJREVBIHRvbwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCIsICJSYXdVc2VPZlBhcmFtZXRlcml6ZWRUeXBlIiwgIlJlZHVuZGFudENhc3QifSkKLSAgICAgICAgLy8gZ3VhcmRlZCBhYm92ZQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEl0ZXJhYmxlPE9iamVjdD4gdmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgU2V0PEVudW0+IHNldCA9IEVudW1TZXQuYWxsT2YoKENsYXNzPEVudW0+KSBmaWVsZC5nZXRUeXBlKCkpOwotICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48T2JqZWN0PnVubW9kaWZpYWJsZVNldChzZXQpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQotICAgIC8vIElmIGl0J3MgYm9vbGVhbiwgZGVmYXVsdCB0byAodHJ1ZSwgZmFsc2UpCi0gICAgaWYgKG1lbWJlciA9PSBudWxsICYmIGZpZWxkLmdldFR5cGUoKSA9PSBib29sZWFuLmNsYXNzKSB7Ci0gICAgICByZXR1cm5UeXBlID0gQ29sbGVjdGlvbi5jbGFzczsKLSAgICAgIHJlc3VsdCA9IG5ldyBQYXJhbWV0ZXI8T2JqZWN0PihmaWVsZCkgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEl0ZXJhYmxlPE9iamVjdD4gdmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIEFycmF5cy48T2JqZWN0PmFzTGlzdChCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXI8T2JqZWN0PihmaWVsZCkgewotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEl0ZXJhYmxlPE9iamVjdD4gdmFsdWVzKCkgewotICAgICAgICAgIC8vIFRPRE86IG5lZWQgdGVzdHMgdG8gbWFrZSBzdXJlIHRoaXMgZmFpbHMgcHJvcGVybHkgd2hlbiBubyBjbWRsaW5lIHBhcmFtcyBnaXZlbiBhbmQKLSAgICAgICAgICAvLyB3b3JrcyBwcm9wZXJseSB3aGVuIHRoZXkgYXJlIGdpdmVuLiBBbHNvLCBjYW4gd2UgcmVzdHJ1Y3R1cmUgdGhlIGNvZGUgc28gdGhhdCB3ZQotICAgICAgICAgIC8vIGp1c3QgdGhyb3cgaGVyZSBpbnN0ZWFkIG9mIGxhdGVyPwotICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0gZWxzZSBpZiAoIWlzVmFsaWRSZXR1cm5UeXBlKHJldHVyblR5cGUpKSB7Ci0gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCByZXR1cm4gdHlwZSAiICsgcmV0dXJuVHlwZQotICAgICAgICAgICsgIiBmb3IgdmFsdWVzIG1lbWJlciAiICsgbWVtYmVyICsgIjsgbXVzdCBiZSBDb2xsZWN0aW9uIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZXR1cm5UeXBlKFR5cGUgdHlwZSkgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgIHJldHVybiBpc0l0ZXJhYmxlQ2xhc3ModHlwZSk7Ci0gICAgfQotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKLSAgICAgIHJldHVybiBpc0l0ZXJhYmxlQ2xhc3MoKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0UmF3VHlwZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0l0ZXJhYmxlQ2xhc3MoVHlwZSByZXR1cm5DbGFzcykgewotICAgIHJldHVybiBJdGVyYWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzczw/PikgcmV0dXJuQ2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHN1aXRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0KEJlbmNobWFyayBzdWl0ZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaWVsZC5zZXQoc3VpdGUsIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhdmFpbGFibGUgdmFsdWVzIG9mIHRoZSBwcm9wZXJ0eSBhcyBzcGVjaWZpZWQgYnkgdGhlIHN1aXRlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IEl0ZXJhYmxlPFQ+IHZhbHVlcygpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhcmFtZXRlcidzIHR5cGUsIHN1Y2ggYXMgZG91YmxlLmNsYXNzLgotICAgKi8KLSAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKLSAgICByZXR1cm4gZmllbGQuZ2V0R2VuZXJpY1R5cGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmaWVsZCdzIG5hbWUuCi0gICAqLwotICBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gZmllbGQuZ2V0TmFtZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1Jlc3VsdC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3ZjVhMy4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1Jlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBpbnZvY2F0aW9uIG9mIGEgYmVuY2htYXJrLCBpbmNsdWRpbmcgdGhlIHJ1biBpdHNlbGYsIGFzIHdlbGwgYXMgdGhlIGVudmlyb25tZW50Ci0gKiBpbiB3aGljaCB0aGUgcnVuIG9jY3VycmVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzdWx0IHsKLSAgcHJpdmF0ZSAvKmZpbmFsKi8gUnVuIHJ1bjsKLSAgcHJpdmF0ZSAvKmZpbmFsKi8gRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0KLSAgcHVibGljIFJlc3VsdChSdW4gcnVuLCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotICAgIHRoaXMucnVuID0gcnVuOwotICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKLSAgfQotCi0gIHB1YmxpYyBSdW4gZ2V0UnVuKCkgewotICAgIHJldHVybiBydW47Ci0gIH0KLQotICBwdWJsaWMgRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKSB7Ci0gICAgcmV0dXJuIGVudmlyb25tZW50OwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIHJldHVybiBvIGluc3RhbmNlb2YgUmVzdWx0Ci0gICAgICAgICYmICgoUmVzdWx0KSBvKS5ydW4uZXF1YWxzKHJ1bikKLSAgICAgICAgJiYgKChSZXN1bHQpIG8pLmVudmlyb25tZW50LmVxdWFscyhlbnZpcm9ubWVudCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gcnVuLmhhc2hDb2RlKCkgKiAzNyArIGVudmlyb25tZW50Lmhhc2hDb2RlKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gcnVuICsgIkAiICsgZW52aXJvbm1lbnQ7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgcHJpdmF0ZSBSZXN1bHQoKSB7fSAvLyBmb3IgZ3NvbgotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9SZXN1bHRzUmVhZGVyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1Jlc3VsdHNSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5NmRkMy4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1Jlc3VsdHNSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci0KLS8qKgotICogSGVscHMgd2l0aCBkZXNlcmlhbGl6YXRpb24gb2YgcmVzdWx0cywgZ2l2ZW4gdW5jZXJ0YWludHkgYWJvdXQgdGhlIGZvcm1hdCAoeG1sIG9yIGpzb24pIHRoZXkKLSAqIGFyZSBpbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlc3VsdHNSZWFkZXIgewotICBwdWJsaWMgUmVzdWx0IGdldFJlc3VsdChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvLyBzYXZlIGlucHV0IGludG8gYSBieXRlIGFycmF5IHNpbmNlIHdlIG1heSBuZWVkIHRvIHJlYWQgaXQgdHdpY2UKLSAgICBieXRlW10gcG9zdGVkRGF0YSA9IHJlYWRBbGxCeXRlcyhpbik7Ci0gICAgUmVzdWx0IHJlc3VsdDsKLSAgICBJbnB1dFN0cmVhbVJlYWRlciBiYWlzSnNvblJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocG9zdGVkRGF0YSkpOwotICAgIHRyeSB7Ci0gICAgICByZXN1bHQgPSBKc29uLmdldEdzb25JbnN0YW5jZSgpLmZyb21Kc29uKGJhaXNKc29uUmVhZGVyLCBSZXN1bHQuY2xhc3MpOwotICAgIH0gY2F0Y2ggKEpzb25QYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBwcm9iYWJseSBhbiBvbGQgY2xpZW50IGlzIHRyeWluZyB0byBzZW5kIGRhdGEsIHNvIHRyeSB0byBwYXJzZSBpdCBhcyBYTUwgaW5zdGVhZC4KLSAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXNYbWwgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocG9zdGVkRGF0YSk7Ci0gICAgICB0cnkgewotICAgICAgICByZXN1bHQgPSBYbWwucmVzdWx0RnJvbVhtbChiYWlzWG1sKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGJhaXNYbWwuY2xvc2UoKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgYmFpc0pzb25SZWFkZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgYnl0ZVtdIHJlYWRBbGxCeXRlcyhJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgaW50IHJlYWQ7Ci0gICAgd2hpbGUgKChyZWFkID0gaW4ucmVhZChidWYpKSAhPSAtMSkgewotICAgICAgYmFvcy53cml0ZShidWYsIDAsIHJlYWQpOwotICAgIH0KLSAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1J1bi5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9SdW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmOTM1MC4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1J1bi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIGNvbXBsZXRlIHJlc3VsdCBvZiBhIGJlbmNobWFyayBzdWl0ZSBydW4uCi0gKgotICogV0FSTklORzogYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgc3RvcmVkIG9uIHRoZSBhcHAgZW5naW5lIHNlcnZlci4gSWYgYW55IGNoYW5nZXMKLSAqIGFyZSBtYWRlIHRvIHRoaXMgY2xhc3MsIGEgZGVzZXJpYWxpemF0aW9uIGFkYXB0ZXIgbXVzdCBiZSB3cml0dGVuIGZvciB0aGlzIGNsYXNzIHRvIGVuc3VyZQotICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gKgotICogPHA+R3d0LXNhZmUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotQEd3dENvbXBhdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBSdW4KLSAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSAvKiBmb3IgR1dUIFNlcmlhbGl6YXRpb24gKi8gewotCi0gIHByaXZhdGUgLypmaW5hbCovIE1hcDxTY2VuYXJpbywgU2NlbmFyaW9SZXN1bHQ+IG1lYXN1cmVtZW50czsKLSAgcHJpdmF0ZSAvKmZpbmFsKi8gU3RyaW5nIGJlbmNobWFya05hbWU7Ci0gIHByaXZhdGUgLypmaW5hbCovIGxvbmcgZXhlY3V0ZWRUaW1lc3RhbXA7Ci0KLSAgLy8gVE9ETzogYWRkIG1vcmUgcnVuIHByb3BlcnRpZXMgc3VjaCBhcyBjaGVja3N1bXMgb2YgdGhlIGV4ZWN1dGVkIGNvZGUKLQotICBwdWJsaWMgUnVuKE1hcDxTY2VuYXJpbywgU2NlbmFyaW9SZXN1bHQ+IG1lYXN1cmVtZW50cywKLSAgICAgIFN0cmluZyBiZW5jaG1hcmtOYW1lLCBEYXRlIGV4ZWN1dGVkVGltZXN0YW1wKSB7Ci0gICAgaWYgKGJlbmNobWFya05hbWUgPT0gbnVsbCB8fCBleGVjdXRlZFRpbWVzdGFtcCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICB0aGlzLm1lYXN1cmVtZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPFNjZW5hcmlvLCBTY2VuYXJpb1Jlc3VsdD4obWVhc3VyZW1lbnRzKTsKLSAgICB0aGlzLmJlbmNobWFya05hbWUgPSBiZW5jaG1hcmtOYW1lOwotICAgIHRoaXMuZXhlY3V0ZWRUaW1lc3RhbXAgPSBleGVjdXRlZFRpbWVzdGFtcC5nZXRUaW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgTWFwPFNjZW5hcmlvLCBTY2VuYXJpb1Jlc3VsdD4gZ2V0TWVhc3VyZW1lbnRzKCkgewotICAgIHJldHVybiBtZWFzdXJlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEJlbmNobWFya05hbWUoKSB7Ci0gICAgcmV0dXJuIGJlbmNobWFya05hbWU7Ci0gIH0KLQotICBwdWJsaWMgRGF0ZSBnZXRFeGVjdXRlZFRpbWVzdGFtcCgpIHsKLSAgICByZXR1cm4gbmV3IERhdGUoZXhlY3V0ZWRUaW1lc3RhbXApOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIGlmIChvIGluc3RhbmNlb2YgUnVuKSB7Ci0gICAgICBSdW4gdGhhdCA9IChSdW4pIG87Ci0gICAgICByZXR1cm4gbWVhc3VyZW1lbnRzLmVxdWFscyh0aGF0Lm1lYXN1cmVtZW50cykKLSAgICAgICAgICAmJiBiZW5jaG1hcmtOYW1lLmVxdWFscyh0aGF0LmJlbmNobWFya05hbWUpCi0gICAgICAgICAgJiYgZXhlY3V0ZWRUaW1lc3RhbXAgPT0gdGhhdC5leGVjdXRlZFRpbWVzdGFtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICBpbnQgcmVzdWx0ID0gbWVhc3VyZW1lbnRzLmhhc2hDb2RlKCk7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICogMzcgKyBiZW5jaG1hcmtOYW1lLmhhc2hDb2RlKCk7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICogMzcgKyAoaW50KSAoKGV4ZWN1dGVkVGltZXN0YW1wID4+IDMyKSBeIGV4ZWN1dGVkVGltZXN0YW1wKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIG1lYXN1cmVtZW50cy50b1N0cmluZygpOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gIHByaXZhdGUgUnVuKCkge30gLy8gZm9yIEdXVCBTZXJpYWxpemF0aW9uCi19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1J1bm5lci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9SdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3MTVjOS4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1J1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlVzZXJFeGNlcHRpb24uRGlzcGxheVVzYWdlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLkV4Y2VwdGlvbkZyb21Vc2VyQ29kZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5JbnRlcmxlYXZlZFJlYWRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9iamVjdEFycmF5czsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5DbG9zZWFibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlByb3h5OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogQ3JlYXRlcywgZXhlY3V0ZXMgYW5kIHJlcG9ydHMgYmVuY2htYXJrIHJ1bnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSdW5uZXIgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVGaWx0ZXIgVVBMT0FEX0ZJTEVfRklMVEVSID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0gICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhtbCIpIHx8IGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuanNvbiIpOwotICAgIH0KLSAgfTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OQU1FX0RBVEVfRk9STUFUID0gInl5eXktTU0tZGQnVCdISC1tbS1zc1oiOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwbGl0dGVyIEFSR1VNRU5UX1NQTElUVEVSCi0gICAgICA9IFNwbGl0dGVyLm9uKFBhdHRlcm4uY29tcGlsZSgiXFxzKyIpKS5vbWl0RW1wdHlTdHJpbmdzKCk7Ci0KLSAgLyoqIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gdGhlIHByb2Nlc3MgKi8KLSAgcHJpdmF0ZSBBcmd1bWVudHMgYXJndW1lbnRzOwotICBwcml2YXRlIFNjZW5hcmlvU2VsZWN0aW9uIHNjZW5hcmlvU2VsZWN0aW9uOwotCi0gIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUZpbGVOYW1lKFJlc3VsdCByZXN1bHQpIHsKLSAgICBTdHJpbmcgdGltZXN0YW1wID0gY3JlYXRlVGltZXN0YW1wKCk7Ci0gICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzLiVzLmpzb24iLCByZXN1bHQuZ2V0UnVuKCkuZ2V0QmVuY2htYXJrTmFtZSgpLCB0aW1lc3RhbXApOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlVGltZXN0YW1wKCkgewotICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KEZJTEVfTkFNRV9EQVRFX0ZPUk1BVCwgTG9jYWxlLlVTKTsKLSAgICBkYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7Ci0gICAgZGF0ZUZvcm1hdC5zZXRMZW5pZW50KHRydWUpOwotICAgIHJldHVybiBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bihTdHJpbmcuLi4gYXJncykgewotICAgIHRoaXMuYXJndW1lbnRzID0gQXJndW1lbnRzLnBhcnNlKGFyZ3MpOwotICAgIEZpbGUgcmVzdWx0c1VwbG9hZEZpbGUgPSBhcmd1bWVudHMuZ2V0VXBsb2FkUmVzdWx0c0ZpbGUoKTsKLSAgICBpZiAocmVzdWx0c1VwbG9hZEZpbGUgIT0gbnVsbCkgewotICAgICAgdXBsb2FkUmVzdWx0c0ZpbGVPckRpcihyZXN1bHRzVXBsb2FkRmlsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHRoaXMuc2NlbmFyaW9TZWxlY3Rpb24gPSBuZXcgU2NlbmFyaW9TZWxlY3Rpb24oYXJndW1lbnRzKTsKLSAgICBpZiAoYXJndW1lbnRzLmdldERlYnVnKCkpIHsKLSAgICAgIGRlYnVnKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFJlc3VsdCByZXN1bHQgPSBydW5PdXRPZlByb2Nlc3MoKTsKLSAgICBuZXcgQ29uc29sZVJlcG9ydChyZXN1bHQuZ2V0UnVuKCksIGFyZ3VtZW50cykuZGlzcGxheVJlc3VsdHMoKTsKLSAgICBib29sZWFuIHNhdmVSZXN1bHRzTG9jYWxseSA9IGFyZ3VtZW50cy5nZXRTYXZlUmVzdWx0c0ZpbGUoKSAhPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICBwb3N0UmVzdWx0cyhyZXN1bHQpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgIHNhdmVSZXN1bHRzTG9jYWxseSA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHNhdmVSZXN1bHRzTG9jYWxseSkgewotICAgICAgc2F2ZVJlc3VsdHMocmVzdWx0KTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHVwbG9hZFJlc3VsdHNGaWxlT3JEaXIoRmlsZSByZXN1bHRzRmlsZU9yRGlyKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChyZXN1bHRzRmlsZU9yRGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgZm9yIChGaWxlIHJlc3VsdHNGaWxlIDogcmVzdWx0c0ZpbGVPckRpci5saXN0RmlsZXMoVVBMT0FEX0ZJTEVfRklMVEVSKSkgewotICAgICAgICAgIHVwbG9hZFJlc3VsdHMocmVzdWx0c0ZpbGUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB1cGxvYWRSZXN1bHRzKHJlc3VsdHNGaWxlT3JEaXIpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidXBsb2FkaW5nIFhNTCBmaWxlIGZhaWxlZCIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGxvYWRSZXN1bHRzKEZpbGUgcmVzdWx0c1VwbG9hZEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJVcGxvYWRpbmcgIiArIHJlc3VsdHNVcGxvYWRGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHJlc3VsdHNVcGxvYWRGaWxlKTsKLSAgICB0cnkgewotICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHRzUmVhZGVyKCkuZ2V0UmVzdWx0KGlucHV0U3RyZWFtKTsKLSAgICAgIHBvc3RSZXN1bHRzKHJlc3VsdCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNhdmVSZXN1bHRzKFJlc3VsdCByZXN1bHQpIHsKLSAgICBGaWxlIHJlc3VsdHNGaWxlID0gYXJndW1lbnRzLmdldFNhdmVSZXN1bHRzRmlsZSgpOwotICAgIEZpbGUgZGVzdGluYXRpb25GaWxlOwotICAgIGlmIChyZXN1bHRzRmlsZSA9PSBudWxsKSB7Ci0gICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKCIuL2NhbGlwZXItcmVzdWx0cyIpOwotICAgICAgZGlyLm1rZGlycygpOwotICAgICAgZGVzdGluYXRpb25GaWxlID0gbmV3IEZpbGUoZGlyLCBjcmVhdGVGaWxlTmFtZShyZXN1bHQpKTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdHNGaWxlLmV4aXN0cygpICYmIHJlc3VsdHNGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgIGRlc3RpbmF0aW9uRmlsZSA9IG5ldyBGaWxlKHJlc3VsdHNGaWxlLCBjcmVhdGVGaWxlTmFtZShyZXN1bHQpKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gYXNzdW1lIHRoaXMgaXMgYSBmaWxlCi0gICAgICBGaWxlIHBhcmVudCA9IHJlc3VsdHNGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICB9Ci0gICAgICBkZXN0aW5hdGlvbkZpbGUgPSByZXN1bHRzRmlsZTsKLSAgICB9Ci0KLSAgICBQcmludFN0cmVhbSBmaWxlUHJpbnRTdHJlYW07Ci0gICAgdHJ5IHsKLSAgICAgIGZpbGVQcmludFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbkZpbGUpKTsKLSAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbid0IG9wZW4gIiArIGRlc3RpbmF0aW9uRmlsZSwgZSk7Ci0gICAgfQotICAgIFN0cmluZyByZXN1bHRKc29uID0gSnNvbi5nZXRHc29uSW5zdGFuY2UoKS50b0pzb24ocmVzdWx0KTsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgcmVzdWx0cyB0byAiICsgZGVzdGluYXRpb25GaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgICBmaWxlUHJpbnRTdHJlYW0ucHJpbnQocmVzdWx0SnNvbik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIHdyaXRlIHJlc3VsdHMgdG8gZmlsZSwgd3JpdGluZyB0byBzdGFuZGFyZCBvdXQgaW5zdGVhZDoiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHRKc29uKTsKLSAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgZmlsZVByaW50U3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvc3RSZXN1bHRzKFJlc3VsdCByZXN1bHQpIHsKLSAgICBDYWxpcGVyUmMgY2FsaXBlcnJjID0gQ2FsaXBlclJjLklOU1RBTkNFOwotICAgIFN0cmluZyBwb3N0VXJsID0gY2FsaXBlcnJjLmdldFBvc3RVcmwoKTsKLSAgICBTdHJpbmcgYXBpS2V5ID0gY2FsaXBlcnJjLmdldEFwaUtleSgpOwotICAgIGlmIChwb3N0VXJsID09IG51bGwgfHwgYXBpS2V5ID09IG51bGwpIHsKLSAgICAgIC8vIFRPRE86IHByb2JhYmx5IG5pY2VyIHRvIHNob3cgYSBtZXNzYWdlIGlmIG9ubHkgb25lIGlzIG51bGwKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVVJMIHVybCA9IG5ldyBVUkwocG9zdFVybCArIGFwaUtleSArICIvIiArIHJlc3VsdC5nZXRSdW4oKS5nZXRCZW5jaG1hcmtOYW1lKCkpOwotICAgICAgSHR0cFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKGdldFByb3h5KCkpOwotICAgICAgdXJsQ29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKLSAgICAgIFN0cmluZyByZXN1bHRKc29uID0gSnNvbi5nZXRHc29uSW5zdGFuY2UoKS50b0pzb24ocmVzdWx0KTsKLSAgICAgIHVybENvbm5lY3Rpb24uZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUocmVzdWx0SnNvbi5nZXRCeXRlcygpKTsKLSAgICAgIGlmICh1cmxDb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpID09IDIwMCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZpZXcgY3VycmVudCBhbmQgcHJldmlvdXMgYmVuY2htYXJrIHJlc3VsdHMgb25saW5lOiIpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLSAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICIgKyBpbi5yZWFkTGluZSgpKTsKLSAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3RpbmcgdG8gIiArIHBvc3RVcmwgKyAiIGZhaWxlZDogIgotICAgICAgICAgICsgdXJsQ29ubmVjdGlvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7Ci0gICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0gICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSkpOwotICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0gICAgICB9Ci0gICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUG9zdGluZyB0byAiICsgcG9zdFVybCArICIgZmFpbGVkLiIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgUHJveHkgZ2V0UHJveHkoKSB7Ci0gICAgU3RyaW5nIHByb3h5QWRkcmVzcyA9IENhbGlwZXJSYy5JTlNUQU5DRS5nZXRQcm94eSgpOwotICAgIGlmIChwcm94eUFkZHJlc3MgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIFByb3h5Lk5PX1BST1hZOwotICAgIH0KLQotICAgIFN0cmluZ1tdIHByb3h5SG9zdEFuZFBvcnQgPSBwcm94eUFkZHJlc3MudHJpbSgpLnNwbGl0KCI6Iik7Ci0gICAgcmV0dXJuIG5ldyBQcm94eShQcm94eS5UeXBlLkhUVFAsIG5ldyBJbmV0U29ja2V0QWRkcmVzcygKLSAgICAgICAgcHJveHlIb3N0QW5kUG9ydFswXSwgSW50ZWdlci5wYXJzZUludChwcm94eUhvc3RBbmRQb3J0WzFdKSkpOwotICB9Ci0KLSAgcHJpdmF0ZSBTY2VuYXJpb1Jlc3VsdCBydW5TY2VuYXJpbyhTY2VuYXJpbyBzY2VuYXJpbykgewotICAgIE1lYXN1cmVtZW50UmVzdWx0IHRpbWVNZWFzdXJlbWVudFJlc3VsdCA9IG1lYXN1cmUoc2NlbmFyaW8sIE1lYXN1cmVtZW50VHlwZS5USU1FKTsKLSAgICBNZWFzdXJlbWVudFNldCBhbGxvY2F0aW9uTWVhc3VyZW1lbnRzID0gbnVsbDsKLSAgICBTdHJpbmcgYWxsb2NhdGlvbkV2ZW50TG9nID0gbnVsbDsKLSAgICBNZWFzdXJlbWVudFNldCBtZW1vcnlNZWFzdXJlbWVudHMgPSBudWxsOwotICAgIFN0cmluZyBtZW1vcnlFdmVudExvZyA9IG51bGw7Ci0gICAgaWYgKGFyZ3VtZW50cy5nZXRNZWFzdXJlTWVtb3J5KCkpIHsKLSAgICAgIE1lYXN1cmVtZW50UmVzdWx0IGFsbG9jYXRpb25zTWVhc3VyZW1lbnRSZXN1bHQgPQotICAgICAgICAgIG1lYXN1cmUoc2NlbmFyaW8sIE1lYXN1cmVtZW50VHlwZS5JTlNUQU5DRSk7Ci0gICAgICBhbGxvY2F0aW9uTWVhc3VyZW1lbnRzID0gYWxsb2NhdGlvbnNNZWFzdXJlbWVudFJlc3VsdC5nZXRNZWFzdXJlbWVudHMoKTsKLSAgICAgIGFsbG9jYXRpb25FdmVudExvZyA9IGFsbG9jYXRpb25zTWVhc3VyZW1lbnRSZXN1bHQuZ2V0RXZlbnRMb2coKTsKLSAgICAgIE1lYXN1cmVtZW50UmVzdWx0IG1lbW9yeU1lYXN1cmVtZW50UmVzdWx0ID0KLSAgICAgICAgICBtZWFzdXJlKHNjZW5hcmlvLCBNZWFzdXJlbWVudFR5cGUuTUVNT1JZKTsKLSAgICAgIG1lbW9yeU1lYXN1cmVtZW50cyA9IG1lbW9yeU1lYXN1cmVtZW50UmVzdWx0LmdldE1lYXN1cmVtZW50cygpOwotICAgICAgbWVtb3J5RXZlbnRMb2cgPSBtZW1vcnlNZWFzdXJlbWVudFJlc3VsdC5nZXRFdmVudExvZygpOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgU2NlbmFyaW9SZXN1bHQodGltZU1lYXN1cmVtZW50UmVzdWx0LmdldE1lYXN1cmVtZW50cygpLAotICAgICAgICB0aW1lTWVhc3VyZW1lbnRSZXN1bHQuZ2V0RXZlbnRMb2coKSwKLSAgICAgICAgYWxsb2NhdGlvbk1lYXN1cmVtZW50cywgYWxsb2NhdGlvbkV2ZW50TG9nLAotICAgICAgICBtZW1vcnlNZWFzdXJlbWVudHMsIG1lbW9yeUV2ZW50TG9nKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lYXN1cmVtZW50UmVzdWx0IHsKLSAgICBwcml2YXRlIGZpbmFsIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50czsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBldmVudExvZzsKLQotICAgIE1lYXN1cmVtZW50UmVzdWx0KE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50cywgU3RyaW5nIGV2ZW50TG9nKSB7Ci0gICAgICB0aGlzLm1lYXN1cmVtZW50cyA9IG1lYXN1cmVtZW50czsKLSAgICAgIHRoaXMuZXZlbnRMb2cgPSBldmVudExvZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVhc3VyZW1lbnRTZXQgZ2V0TWVhc3VyZW1lbnRzKCkgewotICAgICAgcmV0dXJuIG1lYXN1cmVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50TG9nKCkgewotICAgICAgcmV0dXJuIGV2ZW50TG9nOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTWVhc3VyZW1lbnRSZXN1bHQgbWVhc3VyZShTY2VuYXJpbyBzY2VuYXJpbywgTWVhc3VyZW1lbnRUeXBlIHR5cGUpIHsKLSAgICBWbSB2bSA9IG5ldyBWbUZhY3RvcnkoKS5jcmVhdGVWbShzY2VuYXJpbyk7Ci0gICAgLy8gdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHN0YXJ0aW5nIHRoZSBmb3JrZWQgcHJvY2VzcyBvbiBjZXJ0YWluIFZNcwotICAgIFByb2Nlc3NCdWlsZGVyIHByb2Nlc3NCdWlsZGVyID0gY3JlYXRlQ29tbWFuZChzY2VuYXJpbywgdm0sIHR5cGUpCi0gICAgICAgIC5yZWRpcmVjdEVycm9yU3RyZWFtKHRydWUpOwotICAgIFByb2Nlc3MgdGltZVByb2Nlc3M7Ci0gICAgdHJ5IHsKLSAgICAgIHRpbWVQcm9jZXNzID0gcHJvY2Vzc0J1aWxkZXIuc3RhcnQoKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZmFpbGVkIHRvIHN0YXJ0IHN1YnByb2Nlc3MiLCBlKTsKLSAgICB9Ci0KLSAgICBNZWFzdXJlbWVudFNldCBtZWFzdXJlbWVudFNldCA9IG51bGw7Ci0gICAgU3RyaW5nQnVpbGRlciBldmVudExvZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgSW50ZXJsZWF2ZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgcmVhZGVyID0gbmV3IEludGVybGVhdmVkUmVhZGVyKGFyZ3VtZW50cy5nZXRNYXJrZXIoKSwKLSAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIodGltZVByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSkpOwotICAgICAgT2JqZWN0IG87Ci0gICAgICB3aGlsZSAoKG8gPSByZWFkZXIucmVhZCgpKSAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgZXZlbnRMb2cuYXBwZW5kKG8pOwotICAgICAgICB9IGVsc2UgaWYgKG1lYXN1cmVtZW50U2V0ID09IG51bGwpIHsKLSAgICAgICAgICBKc29uT2JqZWN0IGpzb25PYmplY3QgPSAoSnNvbk9iamVjdCkgbzsKLSAgICAgICAgICBtZWFzdXJlbWVudFNldCA9IEpzb24ubWVhc3VyZW1lbnRTZXRGcm9tSnNvbihqc29uT2JqZWN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB2YWx1ZTogIiArIG8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIENsb3NlYWJsZXMuY2xvc2VRdWlldGx5KHJlYWRlcik7Ci0gICAgICB0aW1lUHJvY2Vzcy5kZXN0cm95KCk7Ci0gICAgfQotCi0gICAgaWYgKG1lYXN1cmVtZW50U2V0ID09IG51bGwpIHsKLSAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZhaWxlZCB0byBleGVjdXRlICIgKyBKb2luZXIub24oIiAiKS5qb2luKHByb2Nlc3NCdWlsZGVyLmNvbW1hbmQoKSk7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgIiArIG1lc3NhZ2UpOwotICAgICAgU3lzdGVtLmVyci5wcmludGxuKGV2ZW50TG9nLnRvU3RyaW5nKCkpOwotICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBNZWFzdXJlbWVudFJlc3VsdChtZWFzdXJlbWVudFNldCwgZXZlbnRMb2cudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIFByb2Nlc3NCdWlsZGVyIGNyZWF0ZUNvbW1hbmQoU2NlbmFyaW8gc2NlbmFyaW8sIFZtIHZtLCBNZWFzdXJlbWVudFR5cGUgdHlwZSkgewotICAgIEZpbGUgd29ya2luZ0RpcmVjdG9yeSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7Ci0KLSAgICBTdHJpbmcgY2xhc3NQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKLSAgICBpZiAoY2xhc3NQYXRoID09IG51bGwgfHwgY2xhc3NQYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImphdmEuY2xhc3MucGF0aCBpcyB1bmRlZmluZWQgaW4gIiArIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgIH0KLQotICAgIEltbXV0YWJsZUxpc3QuQnVpbGRlcjxTdHJpbmc+IHZtQXJncyA9IEltbXV0YWJsZUxpc3QuYnVpbGRlcigpOwotICAgIHZtQXJncy5hZGRBbGwoQVJHVU1FTlRfU1BMSVRURVIuc3BsaXQoc2NlbmFyaW8uZ2V0VmFyaWFibGVzKCkuZ2V0KFNjZW5hcmlvLlZNX0tFWSkpKTsKLSAgICBpZiAodHlwZSA9PSBNZWFzdXJlbWVudFR5cGUuSU5TVEFOQ0UgfHwgdHlwZSA9PSBNZWFzdXJlbWVudFR5cGUuTUVNT1JZKSB7Ci0gICAgICBTdHJpbmcgYWxsb2NhdGlvbkphckZpbGUgPSBTeXN0ZW0uZ2V0ZW52KCJBTExPQ0FUSU9OX0pBUiIpOwotICAgICAgdm1BcmdzLmFkZCgiLWphdmFhZ2VudDoiICsgYWxsb2NhdGlvbkphckZpbGUpOwotICAgIH0KLSAgICB2bUFyZ3MuYWRkQWxsKHZtLmdldFZtU3BlY2lmaWNPcHRpb25zKHR5cGUsIGFyZ3VtZW50cykpOwotCi0gICAgTWFwPFN0cmluZywgU3RyaW5nPiB2bVBhcmFtZXRlcnMgPSBzY2VuYXJpby5nZXRWYXJpYWJsZXMoCi0gICAgICAgIHNjZW5hcmlvU2VsZWN0aW9uLmdldFZtUGFyYW1ldGVyTmFtZXMoKSk7Ci0gICAgZm9yIChTdHJpbmcgdm1QYXJhbWV0ZXIgOiB2bVBhcmFtZXRlcnMudmFsdWVzKCkpIHsKLSAgICAgIHZtQXJncy5hZGRBbGwoQVJHVU1FTlRfU1BMSVRURVIuc3BsaXQodm1QYXJhbWV0ZXIpKTsKLSAgICB9Ci0KLSAgICBJbW11dGFibGVMaXN0LkJ1aWxkZXI8U3RyaW5nPiBjYWxpcGVyQXJncyA9IEltbXV0YWJsZUxpc3QuYnVpbGRlcigpOwotICAgIGNhbGlwZXJBcmdzLmFkZCgiLS13YXJtdXBNaWxsaXMiKS5hZGQoTG9uZy50b1N0cmluZyhhcmd1bWVudHMuZ2V0V2FybXVwTWlsbGlzKCkpKTsKLSAgICBjYWxpcGVyQXJncy5hZGQoIi0tcnVuTWlsbGlzIikuYWRkKExvbmcudG9TdHJpbmcoYXJndW1lbnRzLmdldFJ1bk1pbGxpcygpKSk7Ci0gICAgY2FsaXBlckFyZ3MuYWRkKCItLW1lYXN1cmVtZW50VHlwZSIpLmFkZCh0eXBlLnRvU3RyaW5nKCkpOwotICAgIGNhbGlwZXJBcmdzLmFkZCgiLS1tYXJrZXIiKS5hZGQoYXJndW1lbnRzLmdldE1hcmtlcigpKTsKLQotICAgIE1hcDxTdHJpbmcsU3RyaW5nPiB1c2VyUGFyYW1ldGVycyA9IHNjZW5hcmlvLmdldFZhcmlhYmxlcygKLSAgICAgICAgc2NlbmFyaW9TZWxlY3Rpb24uZ2V0VXNlclBhcmFtZXRlck5hbWVzKCkpOwotICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogdXNlclBhcmFtZXRlcnMuZW50cnlTZXQoKSkgewotICAgICAgY2FsaXBlckFyZ3MuYWRkKCItRCIgKyBlbnRyeS5nZXRLZXkoKSArICI9IiArIGVudHJ5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgICBjYWxpcGVyQXJncy5hZGQoYXJndW1lbnRzLmdldFN1aXRlQ2xhc3NOYW1lKCkpOwotCi0gICAgcmV0dXJuIHZtLm5ld1Byb2Nlc3NCdWlsZGVyKHdvcmtpbmdEaXJlY3RvcnksIGNsYXNzUGF0aCwKLSAgICAgICAgdm1BcmdzLmJ1aWxkKCksIEluUHJvY2Vzc1J1bm5lci5jbGFzcy5nZXROYW1lKCksIGNhbGlwZXJBcmdzLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRlYnVnKCkgewotICAgIHRyeSB7Ci0gICAgICBpbnQgZGVidWdSZXBzID0gYXJndW1lbnRzLmdldERlYnVnUmVwcygpOwotICAgICAgSW5Qcm9jZXNzUnVubmVyIHJ1bm5lciA9IG5ldyBJblByb2Nlc3NSdW5uZXIoKTsKLSAgICAgIERlYnVnTWVhc3VyZXIgbWVhc3VyZXIgPSBuZXcgRGVidWdNZWFzdXJlcihkZWJ1Z1JlcHMpOwotICAgICAgZm9yIChTY2VuYXJpbyBzY2VuYXJpbyA6IHNjZW5hcmlvU2VsZWN0aW9uLnNlbGVjdCgpKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicnVubmluZyAiICsgZGVidWdSZXBzICsgIiBkZWJ1ZyByZXBzIG9mICIgKyBzY2VuYXJpbyk7Ci0gICAgICAgIHJ1bm5lci5ydW4oc2NlbmFyaW9TZWxlY3Rpb24sIHNjZW5hcmlvLCBtZWFzdXJlcik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb25Gcm9tVXNlckNvZGVFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBSZXN1bHQgcnVuT3V0T2ZQcm9jZXNzKCkgewotICAgIERhdGUgZXhlY3V0ZWREYXRlID0gbmV3IERhdGUoKTsKLSAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxTY2VuYXJpbywgU2NlbmFyaW9SZXN1bHQ+IHJlc3VsdHNCdWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKLQotICAgIHRyeSB7Ci0gICAgICBMaXN0PFNjZW5hcmlvPiBzY2VuYXJpb3MgPSBzY2VuYXJpb1NlbGVjdGlvbi5zZWxlY3QoKTsKLQotICAgICAgaW50IGkgPSAwOwotICAgICAgZm9yIChTY2VuYXJpbyBzY2VuYXJpbyA6IHNjZW5hcmlvcykgewotICAgICAgICBiZWZvcmVNZWFzdXJlbWVudChpKyssIHNjZW5hcmlvcy5zaXplKCksIHNjZW5hcmlvKTsKLSAgICAgICAgU2NlbmFyaW9SZXN1bHQgc2NlbmFyaW9SZXN1bHQgPSBydW5TY2VuYXJpbyhzY2VuYXJpbyk7Ci0gICAgICAgIGFmdGVyTWVhc3VyZW1lbnQoYXJndW1lbnRzLmdldE1lYXN1cmVNZW1vcnkoKSwgc2NlbmFyaW9SZXN1bHQpOwotICAgICAgICByZXN1bHRzQnVpbGRlci5wdXQoc2NlbmFyaW8sIHNjZW5hcmlvUmVzdWx0KTsKLSAgICAgIH0KLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCi0gICAgICBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IG5ldyBFbnZpcm9ubWVudEdldHRlcigpLmdldEVudmlyb25tZW50U25hcHNob3QoKTsKLSAgICAgIHJldHVybiBuZXcgUmVzdWx0KAotICAgICAgICAgIG5ldyBSdW4ocmVzdWx0c0J1aWxkZXIuYnVpbGQoKSwgYXJndW1lbnRzLmdldFN1aXRlQ2xhc3NOYW1lKCksIGV4ZWN1dGVkRGF0ZSksCi0gICAgICAgICAgZW52aXJvbm1lbnQpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uRnJvbVVzZXJDb2RlRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBiZWZvcmVNZWFzdXJlbWVudChpbnQgaW5kZXgsIGludCB0b3RhbCwgU2NlbmFyaW8gc2NlbmFyaW8pIHsKLSAgICBkb3VibGUgcGVyY2VudERvbmUgPSAoZG91YmxlKSBpbmRleCAvIHRvdGFsOwotICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlMi4wZiUlICVzIiwgcGVyY2VudERvbmUgKiAxMDAsIHNjZW5hcmlvKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZnRlck1lYXN1cmVtZW50KGJvb2xlYW4gbWVtb3J5TWVhc3VyZWQsIFNjZW5hcmlvUmVzdWx0IHNjZW5hcmlvUmVzdWx0KSB7Ci0gICAgU3RyaW5nIG1lbW9yeU1lYXN1cmVtZW50cyA9ICIiOwotICAgIGlmIChtZW1vcnlNZWFzdXJlZCkgewotICAgICAgTWVhc3VyZW1lbnRTZXQgaW5zdGFuY2VNZWFzdXJlbWVudFNldCA9Ci0gICAgICAgICAgc2NlbmFyaW9SZXN1bHQuZ2V0TWVhc3VyZW1lbnRTZXQoTWVhc3VyZW1lbnRUeXBlLklOU1RBTkNFKTsKLSAgICAgIFN0cmluZyBpbnN0YW5jZVVuaXQgPQotICAgICAgICBDb25zb2xlUmVwb3J0LlVOSVRfT1JERVJJTkcubWluKGluc3RhbmNlTWVhc3VyZW1lbnRTZXQuZ2V0VW5pdE5hbWVzKCkuZW50cnlTZXQoKSkuZ2V0S2V5KCk7Ci0gICAgICBNZWFzdXJlbWVudFNldCBtZW1vcnlNZWFzdXJlbWVudFNldCA9IHNjZW5hcmlvUmVzdWx0LmdldE1lYXN1cmVtZW50U2V0KE1lYXN1cmVtZW50VHlwZS5NRU1PUlkpOwotICAgICAgU3RyaW5nIG1lbW9yeVVuaXQgPQotICAgICAgICBDb25zb2xlUmVwb3J0LlVOSVRfT1JERVJJTkcubWluKG1lbW9yeU1lYXN1cmVtZW50U2V0LmdldFVuaXROYW1lcygpLmVudHJ5U2V0KCkpLmdldEtleSgpOwotICAgICAgbWVtb3J5TWVhc3VyZW1lbnRzID0gU3RyaW5nLmZvcm1hdCgiLCBhbGxvY2F0ZWQgJXMlcyBmb3IgYSB0b3RhbCBvZiAlcyVzIiwKLSAgICAgICAgICBNYXRoLnJvdW5kKGluc3RhbmNlTWVhc3VyZW1lbnRTZXQubWVkaWFuVW5pdHMoKSksIGluc3RhbmNlVW5pdCwKLSAgICAgICAgICBNYXRoLnJvdW5kKG1lbW9yeU1lYXN1cmVtZW50U2V0Lm1lZGlhblVuaXRzKCkpLCBtZW1vcnlVbml0KTsKLSAgICB9Ci0KLSAgICBNZWFzdXJlbWVudFNldCB0aW1lTWVhc3VyZW1lbnRTZXQgPSBzY2VuYXJpb1Jlc3VsdC5nZXRNZWFzdXJlbWVudFNldChNZWFzdXJlbWVudFR5cGUuVElNRSk7Ci0gICAgU3RyaW5nIHVuaXQgPQotICAgICAgICBDb25zb2xlUmVwb3J0LlVOSVRfT1JERVJJTkcubWluKHRpbWVNZWFzdXJlbWVudFNldC5nZXRVbml0TmFtZXMoKS5lbnRyeVNldCgpKS5nZXRLZXkoKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50ZigiICUuMmYgJXM7IFx1MDNDMz0lLjJmICVzIEAgJWQgdHJpYWxzJXMlbiIsIHRpbWVNZWFzdXJlbWVudFNldC5tZWRpYW5Vbml0cygpLAotICAgICAgICB1bml0LCB0aW1lTWVhc3VyZW1lbnRTZXQuc3RhbmRhcmREZXZpYXRpb25Vbml0cygpLCB1bml0LAotICAgICAgICB0aW1lTWVhc3VyZW1lbnRTZXQuZ2V0TWVhc3VyZW1lbnRzKCkuc2l6ZSgpLCBtZW1vcnlNZWFzdXJlbWVudHMpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIHRyeSB7Ci0gICAgICBuZXcgUnVubmVyKCkucnVuKGFyZ3MpOwotICAgICAgU3lzdGVtLmV4aXQoMCk7IC8vIHVzZXIgY29kZSBtYXkgaGF2ZSBsZWF2ZSBub24tZGFlbW9uIHRocmVhZHMgYmVoaW5kIQotICAgIH0gY2F0Y2ggKERpc3BsYXlVc2FnZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLmRpc3BsYXkoKTsKLSAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0gY2F0Y2ggKFVzZXJFeGNlcHRpb24gZSkgewotICAgICAgZS5kaXNwbGF5KCk7Ci0gICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gdGVtcG9yYXJ5IGZha2VyeQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihDbGFzczw/IGV4dGVuZHMgQmVuY2htYXJrPiBzdWl0ZSwgU3RyaW5nW10gYXJncykgewotICAgIG1haW4oT2JqZWN0QXJyYXlzLmNvbmNhdChhcmdzLCBzdWl0ZS5nZXROYW1lKCkpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9TY2VuYXJpby5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9TY2VuYXJpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzAyNmQ4Li4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvU2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIGNvbmZpZ3VyZWQgYmVuY2htYXJrLgotICoKLSAqIFdBUk5JTkc6IGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHN0b3JlZCBvbiB0aGUgYXBwIGVuZ2luZSBzZXJ2ZXIuIElmIGFueSBjaGFuZ2VzCi0gKiBhcmUgbWFkZSB0byB0aGlzIGNsYXNzLCBhIGRlc2VyaWFsaXphdGlvbiBhZGFwdGVyIG11c3QgYmUgd3JpdHRlbiBmb3IgdGhpcyBjbGFzcyB0byBlbnN1cmUKLSAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotICoKLSAqIDxwPkd3dC1zYWZlLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLUBHd3RDb21wYXRpYmxlCi1wdWJsaWMgZmluYWwgY2xhc3MgU2NlbmFyaW8KLSAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSAvKiBmb3IgR1dUICovICB7Ci0KLSAgc3RhdGljIGZpbmFsIFN0cmluZyBWTV9LRVkgPSAidm0iOwotICBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSUFMX0tFWSA9ICJ0cmlhbCI7Ci0KLSAgcHJpdmF0ZSAvKmZpbmFsKi8gTWFwPFN0cmluZywgU3RyaW5nPiB2YXJpYWJsZXM7Ci0KLSAgcHVibGljIFNjZW5hcmlvKE1hcDxTdHJpbmcsIFN0cmluZz4gdmFyaWFibGVzKSB7Ci0gICAgdGhpcy52YXJpYWJsZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4odmFyaWFibGVzKTsKLSAgfQotCi0gIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZhcmlhYmxlcygpIHsKLSAgICByZXR1cm4gdmFyaWFibGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5hbWVkIHNldCBvZiB2YXJpYWJsZXMuCi0gICAqLwotICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRWYXJpYWJsZXMoU2V0PFN0cmluZz4gbmFtZXMpIHsKLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPih2YXJpYWJsZXMpOwotICAgIHJlc3VsdC5rZXlTZXQoKS5yZXRhaW5BbGwobmFtZXMpOwotICAgIGlmICghcmVzdWx0LmtleVNldCgpLmVxdWFscyhuYW1lcykpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBhbGwgb2YgIiArIG5hbWVzICsgIiBhcmUgaW4gIiArIHJlc3VsdC5rZXlTZXQoKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBTY2VuYXJpbwotICAgICAgICAmJiAoKFNjZW5hcmlvKSBvKS5nZXRWYXJpYWJsZXMoKS5lcXVhbHModmFyaWFibGVzKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIHJldHVybiB2YXJpYWJsZXMuaGFzaENvZGUoKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAiU2NlbmFyaW8iICsgdmFyaWFibGVzOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gIHByaXZhdGUgU2NlbmFyaW8oKSB7fSAvLyBmb3IgR1dUCi19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1NjZW5hcmlvUmVzdWx0LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1NjZW5hcmlvUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTY4N2QuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9TY2VuYXJpb1Jlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBIb2xkcyB0aGUgcmVzdWx0cyBmb3IgYSBwYXJ0aWN1bGFyIHNjZW5hcmlvLCBpbmNsdWRpbmcgdGltaW5nIG1lYXN1cmVtZW50cywgbWVtb3J5IHVzZQotICogbWVhc3VyZW1lbnRzLCBhbmQgZXZlbnQgbG9ncyBmb3IgYm90aCwgcmVjb3JkaW5nIHNpZ25pZmljYW50IGV2ZW50cyBkdXJpbmcgbWVhc3VyZW1lbnQuCi0gKgotICogV0FSTklORzogYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgc3RvcmVkIG9uIHRoZSBhcHAgZW5naW5lIHNlcnZlci4gSWYgYW55IGNoYW5nZXMKLSAqIGFyZSBtYWRlIHRvIHRoaXMgY2xhc3MsIGEgZGVzZXJpYWxpemF0aW9uIGFkYXB0ZXIgbXVzdCBiZSB3cml0dGVuIGZvciB0aGlzIGNsYXNzIHRvIGVuc3VyZQotICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gKgotICogPHA+R3d0LXNhZmUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKHsic2VyaWFsIiwgIkZpZWxkTWF5QmVGaW5hbCJ9KQotQEd3dENvbXBhdGlibGUKLXB1YmxpYyBmaW5hbCBjbGFzcyBTY2VuYXJpb1Jlc3VsdAotICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIC8qIGZvciBHV1QgU2VyaWFsaXphdGlvbiAqLyB7Ci0KLSAgLy8gd2FudCB0aGVzZSB0byBiZSBFbnVtTWFwcywgYnV0IHRoYXQgdXBzZXRzIEdXVAotICBwcml2YXRlIC8qZmluYWwqLyBNYXA8U3RyaW5nLCBNZWFzdXJlbWVudFNldD4gbWVhc3VyZW1lbnRTZXRNYXAKLSAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZWFzdXJlbWVudFNldD4oKTsKLSAgcHJpdmF0ZSAvKmZpbmFsKi8gTWFwPFN0cmluZywgU3RyaW5nPiBldmVudExvZ01hcAotICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICBwdWJsaWMgU2NlbmFyaW9SZXN1bHQoTWVhc3VyZW1lbnRTZXQgdGltZU1lYXN1cmVtZW50U2V0LAotICAgICAgU3RyaW5nIHRpbWVFdmVudExvZywgTWVhc3VyZW1lbnRTZXQgaW5zdGFuY2VNZWFzdXJlbWVudFNldCwKLSAgICAgIFN0cmluZyBpbnN0YW5jZUV2ZW50TG9nLCBNZWFzdXJlbWVudFNldCBtZW1vcnlNZWFzdXJlbWVudFNldCwKLSAgICAgIFN0cmluZyBtZW1vcnlFdmVudExvZykgewotICAgIGlmICh0aW1lTWVhc3VyZW1lbnRTZXQgIT0gbnVsbCkgewotICAgICAgbWVhc3VyZW1lbnRTZXRNYXAucHV0KE1lYXN1cmVtZW50VHlwZS5USU1FLnRvU3RyaW5nKCksIHRpbWVNZWFzdXJlbWVudFNldCk7Ci0gICAgICBldmVudExvZ01hcC5wdXQoTWVhc3VyZW1lbnRUeXBlLlRJTUUudG9TdHJpbmcoKSwgdGltZUV2ZW50TG9nKTsKLSAgICB9Ci0gICAgaWYgKGluc3RhbmNlTWVhc3VyZW1lbnRTZXQgIT0gbnVsbCkgewotICAgICAgbWVhc3VyZW1lbnRTZXRNYXAucHV0KE1lYXN1cmVtZW50VHlwZS5JTlNUQU5DRS50b1N0cmluZygpLCBpbnN0YW5jZU1lYXN1cmVtZW50U2V0KTsKLSAgICAgIGV2ZW50TG9nTWFwLnB1dChNZWFzdXJlbWVudFR5cGUuSU5TVEFOQ0UudG9TdHJpbmcoKSwgaW5zdGFuY2VFdmVudExvZyk7Ci0gICAgfQotICAgIGlmIChtZW1vcnlNZWFzdXJlbWVudFNldCAhPSBudWxsKSB7Ci0gICAgICBtZWFzdXJlbWVudFNldE1hcC5wdXQoTWVhc3VyZW1lbnRUeXBlLk1FTU9SWS50b1N0cmluZygpLCBtZW1vcnlNZWFzdXJlbWVudFNldCk7Ci0gICAgICBldmVudExvZ01hcC5wdXQoTWVhc3VyZW1lbnRUeXBlLk1FTU9SWS50b1N0cmluZygpLCBtZW1vcnlFdmVudExvZyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE1lYXN1cmVtZW50U2V0IGdldE1lYXN1cmVtZW50U2V0KE1lYXN1cmVtZW50VHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIG1lYXN1cmVtZW50U2V0TWFwLmdldCh0eXBlLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRFdmVudExvZyhNZWFzdXJlbWVudFR5cGUgdHlwZSkgewotICAgIHJldHVybiBldmVudExvZ01hcC5nZXQodHlwZS50b1N0cmluZygpKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICByZXR1cm4gbyBpbnN0YW5jZW9mIFNjZW5hcmlvUmVzdWx0Ci0gICAgICAgICYmICgoU2NlbmFyaW9SZXN1bHQpIG8pLm1lYXN1cmVtZW50U2V0TWFwLmVxdWFscyhtZWFzdXJlbWVudFNldE1hcCkKLSAgICAgICAgJiYgKChTY2VuYXJpb1Jlc3VsdCkgbykuZXZlbnRMb2dNYXAuZXF1YWxzKGV2ZW50TG9nTWFwKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIHJldHVybiBtZWFzdXJlbWVudFNldE1hcC5oYXNoQ29kZSgpICogMzcgKyBldmVudExvZ01hcC5oYXNoQ29kZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICJtZWFzdXJlbWVudFNldE1hcDogIiArIG1lYXN1cmVtZW50U2V0TWFwICsgIiwgZXZlbnRMb2dNYXA6ICIgKyBldmVudExvZ01hcDsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICBwcml2YXRlIFNjZW5hcmlvUmVzdWx0KCkge30gLy8gZm9yIEdXVCBTZXJpYWxpemF0aW9uCi19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1NjZW5hcmlvU2VsZWN0aW9uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1NjZW5hcmlvU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZmVhZDAuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9TY2VuYXJpb1NlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlVzZXJFeGNlcHRpb24uQWJzdHJhY3RCZW5jaG1hcmtFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlVzZXJFeGNlcHRpb24uRG9lc250SW1wbGVtZW50QmVuY2htYXJrRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLkV4Y2VwdGlvbkZyb21Vc2VyQ29kZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuVXNlckV4Y2VwdGlvbi5Ob1BhcmFtZXRlcmxlc3NDb25zdHJ1Y3RvckV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuVXNlckV4Y2VwdGlvbi5Ob1N1Y2hDbGFzc0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZEhhc2hNdWx0aW1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBGaWd1cmVzIG91dCB3aGljaCBzY2VuYXJpb3MgdG8gYmVuY2htYXJrIGdpdmVuIGEgYmVuY2htYXJrIHN1aXRlLCBzZXQgb2YgdXNlcgotICogcGFyYW1ldGVycywgYW5kIHNldCBvZiB1c2VyIFZNcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNjZW5hcmlvU2VsZWN0aW9uIHsKLQotICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHVzZXJWbXM7Ci0gIHByaXZhdGUgZmluYWwgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHZtUGFyYW1ldGVyczsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3VpdGVDbGFzc05hbWU7Ci0KLSAgLyoqCi0gICAqIFRoZSB1c2VyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgbWF5IGJlIGEgc3Vic2V0IG9mCi0gICAqIHRoZSBlZmZlY3RpdmUgdXNlciBwYXJhbWV0ZXJzIGJlY2F1c2UgcGFyYW1ldGVycyBub3Qgc3BlY2lmaWVkIGhlcmUgbWF5IGdldAotICAgKiBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBiZW5jaG1hcmsgY2xhc3MuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB1c2VyUGFyYW1ldGVyQXJndW1lbnRzOwotCi0gIC8qKgotICAgKiBUaGUgYWN0dWFsIHVzZXIgcGFyYW1ldGVycyB3ZSdsbCB1c2UgdG8gcnVuIGluIHRoZSBiZW5jaG1hcmsuIFRoaXMgY29udGFpbnMKLSAgICogdGhlIHVzZXJQYXJhbWV0ZXJBcmd1bWVudHMgcGx1cyB0aGUgZGVmYXVsdCB1c2VyIHBhcmFtZXRlcnMuCi0gICAqLwotICBwcml2YXRlIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB1c2VyUGFyYW1ldGVyczsKLQotICBwcml2YXRlIGZpbmFsIGludCB0cmlhbHM7Ci0gIHByaXZhdGUgQmVuY2htYXJrIHN1aXRlOwotCi0KLSAgcHVibGljIFNjZW5hcmlvU2VsZWN0aW9uKEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKLSAgICB0aGlzKGFyZ3VtZW50cy5nZXRVc2VyVm1zKCksIGFyZ3VtZW50cy5nZXRWbVBhcmFtZXRlcnMoKSwgYXJndW1lbnRzLmdldFN1aXRlQ2xhc3NOYW1lKCksCi0gICAgICAgIGFyZ3VtZW50cy5nZXRVc2VyUGFyYW1ldGVycygpLCBhcmd1bWVudHMuZ2V0VHJpYWxzKCkpOwotICB9Ci0KLSAgcHVibGljIFNjZW5hcmlvU2VsZWN0aW9uKFNldDxTdHJpbmc+IHVzZXJWbXMsIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB2bVBhcmFtZXRlcnMsCi0gICAgICBTdHJpbmcgc3VpdGVDbGFzc05hbWUsIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB1c2VyUGFyYW1ldGVyQXJndW1lbnRzLCBpbnQgdHJpYWxzKSB7Ci0gICAgdGhpcy51c2VyVm1zID0gdXNlclZtczsKLSAgICB0aGlzLnZtUGFyYW1ldGVycyA9IHZtUGFyYW1ldGVyczsKLSAgICB0aGlzLnN1aXRlQ2xhc3NOYW1lID0gc3VpdGVDbGFzc05hbWU7Ci0gICAgdGhpcy51c2VyUGFyYW1ldGVyQXJndW1lbnRzID0gdXNlclBhcmFtZXRlckFyZ3VtZW50czsKLSAgICB0aGlzLnRyaWFscyA9IHRyaWFsczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBzY2VuYXJpb3MgZm9yIHRoaXMgYmVuY2htYXJrLgotICAgKi8KLSAgcHVibGljIExpc3Q8U2NlbmFyaW8+IHNlbGVjdCgpIHsKLSAgICBwcmVwYXJlU3VpdGUoKTsKLSAgICB1c2VyUGFyYW1ldGVycyA9IGNvbXB1dGVVc2VyUGFyYW1ldGVycygpOwotICAgIHJldHVybiBjcmVhdGVTY2VuYXJpb3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHtAY29kZSBzY2VuYXJpb30sIHdpdGggaW5mb3JtYXRpb24gZnJvbSB7QGNvZGUgc3VpdGV9Ci0gICAqIGFzc2lzdGluZyBpbiBjb3JyZWN0aW5nIHByb2JsZW1zLgotICAgKi8KLSAgcHVibGljIFNjZW5hcmlvIG5vcm1hbGl6ZVNjZW5hcmlvKFNjZW5hcmlvIHNjZW5hcmlvKSB7Ci0gICAgLy8gVGhpcyBvbmx5IGFwcGxpZXMgdG8gU2ltcGxlQmVuY2htYXJrcyBzaW5jZSB0aGV5IGFjY2VwdCB0aGUgc3BlY2lhbCAiYmVuY2htYXJrIgotICAgIC8vIHBhcmFtZXRlci4gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBiZWNhdXNlIFNpbXBsZUJlbmNobWFyayBpcyB0aGUgbW9zdCBjb21tb25seQotICAgIC8vIHVzZWQgYmVuY2htYXJrIGNsYXNzLiBIYXZlIHRvIGRvIHRoaXMgaG9ycmlibGUgc3R1ZmYgc2luY2UgQmVuY2htYXJrIEFQSQotICAgIC8vIGRvZXNuJ3QgcHJvdmlkZSBzY2VuYXJpby1ub3JtYWxpemF0aW9uIChhbmQgaXQgc2hvdWxkbid0KSwgd2hpY2ggU2ltcGxlQmVuY2htYXJrCi0gICAgLy8gcmVxdWlyZXMuCi0gICAgaWYgKHN1aXRlIGluc3RhbmNlb2YgU2ltcGxlQmVuY2htYXJrKSB7Ci0gICAgICByZXR1cm4gKChTaW1wbGVCZW5jaG1hcmspIHN1aXRlKS5ub3JtYWxpemVTY2VuYXJpbyhzY2VuYXJpbyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNjZW5hcmlvOwotICB9Ci0KLSAgcHVibGljIFNldDxTdHJpbmc+IGdldFVzZXJQYXJhbWV0ZXJOYW1lcygpIHsKLSAgICBpZiAodXNlclBhcmFtZXRlcnMgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gdXNlclBhcmFtZXRlcnMua2V5U2V0KCk7Ci0gIH0KLQotICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Vm1QYXJhbWV0ZXJOYW1lcygpIHsKLSAgICByZXR1cm4gdm1QYXJhbWV0ZXJzLmtleVNldCgpOwotICB9Ci0KLSAgcHVibGljIENvbmZpZ3VyZWRCZW5jaG1hcmsgY3JlYXRlQmVuY2htYXJrKFNjZW5hcmlvIHNjZW5hcmlvKSB7Ci0gICAgcmV0dXJuIHN1aXRlLmNyZWF0ZUJlbmNobWFyayhzY2VuYXJpby5nZXRWYXJpYWJsZXMoZ2V0VXNlclBhcmFtZXRlck5hbWVzKCkpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcmVwYXJlU3VpdGUoKSB7Ci0gICAgQ2xhc3M8Pz4gYmVuY2htYXJrQ2xhc3M7Ci0gICAgdHJ5IHsKLSAgICAgIGJlbmNobWFya0NsYXNzID0gZ2V0Q2xhc3NCeU5hbWUoc3VpdGVDbGFzc05hbWUpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlKSB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uRnJvbVVzZXJDb2RlRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7Ci0gICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoQ2xhc3NFeGNlcHRpb24oc3VpdGVDbGFzc05hbWUpOwotICAgIH0KLQotICAgIE9iamVjdCBzOwotICAgIHRyeSB7Ci0gICAgICBDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvciA9IGJlbmNobWFya0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoKTsKLSAgICAgIGNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICBzID0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoKTsKLSAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgdGhyb3cgbmV3IEFic3RyYWN0QmVuY2htYXJrRXhjZXB0aW9uKGJlbmNobWFya0NsYXNzKTsKLSAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICB0aHJvdyBuZXcgTm9QYXJhbWV0ZXJsZXNzQ29uc3RydWN0b3JFeGNlcHRpb24oYmVuY2htYXJrQ2xhc3MpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaW1wb3NzaWJsZSkgewotICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGltcG9zc2libGUpOyAvLyBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHdlIHNldEFjY2Vzc2libGUodHJ1ZSkKLSAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb25Gcm9tVXNlckNvZGVFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAocyBpbnN0YW5jZW9mIEJlbmNobWFyaykgewotICAgICAgdGhpcy5zdWl0ZSA9IChCZW5jaG1hcmspIHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBEb2VzbnRJbXBsZW1lbnRCZW5jaG1hcmtFeGNlcHRpb24oYmVuY2htYXJrQ2xhc3MpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IGdldENsYXNzQnlOYW1lKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgIC8vIHRyeSByZXBsYWNpbmcgdGhlIGxhc3QgZG90IHdpdGggYSAkLCBpbiBjYXNlIHRoYXQgaGVscHMKLSAgICAgIC8vIGV4YW1wbGU6IHR1dG9yaWFsLlR1dG9yaWFsLkJlbmNobWFyazEgYmVjb21lcyB0dXRvcmlhbC5UdXRvcmlhbCRCZW5jaG1hcmsxCi0gICAgICAvLyBhbXVzaW5nbHksIHRoZSAkIGNoYXJhY3RlciBtZWFucyB0aHJlZSBkaWZmZXJlbnQgdGhpbmdzIGluIHRoaXMgb25lIGxpbmUgYWxvbmUKLSAgICAgIFN0cmluZyBuZXdOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2VGaXJzdCgiXFwuKFteLl0rKSQiLCAiXFwkJDEiKTsKLSAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG5ld05hbWUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXB1dGVVc2VyUGFyYW1ldGVycygpIHsKLSAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gTGlua2VkSGFzaE11bHRpbWFwLmNyZWF0ZSgpOwotICAgIGZvciAoU3RyaW5nIGtleSA6IHN1aXRlLnBhcmFtZXRlck5hbWVzKCkpIHsKLSAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgdmFsdWVzCi0gICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdXNlclZhbHVlcyA9IHVzZXJQYXJhbWV0ZXJBcmd1bWVudHMuZ2V0KGtleSk7Ci0gICAgICBpZiAoIXVzZXJWYWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5wdXRBbGwoa2V5LCB1c2VyVmFsdWVzKTsKLSAgICAgICAgLy8gVE9ETzogdHlwZSBjb252ZXJ0ICdlbSB0byB2YWxpZGF0ZT8KLQotICAgICAgfSBlbHNlIHsgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMgZnJvbSB0aGUgc3VpdGUKLSAgICAgICAgU2V0PFN0cmluZz4gdmFsdWVzID0gc3VpdGUucGFyYW1ldGVyVmFsdWVzKGtleSk7Ci0gICAgICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oa2V5ICsgIiBoYXMgbm8gdmFsdWVzLiAiCi0gICAgICAgICAgICAgICsgIkRpZCB5b3UgZm9yZ2V0IGEgLUQiICsga2V5ICsgIj08dmFsdWU+IGNvbW1hbmQgbGluZSBhcmd1bWVudD8iKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQucHV0QWxsKGtleSwgdmFsdWVzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgY29tcGxldGUgc2V0IG9mIHNjZW5hcmlvcyB3aXRoIGV2ZXJ5IGNvbWJpbmF0aW9uIG9mIHZhcmlhYmxlcy4KLSAgICovCi0gIHByaXZhdGUgTGlzdDxTY2VuYXJpbz4gY3JlYXRlU2NlbmFyaW9zKCkgewotICAgIExpc3Q8U2NlbmFyaW9CdWlsZGVyPiBidWlsZGVycyA9IG5ldyBBcnJheUxpc3Q8U2NlbmFyaW9CdWlsZGVyPigpOwotICAgIGJ1aWxkZXJzLmFkZChuZXcgU2NlbmFyaW9CdWlsZGVyKCkpOwotCi0gICAgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiB2YXJpYWJsZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4oKTsKLSAgICB2YXJpYWJsZXMucHV0KFNjZW5hcmlvLlZNX0tFWSwgdXNlclZtcy5pc0VtcHR5KCkgPyBWbUZhY3RvcnkuZGVmYXVsdFZtcygpIDogdXNlclZtcyk7Ci0gICAgdmFyaWFibGVzLnB1dChTY2VuYXJpby5UUklBTF9LRVksIG5ld0xpc3RPZlNpemUodHJpYWxzKSk7Ci0gICAgdmFyaWFibGVzLnB1dEFsbCh1c2VyUGFyYW1ldGVycy5hc01hcCgpKTsKLSAgICB2YXJpYWJsZXMucHV0QWxsKHZtUGFyYW1ldGVycy5hc01hcCgpKTsKLQotICAgIGZvciAoRW50cnk8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IGVudHJ5IDogdmFyaWFibGVzLmVudHJ5U2V0KCkpIHsKLSAgICAgIEl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzID0gZW50cnkuZ2V0VmFsdWUoKS5pdGVyYXRvcigpOwotICAgICAgaWYgKCF2YWx1ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJOb3QgZW5vdWdoIHZhbHVlcyBmb3IgIiArIGVudHJ5KTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIGZpcnN0VmFsdWUgPSB2YWx1ZXMubmV4dCgpOwotICAgICAgZm9yIChTY2VuYXJpb0J1aWxkZXIgYnVpbGRlciA6IGJ1aWxkZXJzKSB7Ci0gICAgICAgIGJ1aWxkZXIudmFyaWFibGVzLnB1dChlbnRyeS5nZXRLZXkoKSwgZmlyc3RWYWx1ZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG11bHRpcGx5IHRoZSBzaXplIG9mIHRoZSBzcGVjcyBieSB0aGUgbnVtYmVyIG9mIGFsdGVybmF0ZSB2YWx1ZXMKLSAgICAgIGludCBzaXplID0gYnVpbGRlcnMuc2l6ZSgpOwotICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgU3RyaW5nIGFsdGVybmF0ZSA9IHZhbHVlcy5uZXh0KCk7Ci0gICAgICAgIGZvciAoaW50IHMgPSAwOyBzIDwgc2l6ZTsgcysrKSB7Ci0gICAgICAgICAgU2NlbmFyaW9CdWlsZGVyIGNvcHkgPSBidWlsZGVycy5nZXQocykuY29weSgpOwotICAgICAgICAgIGNvcHkudmFyaWFibGVzLnB1dChlbnRyeS5nZXRLZXkoKSwgYWx0ZXJuYXRlKTsKLSAgICAgICAgICBidWlsZGVycy5hZGQoY29weSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBMaXN0PFNjZW5hcmlvPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFNjZW5hcmlvPigpOwotICAgIGZvciAoU2NlbmFyaW9CdWlsZGVyIGJ1aWxkZXIgOiBidWlsZGVycykgewotICAgICAgcmVzdWx0LmFkZChub3JtYWxpemVTY2VuYXJpbyhidWlsZGVyLmJ1aWxkKCkpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcge0Bjb2RlIGNvdW50fSBkaXN0aW5jdCBlbGVtZW50cy4KLSAgICovCi0gIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0xpc3RPZlNpemUoaW50IGNvdW50KSB7Ci0gICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgcmVzdWx0LmFkZChJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFNjZW5hcmlvQnVpbGRlciB7Ci0gICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB2YXJpYWJsZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgIFNjZW5hcmlvQnVpbGRlciBjb3B5KCkgewotICAgICAgU2NlbmFyaW9CdWlsZGVyIHJlc3VsdCA9IG5ldyBTY2VuYXJpb0J1aWxkZXIoKTsKLSAgICAgIHJlc3VsdC52YXJpYWJsZXMucHV0QWxsKHZhcmlhYmxlcyk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTY2VuYXJpbyBidWlsZCgpIHsKLSAgICAgIHJldHVybiBuZXcgU2NlbmFyaW8odmFyaWFibGVzKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvU2ltcGxlQmVuY2htYXJrLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1NpbXBsZUJlbmNobWFyay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZjM2E4Li4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvU2ltcGxlQmVuY2htYXJrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuVXNlckV4Y2VwdGlvbi5FeGNlcHRpb25Gcm9tVXNlckNvZGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgYmVuY2htYXJrcyBpbiBwbGFpbiBjb2RlLgotICogSW1wbGVtZW50aW5nIGNsYXNzZXMgbXVzdCBoYXZlIGEgbm8tYXJndW1lbnRzIGNvbnN0cnVjdG9yLgotICoKLSAqIDxoMz5CZW5jaG1hcmtzPC9oMz4KLSAqIFRoZSBiZW5jaG1hcmtzIG9mIGEgc3VpdGUgYXJlIGRlZmluZWQgYnkgLiBUaGV5IG1heSBiZQotICogc3RhdGljLiBUaGV5IGFyZSBub3QgcGVybWl0dGVkIHRvIHRha2UgcGFyYW1ldGVycyAuIC4gLi4KLSAqCi0gKiA8aDM+UGFyYW1ldGVyczwvaDM+Ci0gKiBTZWUgdGhlIHtAbGluayBQYXJhbX0gZG9jdW1lbnRhdGlvbiB0byBsZWFybiBhYm91dCBwYXJhbWV0ZXJzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2ltcGxlQmVuY2htYXJrCi0gICAgaW1wbGVtZW50cyBCZW5jaG1hcmsgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIEFSR1VNRU5UX1RZUEVTID0geyBpbnQuY2xhc3MgfTsKLQotICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBhcmFtZXRlcjw/Pj4gcGFyYW1ldGVyczsKLSAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBNZXRob2Q+IG1ldGhvZHM7Ci0KLSAgcHJvdGVjdGVkIFNpbXBsZUJlbmNobWFyaygpIHsKLSAgICBwYXJhbWV0ZXJzID0gUGFyYW1ldGVyLmZvckNsYXNzKGdldENsYXNzKCkpOwotICAgIG1ldGhvZHMgPSBjcmVhdGVUaW1lZE1ldGhvZHMoKTsKLQotICAgIGlmIChtZXRob2RzLmlzRW1wdHkoKSkgewotICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgIk5vIGJlbmNobWFya3MgZGVmaW5lZCBpbiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7fQotCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7fQotCi0gIEBPdmVycmlkZSBwdWJsaWMgU2V0PFN0cmluZz4gcGFyYW1ldGVyTmFtZXMoKSB7Ci0gICAgcmV0dXJuIEltbXV0YWJsZVNldC48U3RyaW5nPmJ1aWxkZXIoKQotICAgICAgICAuYWRkKCJiZW5jaG1hcmsiKQotICAgICAgICAuYWRkQWxsKHBhcmFtZXRlcnMua2V5U2V0KCkpCi0gICAgICAgIC5idWlsZCgpOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBTZXQ8U3RyaW5nPiBwYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICBpZiAoImJlbmNobWFyayIuZXF1YWxzKHBhcmFtZXRlck5hbWUpKSB7Ci0gICAgICByZXR1cm4gbWV0aG9kcy5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBQYXJhbWV0ZXI8Pz4gcGFyYW1ldGVyID0gcGFyYW1ldGVycy5nZXQocGFyYW1ldGVyTmFtZSk7Ci0gICAgaWYgKHBhcmFtZXRlciA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBJdGVyYWJsZTw/PiB2YWx1ZXMgPSBwYXJhbWV0ZXIudmFsdWVzKCk7Ci0KLSAgICAgIEltbXV0YWJsZVNldC5CdWlsZGVyPFN0cmluZz4gcmVzdWx0ID0gSW1tdXRhYmxlU2V0LmJ1aWxkZXIoKTsKLSAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgIHJlc3VsdC5hZGQoU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQuYnVpbGQoKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkZyb21Vc2VyQ29kZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIENvbmZpZ3VyZWRCZW5jaG1hcmsgY3JlYXRlQmVuY2htYXJrKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyVmFsdWVzKSB7Ci0gICAgaWYgKCFwYXJhbWV0ZXJOYW1lcygpLmVxdWFscyhwYXJhbWV0ZXJWYWx1ZXMua2V5U2V0KCkpKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHBhcmFtZXRlcnMgc3BlY2lmaWVkLiBFeHBlY3RlZCAiCi0gICAgICAgICAgKyBwYXJhbWV0ZXJOYW1lcygpICsgIiBidXQgd2FzICIgKyBwYXJhbWV0ZXJWYWx1ZXMua2V5U2V0KCkpOwotICAgIH0KLQotICAgIFN0cmluZyBtZXRob2ROYW1lID0gcGFyYW1ldGVyVmFsdWVzLmdldCgiYmVuY2htYXJrIik7Ci0gICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHMuZ2V0KG1ldGhvZE5hbWUpOwotICAgIGlmIChtZXRob2QgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXJzIHNwZWNpZmllZC4gXCJ0aW1lIiArIG1ldGhvZE5hbWUgKyAiXCIgIgotICAgICAgICAgICsgImlzIG5vdCBhIG1ldGhvZCBvZiB0aGlzIGJlbmNobWFyay4iKTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJDbGFzc05ld0luc3RhbmNlIn0pIC8vIGNhbiB0aHJvdyBhbnkgRXhjZXB0aW9uLCBzbyB3ZSBjYXRjaCBhbGwgRXhjZXB0aW9ucwotICAgICAgZmluYWwgU2ltcGxlQmVuY2htYXJrIGNvcHlPZlNlbGYgPSBnZXRDbGFzcygpLm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHBhcmFtZXRlclZhbHVlcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIGlmICgiYmVuY2htYXJrIi5lcXVhbHMocGFyYW1ldGVyTmFtZSkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlcjw/PiBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXJOYW1lKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gVHlwZUNvbnZlcnRlci5mcm9tU3RyaW5nKGVudHJ5LmdldFZhbHVlKCksIHBhcmFtZXRlci5nZXRUeXBlKCkpOwotICAgICAgICBwYXJhbWV0ZXIuc2V0KGNvcHlPZlNlbGYsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGNvcHlPZlNlbGYuc2V0VXAoKTsKLQotICAgICAgcmV0dXJuIG5ldyBDb25maWd1cmVkQmVuY2htYXJrKGNvcHlPZlNlbGYpIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBPYmplY3QgcnVuKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoY29weU9mU2VsZiwgcmVwcyk7Ci0gICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgdGhyb3cgKEV4Y2VwdGlvbikgY2F1c2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHsKLSAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKSBjYXVzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgY29weU9mU2VsZi50ZWFyRG93bigpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uRnJvbVVzZXJDb2RlRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTY2VuYXJpbyBub3JtYWxpemVTY2VuYXJpbyhTY2VuYXJpbyBzY2VuYXJpbykgewotICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFyaWFibGVzID0KLSAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPihzY2VuYXJpby5nZXRWYXJpYWJsZXMoKSk7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBzY2VuYXJpbyBjb250YWlucyBtZXRob2QgbmFtZXMgd2l0aG91dCB0aGUgcHJlZml4ZWQgInRpbWUiLiBJZgotICAgIC8vIGl0IGhhcyAidGltZSIgcHJlZml4ZWQsIHRoZW4gcmVtb3ZlIGl0LiBBbHNvIGNoZWNrIHdoZXRoZXIgdGhlIHVzZXIgaGFzCi0gICAgLy8gYWNjaWRlbnRhbGx5IHB1dCBhIGxvd2VyIGNhc2VkIGxldHRlciBmaXJzdCwgYW5kIGZpeCBpdCBpZiBuZWNlc3NhcnkuCi0gICAgU3RyaW5nIGJlbmNobWFyayA9IHZhcmlhYmxlcy5nZXQoImJlbmNobWFyayIpOwotICAgIE1hcDxTdHJpbmcsIE1ldGhvZD4gdGltZWRNZXRob2RzID0gY3JlYXRlVGltZWRNZXRob2RzKCk7Ci0gICAgaWYgKHRpbWVkTWV0aG9kcy5nZXQoYmVuY2htYXJrKSA9PSBudWxsKSB7Ci0gICAgICAvLyB0cnkgdG8gdXBwZXIgY2FzZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAgIGNoYXJbXSBiZW5jaG1hcmtDaGFycyA9IGJlbmNobWFyay50b0NoYXJBcnJheSgpOwotICAgICAgYmVuY2htYXJrQ2hhcnNbMF0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYmVuY2htYXJrQ2hhcnNbMF0pOwotICAgICAgU3RyaW5nIHVwcGVyQ2FzZWRCZW5jaG1hcmsgPSBTdHJpbmcudmFsdWVPZihiZW5jaG1hcmtDaGFycyk7Ci0gICAgICBpZiAodGltZWRNZXRob2RzLmdldCh1cHBlckNhc2VkQmVuY2htYXJrKSAhPSBudWxsKSB7Ci0gICAgICAgIHZhcmlhYmxlcy5wdXQoImJlbmNobWFyayIsIHVwcGVyQ2FzZWRCZW5jaG1hcmspOwotICAgICAgfSBlbHNlIGlmIChiZW5jaG1hcmsuc3RhcnRzV2l0aCgidGltZSIpKSB7Ci0gICAgICAgIHZhcmlhYmxlcy5wdXQoImJlbmNobWFyayIsIGJlbmNobWFyay5zdWJzdHJpbmcoNCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3IFNjZW5hcmlvKHZhcmlhYmxlcyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIHNwZWMgZm9yIGVhY2ggYmVuY2htYXJrIGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZCBjbGFzcy4gVGhlCi0gICAqIHJldHVybmVkIHNwZWNzIGhhdmUgbm8gcGFyYW1ldGVyIHZhbHVlczsgdGhvc2UgbXVzdCBiZSBhZGRlZCBzZXBhcmF0ZWx5LgotICAgKi8KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2Q+IGNyZWF0ZVRpbWVkTWV0aG9kcygpIHsKLSAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxTdHJpbmcsIE1ldGhvZD4gcmVzdWx0ID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKLSAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBnZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kcygpKSB7Ci0gICAgICBpbnQgbW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOwotICAgICAgaWYgKCFtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRpbWUiKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpCi0gICAgICAgICAgfHwgTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKQotICAgICAgICAgIHx8IE1vZGlmaWVyLmlzQWJzdHJhY3QobW9kaWZpZXJzKQotICAgICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLCBBUkdVTUVOVF9UWVBFUykpIHsKLSAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIlRpbWVkIG1ldGhvZHMgbXVzdCBiZSBwdWJsaWMsICIKLSAgICAgICAgICAgICsgIm5vbi1zdGF0aWMsIG5vbi1hYnN0cmFjdCBhbmQgdGFrZSBhIHNpbmdsZSBpbnQgcGFyYW1ldGVyLiAiCi0gICAgICAgICAgICArICJCdXQgIiArIG1ldGhvZCArICIgdmlvbGF0ZXMgdGhlc2UgcmVxdWlyZW1lbnRzLiIpOwotICAgICAgfQotCi0gICAgICByZXN1bHQucHV0KG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKDQpLCBtZXRob2QpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQuYnVpbGQoKTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0VGltZVVuaXROYW1lcygpIHsKLSAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCJucyIsIDEsCi0gICAgICAgICJ1cyIsIDEwMDAsCi0gICAgICAgICJtcyIsIDEwMDAwMDAsCi0gICAgICAgICJzIiwgMTAwMDAwMDAwMCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZSBuYW5vc1RvVW5pdHMoZG91YmxlIG5hbm9zKSB7Ci0gICAgcmV0dXJuIG5hbm9zOwotICB9Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRJbnN0YW5jZVVuaXROYW1lcygpIHsKLSAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCIgaW5zdGFuY2VzIiwgMSwKLSAgICAgICAgIksgaW5zdGFuY2VzIiwgMTAwMCwKLSAgICAgICAgIk0gaW5zdGFuY2VzIiwgMTAwMDAwMCwKLSAgICAgICAgIkIgaW5zdGFuY2VzIiwgMTAwMDAwMDAwMCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZSBpbnN0YW5jZXNUb1VuaXRzKGxvbmcgaW5zdGFuY2VzKSB7Ci0gICAgcmV0dXJuIGluc3RhbmNlczsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0TWVtb3J5VW5pdE5hbWVzKCkgewotICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoIkIiLCAxLAotICAgICAgICAiS2lCIiwgMTAyNCwKLSAgICAgICAgIk1pQiIsIDEwNDg1NzYsCi0gICAgICAgICJHaUIiLCAxMDczNzQxODI0KTsKLSAgfQotCi0gIEBPdmVycmlkZSBwdWJsaWMgZG91YmxlIGJ5dGVzVG9Vbml0cyhsb25nIGJ5dGVzKSB7Ci0gICAgcmV0dXJuIGJ5dGVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1N0YW5kYXJkVm0uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvU3RhbmRhcmRWbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY2ZWIxLi4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvU3RhbmRhcmRWbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWZpbmFsIGNsYXNzIFN0YW5kYXJkVm0gZXh0ZW5kcyBWbSB7Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Vm1TcGVjaWZpY09wdGlvbnMoTWVhc3VyZW1lbnRUeXBlIHR5cGUsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKLSAgICBpZiAoIWFyZ3VtZW50cy5nZXRDYXB0dXJlVm1Mb2coKSkgewotICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoKTsKLSAgICB9Ci0KLSAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcmVzdWx0LmFkZCgiLXZlcmJvc2U6Z2MiKTsKLSAgICByZXN1bHQuYWRkKCItWGJhdGNoIik7Ci0gICAgcmVzdWx0LmFkZCgiLVhYOitVc2VTZXJpYWxHQyIpOwotICAgIGlmICh0eXBlID09IE1lYXN1cmVtZW50VHlwZS5USU1FKSB7Ci0gICAgICByZXR1cm4gTGlzdHMubmV3QXJyYXlMaXN0KCItWFg6K1ByaW50Q29tcGlsYXRpb24iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFZtTmFtZSgpIHsKLSAgICByZXR1cm4gImphdmEiOwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1RpbWVNZWFzdXJlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9UaW1lTWVhc3VyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNWQyZC4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1RpbWVNZWFzdXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLkRvZXNOb3RTY2FsZUxpbmVhcmx5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5Vc2VyRXhjZXB0aW9uLlJ1bnRpbWVPdXRPZlJhbmdlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3VwcGxpZXI7Ci0KLS8qKgotICogTWVhc3VyZSdzIHRoZSBiZW5jaG1hcmsncyBwZXItdHJpYWwgZXhlY3V0aW9uIHRpbWUuCi0gKi8KLWNsYXNzIFRpbWVNZWFzdXJlciBleHRlbmRzIE1lYXN1cmVyIHsKLQotICBwcml2YXRlIGZpbmFsIGxvbmcgd2FybXVwTmFub3M7Ci0gIHByaXZhdGUgZmluYWwgbG9uZyBydW5OYW5vczsKLQotICAvKioKLSAgICogSWYgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBvdXIgbWVhc3VyZW1lbnRzIGlzIHdpdGhpbiB0aGlzIHRvbGVyYW5jZSwgd2UKLSAgICogd29uJ3QgYm90aGVyIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBtZWFzdXJlbWVudHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgU0hPUlRfQ0lSQ1VJVF9UT0xFUkFOQ0UgPSAwLjAxOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVFJJQUxTID0gMTA7Ci0KLSAgVGltZU1lYXN1cmVyKGxvbmcgd2FybXVwTWlsbGlzLCBsb25nIHJ1bk1pbGxpcykgewotICAgIGNoZWNrQXJndW1lbnQod2FybXVwTWlsbGlzID4gNTApOwotICAgIGNoZWNrQXJndW1lbnQocnVuTWlsbGlzID4gNTApOwotCi0gICAgdGhpcy53YXJtdXBOYW5vcyA9IHdhcm11cE1pbGxpcyAqIDEwMDAwMDA7Ci0gICAgdGhpcy5ydW5OYW5vcyA9IHJ1bk1pbGxpcyAqIDEwMDAwMDA7Ci0gIH0KLQotICBwcml2YXRlIGRvdWJsZSB3YXJtVXAoU3VwcGxpZXI8Q29uZmlndXJlZEJlbmNobWFyaz4gdGVzdFN1cHBsaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBsb25nIGVsYXBzZWROYW5vcyA9IDA7Ci0gICAgbG9uZyBuZXRSZXBzID0gMDsKLSAgICBpbnQgcmVwcyA9IDE7Ci0gICAgYm9vbGVhbiBkZWZpbml0ZWx5U2NhbGVzTGluZWFybHkgPSBmYWxzZTsKLQotICAgIC8qCi0gICAgICogUnVuIHByb2dyZXNzaXZlbHkgbW9yZSByZXBzIGF0IGEgdGltZSB1bnRpbCB3ZSBjcm9zcyBvdXIgd2FybXVwCi0gICAgICogdGhyZXNob2xkLiBUaGlzIHdheSBhbnkganVzdC1pbi10aW1lIGNvbXBpbGVyIHdpbGwgYmUgY29tZm9ydGFibGUgcnVubmluZwotICAgICAqIG11bHRpcGxlIGl0ZXJhdGlvbnMgb2Ygb3VyIG1lYXN1cmVtZW50IG1ldGhvZC4KLSAgICAgKi8KLSAgICBsb2coIltzdGFydGluZyB3YXJtdXBdIik7Ci0gICAgd2hpbGUgKGVsYXBzZWROYW5vcyA8IHdhcm11cE5hbm9zKSB7Ci0gICAgICBsb25nIG5hbm9zID0gbWVhc3VyZVJlcHModGVzdFN1cHBsaWVyLmdldCgpLCByZXBzKTsKLSAgICAgIGVsYXBzZWROYW5vcyArPSBuYW5vczsKLQotICAgICAgbmV0UmVwcyArPSByZXBzOwotICAgICAgcmVwcyAqPSAyOwotCi0gICAgICAvLyBpZiByZXBzIG92ZXJmbG93ZWQsIHRoYXQncyBzdXNwaWNpb3VzISBDaGVjayB0aGF0IGl0IHRpbWUgc2NhbGVzIHdpdGggcmVwcwotICAgICAgaWYgKHJlcHMgPD0gMCkgewotICAgICAgICBpZiAoIWRlZmluaXRlbHlTY2FsZXNMaW5lYXJseSkgewotICAgICAgICAgIGNoZWNrU2NhbGVzTGluZWFybHkodGVzdFN1cHBsaWVyKTsKLSAgICAgICAgICBkZWZpbml0ZWx5U2NhbGVzTGluZWFybHkgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJlcHMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbG9nKCJbZW5kaW5nIHdhcm11cF0iKTsKLQotICAgIGRvdWJsZSBuYW5vc1BlckV4ZWN1dGlvbiA9IChkb3VibGUpIGVsYXBzZWROYW5vcyAvIG5ldFJlcHM7Ci0gICAgZG91YmxlIGxvd2VyQm91bmQgPSAwLjE7Ci0gICAgZG91YmxlIHVwcGVyQm91bmQgPSAxMDAwMDAwMDAwMC4wOwotICAgIGlmICghKGxvd2VyQm91bmQgPD0gbmFub3NQZXJFeGVjdXRpb24gJiYgbmFub3NQZXJFeGVjdXRpb24gPD0gdXBwZXJCb3VuZCkpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lT3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW5vc1BlckV4ZWN1dGlvbiwgbG93ZXJCb3VuZCwgdXBwZXJCb3VuZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbm9zUGVyRXhlY3V0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIERvaW5nIGhhbGYgYXMgbXVjaCB3b3JrIHNob3VsZG4ndCB0YWtlIG11Y2ggbW9yZSB0aGFuIGhhbGYgYXMgbXVjaCB0aW1lLiBJZgotICAgKiBpdCBkb2VzIHdlIGhhdmUgYSBicm9rZW4gYmVuY2htYXJrIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrU2NhbGVzTGluZWFybHkoU3VwcGxpZXI8Q29uZmlndXJlZEJlbmNobWFyaz4gdGVzdFN1cHBsaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBkb3VibGUgaGFsZiA9IG1lYXN1cmVSZXBzKHRlc3RTdXBwbGllci5nZXQoKSwgSW50ZWdlci5NQVhfVkFMVUUgLyAyKTsKLSAgICBkb3VibGUgb25lID0gbWVhc3VyZVJlcHModGVzdFN1cHBsaWVyLmdldCgpLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgaWYgKGhhbGYgLyBvbmUgPiAwLjc1KSB7Ci0gICAgICB0aHJvdyBuZXcgRG9lc05vdFNjYWxlTGluZWFybHlFeGNlcHRpb24oKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTWVhc3VyZSB0aGUgbmFub3MgcGVyIHJlcCBmb3IgdGhlIGdpdmVuIHRlc3QuIFRoaXMgY29kZSB1c2VzIGFuIGludGVyZXN0aW5nCi0gICAqIHN0cmF0ZWd5IHRvIG1lYXN1cmUgdGhlIHJ1bnRpbWUgdG8gbWluaW1pemUgZXhlY3V0aW9uIHRpbWUgd2hlbiBleGVjdXRpb24KLSAgICogdGltZSBpcyBjb25zaXN0ZW50LgotICAgKiA8b2w+Ci0gICAqICAgPGxpPjEuMHgge0Bjb2RlIHJ1bk1pbGxpc30gdHJpYWwgaXMgcnVuLgotICAgKiAgIDxsaT4wLjV4IHtAY29kZSBydW5NaWxsaXN9IHRyaWFsIGlzIHJ1bi4KLSAgICogICA8bGk+MS41eCB7QGNvZGUgcnVuTWlsbGlzfSB0cmlhbCBpcyBydW4uCi0gICAqICAgPGxpPkF0IHRoaXMgcG9pbnQsIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlc2UgdHJpYWxzIGlzIGNvbXB1dGVkLiBJZgotICAgKiAgICAgICBpdCBpcyB3aXRoaW4gdGhlIHRocmVzaG9sZCwgdGhlIHJlc3VsdCBpcyByZXR1cm5lZC4KLSAgICogICA8bGk+T3RoZXJ3aXNlIHRyaWFscyBjb250aW51ZSB0byBiZSBleGVjdXRlZCB1bnRpbCBlaXRoZXIgdGhlIHRocmVzaG9sZAotICAgKiAgICAgICBpcyBzYXRpc2ZpZWQgb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJ1bnMgaGF2ZSBiZWVuIGV4ZWN1dGVkLgotICAgKiA8L29sPgotICAgKgotICAgKiBAcGFyYW0gdGVzdFN1cHBsaWVyIHByb3ZpZGVzIGluc3RhbmNlcyBvZiB0aGUgY29kZSB1bmRlciB0ZXN0LiBBIG5ldyB0ZXN0Ci0gICAqICAgICAgaXMgY3JlYXRlZCBmb3IgZWFjaCBpdGVyYXRpb24gYmVjYXVzZSBzb21lIGJlbmNobWFya3MnIHBlcmZvcm1hbmNlCi0gICAqICAgICAgZGVwZW5kcyBvbiB3aGljaCBtZW1vcnkgd2FzIGFsbG9jYXRlZC4gU2VlIFNldENvbnRhaW5zQmVuY2htYXJrIGZvciBhbgotICAgKiAgICAgIGV4YW1wbGUuCi0gICAqLwotICBAT3ZlcnJpZGUgcHVibGljIE1lYXN1cmVtZW50U2V0IHJ1bihTdXBwbGllcjxDb25maWd1cmVkQmVuY2htYXJrPiB0ZXN0U3VwcGxpZXIpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBkb3VibGUgZXN0aW1hdGVkTmFub3NQZXJSZXAgPSB3YXJtVXAodGVzdFN1cHBsaWVyKTsKLQotICAgIGxvZygiW21lYXN1cmluZyBuYW5vcyBwZXIgcmVwIHdpdGggc2NhbGUgMS4wMF0iKTsKLSAgICBNZWFzdXJlbWVudCBtZWFzdXJlbWVudDEwMCA9IG1lYXN1cmUodGVzdFN1cHBsaWVyLCAxLjAwLCBlc3RpbWF0ZWROYW5vc1BlclJlcCk7Ci0gICAgbG9nKCJbbWVhc3VyaW5nIG5hbm9zIHBlciByZXAgd2l0aCBzY2FsZSAwLjUwXSIpOwotICAgIE1lYXN1cmVtZW50IG1lYXN1cmVtZW50MDUwID0gbWVhc3VyZSh0ZXN0U3VwcGxpZXIsIDAuNTAsIG1lYXN1cmVtZW50MTAwLmdldFJhdygpKTsKLSAgICBsb2coIlttZWFzdXJpbmcgbmFub3MgcGVyIHJlcCB3aXRoIHNjYWxlIDEuNTBdIik7Ci0gICAgTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQxNTAgPSBtZWFzdXJlKHRlc3RTdXBwbGllciwgMS41MCwgbWVhc3VyZW1lbnQxMDAuZ2V0UmF3KCkpOwotICAgIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0ID0KLSAgICAgICAgbmV3IE1lYXN1cmVtZW50U2V0KG1lYXN1cmVtZW50MTAwLCBtZWFzdXJlbWVudDA1MCwgbWVhc3VyZW1lbnQxNTApOwotCi0gICAgZm9yIChpbnQgaSA9IDM7IGkgPCBNQVhfVFJJQUxTOyBpKyspIHsKLSAgICAgIGRvdWJsZSB0aHJlc2hvbGQgPSBTSE9SVF9DSVJDVUlUX1RPTEVSQU5DRSAqIG1lYXN1cmVtZW50U2V0Lm1lYW5SYXcoKTsKLSAgICAgIGlmIChtZWFzdXJlbWVudFNldC5zdGFuZGFyZERldmlhdGlvblJhdygpIDwgdGhyZXNob2xkKSB7Ci0gICAgICAgIHJldHVybiBtZWFzdXJlbWVudFNldDsKLSAgICAgIH0KLQotICAgICAgbG9nKCJbcGVyZm9ybWluZyBhZGRpdGlvbmFsIG1lYXN1cmVtZW50IHdpdGggc2NhbGUgMS4wMF0iKTsKLSAgICAgIE1lYXN1cmVtZW50IG1lYXN1cmVtZW50ID0gbWVhc3VyZSh0ZXN0U3VwcGxpZXIsIDEuMDAsIG1lYXN1cmVtZW50MTAwLmdldFJhdygpKTsKLSAgICAgIG1lYXN1cmVtZW50U2V0ID0gbWVhc3VyZW1lbnRTZXQucGx1c01lYXN1cmVtZW50KG1lYXN1cmVtZW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWVhc3VyZW1lbnRTZXQ7Ci0gIH0KLQotICAvKioKLSAgICogUnVucyB0aGUgdGVzdCBtZXRob2QgZm9yIGFwcHJveGltYXRlbHkge0Bjb2RlIHJ1bk5hbm9zICogZHVyYXRpb25TY2FsZX0KLSAgICogbmFub3MgYW5kIHJldHVybnMgYSBNZWFzdXJlbWVudCBvZiB0aGUgbmFub3MgcGVyIHJlcCBhbmQgdW5pdHMgcGVyIHJlcC4KLSAgICovCi0gIHByaXZhdGUgTWVhc3VyZW1lbnQgbWVhc3VyZShTdXBwbGllcjxDb25maWd1cmVkQmVuY2htYXJrPiB0ZXN0U3VwcGxpZXIsCi0gICAgICBkb3VibGUgZHVyYXRpb25TY2FsZSwgZG91YmxlIGVzdGltYXRlZE5hbm9zUGVyUmVwKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBpbnQgcmVwcyA9IChpbnQpIChkdXJhdGlvblNjYWxlICogcnVuTmFub3MgLyBlc3RpbWF0ZWROYW5vc1BlclJlcCk7Ci0gICAgaWYgKHJlcHMgPT0gMCkgewotICAgICAgcmVwcyA9IDE7Ci0gICAgfQotCi0gICAgbG9nKCJbcnVubmluZyB0cmlhbCB3aXRoICIgKyByZXBzICsgIiByZXBzXSIpOwotICAgIENvbmZpZ3VyZWRCZW5jaG1hcmsgYmVuY2htYXJrID0gdGVzdFN1cHBsaWVyLmdldCgpOwotICAgIGxvbmcgZWxhcHNlZFRpbWUgPSBtZWFzdXJlUmVwcyhiZW5jaG1hcmssIHJlcHMpOwotICAgIGRvdWJsZSBuYW5vc1BlclJlcCA9IGVsYXBzZWRUaW1lIC8gKGRvdWJsZSkgcmVwczsKLSAgICBsb2coU3RyaW5nLmZvcm1hdCgiW3Rvb2sgJS4yZiBuYW5vc2Vjb25kcyBwZXIgcmVwXSIsIG5hbm9zUGVyUmVwKSk7Ci0gICAgcmV0dXJuIG5ldyBNZWFzdXJlbWVudChiZW5jaG1hcmsudGltZVVuaXROYW1lcygpLCBuYW5vc1BlclJlcCwKLSAgICAgICAgYmVuY2htYXJrLm5hbm9zVG9Vbml0cyhuYW5vc1BlclJlcCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRvdGFsIG5hbm9zIHRvIHJ1biB7QGNvZGUgcmVwc30uCi0gICAqLwotICBwcml2YXRlIGxvbmcgbWVhc3VyZVJlcHMoQ29uZmlndXJlZEJlbmNobWFyayBiZW5jaG1hcmssIGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBwcmVwYXJlRm9yVGVzdCgpOwotICAgIGxvZyhMb2dDb25zdGFudHMuTUVBU1VSRURfU0VDVElPTl9TVEFSVElORyk7Ci0gICAgbG9uZyBzdGFydE5hbm9zID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgYmVuY2htYXJrLnJ1bihyZXBzKTsKLSAgICBsb25nIGVuZE5hbm9zID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgbG9nKExvZ0NvbnN0YW50cy5NRUFTVVJFRF9TRUNUSU9OX0RPTkUpOwotICAgIGJlbmNobWFyay5jbG9zZSgpOwotICAgIHJldHVybiBlbmROYW5vcyAtIHN0YXJ0TmFub3M7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvVHlwZUNvbnZlcnRlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9UeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjY4ZTAuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9UeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQ29udmVydCBvYmplY3RzIHRvIGFuZCBmcm9tIFN0cmluZ3MuCi0gKi8KLWZpbmFsIGNsYXNzIFR5cGVDb252ZXJ0ZXIgewotICBwcml2YXRlIFR5cGVDb252ZXJ0ZXIoKSB7fQotCi0gIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGZyb21TdHJpbmcoU3RyaW5nIHZhbHVlLCBUeXBlIHR5cGUpIHsKLSAgICBpZiAodHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBDbGFzczw/PiBjID0gd3JhcCgoQ2xhc3M8Pz4pIHR5cGUpOwotICAgIHRyeSB7Ci0gICAgICBNZXRob2QgbSA9IGMuZ2V0TWV0aG9kKCJ2YWx1ZU9mIiwgU3RyaW5nLmNsYXNzKTsKLSAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsgLy8gdG8gcGVybWl0IGlubmVyIGVudW1zLCBldGMuCi0gICAgICByZXR1cm4gbS5pbnZva2UobnVsbCwgdmFsdWUpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgIkNhbm5vdCBjb252ZXJ0ICIgKyB2YWx1ZSArICIgb2YgdHlwZSAiICsgdHlwZSwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gc2FmZSBiZWNhdXNlIGJvdGggTG9uZy5jbGFzcyBhbmQgbG9uZy5jbGFzcyBhcmUgb2YgdHlwZSBDbGFzczxMb25nPgotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJpdmF0ZSBzdGF0aWMgPFQ+IENsYXNzPFQ+IHdyYXAoQ2xhc3M8VD4gYykgewotICAgIHJldHVybiBjLmlzUHJpbWl0aXZlKCkgPyAoQ2xhc3M8VD4pIFBSSU1JVElWRVNfVE9fV1JBUFBFUlMuZ2V0KGMpIDogYzsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/PiwgQ2xhc3M8Pz4+IFBSSU1JVElWRVNfVE9fV1JBUFBFUlMKLSAgICA9IG5ldyBJbW11dGFibGVNYXAuQnVpbGRlcjxDbGFzczw/PiwgQ2xhc3M8Pz4+KCkKLSAgICAgIC5wdXQoYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcykKLSAgICAgIC5wdXQoYnl0ZS5jbGFzcywgQnl0ZS5jbGFzcykKLSAgICAgIC5wdXQoY2hhci5jbGFzcywgQ2hhcmFjdGVyLmNsYXNzKQotICAgICAgLnB1dChkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcykKLSAgICAgIC5wdXQoZmxvYXQuY2xhc3MsIEZsb2F0LmNsYXNzKQotICAgICAgLnB1dChpbnQuY2xhc3MsIEludGVnZXIuY2xhc3MpCi0gICAgICAucHV0KGxvbmcuY2xhc3MsIExvbmcuY2xhc3MpCi0gICAgICAucHV0KHNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcykKLSAgICAgIC5wdXQodm9pZC5jbGFzcywgVm9pZC5jbGFzcykKLSAgICAgIC5idWlsZCgpOwotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Vc2VyRXhjZXB0aW9uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VzZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1MzVhNy4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VzZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBTaWduaWZpZXMgYSBwcm9ibGVtIHRoYXQgc2hvdWxkIGJlIGV4cGxhaW5lZCBpbiB1c2VyLWZyaWVuZGx5IHRlcm1zIG9uIHRoZSBjb21tYW5kIGxpbmUsIHdpdGhvdXQKLSAqIGEgY29uZnVzaW5nIHN0YWNrIHRyYWNlLCBhbmQgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIHVzYWdlIHN1bW1hcnkuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKSAvLyBuZXZlciBnb2luZyB0byBzZXJpYWxpemUgdGhlc2UuLi4gcmlnaHQ/Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXNlckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICBwcm90ZWN0ZWQgVXNlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKLSAgICBzdXBlcihlcnJvcik7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwbGF5KCk7Ci0KLSAgLy8gLSAtIC0gLQotCi0gIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRXJyb3JJblVzYWdlRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci0gICAgcHJvdGVjdGVkIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKLSAgICAgIHN1cGVyKGVycm9yKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZGlzcGxheSgpIHsKLSAgICAgIFN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZSgpOwotICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBBcmd1bWVudHMucHJpbnRVc2FnZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRXJyb3JJblVzZXJDb2RlRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVtZWR5OwotCi0gICAgcHJvdGVjdGVkIEVycm9ySW5Vc2VyQ29kZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IsIFN0cmluZyByZW1lZHkpIHsKLSAgICAgIHN1cGVyKGVycm9yKTsKLSAgICAgIHRoaXMucmVtZWR5ID0gcmVtZWR5OwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBkaXNwbGF5KCkgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGdldE1lc3NhZ2UoKSk7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlR5cGljYWwgUmVtZWR5OiAiICsgcmVtZWR5KTsKLSAgICB9Ci0gIH0KLQotICAvLyAtIC0gLSAtCi0KLSAgLy8gTm90IHRlY2huaWNhbGx5IGFuIGVycm9yLCBidXQgd29ya3MgbmljZWx5IHRoaXMgd2F5IGFueXdheQotICBwdWJsaWMgc3RhdGljIGNsYXNzIERpc3BsYXlVc2FnZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIERpc3BsYXlVc2FnZUV4Y2VwdGlvbigpIHsKLSAgICAgIHN1cGVyKG51bGwpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5jb21wYXRpYmxlQXJndW1lbnRzRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3JJblVzYWdlRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgSW5jb21wYXRpYmxlQXJndW1lbnRzRXhjZXB0aW9uKFN0cmluZyBhcmcpIHsKLSAgICAgIHN1cGVyKCJTb21lIGFyZ3VtZW50cyBwYXNzZWQgaW4gYXJlIGluY29tcGF0aWJsZSB3aXRoOiAiICsgYXJnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIFVucmVjb2duaXplZE9wdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFVucmVjb2duaXplZE9wdGlvbkV4Y2VwdGlvbihTdHJpbmcgYXJnKSB7Ci0gICAgICBzdXBlcigiQXJndW1lbnQgbm90IHJlY29nbml6ZWQ6ICIgKyBhcmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9CZW5jaG1hcmtDbGFzc0V4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIE5vQmVuY2htYXJrQ2xhc3NFeGNlcHRpb24oKSB7Ci0gICAgICBzdXBlcigiTm8gYmVuY2htYXJrIGNsYXNzIHNwZWNpZmllZC4iKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE11bHRpcGxlQmVuY2htYXJrQ2xhc3Nlc0V4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIE11bHRpcGxlQmVuY2htYXJrQ2xhc3Nlc0V4Y2VwdGlvbihTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLSAgICAgIHN1cGVyKCJNdWx0aXBsZSBiZW5jaG1hcmsgY2xhc3NlcyBzcGVjaWZpZWQ6ICIgKyBBcnJheXMuYXNMaXN0KGEsIGIpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hbGZvcm1lZFBhcmFtZXRlckV4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIE1hbGZvcm1lZFBhcmFtZXRlckV4Y2VwdGlvbihTdHJpbmcgYXJnKSB7Ci0gICAgICBzdXBlcigiTWFsZm9ybWVkIHBhcmFtZXRlcjogIiArIGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVQYXJhbWV0ZXJFeGNlcHRpb24gZXh0ZW5kcyBFcnJvckluVXNhZ2VFeGNlcHRpb24gewotICAgIHB1YmxpYyBEdXBsaWNhdGVQYXJhbWV0ZXJFeGNlcHRpb24oU3RyaW5nIGFyZykgewotICAgICAgc3VwZXIoIkR1cGxpY2F0ZSBwYXJhbWV0ZXI6ICIgKyBhcmcpOwotICAgIH0KLSAgICBwdWJsaWMgRHVwbGljYXRlUGFyYW1ldGVyRXhjZXB0aW9uKFNldDxTdHJpbmc+IGFyZykgewotICAgICAgc3VwZXIoIkR1cGxpY2F0ZSBwYXJhbWV0ZXJzOiAiICsgYXJnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIEludmFsaWRQYXJhbWV0ZXJWYWx1ZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIEludmFsaWRQYXJhbWV0ZXJWYWx1ZUV4Y2VwdGlvbihTdHJpbmcgYXJnLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgIHN1cGVyKCJJbnZhbGlkIHZhbHVlIFwiIiArIHZhbHVlICsgIlwiIGZvciBwYXJhbWV0ZXI6ICIgKyBhcmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52YWxpZFRyaWFsc0V4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIEludmFsaWRUcmlhbHNFeGNlcHRpb24oU3RyaW5nIGFyZykgewotICAgICAgc3VwZXIoIkludmFsaWQgdHJpYWxzOiAiICsgYXJnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbnRDdXN0b21pemVJblByb2Nlc3NWbUV4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIENhbnRDdXN0b21pemVJblByb2Nlc3NWbUV4Y2VwdGlvbigpIHsKLSAgICAgIHN1cGVyKCJDYW4ndCBjdXN0b21pemUgVk0gd2hlbiBydW5uaW5nIGluIHByb2Nlc3MuIik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBOb1N1Y2hDbGFzc0V4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIE5vU3VjaENsYXNzRXhjZXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0gICAgICBzdXBlcigiTm8gY2xhc3MgbmFtZWQgWyIgKyBuYW1lICsgIl0gd2FzIGZvdW5kIChjaGVjayBDTEFTU1BBVEgpLiIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUnVudGltZU91dE9mUmFuZ2VFeGNlcHRpb24gZXh0ZW5kcyBFcnJvckluVXNhZ2VFeGNlcHRpb24gewotICAgIHB1YmxpYyBSdW50aW1lT3V0T2ZSYW5nZUV4Y2VwdGlvbigKLSAgICAgICAgZG91YmxlIG5hbm9zUGVyRXhlY3V0aW9uLCBkb3VibGUgbG93ZXJCb3VuZCwgZG91YmxlIHVwcGVyQm91bmQpIHsKLSAgICAgIHN1cGVyKCJSdW50aW1lICIgKyBuYW5vc1BlckV4ZWN1dGlvbiArICJucy9yZXAgb3V0IG9mIHJhbmdlICIKLSAgICAgICAgICArIGxvd2VyQm91bmQgKyAiLSIgKyB1cHBlckJvdW5kKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIERvZXNOb3RTY2FsZUxpbmVhcmx5RXhjZXB0aW9uIGV4dGVuZHMgRXJyb3JJblVzYWdlRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgRG9lc05vdFNjYWxlTGluZWFybHlFeGNlcHRpb24oKSB7Ci0gICAgICBzdXBlcigiRG9pbmcgMnggYXMgbXVjaCB3b3JrIGRpZG4ndCB0YWtlIDJ4IGFzIG11Y2ggdGltZSEgIgotICAgICAgICAgICsgIklzIHRoZSBKSVQgb3B0aW1pemluZyBhd2F5IHRoZSBib2R5IG9mIHlvdXIgYmVuY2htYXJrPyIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uQ29uc3RhbnRNZW1vcnlVc2FnZSBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIE5vbkNvbnN0YW50TWVtb3J5VXNhZ2UoKSB7Ci0gICAgICBzdXBlcigiTm90IGFsbCByZXBzIG9mIHRoZSBpbm5lciBsb29wIGFsbG9jYXRlIHRoZSBzYW1lIG51bWJlciBvZiB0aW1lcyEgIgotICAgICAgICAgICsgIlRoZSByZXBzIGxvb3Agc2hvdWxkIHVzZSBhIGNvbnN0YW50IG51bWJlciBvZiBhbGxvY2F0aW9ucy4gIgotICAgICAgICAgICsgIkFyZSB5b3UgdXNpbmcgdGhlIHZhbHVlIG9mIHJlcHMgaW5zaWRlIHRoZSBsb29wPyIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJzdHJhY3RCZW5jaG1hcmtFeGNlcHRpb24gZXh0ZW5kcyBFcnJvckluVXNlckNvZGVFeGNlcHRpb24gewotICAgIHB1YmxpYyBBYnN0cmFjdEJlbmNobWFya0V4Y2VwdGlvbihDbGFzczw/PiBzcGVjaWZpZWRDbGFzcykgewotICAgICAgc3VwZXIoIkNsYXNzIFsiICsgc3BlY2lmaWVkQ2xhc3MuZ2V0TmFtZSgpICsgIl0gaXMgYWJzdHJhY3QuIiwgIlNwZWNpZnkgYSBjb25jcmV0ZSBjbGFzcy4iKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vUGFyYW1ldGVybGVzc0NvbnN0cnVjdG9yRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3JJblVzZXJDb2RlRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgTm9QYXJhbWV0ZXJsZXNzQ29uc3RydWN0b3JFeGNlcHRpb24oQ2xhc3M8Pz4gc3BlY2lmaWVkQ2xhc3MpIHsKLSAgICAgIHN1cGVyKCJDbGFzcyBbIiArIHNwZWNpZmllZENsYXNzLmdldE5hbWUoKSArICJdIGhhcyBubyBwYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yLiIsCi0gICAgICAgICAgIlJlbW92ZSBhbGwgY29uc3RydWN0b3JzIG9yIGFkZCBhIHBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IuIik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBEb2VzbnRJbXBsZW1lbnRCZW5jaG1hcmtFeGNlcHRpb24gZXh0ZW5kcyBFcnJvckluVXNlckNvZGVFeGNlcHRpb24gewotICAgIHB1YmxpYyBEb2VzbnRJbXBsZW1lbnRCZW5jaG1hcmtFeGNlcHRpb24oQ2xhc3M8Pz4gc3BlY2lmaWVkQ2xhc3MpIHsKLSAgICAgIHN1cGVyKCJDbGFzcyBbIiArIHNwZWNpZmllZENsYXNzICsgIl0gZG9lcyBub3QgaW1wbGVtZW50IHRoZSAiICsgQmVuY2htYXJrLmNsYXNzLmdldE5hbWUoKQotICAgICAgICAgICsgIiBpbnRlcmZhY2UuIiwgIkFkZCAnZXh0ZW5kcyAiICsgU2ltcGxlQmVuY2htYXJrLmNsYXNzICsgIicgdG8gdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52YWxpZERlYnVnUmVwc0V4Y2VwdGlvbiBleHRlbmRzIEVycm9ySW5Vc2FnZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIEludmFsaWREZWJ1Z1JlcHNFeGNlcHRpb24oU3RyaW5nIGFyZykgewotICAgICAgc3VwZXIoIkludmFsaWQgZGVidWcgcmVwczogIiArIGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVE9ETzogc2hvdWxkIHJlbW92ZSB0aGUgY2FsaXBlciBzdGFjayBmcmFtZXMuLi4uCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uRnJvbVVzZXJDb2RlRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIEV4Y2VwdGlvbkZyb21Vc2VyQ29kZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotICAgICAgc3VwZXIoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGZyb20gdGhlIGJlbmNobWFyayBjb2RlLiIpOwotICAgICAgaW5pdENhdXNlKHQpOwotICAgIH0KLSAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZGlzcGxheSgpIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihnZXRNZXNzYWdlKCkpOwotICAgICAgZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1ZtLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1ZtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzQ1YTkuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9WbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWNsYXNzIFZtIHsKLSAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWbVNwZWNpZmljT3B0aW9ucyhNZWFzdXJlbWVudFR5cGUgdHlwZSwgQXJndW1lbnRzIGFyZ3VtZW50cykgewotICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIHByb2Nlc3MgYnVpbGRlciB0byBydW4gdGhpcyBWTS4KLSAgICoKLSAgICogQHBhcmFtIHZtQXJncyB0aGUgcGF0aCB0byB0aGUgVk0gZm9sbG93ZWQgYnkgVk0gYXJndW1lbnRzLgotICAgKiBAcGFyYW0gYXBwbGljYXRpb25BcmdzIGFyZ3VtZW50cyB0byB0aGUgdGFyZ2V0IHByb2Nlc3MKLSAgICovCi0gIHB1YmxpYyBQcm9jZXNzQnVpbGRlciBuZXdQcm9jZXNzQnVpbGRlcihGaWxlIHdvcmtpbmdEaXJlY3RvcnksIFN0cmluZyBjbGFzc1BhdGgsCi0gICAgICBJbW11dGFibGVMaXN0PFN0cmluZz4gdm1BcmdzLCBTdHJpbmcgY2xhc3NOYW1lLCBJbW11dGFibGVMaXN0PFN0cmluZz4gYXBwbGljYXRpb25BcmdzKSB7Ci0gICAgUHJvY2Vzc0J1aWxkZXIgcmVzdWx0ID0gbmV3IFByb2Nlc3NCdWlsZGVyKCk7Ci0gICAgcmVzdWx0LmRpcmVjdG9yeSh3b3JraW5nRGlyZWN0b3J5KTsKLSAgICByZXN1bHQuY29tbWFuZCgpLmFkZEFsbCh2bUFyZ3MpOwotICAgIHJlc3VsdC5jb21tYW5kKCkuYWRkKCItY3AiKTsKLSAgICByZXN1bHQuY29tbWFuZCgpLmFkZChjbGFzc1BhdGgpOwotICAgIHJlc3VsdC5jb21tYW5kKCkuYWRkKGNsYXNzTmFtZSk7Ci0gICAgcmVzdWx0LmNvbW1hbmQoKS5hZGRBbGwoYXBwbGljYXRpb25BcmdzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1ZtRmFjdG9yeS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9WbUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZTM0Yy4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1ZtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBWbUZhY3RvcnkgewotICBwdWJsaWMgc3RhdGljIEltbXV0YWJsZVNldDxTdHJpbmc+IGRlZmF1bHRWbXMoKSB7Ci0gICAgU3RyaW5nIHZtTmFtZSA9IERhbHZpa1ZtLmlzRGFsdmlrVm0oKQotICAgICAgICA/IERhbHZpa1ZtLnZtTmFtZSgpCi0gICAgICAgIDogU3RhbmRhcmRWbS5kZWZhdWx0Vm1OYW1lKCk7Ci0gICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZih2bU5hbWUpOwotICB9Ci0KLSAgcHVibGljIFZtIGNyZWF0ZVZtKFNjZW5hcmlvIHNjZW5hcmlvKSB7Ci0gICAgTGlzdDxTdHJpbmc+IHZtTGlzdCA9IEFycmF5cy5hc0xpc3Qoc2NlbmFyaW8uZ2V0VmFyaWFibGVzKCkuZ2V0KFNjZW5hcmlvLlZNX0tFWSkuc3BsaXQoIlxccysiKSk7Ci0gICAgVm0gdm0gPSBudWxsOwotICAgIGlmICghdm1MaXN0LmlzRW1wdHkoKSkgewotICAgICAgaWYgKHZtTGlzdC5nZXQoMCkuZW5kc1dpdGgoImFwcF9wcm9jZXNzIikpIHsKLSAgICAgICAgdm0gPSBuZXcgRGFsdmlrVm0oKTsKLSAgICAgIH0gZWxzZSBpZiAodm1MaXN0LmdldCgwKS5lbmRzV2l0aCgiamF2YSIpKSB7Ci0gICAgICAgIHZtID0gbmV3IFN0YW5kYXJkVm0oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHZtID09IG51bGwpIHsKLSAgICAgIHZtID0gbmV3IFZtKCk7Ci0gICAgfQotICAgIHJldHVybiB2bTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9YbWwuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvWG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZWViZGEuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9YbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGF0YSwgd2hpY2ggaXMgc3RvcmVkIGluIFhNTCBmb3JtYXQuCi0gKiBBbGwgbmV3IGRhdGEgaXMgc3RvcmVkIGluIEpTT04uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWwgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURV9GT1JNQVRfU1RSSU5HID0gInl5eXktTU0tZGQnVCdISDptbTpzc3oiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WSVJPTk1FTlRfRUxFTUVOVF9OQU1FID0gImVudmlyb25tZW50IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9FTEVNRU5UX05BTUUgPSAicmVzdWx0IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9FTEVNRU5UX05BTUUgPSAicnVuIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFTkNITUFSS19BVFRSSUJVVEUgPSAiYmVuY2htYXJrIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRUNVVEVEX1RJTUVTVEFNUF9BVFRSSUJVVEUgPSAiZXhlY3V0ZWRUaW1lc3RhbXAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX1NDRU5BUklPX0VMRU1FTlRfTkFNRSA9ICJzY2VuYXJpbyI7Ci0gIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIGEgZGlmZmVyZW50IG5hbWUKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDRU5BUklPX0VMRU1FTlRfTkFNRSA9ICJuZXdTY2VuYXJpbyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRUFTVVJFTUVOVFNfRUxFTUVOVF9OQU1FID0gIm1lYXN1cmVtZW50cyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FX0VWRU5UX0xPR19FTEVNRU5UX05BTUUgPSAiZXZlbnRMb2ciOwotCi0gIHByaXZhdGUgc3RhdGljIFJlc3VsdCByZWFkUmVzdWx0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgIEVudmlyb25tZW50IGVudmlyb25tZW50ID0gbnVsbDsKLSAgICBSdW4gcnVuID0gbnVsbDsKLSAgICBmb3IgKE5vZGUgdG9wTGV2ZWxOb2RlIDogWG1sVXRpbHMuY2hpbGRyZW5PZihlbGVtZW50KSkgewotICAgICAgaWYgKHRvcExldmVsTm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhFTlZJUk9OTUVOVF9FTEVNRU5UX05BTUUpKSB7Ci0gICAgICAgIEVsZW1lbnQgZW52aXJvbm1lbnRFbGVtZW50ID0gKEVsZW1lbnQpIHRvcExldmVsTm9kZTsKLSAgICAgICAgZW52aXJvbm1lbnQgPSByZWFkRW52aXJvbm1lbnRFbGVtZW50KGVudmlyb25tZW50RWxlbWVudCk7Ci0gICAgICB9IGVsc2UgaWYgKHRvcExldmVsTm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhSVU5fRUxFTUVOVF9OQU1FKSkgewotICAgICAgICBydW4gPSByZWFkUnVuRWxlbWVudCgoRWxlbWVudCkgdG9wTGV2ZWxOb2RlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbGxlZ2FsIG5vZGUgbmFtZTogIiArIHRvcExldmVsTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZW52aXJvbm1lbnQgPT0gbnVsbCB8fCBydW4gPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1pc3NpbmcgZW52aXJvbm1lbnQgb3IgcnVuIGVsZW1lbnRzIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBSZXN1bHQocnVuLCBlbnZpcm9ubWVudCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBFbnZpcm9ubWVudCByZWFkRW52aXJvbm1lbnRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotICAgIHJldHVybiBuZXcgRW52aXJvbm1lbnQoWG1sVXRpbHMuYXR0cmlidXRlc09mKGVsZW1lbnQpKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFJ1biByZWFkUnVuRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgIFN0cmluZyBiZW5jaG1hcmtOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQkVOQ0hNQVJLX0FUVFJJQlVURSk7Ci0gICAgU3RyaW5nIGV4ZWN1dGVkRGF0ZVN0cmluZyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVYRUNVVEVEX1RJTUVTVEFNUF9BVFRSSUJVVEUpOwotICAgIERhdGUgZXhlY3V0ZWREYXRlID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoREFURV9GT1JNQVRfU1RSSU5HLCBMb2NhbGUuVVMpCi0gICAgICAgIC5wYXJzZShleGVjdXRlZERhdGVTdHJpbmcpOwotCi0gICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U2NlbmFyaW8sIFNjZW5hcmlvUmVzdWx0PiBtZWFzdXJlbWVudHNCdWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKLSAgICBmb3IgKE5vZGUgc2NlbmFyaW9Ob2RlIDogWG1sVXRpbHMuY2hpbGRyZW5PZihlbGVtZW50KSkgewotICAgICAgRWxlbWVudCBzY2VuYXJpb0VsZW1lbnQgPSAoRWxlbWVudCkgc2NlbmFyaW9Ob2RlOwotICAgICAgU2NlbmFyaW8gc2NlbmFyaW8gPSBuZXcgU2NlbmFyaW8oWG1sVXRpbHMuYXR0cmlidXRlc09mKHNjZW5hcmlvRWxlbWVudCkpOwotICAgICAgU2NlbmFyaW9SZXN1bHQgc2NlbmFyaW9SZXN1bHQ7Ci0KLSAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMKLSAgICAgIGlmIChzY2VuYXJpb05vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoT0xEX1NDRU5BUklPX0VMRU1FTlRfTkFNRSkpIHsKLSAgICAgICAgTWVhc3VyZW1lbnRTZXQgbWVhc3VyZW1lbnQgPQotICAgICAgICAgICAgSnNvbi5tZWFzdXJlbWVudFNldEZyb21Kc29uKHNjZW5hcmlvRWxlbWVudC5nZXRUZXh0Q29udGVudCgpKTsKLSAgICAgICAgc2NlbmFyaW9SZXN1bHQgPSBuZXcgU2NlbmFyaW9SZXN1bHQobWVhc3VyZW1lbnQsICIiLAotICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICB9IGVsc2UgaWYgKHNjZW5hcmlvTm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhTQ0VOQVJJT19FTEVNRU5UX05BTUUpKSB7Ci0gICAgICAgIE1lYXN1cmVtZW50U2V0IHRpbWVNZWFzdXJlbWVudFNldCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBldmVudExvZyA9IG51bGw7Ci0gICAgICAgIGZvciAoTm9kZSBub2RlIDogWG1sVXRpbHMuY2hpbGRyZW5PZihzY2VuYXJpb0VsZW1lbnQpKSB7Ci0gICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoTUVBU1VSRU1FTlRTX0VMRU1FTlRfTkFNRSkpIHsKLSAgICAgICAgICAgIHRpbWVNZWFzdXJlbWVudFNldCA9IEpzb24ubWVhc3VyZW1lbnRTZXRGcm9tSnNvbihub2RlLmdldFRleHRDb250ZW50KCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhUSU1FX0VWRU5UX0xPR19FTEVNRU5UX05BTUUpKSB7Ci0gICAgICAgICAgICBldmVudExvZyA9IG5vZGUuZ2V0VGV4dENvbnRlbnQoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImlsbGVnYWwgbm9kZSBuYW1lOiAiICsgbm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRpbWVNZWFzdXJlbWVudFNldCA9PSBudWxsIHx8IGV2ZW50TG9nID09IG51bGwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibWlzc2luZyBub2RlIFwiIiArIE1FQVNVUkVNRU5UU19FTEVNRU5UX05BTUUgKyAiXCIgb3IgXCIiCi0gICAgICAgICAgICAgICsgVElNRV9FVkVOVF9MT0dfRUxFTUVOVF9OQU1FICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gIm5ldyBNZWFzdXJlbWVudFswXSIgdXNlZCBpbnN0ZWFkIG9mIGVtcHR5IHZhcmFyZ3MgYXJndW1lbnQgc2luY2UgTWVhc3VyZW1lbnRTZXQgaGFzCi0gICAgICAgIC8vIGFuIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3IuCi0gICAgICAgIHNjZW5hcmlvUmVzdWx0ID0gbmV3IFNjZW5hcmlvUmVzdWx0KHRpbWVNZWFzdXJlbWVudFNldCwgZXZlbnRMb2csCi0gICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbGxlZ2FsIG5vZGUgbmFtZTogIiArIHNjZW5hcmlvTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgbWVhc3VyZW1lbnRzQnVpbGRlci5wdXQoc2NlbmFyaW8sIHNjZW5hcmlvUmVzdWx0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFJ1bihtZWFzdXJlbWVudHNCdWlsZGVyLmJ1aWxkKCksIGJlbmNobWFya05hbWUsIGV4ZWN1dGVkRGF0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHJlc3VsdCBieSBkZWNvZGluZyBYTUwgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIFhNTCBzaG91bGQKLSAgICogYmUgY29uc2lzdGVudCB3aXRoIHRoZSBmb3JtYXQgZW1pdHRlZCBieSB0aGUgbm93IGRlbGV0ZWQgcnVuVG9YbWwoUnVuLCBPdXRwdXRTdHJlYW0pLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBSdW4gcnVuRnJvbVhtbChJbnB1dFN0cmVhbSBpbikgewotICAgIHRyeSB7Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShpbik7Ci0gICAgICByZXR1cm4gcmVhZFJ1bkVsZW1lbnQoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYWxmb3JtZWQgWE1MIGRvY3VtZW50IiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZW52aXJvbm1lbnQgYnkgZGVjb2RpbmcgWE1MIGZyb20gdGhlIHNwZWNpZmllZCBzdHJlYW0uIFRoZSBYTUwgc2hvdWxkCi0gICAqIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9ybWF0IGVtaXR0ZWQgYnkgdGhlIG5vdyBkZWxldGVkCi0gICAqIGVudmlyb25tZW50VG9YbWwoRW52aXJvbm1lbnQsIE91dHB1dFN0cmVhbSkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEVudmlyb25tZW50IGVudmlyb25tZW50RnJvbVhtbChJbnB1dFN0cmVhbSBpbikgewotICAgIHRyeSB7Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShpbik7Ci0gICAgICBFbGVtZW50IGVudmlyb25tZW50RWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgcmV0dXJuIHJlYWRFbnZpcm9ubWVudEVsZW1lbnQoZW52aXJvbm1lbnRFbGVtZW50KTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWFsZm9ybWVkIFhNTCBkb2N1bWVudCIsIGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUmVzdWx0IHJlc3VsdEZyb21YbWwoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0cnkgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UoaW4pOwotICAgICAgcmV0dXJuIHJlYWRSZXN1bHRFbGVtZW50KGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWFsZm9ybWVkIFhNTCBkb2N1bWVudCIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgWG1sKCkge30KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvWG1sVXRpbHMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvWG1sVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4ZTZmYS4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1htbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFhtbFV0aWxzIHsKLSAgcHVibGljIHN0YXRpYyBJbW11dGFibGVMaXN0PE5vZGU+IGNoaWxkcmVuT2YoTm9kZSBub2RlKSB7Ci0gICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBJbW11dGFibGVMaXN0LkJ1aWxkZXI8Tm9kZT4gcmVzdWx0ID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSA8IHNpemU7IGkrKykgewotICAgICAgcmVzdWx0LmFkZChjaGlsZHJlbi5pdGVtKGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5idWlsZCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXNPZihFbGVtZW50IGVsZW1lbnQpIHsKLSAgICBOYW1lZE5vZGVNYXAgbWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IEltbXV0YWJsZU1hcC5idWlsZGVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBtYXAuaXRlbShpKTsKLSAgICAgIHJlc3VsdC5wdXQoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuYnVpbGQoKTsKLSAgfQotCi0gIHByaXZhdGUgWG1sVXRpbHMoKSB7fQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9hcGkvQWZ0ZXJSZXAuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL0FmdGVyUmVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4ZWRjYwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL0FmdGVyUmVwLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuYXBpOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBBcHBseSB0aGlzIGFubm90YXRpb24gdG8gYW55IG1ldGhvZCB3aXRob3V0IHBhcmFtZXRlcnMgdG8gaGF2ZSBpdCBydW4gYWZ0ZXIgZWFjaCByZXAgb2YgYQorICoge0BsaW5rIE1hY3JvYmVuY2htYXJrfS4KKyAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldChNRVRIT0QpCitAQmV0YQorcHVibGljIEBpbnRlcmZhY2UgQWZ0ZXJSZXAge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL0JlZm9yZVJlcC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9hcGkvQmVmb3JlUmVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhZTIwMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL0JlZm9yZVJlcC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmFwaTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuQmV0YTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogQXBwbHkgdGhpcyBhbm5vdGF0aW9uIHRvIGFueSBtZXRob2Qgd2l0aG91dCBwYXJhbWV0ZXJzIHRvIGhhdmUgaXQgcnVuIGJlZm9yZSBlYWNoIHJlcCBvZiBhCisgKiB7QGxpbmsgTWFjcm9iZW5jaG1hcmt9LgorICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAVGFyZ2V0KE1FVEhPRCkKK0BCZXRhCitwdWJsaWMgQGludGVyZmFjZSBCZWZvcmVSZXAge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL0Zvb3RwcmludC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9hcGkvRm9vdHByaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhN2I4YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL0Zvb3RwcmludC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmFwaTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBBbm5vdGF0ZXMgYSBtZXRob2Qgd2hvc2UgcmV0dXJuIHZhbHVlIGlzIGFuIG9iamVjdCB3aG9zZSB0b3RhbCBtZW1vcnkgZm9vdHByaW50IGlzIHRvIGJlCisgKiBtZWFzdXJlZC4KKyAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldChNRVRIT0QpCitwdWJsaWMgQGludGVyZmFjZSBGb290cHJpbnQgeworICAvKioKKyAgICogT3B0aW9uYWxseSBpZ25vcmUgaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMgKGluY2x1ZGluZyBzdWJjbGFzc2VzKSB3aGVuIG1lYXN1cmluZy4gIEZvcgorICAgKiBleGFtcGxlLCB7QGNvZGUgQEZvb3RwcmludChpZ25vcmUgPSBFbGVtZW50LmNsYXNzKSBwdWJsaWMgU2V0PEVsZW1lbnQ+IHNldCgpIHsuLi59fSB3b3VsZAorICAgKiBtZWFzdXJlIHRoZSBzaXplIG9mIHRoZSBzZXQgd2hpbGUgaWdub3JpbmcgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnRzLgorICAgKi8KKyAgQ2xhc3M8Pz5bXSBleGNsdWRlKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL01hY3JvYmVuY2htYXJrLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2FwaS9NYWNyb2JlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzQ3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2FwaS9NYWNyb2JlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5hcGk7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkJldGE7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEFwcGx5IHRoaXMgYW5ub3RhdGlvbiB0byBhbnkgbWV0aG9kIHdpdGhvdXQgcGFyYW1ldGVycyB0byBoYXZlIGl0IHRpbWVkIGFzIGEgbWFjcm9iZW5jaG1hcmsuIEEKKyAqIG1hY3JvYmVuY2htYXJrIGlzIHJvdWdobHkgZGVmaW5lZCBhcyBhbnkgYmVuY2htYXJrIHdob3NlIHJ1bnRpbWUgaXMgbGFyZ2UgZW5vdWdoIHRoYXQgdGhlCisgKiBncmFudWxhcml0eSBvZiB0aGUge0BsaW5rcGxhaW4gU3lzdGVtI25hbm9UaW1lIGNsb2NrfSBpcyBub3QgYSBmYWN0b3IgaW4gbWVhc3VyZW1lbnQuIFRodXMsIGVhY2gKKyAqIHJlcGV0aXRpb24gb2YgdGhlIGJlbmNobWFyayBjb2RlIGNhbiBiZSB0aW1lZCBpbmRpdmlkdWFsbHkuCisgKgorICogPHA+QWRkaXRpb25hbGx5LCBzaW5jZSBlYWNoIHJlcCBpcyBpbmRlcGVuZGVudGx5IHRpbWVkLCBzZXR1cCBhbmQgdGVhciBkb3duIGxvZ2ljIGNhbiBiZQorICogcGVyZm9ybWVkIGluIGJldHdlZW4gZWFjaCB1c2luZyB0aGUge0BsaW5rIEJlZm9yZVJlcH0gYW5kIHtAbGluayBBZnRlclJlcH0gYW5ub3RhdGlvbnMKKyAqIHJlc3BlY3RpdmVseS4KKyAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldChNRVRIT0QpCitAQmV0YQorcHVibGljIEBpbnRlcmZhY2UgTWFjcm9iZW5jaG1hcmsge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL1Jlc3VsdFByb2Nlc3Nvci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9hcGkvUmVzdWx0UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjMGVlMAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL1Jlc3VsdFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmFwaTsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5UcmlhbDsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgcHJvY2Vzc2luZyByZXN1bHRzIGFzIHRoZXkgY29tcGxldGUuIENhbGxlcnMgbXVzdCBpbnZva2Uge0BsaW5rICNjbG9zZSgpfSBhZnRlcgorICogYWxsIHRyaWFscyBoYXZlIGJlZW4ge0BsaW5rcGxhaW4gI3Byb2Nlc3NUcmlhbCBwcm9jZXNzZWR9LgorICoKKyAqIDxwPkltcGxlbWVudGF0aW9ucyBtdXN0IGhhdmUgYSBwdWJsaWMgbm8gYXJndW1lbnQgY29uc3RydWN0b3IuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzdWx0UHJvY2Vzc29yIGV4dGVuZHMgQ2xvc2VhYmxlIHsKKyAgdm9pZCBwcm9jZXNzVHJpYWwoVHJpYWwgdHJpYWwpOworfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9hcGkvU2tpcFRoaXNTY2VuYXJpb0V4Y2VwdGlvbi5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9hcGkvU2tpcFRoaXNTY2VuYXJpb0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjZmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2FwaS9Ta2lwVGhpc1NjZW5hcmlvRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuYXBpOworCisvKioKKyAqIFRocm93IHRoaXMgZXhjZXB0aW9uIGZyb20geW91ciBiZW5jaG1hcmsgY2xhc3MncyBzZXRVcCBtZXRob2QsIG9yIGJlbmNobWFyayBtZXRob2QKKyAqIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbWJpbmF0aW9uIG9mIHBhcmFtZXRlcnMgc3VwcGxpZWQgc2hvdWxkIG5vdCBiZSBiZW5jaG1hcmtlZC4gRm9yIGV4YW1wbGUsCisgKiB3aGlsZSB5b3UgbWlnaHQgd2FudCB0byB0ZXN0IDxpPm1vc3Q8L2k+IGNvbWJpbmF0aW9ucyBvZiB0aGUgcGFyYW1ldGVycyB7QGNvZGUgc2l6ZX0gYW5kIHtAY29kZQorICogY29tcGFyYXRvcn0sIHlvdSBtaWdodCBub3Qgd2FudCB0byB0ZXN0IHRoZSBzcGVjaWZpYyBjb21iaW5hdGlvbiBvZiB7QGNvZGUgc2l6ZT0xMDAwMDAwMDB9IGFuZAorICoge0Bjb2RlIGNvbXBhcmF0b3I9cmVhbGx5RXhwZW5zaXZlQ29tcGFyYXRvcn0uCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGZpbmFsIGNsYXNzIFNraXBUaGlzU2NlbmFyaW9FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2FwaS9WbU9wdGlvbnMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYXBpL1ZtT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzNkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2FwaS9WbU9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5hcGk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogQW4gYW5ub3RhdGlvbiBhcHBsaWVkIHRvIGEgYmVuY2htYXJrIHRoYXQgc3BlY2lmaWVzIGZsYWdzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIFZNLiBUaGVzZSBmbGFncworICogYXJlIGFwcGxpZWQgYmVmb3JlIHRob3NlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZC1saW5lIGFuZCB0aHVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBhcHBsaWVkLgorICoKKyAqIDxwPlRoaXMgQVBJIGlzIGxpa2VseSB0byBjaGFuZ2UuCisgKi8KKy8vIFRPRE8oZ2FrKTogU3VwcG9ydCBwbGF0Zm9ybSAoZS5nLiBBbmRyb2lkIGFuZCBKdm0pIHNwZWNpZmljIG9wdGlvbnMuCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQEJldGEKK3B1YmxpYyBAaW50ZXJmYWNlIFZtT3B0aW9ucyB7CisgIFN0cmluZ1tdIHZhbHVlKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0Fic3RyYWN0TG9nTWVzc2FnZVZpc2l0b3IuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0Fic3RyYWN0TG9nTWVzc2FnZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzhlMDljCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvQWJzdHJhY3RMb2dNZXNzYWdlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworLyoqCisgKiBBbiBhYnN0cmFjdCB7QGxpbmsgTG9nTWVzc2FnZVZpc2l0b3J9IHdpdGggbm8tb3AgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgdmlzaXQgbWV0aG9kcyAtCisgKiBwcm92aWRlZCBzbyB0aGF0IGFsbCB2aXNpdG9ycyBkb24ndCBoYXZlIHRvIG92ZXJyaWRlIGFsbCBtZXRob2RzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMb2dNZXNzYWdlVmlzaXRvciBpbXBsZW1lbnRzIExvZ01lc3NhZ2VWaXNpdG9yIHsKKyAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KEdjTG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7fQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChGYWlsdXJlTG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7fQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChIb3RzcG90TG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7fQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChTdGFydE1lYXN1cmVtZW50TG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7fQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlIGxvZ01lc3NhZ2UpIHt9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KFZtT3B0aW9uTG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7fQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChWbVByb3BlcnRpZXNMb2dNZXNzYWdlIGxvZ01lc3NhZ2UpIHt9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9CcmlkZ2VNb2R1bGUuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0JyaWRnZU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmRkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9CcmlkZ2VNb2R1bGUuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5QYXJzZXI7CitpbXBvcnQgZGFnZ2VyLk1vZHVsZTsKK2ltcG9ydCBkYWdnZXIuUHJvdmlkZXM7CisKKy8qKgorICogQmluZGluZ3MgZm9yIHtAbGluayBQYXJzZXIgcGFyc2Vyc30gZm9yIHtAbGluayBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwgbW9kZWx9IGNsYXNzZXMuCisgKi8KK0BNb2R1bGUKK3B1YmxpYyBmaW5hbCBjbGFzcyBCcmlkZ2VNb2R1bGUgeworICBAUHJvdmlkZXMgc3RhdGljIFBhcnNlcjxMb2dNZXNzYWdlPiBwcm92aWRlTG9nTWVzc2FnZVBhcnNlcihMb2dNZXNzYWdlUGFyc2VyIHBhcnNlcikgeworICAgIHJldHVybiBwYXJzZXI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0NvbW1hbmRMaW5lU2VyaWFsaXplci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvQ29tbWFuZExpbmVTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2MzM1NQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0NvbW1hbmRMaW5lU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkJhc2VFbmNvZGluZzsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworCisvKioKKyAqIFNlcmlhbGl6ZXMgYW5kIGRlc2VyaWFsaXplcyBXb3JrZXJTcGVjcyBhcyBiYXNlNjQgZW5jb2RlZCBzdHJpbmdzIHNvIHRoZXkgY2FuIGJlIHBhc3NlZCBvbiB0aGUKKyAqIGNvbW1hbmQgbGluZSB0byB0aGUgd29ya2VyLgorICoKKyAqIDxwPkphdmEgc2VyaWFsaXphdGlvbiBpcyBhIGFwcHJvcHJpYXRlIGluIHRoaXMgdXNlY2FzZSBiZWNhdXNlIHRoZXJlIGFyZSBubyBjb21wYXRpYmlsaXR5CisgKiBjb25jZXJucy4gIFRoZSBtZXNzYWdlcyBlbmNvZGVkL2RlY29kZWQgYnkgdGhpcyBjbGFzcyBhcmUgb25seSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYW5vdGhlcgorICogSlZNIHRoYXQgaXMgcnVubmluZyB3aXRoIHRoZSBzYW1lIHZlcnNpb24gb2YgdGhlIGphdmEgY2xhc3Nlcy4gIEFsc28sIGl0IHNob3VsZCBiZSBsaWdodGVyIHdlaWdodAorICogYW5kIGZhc3RlciB0aGFuIG90aGVyIGNvbW1vbiBzZXJpYWxpemF0aW9uIHNvbHV0aW9ucy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbW1hbmRMaW5lU2VyaWFsaXplciB7CisgIHByaXZhdGUgQ29tbWFuZExpbmVTZXJpYWxpemVyKCkge30KKworICAvKiogUmV0dXJucyB0aGUgZ2l2ZW4gc2VyaWFsaXphYmxlIG9iamVjdCBhcyBhIGJhc2U2NCBlbmNvZGVkIFN0cmluZy4gKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuZGVyKFdvcmtlclNwZWMgbWVzc2FnZSkgeworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICB0cnkgeworICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYnl0ZXMpOworICAgICAgb3V0LndyaXRlT2JqZWN0KG1lc3NhZ2UpOworICAgICAgb3V0LmNsb3NlKCk7CisgICAgICByZXR1cm4gQmFzZUVuY29kaW5nLmJhc2U2NCgpLmVuY29kZShieXRlcy50b0J5dGVBcnJheSgpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKiogUGFyc2VzIHRoZSBnaXZlbiBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgYXMgYW4gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlLiAqLworICBwdWJsaWMgc3RhdGljIFdvcmtlclNwZWMgcGFyc2UoU3RyaW5nIGFyZykgeworICAgIHRyeSB7CisgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKEJhc2VFbmNvZGluZy5iYXNlNjQoKS5kZWNvZGUoYXJnKSk7CisgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKKyAgICAgIFdvcmtlclNwZWMgaW5zdGFuY2UgPSAoV29ya2VyU3BlYykgaW4ucmVhZE9iamVjdCgpOworICAgICAgaW4uY2xvc2UoKTsKKyAgICAgIGNoZWNrU3RhdGUoYmFpcy5yZWFkKCkgPT0gLTEsCisgICAgICAgICAgIk1lc3NhZ2UgJXMgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBvYmplY3QuIiwgYXJnKTsKKyAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgIC8vIGFzc2VydGlvbiBlcnJvcj8KKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjYW5ub3QgZGVjb2RlIG1lc3NhZ2UiLCBlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0ZhaWx1cmVMb2dNZXNzYWdlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9GYWlsdXJlTG9nTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjFhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9GYWlsdXJlTG9nTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBtZXNzYWdlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gYSBmYWlsdXJlIGVuY291bnRlcmVkIGJ5IHRoZSB3b3JrZXIgSlZNLgorICovCitwdWJsaWMgY2xhc3MgRmFpbHVyZUxvZ01lc3NhZ2UgZXh0ZW5kcyBMb2dNZXNzYWdlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RhY2tUcmFjZTsKKworICBwdWJsaWMgRmFpbHVyZUxvZ01lc3NhZ2UoVGhyb3dhYmxlIGUpIHsKKyAgICB0aGlzKFRocm93YWJsZXMuZ2V0U3RhY2tUcmFjZUFzU3RyaW5nKGUpKTsKKyAgfQorCisgIHB1YmxpYyBGYWlsdXJlTG9nTWVzc2FnZShTdHJpbmcgc3RhY2tUcmFjZSkgeworICAgIHRoaXMuc3RhY2tUcmFjZSA9IGNoZWNrTm90TnVsbChzdGFja1RyYWNlKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgc3RhY2tUcmFjZSgpIHsKKyAgICByZXR1cm4gc3RhY2tUcmFjZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhY2NlcHQoTG9nTWVzc2FnZVZpc2l0b3IgdmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXQodGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gc3RhY2tUcmFjZS5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEZhaWx1cmVMb2dNZXNzYWdlKSB7CisgICAgICBGYWlsdXJlTG9nTWVzc2FnZSB0aGF0ID0gKEZhaWx1cmVMb2dNZXNzYWdlKSBvYmo7CisgICAgICByZXR1cm4gdGhpcy5zdGFja1RyYWNlLmVxdWFscyh0aGF0LnN0YWNrVHJhY2UpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9HY0xvZ01lc3NhZ2UuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0djTG9nTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTk3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9HY0xvZ01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlNob3J0RHVyYXRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CisKKy8qKgorICogQSBtZXNzYWdlIHJlcHJlc2VudGluZyBvdXRwdXQgcHJvZHVjZWQgYnkgdGhlIEpWTSB3aGVuIHtAY29kZSAtWFg6K1ByaW50R0N9IGlzIGVuYWJsZWQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHY0xvZ01lc3NhZ2UgZXh0ZW5kcyBMb2dNZXNzYWdlIHsKKyAgLyoqCisgICAqIFRoZSB0eXBlIG9mIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gcGVyZm9ybWVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBlbnVtIFR5cGUgeworICAgIEZVTEwsCisgICAgSU5DUkVNRU5UQUwsCisgIH0KKworICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKyAgcHJpdmF0ZSBmaW5hbCBTaG9ydER1cmF0aW9uIGR1cmF0aW9uOworCisgIEdjTG9nTWVzc2FnZShUeXBlIHR5cGUsIFNob3J0RHVyYXRpb24gZHVyYXRpb24pIHsKKyAgICB0aGlzLnR5cGUgPSBjaGVja05vdE51bGwodHlwZSk7CisgICAgdGhpcy5kdXJhdGlvbiA9IGNoZWNrTm90TnVsbChkdXJhdGlvbik7CisgIH0KKworICBwdWJsaWMgVHlwZSB0eXBlKCkgeworICAgIHJldHVybiB0eXBlOworICB9CisKKyAgcHVibGljIFNob3J0RHVyYXRpb24gZHVyYXRpb24oKSB7CisgICAgcmV0dXJuIGR1cmF0aW9uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFjY2VwdChMb2dNZXNzYWdlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdCh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKHR5cGUsIGR1cmF0aW9uKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBHY0xvZ01lc3NhZ2UpIHsKKyAgICAgIEdjTG9nTWVzc2FnZSB0aGF0ID0gKEdjTG9nTWVzc2FnZSkgb2JqOworICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSB0aGF0LnR5cGUKKyAgICAgICAgICAmJiB0aGlzLmR1cmF0aW9uLmVxdWFscyh0aGF0LmR1cmF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQorICAgICAgICAuYWRkVmFsdWUodHlwZSkKKyAgICAgICAgLmFkZCgiZHVyYXRpb24iLCBkdXJhdGlvbikKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvVXBsb2FkUmVzdWx0cy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvSG90c3BvdExvZ01lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9VcGxvYWRSZXN1bHRzLmphdmEKY29weSB0byBjYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9Ib3RzcG90TG9nTWVzc2FnZS5qYXZhCmluZGV4IDdkYWU3YWYuLjA2NzAxNTMgMTAwNjQ0Ci0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvVXBsb2FkUmVzdWx0cy5qYXZhCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0hvdHNwb3RMb2dNZXNzYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE1ICsxNCwxNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7CitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2U7CiAKIC8qKgotICogVXNhZ2U6IFVwbG9hZFJlc3VsdHMgPGZpbGVfb3JfZGlyPgorICogQSBtZXNzYWdlIHJlcHJlc2VudGluZyBvdXRwdXQgcHJvZHVjZWQgYnkgdGhlIEpWTSB3aGVuIHtAY29kZSAtWFg6K1ByaW50Q29tcGxpYXRpb259IGlzIGVuYWJsZWQuCiAgKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRSZXN1bHRzIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIG5ldyBSdW5uZXIoKS51cGxvYWRSZXN1bHRzRmlsZU9yRGlyKG5ldyBGaWxlKGFyZ3NbMF0pKTsKK3B1YmxpYyBmaW5hbCBjbGFzcyBIb3RzcG90TG9nTWVzc2FnZSBleHRlbmRzIExvZ01lc3NhZ2UgeworICBIb3RzcG90TG9nTWVzc2FnZSgpIHt9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFjY2VwdChMb2dNZXNzYWdlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdCh0aGlzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFR5cGUuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0xvZ01lc3NhZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDcwJQpjb3B5IGZyb20gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFR5cGUuamF2YQpjb3B5IHRvIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0xvZ01lc3NhZ2UuamF2YQppbmRleCAzMGRlNjlmLi5mYzRhMmFkIDEwMDY0NAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL01lYXN1cmVtZW50VHlwZS5qYXZhCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0xvZ01lc3NhZ2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTEgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7Ci0KLUBHd3RDb21wYXRpYmxlCi1wdWJsaWMgZW51bSBNZWFzdXJlbWVudFR5cGUgewotICBUSU1FLCBJTlNUQU5DRSwgTUVNT1JZLCBERUJVRworLyoqCisgKiBBIHNpbmdsZSBsaW5lIG9mIG91dHB1dCBwcm9kdWNlZCBieSBhIHtAY29kZSBXb3JrZXJ9LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9nTWVzc2FnZSB7CisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFjY2VwdChMb2dNZXNzYWdlVmlzaXRvciB2aXNpdG9yKTsKIH0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0xvZ01lc3NhZ2VQYXJzZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0xvZ01lc3NhZ2VQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGFiNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvTG9nTWVzc2FnZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuUGFyc2VyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlNob3J0RHVyYXRpb247CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogUGFyc2VzIHtAbGluayBMb2dNZXNzYWdlfSBzdHJpbmdzLgorICovCitmaW5hbCBjbGFzcyBMb2dNZXNzYWdlUGFyc2VyIGltcGxlbWVudHMgUGFyc2VyPExvZ01lc3NhZ2U+IHsKKyAgQEluamVjdCBMb2dNZXNzYWdlUGFyc2VyKCkge30KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEdDX1BBVFRFUk4gPQorICAgICAgUGF0dGVybi5jb21waWxlKCIuKlxcWyg/OihGdWxsKSApP0dDLiooXFxkK1xcLlxcZCspIHNlY3NcXF0iKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBKSVRfUEFUVEVSTiA9CisgICAgICBQYXR0ZXJuLmNvbXBpbGUoIi4qOjouKiggXFwoKChcXGQrIGJ5dGVzKXwoc3RhdGljKSlcXCkpPyIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFZNX09QVElPTl9QQVRURVJOID0KKyAgICAgIFBhdHRlcm4uY29tcGlsZSgiXFxzKihcXHcrKVxccysoXFx3KylcXHMrOj89XFxzKyhbXlxcc10qKVxccytcXHsoW159XSopXFx9XFxzKiIpOworCisgIEBPdmVycmlkZSBwdWJsaWMgTG9nTWVzc2FnZSBwYXJzZShDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgIC8vIFRPRE8oZ2FrKTogZG8gdGhpcyBzdHVmZiBpbiB0ZXJtcyBvZiBDaGFyU2VxdWVuY2UgaW5zdGVhZCBvZiBTdHJpbmcKKyAgICBTdHJpbmcgc3RyaW5nID0gdGV4dC50b1N0cmluZygpOworICAgIE1hdGNoZXIgZ2NNYXRjaGVyID0gR0NfUEFUVEVSTi5tYXRjaGVyKHN0cmluZyk7CisgICAgaWYgKGdjTWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgIHJldHVybiBuZXcgR2NMb2dNZXNzYWdlKAorICAgICAgICAgICJGdWxsIi5lcXVhbHMoZ2NNYXRjaGVyLmdyb3VwKDEpKQorICAgICAgICAgICAgICA/IEdjTG9nTWVzc2FnZS5UeXBlLkZVTEwKKyAgICAgICAgICAgICAgOiBHY0xvZ01lc3NhZ2UuVHlwZS5JTkNSRU1FTlRBTCwKKyAgICAgICAgICBTaG9ydER1cmF0aW9uLm9mKEJpZ0RlY2ltYWwudmFsdWVPZihEb3VibGUucGFyc2VEb3VibGUoZ2NNYXRjaGVyLmdyb3VwKDIpKSksIFNFQ09ORFMpKTsKKyAgICB9CisgICAgTWF0Y2hlciBqaXRNYXRjaGVyID0gSklUX1BBVFRFUk4ubWF0Y2hlcihzdHJpbmcpOworICAgIGlmIChqaXRNYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgcmV0dXJuIG5ldyBIb3RzcG90TG9nTWVzc2FnZSgpOworICAgIH0KKyAgICBNYXRjaGVyIHZtT3B0aW9uTWF0Y2hlciA9IFZNX09QVElPTl9QQVRURVJOLm1hdGNoZXIoc3RyaW5nKTsKKyAgICBpZiAodm1PcHRpb25NYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgcmV0dXJuIG5ldyBWbU9wdGlvbkxvZ01lc3NhZ2Uodm1PcHRpb25NYXRjaGVyLmdyb3VwKDIpLCB2bU9wdGlvbk1hdGNoZXIuZ3JvdXAoMykpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvTG9nTWVzc2FnZVZpc2l0b3IuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0xvZ01lc3NhZ2VWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxYmJmMQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0xvZ01lc3NhZ2VWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlOworCisvKioKKyAqIEEgdmlzaXRvciBmb3IgdGhlIHZhcmlvdXMgc3ViY2xhc3NlcyBvZiB7QGxpbmsgTG9nTWVzc2FnZX0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9nTWVzc2FnZVZpc2l0b3IgeworICB2b2lkIHZpc2l0KEdjTG9nTWVzc2FnZSBsb2dNZXNzYWdlKTsKKyAgdm9pZCB2aXNpdChGYWlsdXJlTG9nTWVzc2FnZSBsb2dNZXNzYWdlKTsKKyAgdm9pZCB2aXNpdChIb3RzcG90TG9nTWVzc2FnZSBsb2dNZXNzYWdlKTsKKyAgdm9pZCB2aXNpdChTdGFydE1lYXN1cmVtZW50TG9nTWVzc2FnZSBsb2dNZXNzYWdlKTsKKyAgdm9pZCB2aXNpdChTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlIGxvZ01lc3NhZ2UpOworICB2b2lkIHZpc2l0KFZtT3B0aW9uTG9nTWVzc2FnZSBsb2dNZXNzYWdlKTsKKyAgdm9pZCB2aXNpdChWbVByb3BlcnRpZXNMb2dNZXNzYWdlIGxvZ01lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvT3BlbmVkU29ja2V0LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9PcGVuZWRTb2NrZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTBkOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvT3BlbmVkU29ja2V0LmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmx1c2hhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCisvKioKKyAqIEEgc2ltcGxlIHR1cGxlIGZvciB0aGUgb3BlbmVkIHN0cmVhbXMgb2YgYSBzb2NrZXQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPcGVuZWRTb2NrZXQgeworICAvKioKKyAgICogV2FpdHMgZm9yIHRoZSBjaGFubmVsIHRvIGNvbm5lY3QgYW5kIHJldHVybnMgYSBuZXcge0BsaW5rIE9wZW5lZFNvY2tldH0uCisgICAqLworICBwdWJsaWMgc3RhdGljIE9wZW5lZFNvY2tldCBmcm9tU29ja2V0KFNvY2tldENoYW5uZWwgc29ja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHNvY2tldC5jb25maWd1cmVCbG9ja2luZyh0cnVlKTsKKyAgICBzb2NrZXQuZmluaXNoQ29ubmVjdCgpOworICAgIHJldHVybiBmcm9tU29ja2V0KHNvY2tldC5zb2NrZXQoKSk7CisgIH0KKyAgLyoqCisgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIE9wZW5lZFNvY2tldH0gZm9yIHRoZSBnaXZlbiBjb25uZWN0ZWQge0BsaW5rIFNvY2tldH0gaW5zdGFuY2UuCisgICAqLworICBwdWJsaWMgc3RhdGljIE9wZW5lZFNvY2tldCBmcm9tU29ja2V0KFNvY2tldCBzb2NrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gU2V0dGluZyB0aGlzIHRvIHRydWUgZGlzYWJsZXMgTmFnbGUncyBhbGdvcml0aG0gKFJGQyA4OTYpIHdoaWNoIHNlZWtzIHRvIGRlY3JlYXNlIHBhY2tldAorICAgIC8vIG92ZXJoZWFkIGJ5IGJ1ZmZlcmluZyB3cml0ZXMgd2hpbGUgdGhlcmUgYXJlIHBhY2tldHMgb3V0c3RhbmRpbmcgKGkuZS4gaGF2ZW4ndCBiZWVuIGFjaydkKS4KKyAgICAvLyBUaGlzIGludGVyYWN0cyBwb29ybHkgd2l0aCBhbm90aGVyIFRDUCBmZWF0dXJlIGNhbGxlZCAnZGVsYXllZCBhY2tzJyAoUkZDIDExMjIpIGlmIHRoZQorICAgIC8vIGFwcGxpY2F0aW9uIHNlbmRzIGxvdHMgb2Ygc21hbGwgbWVzc2FnZXMgKHdoaWNoIHdlIGRvISkuICBXaXRob3V0IHRoaXMgZW5hYmxlZCBtZXNzYWdlcyBzZW50CisgICAgLy8gYnkgdGhlIHdvcmtlciBtYXkgYmUgZGVsYXllZCBieSB1cCB0byB0aGUgZGVsYXllZCBhY2sgdGltZW91dCAob24gbGludXggdGhpcyBpcyA0MC01MDBtcywKKyAgICAvLyB0aG91Z2ggaW4gcHJhY3RpY2UgSSBoYXZlIG9ubHkgb2JzZXJ2ZWQgNDBtcykuICBTbyB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgVENQX05PX0RFTEFZIG9wdGlvbgorICAgIC8vIGhlcmUuCisgICAgc29ja2V0LnNldFRjcE5vRGVsYXkodHJ1ZSk7CisgICAgLy8gTi5CLiBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgY29uc3RydWN0aW5nIGFuIE9iamVjdE91dHB1dFN0cmVhbSByZXF1aXJlcyB3cml0aW5nIGEgaGVhZGVyCisgICAgLy8gYW5kIGNvbnN0cnVjdGluZyBhbiBPYmplY3RJbnB1dFN0cmVhbSByZXF1aXJlcyByZWFkaW5nIHRoYXQgaGVhZGVyLiAgU28gd2UgYWx3YXlzIG5lZWQgdG8KKyAgICAvLyBjb25zdHJ1Y3QgdGhlIE9PUyBmaXJzdCBzbyB3ZSBkb24ndCBkZWFkbG9jay4gCisgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZ2V0T3V0cHV0U3RyZWFtKHNvY2tldCkpOworICAgIE9iamVjdElucHV0U3RyZWFtIGlucHV0ID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGdldElucHV0U3RyZWFtKHNvY2tldCkpOworICAgIHJldHVybiBuZXcgT3BlbmVkU29ja2V0KG5ldyBSZWFkZXIoaW5wdXQpLCBuZXcgV3JpdGVyKG91dHB1dCkpOworICB9CisgIAorICBwcml2YXRlIGZpbmFsIFJlYWRlciByZWFkZXI7CisgIHByaXZhdGUgZmluYWwgV3JpdGVyIHdyaXRlcjsKKworICBwcml2YXRlIE9wZW5lZFNvY2tldChSZWFkZXIgcmVhZGVyLAorICAgICAgV3JpdGVyIG9iamVjdE91dHB1dFN0cmVhbSkgeworICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOworICAgIHRoaXMud3JpdGVyID0gb2JqZWN0T3V0cHV0U3RyZWFtOworICB9CisKKyAgcHVibGljIFJlYWRlciByZWFkZXIoKSB7CisgICAgcmV0dXJuIHJlYWRlcjsKKyAgfQorICAKKyAgcHVibGljIFdyaXRlciB3cml0ZXIoKSB7CisgICAgcmV0dXJuIHdyaXRlcjsKKyAgfQorICAKKyAgLyoqIFJlYWRzIG9iamVjdHMgZnJvbSB0aGUgc29ja2V0LiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlYWRlciBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RJbnB1dFN0cmVhbSBpbnB1dDsKKworICAgIFJlYWRlcihPYmplY3RJbnB1dFN0cmVhbSBpcykgeworICAgICAgdGhpcy5pbnB1dCA9IGlzOworICAgIH0KKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGUgbmV4dCBvYmplY3QsIG9yIHtAY29kZSBudWxsfSBpZiB3ZSBhcmUgYXQgRU9GLiAqLworICAgIHB1YmxpYyBTZXJpYWxpemFibGUgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gKFNlcmlhbGl6YWJsZSkgY2hlY2tOb3ROdWxsKGlucHV0LnJlYWRPYmplY3QoKSk7CisgICAgICB9IGNhdGNoIChFT0ZFeGNlcHRpb24gZW9mKSB7CisgICAgICAgIC8vIFRPRE8obHVrZXMpOiBUaGUgb25seSAnYmV0dGVyJyB3YXkgdG8gaGFuZGxlIHRoaXMgd291bGQgYmUgdG8gdXNlIGFuIGV4cGxpY2l0IHBvaXNvbiBwaWxsCisgICAgICAgIC8vIG1hcmtlciBpbiB0aGUgc3RyZWFtLiAgT3RoZXJ3aXNlIHdlIGp1c3QgaGF2ZSB0byBjYXRjaCBFT0ZFeGNlcHRpb24uCisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gIHsKKyAgICAgIGlucHV0LmNsb3NlKCk7CisgICAgfQorICB9CisKKyAgLyoqIFdyaXRlcyBvYmplY3RzIHRvIHRoZSBzb2NrZXQuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV3JpdGVyIGltcGxlbWVudHMgQ2xvc2VhYmxlLCBGbHVzaGFibGUgeworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0T3V0cHV0U3RyZWFtIG91dHB1dDsKKworICAgIFdyaXRlcihPYmplY3RPdXRwdXRTdHJlYW0gb3V0cHV0KSB7CisgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgbmV4dCBvYmplY3QsIG9yIHtAY29kZSBudWxsfSBpZiB3ZSBhcmUgYXQgRU9GLiAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFNlcmlhbGl6YWJsZSBzZXJpYWxpemFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBvdXRwdXQud3JpdGVPYmplY3Qoc2VyaWFsaXphYmxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIG91dHB1dC5jbG9zZSgpOworICAgIH0KKyAgfQorICAKKyAgLyoqCisgICAqIFJldHVybnMgYW4ge0BsaW5rIE91dHB1dFN0cmVhbX0gZm9yIHRoZSBzb2NrZXQsIGJ1dCB1bmxpa2Uge0BsaW5rIFNvY2tldCNnZXRPdXRwdXRTdHJlYW0oKX0KKyAgICogd2hlbiB5b3UgY2FsbCB7QGxpbmsgT3V0cHV0U3RyZWFtI2Nsb3NlKCkgY2xvc2V9IGl0IG9ubHkgY2xvc2VzIHRoZSBvdXRwdXQgZW5kIG9mIHRoZSBzb2NrZXQKKyAgICogaW5zdGVhZCBvZiB0aGUgZW50aXJlIHNvY2tldC4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oZmluYWwgU29ja2V0IHNvY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZGVsZWdhdGUgPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgcmV0dXJuIG5ldyBPdXRwdXRTdHJlYW0oKSB7CisKKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRlbGVnYXRlLmZsdXNoKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoc29ja2V0KSB7CisgICAgICAgICAgc29ja2V0LnNodXRkb3duT3V0cHV0KCk7CisgICAgICAgICAgaWYgKHNvY2tldC5pc0lucHV0U2h1dGRvd24oKSkgeworICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgCisgICAgICAvLyBCb3JpbmcgZGVsZWdhdGVzIGZyb20gaGVyZSBvbiBkb3duCisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRlbGVnYXRlLndyaXRlKGIpOworICAgICAgfQorICAgIAorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBkZWxlZ2F0ZS53cml0ZShiKTsKKyAgICAgIH0KKyAgICAKKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZGVsZWdhdGUud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgfQorICAgIAorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZGVsZWdhdGUuZmx1c2goKTsKKyAgICAgIH0KKyAgICB9OworICB9CisgIAorICAvKioKKyAgICogUmV0dXJucyBhbiB7QGxpbmsgSW5wdXRTdHJlYW19IGZvciB0aGUgc29ja2V0LCBidXQgdW5saWtlIHtAbGluayBTb2NrZXQjZ2V0SW5wdXRTdHJlYW0oKX0KKyAgICogd2hlbiB5b3UgY2FsbCB7QGxpbmsgSW5wdXRTdHJlYW0jY2xvc2UoKSBjbG9zZX0gaXQgb25seSBjbG9zZXMgdGhlIGlucHV0IGVuZCBvZiB0aGUgc29ja2V0CisgICAqIGluc3RlYWQgb2YgdGhlIGVudGlyZSBzb2NrZXQuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShmaW5hbCBTb2NrZXQgc29ja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIElucHV0U3RyZWFtIGRlbGVnYXRlID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgcmV0dXJuIG5ldyBJbnB1dFN0cmVhbSgpIHsKKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc29ja2V0KSB7CisgICAgICAgICAgc29ja2V0LnNodXRkb3duSW5wdXQoKTsKKyAgICAgICAgICBpZiAoc29ja2V0LmlzT3V0cHV0U2h1dGRvd24oKSkgeworICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIEJvcmluZyBkZWxlZ2F0ZXMgZnJvbSBoZXJlIG9uIGRvd24KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGVsZWdhdGUucmVhZCgpOworICAgICAgfQorICAgICAgCisgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGVsZWdhdGUucmVhZChiKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgfQorICAgICAgCisgICAgICBAT3ZlcnJpZGUgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5za2lwKG4pOworICAgICAgfQorICAgICAgCisgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXZhaWxhYmxlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKKyAgICAgICAgZGVsZWdhdGUubWFyayhyZWFkbGltaXQpOworICAgICAgfQorICAgICAgCisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBkZWxlZ2F0ZS5yZXNldCgpOworICAgICAgfQorICAgICAgCisgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1hcmtTdXBwb3J0ZWQoKTsKKyAgICAgIH0KKyAgICB9OworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL01lYXN1cmVtZW50VHlwZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvUmVuZGVyZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc0JQpjb3B5IGZyb20gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFR5cGUuamF2YQpjb3B5IHRvIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1JlbmRlcmVyLmphdmEKaW5kZXggMzBkZTY5Zi4uZjJjOTAzNyAxMDA2NDQKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFR5cGUuamF2YQorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9SZW5kZXJlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMSArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7CitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2U7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlOwotCi1AR3d0Q29tcGF0aWJsZQotcHVibGljIGVudW0gTWVhc3VyZW1lbnRUeXBlIHsKLSAgVElNRSwgSU5TVEFOQ0UsIE1FTU9SWSwgREVCVUcKK3B1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXI8VD4geworICBTdHJpbmcgcmVuZGVyKFQgb2JqZWN0KTsKIH0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1Nob3VsZENvbnRpbnVlTWVzc2FnZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvU2hvdWxkQ29udGludWVNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0ZjVmNgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1Nob3VsZENvbnRpbnVlTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIEEgbWVzc2FnZSBzZW50IGZyb20gdGhlIHJ1bm5lciB0byB0aGUgd29ya2VyIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IG1lYXN1cmluZyBzaG91bGQgCisgKiBjb250aW51ZS4KKyAqLworcHVibGljIGNsYXNzIFNob3VsZENvbnRpbnVlTWVzc2FnZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzaG91bGRDb250aW51ZTsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHdhcm11cENvbXBsZXRlOworCisgIHB1YmxpYyBTaG91bGRDb250aW51ZU1lc3NhZ2UoYm9vbGVhbiBzaG91bGRDb250aW51ZSwgYm9vbGVhbiB3YXJtdXBDb21wbGV0ZSkgeworICAgIHRoaXMuc2hvdWxkQ29udGludWUgPSBzaG91bGRDb250aW51ZTsKKyAgICB0aGlzLndhcm11cENvbXBsZXRlID0gd2FybXVwQ29tcGxldGU7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIHNob3VsZENvbnRpbnVlKCkgeworICAgIHJldHVybiBzaG91bGRDb250aW51ZTsKKyAgfQorICAKKyAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzaG91bGRDb250aW51ZSkuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBTaG91bGRDb250aW51ZU1lc3NhZ2UgCisgICAgICAgICYmIHNob3VsZENvbnRpbnVlID09ICgoU2hvdWxkQ29udGludWVNZXNzYWdlKSBvYmopLnNob3VsZENvbnRpbnVlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNXYXJtdXBDb21wbGV0ZSgpIHsKKyAgICByZXR1cm4gd2FybXVwQ29tcGxldGU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1N0YXJ0TWVhc3VyZW1lbnRMb2dNZXNzYWdlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9TdGFydE1lYXN1cmVtZW50TG9nTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNGRjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9TdGFydE1lYXN1cmVtZW50TG9nTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIEEgbWVzc2FnZSBzaWduYWxpbmcgdGhhdCB0aGUgdGltaW5nIGludGVydmFsIGhhcyBzdGFydGVkIGluIHRoZSB3b3JrZXIuCisgKi8KKy8vIFRPRE8oZ2FrKTogcmVuYW1lIGluIHRlcm1zIG9mIG1lYXN1cmVtZW50CitwdWJsaWMgY2xhc3MgU3RhcnRNZWFzdXJlbWVudExvZ01lc3NhZ2UgZXh0ZW5kcyBMb2dNZXNzYWdlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGFjY2VwdChMb2dNZXNzYWdlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdCh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBTdGFydE1lYXN1cmVtZW50TG9nTWVzc2FnZS5jbGFzcy5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFN0YXJ0TWVhc3VyZW1lbnRMb2dNZXNzYWdlOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9TdGFydHVwQW5ub3VuY2VNZXNzYWdlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9TdGFydHVwQW5ub3VuY2VNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmZDliMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1N0YXJ0dXBBbm5vdW5jZU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCisvKioKKyAqIEEgbWVzc2FnZSBzZW50IGZyb20gdGhlIHdvcmtlciB0byB0aGUgcnVubmVyIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0dXAgdG8gaWRlbnRpZnkgdGhlIHRyaWFsCisgKiB0aGF0IGl0IGlzIHBlcmZvcm1pbmcuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdGFydHVwQW5ub3VuY2VNZXNzYWdlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHJpdmF0ZSBmaW5hbCBVVUlEIHRyaWFsSWQ7CisKKyAgcHVibGljIFN0YXJ0dXBBbm5vdW5jZU1lc3NhZ2UoVVVJRCB0cmlhbElkKSB7CisgICAgdGhpcy50cmlhbElkID0gY2hlY2tOb3ROdWxsKHRyaWFsSWQpOworICB9CisKKyAgcHVibGljIFVVSUQgdHJpYWxJZCgpIHsKKyAgICByZXR1cm4gdHJpYWxJZDsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiB0cmlhbElkLmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgU3RhcnR1cEFubm91bmNlTWVzc2FnZQorICAgICAgICAmJiB0cmlhbElkLmVxdWFscygoKFN0YXJ0dXBBbm5vdW5jZU1lc3NhZ2UpIG9iaikudHJpYWxJZCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1N0b3BNZWFzdXJlbWVudExvZ01lc3NhZ2UuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1N0b3BNZWFzdXJlbWVudExvZ01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTNlZTUwCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvU3RvcE1lYXN1cmVtZW50TG9nTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBtZXNzYWdlIHNpZ25hbGluZyB0aGF0IHRoZSB0aW1pbmcgaW50ZXJ2YWwgaGFzIGVuZGVkIGluIHRoZSB3b3JrZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlIGV4dGVuZHMgTG9nTWVzc2FnZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlTGlzdDxNZWFzdXJlbWVudD4gbWVhc3VyZW1lbnRzOworCisgIHB1YmxpYyBTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlKEl0ZXJhYmxlPE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHMpIHsKKyAgICB0aGlzLm1lYXN1cmVtZW50cyA9IEltbXV0YWJsZUxpc3QuY29weU9mKG1lYXN1cmVtZW50cyk7CisgIH0KKworICBwdWJsaWMgSW1tdXRhYmxlTGlzdDxNZWFzdXJlbWVudD4gbWVhc3VyZW1lbnRzKCkgeworICAgIHJldHVybiBtZWFzdXJlbWVudHM7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgYWNjZXB0KExvZ01lc3NhZ2VWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICB2aXNpdG9yLnZpc2l0KHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobWVhc3VyZW1lbnRzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlKSB7CisgICAgICBTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlIHRoYXQgPSAoU3RvcE1lYXN1cmVtZW50TG9nTWVzc2FnZSkgb2JqOworICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRzLmVxdWFscyh0aGF0Lm1lYXN1cmVtZW50cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1ZtT3B0aW9uTG9nTWVzc2FnZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvVm1PcHRpb25Mb2dNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4ZDVjZAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL1ZtT3B0aW9uTG9nTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisKKy8qKgorICogQSBtZXNzYWdlIHJlcHJlc2VudGluZyBvdXRwdXQgcHJvZHVjZWQgYnkgdGhlIEpWTSB3aGVuIHtAY29kZSAtWFg6K1ByaW50RmxhZ3NGaW5hbH0gaXMgZW5hYmxlZC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZtT3B0aW9uTG9nTWVzc2FnZSBleHRlbmRzIExvZ01lc3NhZ2UgeworICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICBWbU9wdGlvbkxvZ01lc3NhZ2UoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgIHRoaXMubmFtZSA9IGNoZWNrTm90TnVsbChuYW1lKTsKKyAgICB0aGlzLnZhbHVlID0gY2hlY2tOb3ROdWxsKHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdmFsdWUoKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFjY2VwdChMb2dNZXNzYWdlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgdmlzaXRvci52aXNpdCh0aGlzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvVm1Qcm9wZXJ0aWVzTG9nTWVzc2FnZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvVm1Qcm9wZXJ0aWVzTG9nTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjM4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9WbVByb3BlcnRpZXNMb2dNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBtZXNzYWdlIGNvbnRhaW5pbmcgYSBzZWxlY3Rpb24gb2Yge0BsaW5rIFN5c3RlbSNnZXRQcm9wZXJ0aWVzKCkgc3lzdGVtIHByb3BlcnRpZXN9IGZyb20gdGhlCisgKiB3b3JrZXIgSlZNLgorICovCitwdWJsaWMgY2xhc3MgVm1Qcm9wZXJ0aWVzTG9nTWVzc2FnZSBleHRlbmRzIExvZ01lc3NhZ2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllczsKKworICBwdWJsaWMgVm1Qcm9wZXJ0aWVzTG9nTWVzc2FnZSgpIHsKKyAgICB0aGlzKEltbXV0YWJsZU1hcC5jb3B5T2YoTWFwcy5mcm9tUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKSkpOworICB9CisKKyAgcHVibGljIFZtUHJvcGVydGllc0xvZ01lc3NhZ2UoSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzKSB7CisgICAgdGhpcy5wcm9wZXJ0aWVzID0gY2hlY2tOb3ROdWxsKHByb3BlcnRpZXMpOworICB9CisKKyAgcHVibGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcygpIHsKKyAgICByZXR1cm4gcHJvcGVydGllczsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBhY2NlcHQoTG9nTWVzc2FnZVZpc2l0b3IgdmlzaXRvcikgeworICAgIHZpc2l0b3IudmlzaXQodGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShwcm9wZXJ0aWVzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBWbVByb3BlcnRpZXNMb2dNZXNzYWdlKSB7CisgICAgICBWbVByb3BlcnRpZXNMb2dNZXNzYWdlIHRoYXQgPSAoVm1Qcm9wZXJ0aWVzTG9nTWVzc2FnZSkgb2JqOworICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5lcXVhbHModGhhdC5wcm9wZXJ0aWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvV29ya2VyU3BlYy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvV29ya2VyU3BlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmIxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9Xb3JrZXJTcGVjLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkJlbmNobWFya1NwZWM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKKy8qKgorICogVGhpcyBvYmplY3QgaXMgc2VudCBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyB0byB0aGUgY2hpbGQgdG8gdGVsbCBpdCB3aGF0IHRvIGRvLiBJZiB0aGUgY2hpbGQKKyAqIGRvZXMgbm90IGRvIGl0LCBpdCB3aWxsIG5vdCBnZXQgaXRzIGFsbG93YW5jZSB0aGlzIHdlZWsuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXb3JrZXJTcGVjIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIGZpbmFsIFVVSUQgdHJpYWxJZDsKKyAgLy8gU2hvdWxkIGJlID8gZXh0ZW5kcyBXb3JrZXIgYnV0IGNpcmN1bGFyIGJ1aWxkIGRlcHMgcHJldmVudCB0aGF0LgorICBwdWJsaWMgZmluYWwgQ2xhc3M8Pz4gd29ya2VyQ2xhc3M7CisgIHB1YmxpYyBmaW5hbCBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IHdvcmtlck9wdGlvbnM7CisgIHB1YmxpYyBmaW5hbCBCZW5jaG1hcmtTcGVjIGJlbmNobWFya1NwZWM7CisKKyAgLyoqCisgICAqIFRoZSBuYW1lcyBvZiB0aGUgYmVuY2htYXJrIG1ldGhvZCBwYXJhbWV0ZXJzIHNvIHRoYXQgdGhlIG1ldGhvZCBjYW4gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KKyAgICovCisgIHB1YmxpYyBmaW5hbCBJbW11dGFibGVMaXN0PENsYXNzPD8+PiBtZXRob2RQYXJhbWV0ZXJDbGFzc2VzOworICBwdWJsaWMgZmluYWwgaW50IHBvcnQ7CisKKyAgcHVibGljIFdvcmtlclNwZWMoCisgICAgICBVVUlEIHRyaWFsSWQsCisgICAgICBDbGFzczw/PiB3b3JrZXJDbGFzcywKKyAgICAgIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gd29ya2VyT3B0aW9ucywKKyAgICAgIEJlbmNobWFya1NwZWMgYmVuY2htYXJrU3BlYywKKyAgICAgIEltbXV0YWJsZUxpc3Q8Q2xhc3M8Pz4+IG1ldGhvZFBhcmFtZXRlckNsYXNzZXMsCisgICAgICBpbnQgcG9ydCkgeworICAgIHRoaXMudHJpYWxJZCA9IHRyaWFsSWQ7CisgICAgdGhpcy53b3JrZXJDbGFzcyA9IHdvcmtlckNsYXNzOworICAgIHRoaXMud29ya2VyT3B0aW9ucyA9IHdvcmtlck9wdGlvbnM7CisgICAgdGhpcy5iZW5jaG1hcmtTcGVjID0gYmVuY2htYXJrU3BlYzsKKyAgICB0aGlzLm1ldGhvZFBhcmFtZXRlckNsYXNzZXMgPSBtZXRob2RQYXJhbWV0ZXJDbGFzc2VzOworICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRUeXBlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9wYWNrYWdlLWluZm8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDczJQpjb3B5IGZyb20gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFR5cGUuamF2YQpjb3B5IHRvIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL3BhY2thZ2UtaW5mby5qYXZhCmluZGV4IDMwZGU2OWYuLjJkNDc0ZWUgMTAwNjQ0Ci0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRUeXBlLmphdmEKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvcGFja2FnZS1pbmZvLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDExICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLkd3dENvbXBhdGlibGU7Ci0KLUBHd3RDb21wYXRpYmxlCi1wdWJsaWMgZW51bSBNZWFzdXJlbWVudFR5cGUgewotICBUSU1FLCBJTlNUQU5DRSwgTUVNT1JZLCBERUJVRwotfQorLyoqCisgKiBCcmlkZ2VzIGJldHdlZW4gdGhlIHJ1bm5lciBhbmQgdGhlIHdvcmtlci4KKyAqLworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0NhbGlwZXJDb25maWcuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0NhbGlwZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmUwYWRlCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvQ2FsaXBlckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5jb25maWc7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuVXRpbC5zdWJncm91cE1hcDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5SZXN1bHRQcm9jZXNzb3I7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLlBsYXRmb3JtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5WaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQmlNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5IYXNoQmlNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVCaU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGNhbGlwZXIgY29uZmlndXJhdGlvbi4gIEJ5IGRlZmF1bHQsIHtAY29kZSB+Ly5jYWxpcGVyL2NvbmZpZy5wcm9wZXJ0aWVzfSBhbmQKKyAqIHtAY29kZSBnbG9iYWwtY29uZmlnLnByb3BlcnRpZXN9LgorICoKKyAqIEBhdXRob3IgZ2FrQGdvb2dsZS5jb20gKEdyZWdvcnkgS2ljaykKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENhbGlwZXJDb25maWcgeworICBAVmlzaWJsZUZvclRlc3RpbmcgZmluYWwgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzOworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU1hcDxDbGFzczw/IGV4dGVuZHMgUmVzdWx0UHJvY2Vzc29yPiwgUmVzdWx0UHJvY2Vzc29yQ29uZmlnPgorICAgICAgcmVzdWx0UHJvY2Vzc29yQ29uZmlnczsKKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgcHVibGljIENhbGlwZXJDb25maWcoSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzKQorICAgICAgdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBjaGVja05vdE51bGwocHJvcGVydGllcyk7CisgICAgdGhpcy5yZXN1bHRQcm9jZXNzb3JDb25maWdzID0gZmluZFJlc3VsdFByb2Nlc3NvckNvbmZpZ3Moc3ViZ3JvdXBNYXAocHJvcGVydGllcywgInJlc3VsdHMiKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIENMQVNTX1BST1BFUlRZX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIihcXHcrKVxcLmNsYXNzIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgPFQ+IEltbXV0YWJsZUJpTWFwPFN0cmluZywgQ2xhc3M8PyBleHRlbmRzIFQ+PiBtYXBHcm91cE5hbWVzVG9DbGFzc2VzKAorICAgICAgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBncm91cFByb3BlcnRpZXMsIENsYXNzPFQ+IHR5cGUpCisgICAgICAgICAgdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICBCaU1hcDxTdHJpbmcsIENsYXNzPD8gZXh0ZW5kcyBUPj4gbmFtZXNUb0NsYXNzZXMgPSBIYXNoQmlNYXAuY3JlYXRlKCk7CisgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBncm91cFByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworICAgICAgTWF0Y2hlciBtYXRjaGVyID0gQ0xBU1NfUFJPUEVSVFlfUEFUVEVSTi5tYXRjaGVyKGVudHJ5LmdldEtleSgpKTsKKyAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSAmJiAhZW50cnkuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBDbGFzczw/PiBzb21lQ2xhc3MgPSBVdGlsLmxvYWRDbGFzcyhlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICBjaGVja1N0YXRlKHR5cGUuaXNBc3NpZ25hYmxlRnJvbShzb21lQ2xhc3MpKTsKKyAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgVD4gdmVyaWZpZWRDbGFzcyA9IChDbGFzczw/IGV4dGVuZHMgVD4pIHNvbWVDbGFzczsKKyAgICAgICAgICBuYW1lc1RvQ2xhc3Nlcy5wdXQobWF0Y2hlci5ncm91cCgxKSwgdmVyaWZpZWRDbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcmVzdWx0IHByb2Nlc3NvciBjbGFzczogIgorICAgICAgICAgICAgICArIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBJbW11dGFibGVCaU1hcC5jb3B5T2YobmFtZXNUb0NsYXNzZXMpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSW1tdXRhYmxlTWFwPENsYXNzPD8gZXh0ZW5kcyBSZXN1bHRQcm9jZXNzb3I+LCBSZXN1bHRQcm9jZXNzb3JDb25maWc+CisgICAgICBmaW5kUmVzdWx0UHJvY2Vzc29yQ29uZmlncyhJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdHNQcm9wZXJ0aWVzKQorICAgICAgICAgIHRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgSW1tdXRhYmxlQmlNYXA8U3RyaW5nLCBDbGFzczw/IGV4dGVuZHMgUmVzdWx0UHJvY2Vzc29yPj4gcHJvY2Vzc29yVG9DbGFzcyA9CisgICAgICAgIG1hcEdyb3VwTmFtZXNUb0NsYXNzZXMocmVzdWx0c1Byb3BlcnRpZXMsIFJlc3VsdFByb2Nlc3Nvci5jbGFzcyk7CisgICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8Q2xhc3M8PyBleHRlbmRzIFJlc3VsdFByb2Nlc3Nvcj4sIFJlc3VsdFByb2Nlc3NvckNvbmZpZz4gYnVpbGRlciA9CisgICAgICAgIEltbXV0YWJsZU1hcC5idWlsZGVyKCk7CisgICAgZm9yIChFbnRyeTxTdHJpbmcsIENsYXNzPD8gZXh0ZW5kcyBSZXN1bHRQcm9jZXNzb3I+PiBlbnRyeSA6IHByb2Nlc3NvclRvQ2xhc3MuZW50cnlTZXQoKSkgeworICAgICAgYnVpbGRlci5wdXQoZW50cnkuZ2V0VmFsdWUoKSwgZ2V0UmVzdWx0UHJvY2Vzc29yQ29uZmlnKHJlc3VsdHNQcm9wZXJ0aWVzLCBlbnRyeS5nZXRLZXkoKSkpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHVibGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcygpIHsKKyAgICByZXR1cm4gcHJvcGVydGllczsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGhvc3QgVk0gKGluY2x1ZGluZyB0aGUgZmxhZ3MgdXNlZCB0byBjcmVhdGUgaXQpLiBBbnkKKyAgICogYXJncyBzcGVjaWZpZWQgdXNpbmcge0Bjb2RlIHZtLmFyZ3N9IHdpbGwgYWxzbyBiZSBhcHBsaWVkCisgICAqLworICBwdWJsaWMgVm1Db25maWcgZ2V0RGVmYXVsdFZtQ29uZmlnKFBsYXRmb3JtIHBsYXRmb3JtKSB7CisgICAgcmV0dXJuIG5ldyBWbUNvbmZpZy5CdWlsZGVyKHBsYXRmb3JtLCBwbGF0Zm9ybS5kZWZhdWx0Vm1Ib21lRGlyKCkpCisgICAgICAgIC5hZGRBbGxPcHRpb25zKHBsYXRmb3JtLmlucHV0QXJndW1lbnRzKCkpCisgICAgICAgIC8vIHN0aWxsIGluY29ycG9yYXRlIHZtLmFyZ3MKKyAgICAgICAgLmFkZEFsbE9wdGlvbnMoZ2V0QXJncyhzdWJncm91cE1hcChwcm9wZXJ0aWVzLCAidm0iKSkpCisgICAgICAgIC5idWlsZCgpOworICB9CisKKyAgcHVibGljIFZtQ29uZmlnIGdldFZtQ29uZmlnKFBsYXRmb3JtIHBsYXRmb3JtLCBTdHJpbmcgbmFtZSkKKyAgICAgIHRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgY2hlY2tOb3ROdWxsKG5hbWUpOworICAgIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gdm1Hcm91cE1hcCA9IHN1Ymdyb3VwTWFwKHByb3BlcnRpZXMsICJ2bSIpOworICAgIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gdm1NYXAgPSBzdWJncm91cE1hcCh2bUdyb3VwTWFwLCBuYW1lKTsKKyAgICBGaWxlIGhvbWVEaXI7CisgICAgdHJ5IHsKKyAgICAgIGhvbWVEaXIgPSBwbGF0Zm9ybS5jdXN0b21WbUhvbWVEaXIodm1Hcm91cE1hcCwgbmFtZSk7CisgICAgfSBjYXRjaCAoVmlydHVhbE1hY2hpbmVFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFZtQ29uZmlnLkJ1aWxkZXIocGxhdGZvcm0sIGhvbWVEaXIpCisgICAgICAgIC5hZGRBbGxPcHRpb25zKGdldEFyZ3Modm1Hcm91cE1hcCkpCisgICAgICAgIC5hZGRBbGxPcHRpb25zKGdldEFyZ3Modm1NYXApKQorICAgICAgICAuYnVpbGQoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSU5TVFJVTUVOVF9DTEFTU19QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCIoW15cXC5dKylcXC5jbGFzcyIpOworCisgIHB1YmxpYyBJbW11dGFibGVTZXQ8U3RyaW5nPiBnZXRDb25maWd1cmVkSW5zdHJ1bWVudHMoKSB7CisgICAgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8U3RyaW5nPiByZXN1bHRCdWlsZGVyID0gSW1tdXRhYmxlU2V0LmJ1aWxkZXIoKTsKKyAgICBmb3IgKFN0cmluZyBrZXkgOiBzdWJncm91cE1hcChwcm9wZXJ0aWVzLCAiaW5zdHJ1bWVudCIpLmtleVNldCgpKSB7CisgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBJTlNUUlVNRU5UX0NMQVNTX1BBVFRFUk4ubWF0Y2hlcihrZXkpOworICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7CisgICAgICAgIHJlc3VsdEJ1aWxkZXIuYWRkKG1hdGNoZXIuZ3JvdXAoMSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0QnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHVibGljIEluc3RydW1lbnRDb25maWcgZ2V0SW5zdHJ1bWVudENvbmZpZyhTdHJpbmcgbmFtZSkgeworICAgIGNoZWNrTm90TnVsbChuYW1lKTsKKyAgICBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IGluc3RydW1lbnRHcm91cE1hcCA9IHN1Ymdyb3VwTWFwKHByb3BlcnRpZXMsICJpbnN0cnVtZW50Iik7CisgICAgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBpbnNydW1lbnRNYXAgPSBzdWJncm91cE1hcChpbnN0cnVtZW50R3JvdXBNYXAsIG5hbWUpOworICAgIEBOdWxsYWJsZSBTdHJpbmcgY2xhc3NOYW1lID0gaW5zcnVtZW50TWFwLmdldCgiY2xhc3MiKTsKKyAgICBjaGVja0FyZ3VtZW50KGNsYXNzTmFtZSAhPSBudWxsLCAibm8gaW5zdHJ1bWVudCBjb25maWd1cmVkIG5hbWVkICVzIiwgbmFtZSk7CisgICAgcmV0dXJuIG5ldyBJbnN0cnVtZW50Q29uZmlnLkJ1aWxkZXIoKQorICAgICAgICAuY2xhc3NOYW1lKGNsYXNzTmFtZSkKKyAgICAgICAgLmFkZEFsbE9wdGlvbnMoc3ViZ3JvdXBNYXAoaW5zcnVtZW50TWFwLCAib3B0aW9ucyIpKQorICAgICAgICAuYnVpbGQoKTsKKyAgfQorCisgIHB1YmxpYyBJbW11dGFibGVTZXQ8Q2xhc3M8PyBleHRlbmRzIFJlc3VsdFByb2Nlc3Nvcj4+IGdldENvbmZpZ3VyZWRSZXN1bHRQcm9jZXNzb3JzKCkgeworICAgIHJldHVybiByZXN1bHRQcm9jZXNzb3JDb25maWdzLmtleVNldCgpOworICB9CisKKyAgcHVibGljIFJlc3VsdFByb2Nlc3NvckNvbmZpZyBnZXRSZXN1bHRQcm9jZXNzb3JDb25maWcoCisgICAgICBDbGFzczw/IGV4dGVuZHMgUmVzdWx0UHJvY2Vzc29yPiByZXN1bHRQcm9jZXNzb3JDbGFzcykgeworICAgIHJldHVybiByZXN1bHRQcm9jZXNzb3JDb25maWdzLmdldChyZXN1bHRQcm9jZXNzb3JDbGFzcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXN1bHRQcm9jZXNzb3JDb25maWcgZ2V0UmVzdWx0UHJvY2Vzc29yQ29uZmlnKAorICAgICAgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHRzUHJvcGVydGllcywgU3RyaW5nIG5hbWUpIHsKKyAgICBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdHNNYXAgPSBzdWJncm91cE1hcChyZXN1bHRzUHJvcGVydGllcywgbmFtZSk7CisgICAgcmV0dXJuIG5ldyBSZXN1bHRQcm9jZXNzb3JDb25maWcuQnVpbGRlcigpCisgICAgICAgIC5jbGFzc05hbWUocmVzdWx0c01hcC5nZXQoImNsYXNzIikpCisgICAgICAgIC5hZGRBbGxPcHRpb25zKHN1Ymdyb3VwTWFwKHJlc3VsdHNNYXAsICJvcHRpb25zIikpCisgICAgICAgIC5idWlsZCgpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoInByb3BlcnRpZXMiLCBwcm9wZXJ0aWVzKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBcmdzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcykgeworICAgIFN0cmluZyBhcmdzU3RyaW5nID0gU3RyaW5ncy5udWxsVG9FbXB0eShwcm9wZXJ0aWVzLmdldCgiYXJncyIpKTsKKyAgICBJbW11dGFibGVMaXN0LkJ1aWxkZXI8U3RyaW5nPiBhcmdzID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7CisgICAgU3RyaW5nQnVpbGRlciBhcmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc1N0cmluZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICBjaGFyIGMgPSBhcmdzU3RyaW5nLmNoYXJBdChpKTsKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgYXJnLmFwcGVuZChhcmdzU3RyaW5nLmNoYXJBdCgrK2kpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgaWYgKGFyZy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKGFyZy50b1N0cmluZygpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYXJnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBhcmcuYXBwZW5kKGMpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYXJnLmxlbmd0aCgpID4gMCkgeworICAgICAgYXJncy5hZGQoYXJnLnRvU3RyaW5nKCkpOworICAgIH0KKyAgICByZXR1cm4gYXJncy5idWlsZCgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0NhbGlwZXJDb25maWdMb2FkZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0NhbGlwZXJDb25maWdMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTAzY2YyCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvQ2FsaXBlckNvbmZpZ0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZzsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zLkNhbGlwZXJPcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5CeXRlU291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBMb2FkcyBjYWxpcGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kLCBpZiBuZWNlc3NhcnksIGNyZWF0ZXMgbmV3IHZlcnNpb25zIGZyb20gdGhlIGRlZmF1bHRzLgorICovCitAU2luZ2xldG9uCitwdWJsaWMgZmluYWwgY2xhc3MgQ2FsaXBlckNvbmZpZ0xvYWRlciB7CisgIHByaXZhdGUgZmluYWwgQ2FsaXBlck9wdGlvbnMgb3B0aW9uczsKKworICBASW5qZWN0IENhbGlwZXJDb25maWdMb2FkZXIoQ2FsaXBlck9wdGlvbnMgb3B0aW9ucykgeworICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgIH0KKworICBwdWJsaWMgQ2FsaXBlckNvbmZpZyBsb2FkT3JDcmVhdGUoKSB0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgIEZpbGUgY29uZmlnRmlsZSA9IG9wdGlvbnMuY2FsaXBlckNvbmZpZ0ZpbGUoKTsKKyAgICBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IGRlZmF1bHRzOworICAgIHRyeSB7CisgICAgICBkZWZhdWx0cyA9IFV0aWwubG9hZFByb3BlcnRpZXMoCisgICAgICAgICAgVXRpbC5yZXNvdXJjZVN1cHBsaWVyKENhbGlwZXJDb25maWcuY2xhc3MsICJnbG9iYWwtY29uZmlnLnByb3BlcnRpZXMiKSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW1wb3NzaWJsZSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGltcG9zc2libGUpOworICAgIH0KKworICAgIC8vIFRPRE8oa2V2aW5iKTogZGVhbCB3aXRoIG1pZ3JhdGlvbiBpc3N1ZSBmcm9tIG9sZC1zdHlsZSAuY2FsaXBlcnJjCisKKyAgICBpZiAoY29uZmlnRmlsZS5leGlzdHMoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiB1c2VyID0KKyAgICAgICAgICAgIFV0aWwubG9hZFByb3BlcnRpZXMoRmlsZXMuYXNCeXRlU291cmNlKGNvbmZpZ0ZpbGUpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDYWxpcGVyQ29uZmlnKG1lcmdlUHJvcGVydGllcyhvcHRpb25zLmNvbmZpZ1Byb3BlcnRpZXMoKSwgdXNlciwgZGVmYXVsdHMpKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGtlZXBHb2luZykgeworICAgICAgfQorICAgIH0KKworICAgIEJ5dGVTb3VyY2Ugc3VwcGxpZXIgPSBVdGlsLnJlc291cmNlU3VwcGxpZXIoQ2FsaXBlckNvbmZpZy5jbGFzcywgImRlZmF1bHQtY29uZmlnLnByb3BlcnRpZXMiKTsKKyAgICB0cnlDb3B5SWZOZWVkZWQoc3VwcGxpZXIsIGNvbmZpZ0ZpbGUpOworCisgICAgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiB1c2VyOworICAgIHRyeSB7CisgICAgICB1c2VyID0gVXRpbC5sb2FkUHJvcGVydGllcyhzdXBwbGllcik7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOyAvLyBjbGFzcyBwYXRoIG11c3QgYmUgbWVzc2VkIHVwCisgICAgfQorICAgIHJldHVybiBuZXcgQ2FsaXBlckNvbmZpZyhtZXJnZVByb3BlcnRpZXMob3B0aW9ucy5jb25maWdQcm9wZXJ0aWVzKCksIHVzZXIsIGRlZmF1bHRzKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IG1lcmdlUHJvcGVydGllcyhNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbW1hbmRMaW5lLAorICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB1c2VyLAorICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBkZWZhdWx0cykgeworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gTWFwcy5uZXdIYXNoTWFwKGRlZmF1bHRzKTsKKyAgICBtYXAucHV0QWxsKHVzZXIpOyAvLyBvdmVyd3JpdGUgYW5kIGF1Z21lbnQKKyAgICBtYXAucHV0QWxsKGNvbW1hbmRMaW5lKTsgLy8gb3ZlcndyaXRlIGFuZCBhdWdtZW50CisgICAgSXRlcmFibGVzLnJlbW92ZUlmKG1hcC52YWx1ZXMoKSwgUHJlZGljYXRlcy5lcXVhbFRvKCIiKSk7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5jb3B5T2YobWFwKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5Q29weUlmTmVlZGVkKEJ5dGVTb3VyY2Ugc3VwcGxpZXIsIEZpbGUgcmNGaWxlKSB7CisgICAgaWYgKCFyY0ZpbGUuZXhpc3RzKCkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHN1cHBsaWVyLmNvcHlUbyhGaWxlcy5hc0J5dGVTaW5rKHJjRmlsZSkpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICByY0ZpbGUuZGVsZXRlKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9Db25maWdNb2R1bGUuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0NvbmZpZ01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjY0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9Db25maWdNb2R1bGUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5jb25maWc7CisKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBCaW5kaW5ncyBmb3IgQ2FsaXBlciBjb25maWd1cmF0aW9uLgorICovCitATW9kdWxlCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlnTW9kdWxlIHsKKworICAvKioKKyAgICogVGhlIHtAY29kZSBkb05vdFJlbW92ZX0gcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbgorICAgKiBpcyBsb2FkZWQgYW5kIHVzZWQgdG8gdXBkYXRlIHRoZSBsb2dnZXIgc2V0dGluZ3MgYmVmb3JlIHRoZSBjb25maWd1cmF0aW9uIGlzIGxvYWRlZC4KKyAgICovCisgIEBQcm92aWRlcyBAU2luZ2xldG9uCisgIHN0YXRpYyBDYWxpcGVyQ29uZmlnIHByb3ZpZGVDYWxpcGVyQ29uZmlnKAorICAgICAgQ2FsaXBlckNvbmZpZ0xvYWRlciBjb25maWdMb2FkZXIsCisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTG9nZ2luZ0NvbmZpZ0xvYWRlciBkb05vdFJlbW92ZSkKKyAgICAgIHRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICByZXR1cm4gY29uZmlnTG9hZGVyLmxvYWRPckNyZWF0ZSgpOworICB9CisKKyAgQFByb3ZpZGVzIHN0YXRpYyBMb2dNYW5hZ2VyIHByb3ZpZGVMb2dNYW5hZ2VyKCkgeworICAgIHJldHVybiBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvSW5zdHJ1bWVudENvbmZpZy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvSW5zdHJ1bWVudENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTVhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9JbnN0cnVtZW50Q29uZmlnLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZzsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5JbnN0cnVtZW50U3BlYzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk1vcmVPYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuSW1tdXRhYmxlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIHRoZSBpbnN0cnVtZW50IGJ5IHRoZSB1c2VyLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUKKyAqIHtAbGluayBJbnN0cnVtZW50U3BlY30gaW4gdGhhdCBhbnkgbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb25zIGNhbiB5aWVsZCB0aGUgc2FtZSBzcGVjCisgKiAoZHVlIHRvIGRlZmF1bHQgb3B0aW9uIHZhbHVlcykuCisgKgorICogQGF1dGhvciBnYWtAZ29vZ2xlLmNvbSAoR3JlZ29yeSBLaWNrKQorICovCitASW1tdXRhYmxlCitwdWJsaWMgZmluYWwgY2xhc3MgSW5zdHJ1bWVudENvbmZpZyB7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnM7CisKKyAgcHJpdmF0ZSBJbnN0cnVtZW50Q29uZmlnKEJ1aWxkZXIgYnVpbGRlcikgeworICAgIHRoaXMuY2xhc3NOYW1lID0gYnVpbGRlci5jbGFzc05hbWU7CisgICAgdGhpcy5vcHRpb25zID0gYnVpbGRlci5vcHRpb25zQnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHVibGljIFN0cmluZyBjbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgfQorCisgIHB1YmxpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMoKSB7CisgICAgcmV0dXJuIG9wdGlvbnM7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqID09IHRoaXMpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW5zdHJ1bWVudENvbmZpZykgeworICAgICAgSW5zdHJ1bWVudENvbmZpZyB0aGF0ID0gKEluc3RydW1lbnRDb25maWcpIG9iajsKKyAgICAgIHJldHVybiB0aGlzLmNsYXNzTmFtZS5lcXVhbHModGhhdC5jbGFzc05hbWUpCisgICAgICAgICAgJiYgdGhpcy5vcHRpb25zLmVxdWFscyh0aGF0Lm9wdGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUoY2xhc3NOYW1lLCBvcHRpb25zKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQorICAgICAgICAuYWRkKCJjbGFzc05hbWUiLCBjbGFzc05hbWUpCisgICAgICAgIC5hZGQoIm9wdGlvbnMiLCBvcHRpb25zKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVNYXAuQnVpbGRlcjxTdHJpbmcsIFN0cmluZz4gb3B0aW9uc0J1aWxkZXIgPSBJbW11dGFibGVNYXAuYnVpbGRlcigpOworCisgICAgcHVibGljIEJ1aWxkZXIgY2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2hlY2tOb3ROdWxsKGNsYXNzTmFtZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBpbnN0cnVtZW50Q2xhc3MoQ2xhc3M8Pz4gaW5zdHVybWVudENsYXNzKSB7CisgICAgICByZXR1cm4gY2xhc3NOYW1lKGluc3R1cm1lbnRDbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGFkZE9wdGlvbihTdHJpbmcgb3B0aW9uLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgIG9wdGlvbnNCdWlsZGVyLnB1dChvcHRpb24sIHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGFkZEFsbE9wdGlvbnMoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKSB7CisgICAgICBvcHRpb25zQnVpbGRlci5wdXRBbGwob3B0aW9ucyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5zdHJ1bWVudENvbmZpZyBidWlsZCgpIHsKKyAgICAgIGNoZWNrU3RhdGUoY2xhc3NOYW1lICE9IG51bGwpOworICAgICAgcmV0dXJuIG5ldyBJbnN0cnVtZW50Q29uZmlnKHRoaXMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0ludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxZGY5NwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0ludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBUaHJvd24gd2hlbiBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIEBhdXRob3IgZ2FrQGdvb2dsZS5jb20gKEdyZWdvcnkgS2ljaykKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgIHB1YmxpYyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KKworICBwdWJsaWMgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihjYXVzZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkaXNwbGF5KFByaW50V3JpdGVyIHdyaXRlcikgeworICAgIHdyaXRlci5wcmludGxuKGdldE1lc3NhZ2UoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0xvZ2dpbmdDb25maWdMb2FkZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0xvZ2dpbmdDb25maWdMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWUyMTZjCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvTG9nZ2luZ0NvbmZpZ0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5jb25maWc7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuU0VWRVJFOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5XQVJOSU5HOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlJ1bjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9ucy5DYWxpcGVyRGlyZWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uQ2xvc2VyOworCitpbXBvcnQgb3JnLmpvZGEudGltZS5mb3JtYXQuSVNPRGF0ZVRpbWVGb3JtYXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogTG9hZGluZyB0aGUgbG9nZ2luZyBjb25maWd1cmF0aW9uIGF0IHtAY29kZSB+Ly5jYWxpcGVyL2xvZ2dpbmcucHJvcGVydGllc30gaWYgcHJlc2VudC4KKyAqLworQFNpbmdsZXRvbgorZmluYWwgY2xhc3MgTG9nZ2luZ0NvbmZpZ0xvYWRlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKExvZ2dpbmdDb25maWdMb2FkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIGZpbmFsIEZpbGUgY2FsaXBlckRpcmVjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBMb2dNYW5hZ2VyIGxvZ01hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgUnVuIHJ1bjsKKworICBASW5qZWN0IExvZ2dpbmdDb25maWdMb2FkZXIoQENhbGlwZXJEaXJlY3RvcnkgRmlsZSBjYWxpcGVyRGlyZWN0b3J5LCBMb2dNYW5hZ2VyIGxvZ01hbmFnZXIsCisgICAgICBSdW4gcnVuKSB7CisgICAgdGhpcy5jYWxpcGVyRGlyZWN0b3J5ID0gY2FsaXBlckRpcmVjdG9yeTsKKyAgICB0aGlzLmxvZ01hbmFnZXIgPSBsb2dNYW5hZ2VyOworICAgIHRoaXMucnVuID0gcnVuOworICB9CisKKyAgQEluamVjdCB2b2lkIGxvYWRMb2dnaW5nQ29uZmlnKCkgeworICAgIEZpbGUgbG9nZ2luZ1Byb3BlcnRpZXNGaWxlID0gbmV3IEZpbGUoY2FsaXBlckRpcmVjdG9yeSwgImxvZ2dpbmcucHJvcGVydGllcyIpOworICAgIGlmIChsb2dnaW5nUHJvcGVydGllc0ZpbGUuaXNGaWxlKCkpIHsKKyAgICAgIENsb3NlciBjbG9zZXIgPSBDbG9zZXIuY3JlYXRlKCk7CisgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpcyA9IGNsb3Nlci5yZWdpc3RlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ2dpbmdQcm9wZXJ0aWVzRmlsZSkpOworICAgICAgICBsb2dNYW5hZ2VyLnJlYWRDb25maWd1cmF0aW9uKGZpcyk7CisgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oZSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGNsb3Nlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nZ2VyLmxvZyhTRVZFUkUsICJjb3VsZCBub3QgY2xvc2UgIiArIGxvZ2dpbmdQcm9wZXJ0aWVzRmlsZSwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxvZ2dlci5pbmZvKFN0cmluZy5mb3JtYXQoIlVzaW5nIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBhdCAlcyIsIGxvZ2dpbmdQcm9wZXJ0aWVzRmlsZSkpOworICAgIH0gZWxzZSB7CisgICAgICB0cnkgeworICAgICAgICBtYXliZUxvYWREZWZhdWx0TG9nQ29uZmlndXJhdGlvbihMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKSk7CisgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oZSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nIHZvaWQgbWF5YmVMb2FkRGVmYXVsdExvZ0NvbmZpZ3VyYXRpb24oTG9nTWFuYWdlciBsb2dNYW5hZ2VyKQorICAgICAgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgbG9nTWFuYWdlci5yZXNldCgpOworICAgIEZpbGUgbG9nRGlyZWN0b3J5ID0gbmV3IEZpbGUoY2FsaXBlckRpcmVjdG9yeSwgImxvZyIpOworICAgIGxvZ0RpcmVjdG9yeS5ta2RpcnMoKTsKKyAgICBGaWxlSGFuZGxlciBmaWxlSGFuZGxlciA9IG5ldyBGaWxlSGFuZGxlcihTdHJpbmcuZm9ybWF0KCIlcyVjJXMuJXMubG9nIiwKKyAgICAgICAgbG9nRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpLCBGaWxlLnNlcGFyYXRvckNoYXIsCisgICAgICAgIElTT0RhdGVUaW1lRm9ybWF0LmJhc2ljRGF0ZVRpbWVOb01pbGxpcygpLnByaW50KHJ1bi5zdGFydFRpbWUoKSksIHJ1bi5pZCgpKSk7CisgICAgZmlsZUhhbmRsZXIuc2V0RW5jb2RpbmcoQ2hhcnNldHMuVVRGXzgubmFtZSgpKTsKKyAgICBmaWxlSGFuZGxlci5zZXRGb3JtYXR0ZXIobmV3IFNpbXBsZUZvcm1hdHRlcigpKTsKKyAgICBMb2dnZXIgZ2xvYmFsTG9nZ2VyID0gbG9nTWFuYWdlci5nZXRMb2dnZXIoIiIpOworICAgIGdsb2JhbExvZ2dlci5hZGRIYW5kbGVyKGZpbGVIYW5kbGVyKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihFeGNlcHRpb24gZSkgeworICAgIGxvZ2dlci5sb2coV0FSTklORywgIkNvdWxkIG5vdCBhcHBseSB0aGUgbG9nZ2luZyBjb25maWd1cmF0aW9uIiwgZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL1Jlc3VsdFByb2Nlc3NvckNvbmZpZy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvUmVzdWx0UHJvY2Vzc29yQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhYTBlYgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL1Jlc3VsdFByb2Nlc3NvckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZzsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIHRoZSB7QGxpbmsgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5SZXN1bHRQcm9jZXNzb3J9IGJ5IHRoZQorICogdXNlci4KKyAqCisgKiBAYXV0aG9yIGdha0Bnb29nbGUuY29tIChHcmVnb3J5IEtpY2spCisgKi8KK3B1YmxpYyBjbGFzcyBSZXN1bHRQcm9jZXNzb3JDb25maWcgeworICBwcml2YXRlIGZpbmFsIFN0cmluZyBjbGFzc05hbWU7CisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zOworCisgIHByaXZhdGUgUmVzdWx0UHJvY2Vzc29yQ29uZmlnKEJ1aWxkZXIgYnVpbGRlcikgeworICAgIHRoaXMuY2xhc3NOYW1lID0gYnVpbGRlci5jbGFzc05hbWU7CisgICAgdGhpcy5vcHRpb25zID0gYnVpbGRlci5vcHRpb25zQnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHVibGljIFN0cmluZyBjbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgfQorCisgIHB1YmxpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMoKSB7CisgICAgcmV0dXJuIG9wdGlvbnM7CisgIH0KKworCisgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSZXN1bHRQcm9jZXNzb3JDb25maWcpIHsKKyAgICAgIFJlc3VsdFByb2Nlc3NvckNvbmZpZyB0aGF0ID0gKFJlc3VsdFByb2Nlc3NvckNvbmZpZykgb2JqOworICAgICAgcmV0dXJuIHRoaXMuY2xhc3NOYW1lLmVxdWFscyh0aGF0LmNsYXNzTmFtZSkKKyAgICAgICAgICAmJiB0aGlzLm9wdGlvbnMuZXF1YWxzKHRoYXQub3B0aW9ucyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShjbGFzc05hbWUsIG9wdGlvbnMpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSkKKyAgICAgICAgLmFkZCgib3B0aW9ucyIsIG9wdGlvbnMpCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKKyAgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICBwcml2YXRlIEltbXV0YWJsZU1hcC5CdWlsZGVyPFN0cmluZywgU3RyaW5nPiBvcHRpb25zQnVpbGRlciA9IEltbXV0YWJsZU1hcC5idWlsZGVyKCk7CisKKyAgICBwdWJsaWMgQnVpbGRlciBjbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgdGhpcy5jbGFzc05hbWUgPSBjaGVja05vdE51bGwoY2xhc3NOYW1lKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGFkZE9wdGlvbihTdHJpbmcgb3B0aW9uLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgIHRoaXMub3B0aW9uc0J1aWxkZXIucHV0KG9wdGlvbiwgdmFsdWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgYWRkQWxsT3B0aW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpIHsKKyAgICAgIHRoaXMub3B0aW9uc0J1aWxkZXIucHV0QWxsKG9wdGlvbnMpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFByb2Nlc3NvckNvbmZpZyBidWlsZCgpIHsKKyAgICAgIHJldHVybiBuZXcgUmVzdWx0UHJvY2Vzc29yQ29uZmlnKHRoaXMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvVm1Db25maWcuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL1ZtQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNjNjYQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL1ZtQ29uZmlnLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZzsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlZtU3BlYzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lkd1YXJkZWRCeTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCB0byB0aGUgVk0gYnkgdGhlIHVzZXIuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB7QGxpbmsgVm1TcGVjfQorICogaW4gdGhhdCBhbnkgbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb25zIGNhbiB5aWVsZCB0aGUgc2FtZSBzcGVjIChkdWUgdG8gZGVmYXVsdCBmbGFnIHZhbHVlcykgYW5kIGFueQorICogbnVtYmVyIG9mIHNwZWNzIGNhbiBjb21lIGZyb20gYSBzaW5nbGUgY29uZmlndXJhdGlvbiAoZHVlIHRvCisgKiA8YSBocmVmPSJodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9lcmdvNS0xNDAyMjMuaHRtbCI+ZXJnb25vbWljczwvYT4pLgorICoKKyAqIEBhdXRob3IgZ2FrQGdvb2dsZS5jb20gKEdyZWdvcnkgS2ljaykKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZtQ29uZmlnIHsKKyAgcHJpdmF0ZSBmaW5hbCBQbGF0Zm9ybSBwbGF0Zm9ybTsKKyAgcHJpdmF0ZSBmaW5hbCBGaWxlIHZtSG9tZTsKKyAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVMaXN0PFN0cmluZz4gb3B0aW9uczsKKworICBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgcHJpdmF0ZSBGaWxlIHZtRXhlY3V0YWJsZTsKKworICBwcml2YXRlIFZtQ29uZmlnKEJ1aWxkZXIgYnVpbGRlcikgeworICAgIHRoaXMucGxhdGZvcm0gPSBidWlsZGVyLnBsYXRmb3JtOworICAgIHRoaXMudm1Ib21lID0gYnVpbGRlci52bUhvbWU7CisgICAgdGhpcy5vcHRpb25zID0gYnVpbGRlci5vcHRpb25zQnVpbGRlci5idWlsZCgpOworICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nCisgIHB1YmxpYyBWbUNvbmZpZyhGaWxlIHZtSG9tZSwgSXRlcmFibGU8U3RyaW5nPiBvcHRpb25zLCBGaWxlIHZtRXhlY3V0YWJsZSwgUGxhdGZvcm0gcGxhdGZvcm0pIHsKKyAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07CisgICAgdGhpcy52bUhvbWUgPSBjaGVja05vdE51bGwodm1Ib21lKTsKKyAgICB0aGlzLnZtRXhlY3V0YWJsZSA9IGNoZWNrTm90TnVsbCh2bUV4ZWN1dGFibGUpOworICAgIHRoaXMub3B0aW9ucyA9IEltbXV0YWJsZUxpc3QuY29weU9mKG9wdGlvbnMpOworICB9CisKKyAgcHVibGljIEZpbGUgdm1Ib21lKCkgeworICAgIHJldHVybiB2bUhvbWU7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIEZpbGUgdm1FeGVjdXRhYmxlKCkgeworICAgIGlmICh2bUV4ZWN1dGFibGUgPT0gbnVsbCkgeworICAgICAgdm1FeGVjdXRhYmxlID0gcGxhdGZvcm0udm1FeGVjdXRhYmxlKHZtSG9tZSk7CisgICAgfQorICAgIHJldHVybiB2bUV4ZWN1dGFibGU7CisgIH0KKworICBwdWJsaWMgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IG9wdGlvbnMoKSB7CisgICAgcmV0dXJuIG9wdGlvbnM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHBsYXRmb3JtTmFtZSgpIHsKKyAgICByZXR1cm4gcGxhdGZvcm0ubmFtZSgpOworICB9CisKKyAgcHVibGljIFN0cmluZyB3b3JrZXJDbGFzc1BhdGgoKSB7CisgICAgcmV0dXJuIHBsYXRmb3JtLndvcmtlckNsYXNzUGF0aCgpOworICB9CisKKyAgcHVibGljIEltbXV0YWJsZVNldDxTdHJpbmc+IHdvcmtlclByb2Nlc3NBcmdzKCkgeworICAgIHJldHVybiBwbGF0Zm9ybS53b3JrZXJQcm9jZXNzQXJncygpOworICB9CisKKyAgcHVibGljIEltbXV0YWJsZVNldDxTdHJpbmc+IGNvbW1vbkluc3RydW1lbnRWbUFyZ3MoKSB7CisgICAgcmV0dXJuIHBsYXRmb3JtLmNvbW1vbkluc3RydW1lbnRWbUFyZ3MoKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBWbUNvbmZpZykgeworICAgICAgVm1Db25maWcgdGhhdCA9IChWbUNvbmZpZykgb2JqOworICAgICAgcmV0dXJuIHRoaXMucGxhdGZvcm0uZXF1YWxzKHRoYXQucGxhdGZvcm0pCisgICAgICAgICAgJiYgdGhpcy52bUhvbWUuZXF1YWxzKHRoYXQudm1Ib21lKQorICAgICAgICAgICYmIHRoaXMub3B0aW9ucy5lcXVhbHModGhhdC5vcHRpb25zKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKHBsYXRmb3JtLCB2bUhvbWUsIG9wdGlvbnMpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoInBsYXRmb3JtIiwgcGxhdGZvcm0pCisgICAgICAgIC5hZGQoInZtSG9tZSIsIHZtSG9tZSkKKyAgICAgICAgLmFkZCgib3B0aW9ucyIsIG9wdGlvbnMpCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBQbGF0Zm9ybSBwbGF0Zm9ybTsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgdm1Ib21lOworICAgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPFN0cmluZz4gb3B0aW9uc0J1aWxkZXIgPSBJbW11dGFibGVMaXN0LmJ1aWxkZXIoKTsKKworCisgICAgcHVibGljIEJ1aWxkZXIoUGxhdGZvcm0gcGxhdGZvcm0sIEZpbGUgdm1Ib21lKSB7CisgICAgICB0aGlzLnBsYXRmb3JtID0gY2hlY2tOb3ROdWxsKHBsYXRmb3JtKTsKKyAgICAgIHRoaXMudm1Ib21lID0gY2hlY2tOb3ROdWxsKHZtSG9tZSk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgYWRkT3B0aW9uKFN0cmluZyBvcHRpb24pIHsKKyAgICAgIG9wdGlvbnNCdWlsZGVyLmFkZChvcHRpb24pOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgYWRkQWxsT3B0aW9ucyhJdGVyYWJsZTxTdHJpbmc+IG9wdGlvbnMpIHsKKyAgICAgIG9wdGlvbnNCdWlsZGVyLmFkZEFsbChvcHRpb25zKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBWbUNvbmZpZyBidWlsZCgpIHsKKyAgICAgIHJldHVybiBuZXcgVm1Db25maWcodGhpcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vQW5ub3RhdGlvbkV4Y2x1c2lvblN0cmF0ZWd5LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vQW5ub3RhdGlvbkV4Y2x1c2lvblN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5MzdiYQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvanNvbi9Bbm5vdGF0aW9uRXhjbHVzaW9uU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5qc29uOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkV4Y2x1ZGVGcm9tSnNvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uRXhjbHVzaW9uU3RyYXRlZ3k7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkZpZWxkQXR0cmlidXRlczsKKworLyoqCisgKiBBbiBleGNsdXNpb24gc3RyYXRlZ3kgdGhhdCBleGNsdWRlcyBlbGVtZW50cyBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgRXhjbHVkZUZyb21Kc29ufS4KKyAqLworZmluYWwgY2xhc3MgQW5ub3RhdGlvbkV4Y2x1c2lvblN0cmF0ZWd5IGltcGxlbWVudHMgRXhjbHVzaW9uU3RyYXRlZ3kgeworICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gc2hvdWxkU2tpcEZpZWxkKEZpZWxkQXR0cmlidXRlcyBmKSB7CisgICAgcmV0dXJuIGYuZ2V0QW5ub3RhdGlvbihFeGNsdWRlRnJvbUpzb24uY2xhc3MpICE9IG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gc2hvdWxkU2tpcENsYXNzKENsYXNzPD8+IGNsYXp6KSB7CisgICAgcmV0dXJuIGNsYXp6LmdldEFubm90YXRpb24oRXhjbHVkZUZyb21Kc29uLmNsYXNzKSAhPSBudWxsOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vR3Nvbk1vZHVsZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9qc29uL0dzb25Nb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTFkY2NhCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9qc29uL0dzb25Nb2R1bGUuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5qc29uOworCitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkV4Y2x1c2lvblN0cmF0ZWd5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uVHlwZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5pbnRlcm5hbC5iaW5kLlR5cGVBZGFwdGVyczsKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKK2ltcG9ydCBkYWdnZXIuUHJvdmlkZXMuVHlwZTsKK2ltcG9ydCBvcmcuam9kYS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBCaW5kcyBhIHtAbGluayBHc29ufSBpbnN0YW5jZSBzdWl0YWJsZSBmb3Igc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcgQ2FsaXBlcgorICoge0BsaW5rcGxhaW4gY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsIG1vZGVsfSBvYmplY3RzLgorICovCitATW9kdWxlCitwdWJsaWMgZmluYWwgY2xhc3MgR3Nvbk1vZHVsZSB7CisKKyAgQFByb3ZpZGVzKHR5cGUgPSBUeXBlLlNFVCkKKyAgc3RhdGljIFR5cGVBZGFwdGVyRmFjdG9yeSBwcm92aWRlSW1tdXRhYmxlTGlzdFR5cGVBZGFwdGVyRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbmV3IEltbXV0YWJsZUxpc3RUeXBlQWRhdHBlckZhY3RvcnkoKTsKKyAgfQorCisgIEBQcm92aWRlcyh0eXBlID0gVHlwZS5TRVQpCisgIHN0YXRpYyBUeXBlQWRhcHRlckZhY3RvcnkgcHJvdmlkZUltbXV0YWJsZU1hcFR5cGVBZGFwdGVyRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbmV3IEltbXV0YWJsZU1hcFR5cGVBZGFwdGVyRmFjdG9yeSgpOworICB9CisKKyAgQFByb3ZpZGVzKHR5cGUgPSBUeXBlLlNFVCkKKyAgc3RhdGljIFR5cGVBZGFwdGVyRmFjdG9yeSBwcm92aWRlTmF0dXJhbGx5U29ydGVkTWFwVHlwZUFkYXB0ZXJGYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgTmF0dXJhbGx5U29ydGVkTWFwVHlwZUFkYXB0ZXJGYWN0b3J5KCk7CisgIH0KKworICBAUHJvdmlkZXModHlwZSA9IFR5cGUuU0VUKQorICBzdGF0aWMgVHlwZUFkYXB0ZXJGYWN0b3J5IHByb3ZpZGVJbW11dGFibGVNdWx0aW1hcFR5cGVBZGFwdGVyRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbmV3IEltbXV0YWJsZU11bHRpbWFwVHlwZUFkYXB0ZXJGYWN0b3J5KCk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgc3RhdGljIEV4Y2x1c2lvblN0cmF0ZWd5IHByb3ZpZGVBbm5vdGF0aW9uRXhjbHVzaW9uU3RyYXRlZ3koKSB7CisgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uRXhjbHVzaW9uU3RyYXRlZ3koKTsKKyAgfQorCisgIEBQcm92aWRlcyh0eXBlID0gVHlwZS5TRVQpCisgIHN0YXRpYyBUeXBlQWRhcHRlckZhY3RvcnkgcHJvdmlkZVR5cGVBZGFwdGVyRmFjdG9yeUZvckluc3RhbnQoCisgICAgICBJbnN0YW50VHlwZUFkYXB0ZXIgdHlwZUFkYXB0ZXIpIHsKKyAgICByZXR1cm4gVHlwZUFkYXB0ZXJzLm5ld0ZhY3RvcnkoSW5zdGFudC5jbGFzcywgdHlwZUFkYXB0ZXIpOworICB9CisKKyAgQFByb3ZpZGVzIHN0YXRpYyBJbnN0YW50VHlwZUFkYXB0ZXIgcHJvdmlkZUluc3RhbnRUeXBlQWRhcHRlcigpIHsKKyAgICByZXR1cm4gbmV3IEluc3RhbnRUeXBlQWRhcHRlcigpOworICB9CisKKyAgQFByb3ZpZGVzIHN0YXRpYyBHc29uIHByb3ZpZGVHc29uKFNldDxUeXBlQWRhcHRlckZhY3Rvcnk+IHR5cGVBZGFwdGVyRmFjdG9yaWVzLAorICAgICAgRXhjbHVzaW9uU3RyYXRlZ3kgZXhjbHVzaW9uU3RyYXRlZ3kpIHsKKyAgICBHc29uQnVpbGRlciBnc29uQnVpbGRlciA9IG5ldyBHc29uQnVpbGRlcigpLnNldEV4Y2x1c2lvblN0cmF0ZWdpZXMoZXhjbHVzaW9uU3RyYXRlZ3kpOworICAgIGZvciAoVHlwZUFkYXB0ZXJGYWN0b3J5IHR5cGVBZGFwdGVyRmFjdG9yeSA6IHR5cGVBZGFwdGVyRmFjdG9yaWVzKSB7CisgICAgICBnc29uQnVpbGRlci5yZWdpc3RlclR5cGVBZGFwdGVyRmFjdG9yeSh0eXBlQWRhcHRlckZhY3RvcnkpOworICAgIH0KKyAgICByZXR1cm4gZ3NvbkJ1aWxkZXIuY3JlYXRlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvanNvbi9JbW11dGFibGVMaXN0VHlwZUFkYXRwZXJGYWN0b3J5LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vSW1tdXRhYmxlTGlzdFR5cGVBZGF0cGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2M5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vSW1tdXRhYmxlTGlzdFR5cGVBZGF0cGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmpzb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uVHlwZUFkYXB0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLlR5cGVBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uUmVhZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvbldyaXRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFNlcmlhbGl6ZXMgYW5kIGRlc2VyaWFsaXplcyB7QGxpbmsgSW1tdXRhYmxlTGlzdH0gaW5zdGFuY2VzIHVzaW5nIGFuIHtAbGluayBBcnJheUxpc3R9IGFzIGFuCisgKiBpbnRlcm1lZGlhcnkuCisgKi8KK2ZpbmFsIGNsYXNzIEltbXV0YWJsZUxpc3RUeXBlQWRhdHBlckZhY3RvcnkgaW1wbGVtZW50cyBUeXBlQWRhcHRlckZhY3RvcnkgeworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgQE92ZXJyaWRlIHB1YmxpYyA8VD4gVHlwZUFkYXB0ZXI8VD4gY3JlYXRlKEdzb24gZ3NvbiwgVHlwZVRva2VuPFQ+IHR5cGVUb2tlbikgeworICAgIFR5cGUgdHlwZSA9IHR5cGVUb2tlbi5nZXRUeXBlKCk7CisgICAgaWYgKHR5cGVUb2tlbi5nZXRSYXdUeXBlKCkgIT0gSW1tdXRhYmxlTGlzdC5jbGFzcworICAgICAgICB8fCAhKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbS5nb29nbGUuY29tbW9uLnJlZmxlY3QuVHlwZVRva2VuPEltbXV0YWJsZUxpc3Q8Pz4+IGJldHRlclRva2VuID0KKyAgICAgICAgKGNvbS5nb29nbGUuY29tbW9uLnJlZmxlY3QuVHlwZVRva2VuPEltbXV0YWJsZUxpc3Q8Pz4+KQorICAgICAgICAgICAgY29tLmdvb2dsZS5jb21tb24ucmVmbGVjdC5UeXBlVG9rZW4ub2YodHlwZVRva2VuLmdldFR5cGUoKSk7CisgICAgZmluYWwgVHlwZUFkYXB0ZXI8QXJyYXlMaXN0PD8+PiBhcnJheUxpc3RBZGFwdGVyID0KKyAgICAgICAgKFR5cGVBZGFwdGVyPEFycmF5TGlzdDw/Pj4pIGdzb24uZ2V0QWRhcHRlcigKKyAgICAgICAgICAgIFR5cGVUb2tlbi5nZXQoYmV0dGVyVG9rZW4uZ2V0U3VwZXJ0eXBlKExpc3QuY2xhc3MpLmdldFN1YnR5cGUoQXJyYXlMaXN0LmNsYXNzKQorICAgICAgICAgICAgICAgIC5nZXRUeXBlKCkpKTsKKyAgICByZXR1cm4gbmV3IFR5cGVBZGFwdGVyPFQ+KCkgeworICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHdyaXRlKEpzb25Xcml0ZXIgb3V0LCBUIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBcnJheUxpc3Q8Pz4gYXJyYXlMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KChMaXN0PD8+KSB2YWx1ZSk7CisgICAgICAgIGFycmF5TGlzdEFkYXB0ZXIud3JpdGUob3V0LCBhcnJheUxpc3QpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUgcHVibGljIFQgcmVhZChKc29uUmVhZGVyIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBcnJheUxpc3Q8Pz4gYXJyYXlMaXN0ID0gYXJyYXlMaXN0QWRhcHRlci5yZWFkKGluKTsKKyAgICAgICAgcmV0dXJuIChUKSBJbW11dGFibGVMaXN0LmNvcHlPZihhcnJheUxpc3QpOworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvanNvbi9JbW11dGFibGVNYXBUeXBlQWRhcHRlckZhY3RvcnkuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvanNvbi9JbW11dGFibGVNYXBUeXBlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWMxNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9qc29uL0ltbXV0YWJsZU1hcFR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmpzb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLlR5cGVBZGFwdGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5UeXBlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvblJlYWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25Xcml0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBTZXJpYWxpemVzIGFuZCBkZXNlcmlhbGl6ZXMge0BsaW5rIEltbXV0YWJsZU1hcH0gaW5zdGFuY2VzIHVzaW5nIGEge0BsaW5rIEhhc2hNYXB9IGFzIGFuCisgKiBpbnRlcm1lZGlhcnkuCisgKi8KK2ZpbmFsIGNsYXNzIEltbXV0YWJsZU1hcFR5cGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIFR5cGVBZGFwdGVyRmFjdG9yeSB7CisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBAT3ZlcnJpZGUgcHVibGljIDxUPiBUeXBlQWRhcHRlcjxUPiBjcmVhdGUoR3NvbiBnc29uLCBUeXBlVG9rZW48VD4gdHlwZVRva2VuKSB7CisgICAgVHlwZSB0eXBlID0gdHlwZVRva2VuLmdldFR5cGUoKTsKKyAgICBpZiAodHlwZVRva2VuLmdldFJhd1R5cGUoKSAhPSBJbW11dGFibGVNYXAuY2xhc3MKKyAgICAgICAgfHwgISh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBjb20uZ29vZ2xlLmNvbW1vbi5yZWZsZWN0LlR5cGVUb2tlbjxJbW11dGFibGVNYXA8PywgPz4+IGJldHRlclRva2VuID0KKyAgICAgICAgKGNvbS5nb29nbGUuY29tbW9uLnJlZmxlY3QuVHlwZVRva2VuPEltbXV0YWJsZU1hcDw/LCA/Pj4pCisgICAgICAgICAgICBjb20uZ29vZ2xlLmNvbW1vbi5yZWZsZWN0LlR5cGVUb2tlbi5vZih0eXBlVG9rZW4uZ2V0VHlwZSgpKTsKKyAgICBmaW5hbCBUeXBlQWRhcHRlcjxIYXNoTWFwPD8sID8+PiBoYXNoTWFwQWRhcHRlciA9CisgICAgICAgIChUeXBlQWRhcHRlcjxIYXNoTWFwPD8sID8+PikgZ3Nvbi5nZXRBZGFwdGVyKAorICAgICAgICAgICAgVHlwZVRva2VuLmdldChiZXR0ZXJUb2tlbi5nZXRTdXBlcnR5cGUoTWFwLmNsYXNzKS5nZXRTdWJ0eXBlKEhhc2hNYXAuY2xhc3MpCisgICAgICAgICAgICAgICAgLmdldFR5cGUoKSkpOworICAgIHJldHVybiBuZXcgVHlwZUFkYXB0ZXI8VD4oKSB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgd3JpdGUoSnNvbldyaXRlciBvdXQsIFQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEhhc2hNYXA8PywgPz4gaGFzaE1hcCA9IE1hcHMubmV3SGFzaE1hcCgoTWFwPD8sID8+KSB2YWx1ZSk7CisgICAgICAgIGhhc2hNYXBBZGFwdGVyLndyaXRlKG91dCwgaGFzaE1hcCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgVCByZWFkKEpzb25SZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEhhc2hNYXA8PywgPz4gaGFzaE1hcCA9IGhhc2hNYXBBZGFwdGVyLnJlYWQoaW4pOworICAgICAgICByZXR1cm4gKFQpIEltbXV0YWJsZU1hcC5jb3B5T2YoaGFzaE1hcCk7CisgICAgICB9CisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9qc29uL0ltbXV0YWJsZU11bHRpbWFwVHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vSW1tdXRhYmxlTXVsdGltYXBUeXBlQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzgxMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9qc29uL0ltbXV0YWJsZU11bHRpbWFwVHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmpzb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5yZWZsZWN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLlR5cGVBZGFwdGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5UeXBlQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uUmVhZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvbldyaXRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogU2VyaWFsaXplcyBhbmQgZGVzZXJpYWxpemVzIHtAbGluayBJbW11dGFibGVNdWx0aW1hcH0gaW5zdGFuY2VzIHVzaW5nIG1hcHMgb2YgY29sbGVjdGlvbnMgYXMKKyAqIGludGVybWVkaWFyaWVzLgorICovCitmaW5hbCBjbGFzcyBJbW11dGFibGVNdWx0aW1hcFR5cGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIFR5cGVBZGFwdGVyRmFjdG9yeSB7CisgIHByaXZhdGUgc3RhdGljIDxLLCBWPiBUeXBlVG9rZW48TWFwPEssIExpc3Q8Vj4+PiBnZXRNYXBPZkxpc3RzVG9rZW4oCisgICAgICBUeXBlVG9rZW48TGlzdE11bHRpbWFwPEssIFY+PiBmcm9tKSB7CisgICAgUGFyYW1ldGVyaXplZFR5cGUgcmF3VHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZSkgZnJvbS5nZXRTdXBlcnR5cGUoTGlzdE11bHRpbWFwLmNsYXNzKS5nZXRUeXBlKCk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIGtleSB0eXBlIGlzIEsKKyAgICBUeXBlVG9rZW48Sz4ga2V5VHlwZSA9IChUeXBlVG9rZW48Sz4pIFR5cGVUb2tlbi5vZihyYXdUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIHZhbHVlIHR5cGUgaXMgVgorICAgIFR5cGVUb2tlbjxWPiB2YWx1ZVR5cGUgPSAoVHlwZVRva2VuPFY+KSBUeXBlVG9rZW4ub2YocmF3VHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMV0pOworICAgIHJldHVybiBuZXcgVHlwZVRva2VuPE1hcDxLLCBMaXN0PFY+Pj4oKSB7fQorICAgICAgICAud2hlcmUobmV3IFR5cGVQYXJhbWV0ZXI8Sz4oKSB7fSwga2V5VHlwZSkKKyAgICAgICAgLndoZXJlKG5ldyBUeXBlUGFyYW1ldGVyPFY+KCkge30sIHZhbHVlVHlwZSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyA8SywgVj4gVHlwZVRva2VuPE1hcDxLLCBTZXQ8Vj4+PiBnZXRNYXBPZlNldHNUb2tlbigKKyAgICAgIFR5cGVUb2tlbjxTZXRNdWx0aW1hcDxLLCBWPj4gZnJvbSkgeworICAgIFBhcmFtZXRlcml6ZWRUeXBlIHJhd1R5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpIGZyb20uZ2V0U3VwZXJ0eXBlKFNldE11bHRpbWFwLmNsYXNzKS5nZXRUeXBlKCk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIGtleSB0eXBlIGlzIEsKKyAgICBUeXBlVG9rZW48Sz4ga2V5VHlwZSA9IChUeXBlVG9rZW48Sz4pIFR5cGVUb2tlbi5vZihyYXdUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIHZhbHVlIHR5cGUgaXMgVgorICAgIFR5cGVUb2tlbjxWPiB2YWx1ZVR5cGUgPSAoVHlwZVRva2VuPFY+KSBUeXBlVG9rZW4ub2YocmF3VHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMV0pOworICAgIHJldHVybiBuZXcgVHlwZVRva2VuPE1hcDxLLCBTZXQ8Vj4+PigpIHt9CisgICAgICAgIC53aGVyZShuZXcgVHlwZVBhcmFtZXRlcjxLPigpIHt9LCBrZXlUeXBlKQorICAgICAgICAud2hlcmUobmV3IFR5cGVQYXJhbWV0ZXI8Vj4oKSB7fSwgdmFsdWVUeXBlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCIsICJyYXd0eXBlcyJ9KQorICBwdWJsaWMgPFQ+IFR5cGVBZGFwdGVyPFQ+IGNyZWF0ZShHc29uIGdzb24sIGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjxUPiB0eXBlVG9rZW4pIHsKKyAgICBpZiAoSW1tdXRhYmxlTGlzdE11bHRpbWFwLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZVRva2VuLmdldFJhd1R5cGUoKSkpIHsKKyAgICAgIFR5cGVUb2tlbjxNYXA8PywgTGlzdDw/Pj4+IG1hcFRva2VuID0KKyAgICAgICAgICBnZXRNYXBPZkxpc3RzVG9rZW4oKFR5cGVUb2tlbikgVHlwZVRva2VuLm9mKHR5cGVUb2tlbi5nZXRUeXBlKCkpKTsKKyAgICAgIGZpbmFsIFR5cGVBZGFwdGVyPE1hcDw/LCBMaXN0PD8+Pj4gYWRhcHRlciA9CisgICAgICAgICAgKFR5cGVBZGFwdGVyPE1hcDw/LCBMaXN0PD8+Pj4pIGdzb24uZ2V0QWRhcHRlcigKKyAgICAgICAgICAgICAgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuLmdldChtYXBUb2tlbi5nZXRUeXBlKCkpKTsKKyAgICAgIHJldHVybiBuZXcgVHlwZUFkYXB0ZXI8VD4oKSB7CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB3cml0ZShKc29uV3JpdGVyIG91dCwgVCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICBJbW11dGFibGVMaXN0TXVsdGltYXA8PywgPz4gbXVsdGltYXAgPSAoSW1tdXRhYmxlTGlzdE11bHRpbWFwPD8sID8+KSB2YWx1ZTsKKyAgICAgICAgICBhZGFwdGVyLndyaXRlKG91dCwgKE1hcCkgbXVsdGltYXAuYXNNYXAoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFQgcmVhZChKc29uUmVhZGVyIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgIE1hcDw/LCBMaXN0PD8+PiB2YWx1ZSA9IGFkYXB0ZXIucmVhZChpbik7CisgICAgICAgICAgSW1tdXRhYmxlTGlzdE11bHRpbWFwLkJ1aWxkZXIgYnVpbGRlciA9IEltbXV0YWJsZUxpc3RNdWx0aW1hcC5idWlsZGVyKCk7CisgICAgICAgICAgZm9yIChFbnRyeTw/LCBMaXN0PD8+PiBlbnRyeSA6IHZhbHVlLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucHV0QWxsKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIChUKSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfSBlbHNlIGlmIChJbW11dGFibGVTZXRNdWx0aW1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGVUb2tlbi5nZXRSYXdUeXBlKCkpKSB7CisgICAgICBUeXBlVG9rZW48TWFwPD8sIFNldDw/Pj4+IG1hcFRva2VuID0KKyAgICAgICAgICBnZXRNYXBPZlNldHNUb2tlbigoVHlwZVRva2VuKSBUeXBlVG9rZW4ub2YodHlwZVRva2VuLmdldFR5cGUoKSkpOworICAgICAgZmluYWwgVHlwZUFkYXB0ZXI8TWFwPD8sIFNldDw/Pj4+IGFkYXB0ZXIgPQorICAgICAgICAgIChUeXBlQWRhcHRlcjxNYXA8PywgU2V0PD8+Pj4pIGdzb24uZ2V0QWRhcHRlcigKKyAgICAgICAgICAgICAgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuLmdldChtYXBUb2tlbi5nZXRUeXBlKCkpKTsKKyAgICAgIHJldHVybiBuZXcgVHlwZUFkYXB0ZXI8VD4oKSB7CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCB3cml0ZShKc29uV3JpdGVyIG91dCwgVCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICBJbW11dGFibGVTZXRNdWx0aW1hcDw/LCA/PiBtdWx0aW1hcCA9IChJbW11dGFibGVTZXRNdWx0aW1hcDw/LCA/PikgdmFsdWU7CisgICAgICAgICAgYWRhcHRlci53cml0ZShvdXQsIChNYXApIG11bHRpbWFwLmFzTWFwKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBUIHJlYWQoSnNvblJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICBNYXA8PywgU2V0PD8+PiB2YWx1ZSA9IGFkYXB0ZXIucmVhZChpbik7CisgICAgICAgICAgSW1tdXRhYmxlU2V0TXVsdGltYXAuQnVpbGRlciBidWlsZGVyID0gSW1tdXRhYmxlU2V0TXVsdGltYXAuYnVpbGRlcigpOworICAgICAgICAgIGZvciAoRW50cnk8PywgU2V0PD8+PiBlbnRyeSA6IHZhbHVlLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucHV0QWxsKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIChUKSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9qc29uL0luc3RhbnRUeXBlQWRhcHRlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9qc29uL0luc3RhbnRUeXBlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTAwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vSW5zdGFudFR5cGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuanNvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5UeXBlQWRhcHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25SZWFkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uV3JpdGVyOworCitpbXBvcnQgb3JnLmpvZGEudGltZS5JbnN0YW50OworaW1wb3J0IG9yZy5qb2RhLnRpbWUuZm9ybWF0LklTT0RhdGVUaW1lRm9ybWF0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTZXJpYWxpemVzIGFuZCBkZXNlcmlhbGl6ZXMge0BsaW5rIEluc3RhbnR9IGluc3RhbmNlcy4KKyAqLworZmluYWwgY2xhc3MgSW5zdGFudFR5cGVBZGFwdGVyIGV4dGVuZHMgVHlwZUFkYXB0ZXI8SW5zdGFudD4geworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgd3JpdGUoSnNvbldyaXRlciBvdXQsIEluc3RhbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgb3V0LnZhbHVlKElTT0RhdGVUaW1lRm9ybWF0LmRhdGVUaW1lKCkucHJpbnQodmFsdWUpKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgSW5zdGFudCByZWFkKEpzb25SZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIElTT0RhdGVUaW1lRm9ybWF0LmRhdGVUaW1lKCkucGFyc2VEYXRlVGltZShpbi5uZXh0U3RyaW5nKCkpLnRvSW5zdGFudCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vTmF0dXJhbGx5U29ydGVkTWFwVHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2pzb24vTmF0dXJhbGx5U29ydGVkTWFwVHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmZGIxOQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvanNvbi9OYXR1cmFsbHlTb3J0ZWRNYXBUeXBlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5qc29uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5UeXBlQWRhcHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uVHlwZUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25SZWFkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uV3JpdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworLyoqCisgKiBTZXJpYWxpemVzIGFuZCBkZXNlcmlhbGl6ZXMge0BsaW5rIFNvcnRlZE1hcH0gaW5zdGFuY2VzIHVzaW5nIGEge0BsaW5rIFRyZWVNYXB9IHdpdGggbmF0dXJhbAorICogb3JkZXJpbmcgYXMgYW4gaW50ZXJtZWRpYXJ5LgorICovCitmaW5hbCBjbGFzcyBOYXR1cmFsbHlTb3J0ZWRNYXBUeXBlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBUeXBlQWRhcHRlckZhY3RvcnkgeworICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVTZXQ8Q2xhc3M8PyBleHRlbmRzIFNvcnRlZE1hcD4+IENMQVNTRVMgPQorICAgICAgSW1tdXRhYmxlU2V0Lm9mKFNvcnRlZE1hcC5jbGFzcywgVHJlZU1hcC5jbGFzcyk7CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIEBPdmVycmlkZSBwdWJsaWMgPFQ+IFR5cGVBZGFwdGVyPFQ+IGNyZWF0ZShHc29uIGdzb24sIFR5cGVUb2tlbjxUPiB0eXBlVG9rZW4pIHsKKyAgICBUeXBlIHR5cGUgPSB0eXBlVG9rZW4uZ2V0VHlwZSgpOworICAgIGlmICghQ0xBU1NFUy5jb250YWlucyh0eXBlVG9rZW4uZ2V0UmF3VHlwZSgpKQorICAgICAgICB8fCAhKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGNvbS5nb29nbGUuY29tbW9uLnJlZmxlY3QuVHlwZVRva2VuPFNvcnRlZE1hcDw/LCA/Pj4gYmV0dGVyVG9rZW4gPQorICAgICAgICAoY29tLmdvb2dsZS5jb21tb24ucmVmbGVjdC5UeXBlVG9rZW48U29ydGVkTWFwPD8sID8+PikKKyAgICAgICAgICAgIGNvbS5nb29nbGUuY29tbW9uLnJlZmxlY3QuVHlwZVRva2VuLm9mKHR5cGVUb2tlbi5nZXRUeXBlKCkpOworICAgIGZpbmFsIFR5cGVBZGFwdGVyPE1hcDw/LCA/Pj4gbWFwQWRhcHRlciA9CisgICAgICAgIChUeXBlQWRhcHRlcjxNYXA8PywgPz4+KSBnc29uLmdldEFkYXB0ZXIoCisgICAgICAgICAgICBUeXBlVG9rZW4uZ2V0KGJldHRlclRva2VuLmdldFN1cGVydHlwZShNYXAuY2xhc3MpLmdldFR5cGUoKSkpOworICAgIHJldHVybiBuZXcgVHlwZUFkYXB0ZXI8VD4oKSB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgd3JpdGUoSnNvbldyaXRlciBvdXQsIFQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFRyZWVNYXA8PywgPz4gdHJlZU1hcCA9IE1hcHMubmV3VHJlZU1hcCgoU29ydGVkTWFwPD8sID8+KSB2YWx1ZSk7CisgICAgICAgIG1hcEFkYXB0ZXIud3JpdGUob3V0LCB0cmVlTWFwKTsKKyAgICAgIH0KKworICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgVCByZWFkKEpzb25SZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFRyZWVNYXAgdHJlZU1hcCA9IE1hcHMubmV3VHJlZU1hcCgpOworICAgICAgICB0cmVlTWFwLnB1dEFsbChtYXBBZGFwdGVyLnJlYWQoaW4pKTsKKyAgICAgICAgcmV0dXJuIChUKSB0cmVlTWFwOworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbWVtb3J5L0NoYWluLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21lbW9yeS9DaGFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTE0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21lbW9yeS9DaGFpbi5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5tZW1vcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8qKgorICogQSBjaGFpbiBvZiByZWZlcmVuY2VzLCB3aGljaCBzdGFydHMgYXQgYSByb290IG9iamVjdCBhbmQgbGVhZHMgdG8gYQorICogcGFydGljdWxhciB2YWx1ZSAoZWl0aGVyIGFuIG9iamVjdCBvciBhIHByaW1pdGl2ZSkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFpbiB7CisgIHByaXZhdGUgZmluYWwgT2JqZWN0IHZhbHVlOworICBwcml2YXRlIGZpbmFsIENoYWluIHBhcmVudDsKKworICBDaGFpbihDaGFpbiBwYXJlbnQsIE9iamVjdCB2YWx1ZSkgeworICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIHN0YXRpYyBDaGFpbiByb290KE9iamVjdCB2YWx1ZSkgeworICAgIHJldHVybiBuZXcgQ2hhaW4obnVsbCwgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwodmFsdWUpKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRWYWx1ZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZSgpLmdldENsYXNzKCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIEZpZWxkQ2hhaW4gYXBwZW5kRmllbGQoRmllbGQgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHJldHVybiBuZXcgRmllbGRDaGFpbih0aGlzLCBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChmaWVsZCksIHZhbHVlKTsKKyAgfQorCisgIEFycmF5SW5kZXhDaGFpbiBhcHBlbmRBcnJheUluZGV4KGludCBhcnJheUluZGV4LCBPYmplY3QgdmFsdWUpIHsKKyAgICByZXR1cm4gbmV3IEFycmF5SW5kZXhDaGFpbih0aGlzLCBhcnJheUluZGV4LCB2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY2hhaW4gaGFzIGEgcGFyZW50LiBUaGlzIHJldHVybnMgZmFsc2Ugb25seSB3aGVuCisgICAqIHRoaXMgY2hhaW4gcmVwcmVzZW50cyB0aGUgcm9vdCBvYmplY3QgaXRzZWxmLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzUGFyZW50KCkgeworICAgIHJldHVybiBwYXJlbnQgIT0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgY2hhaW4sIGZyb20gd2hpY2ggdGhpcyBjaGFpbiB3YXMgY3JlYXRlZC4KKyAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYge0Bjb2RlICFoYXNQYXJlbnQoKX0sIHRoZW4gYW4KKyAgICovCisgIHB1YmxpYyBATm9ubnVsbCBDaGFpbiBnZXRQYXJlbnQoKSB7CisgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKHBhcmVudCAhPSBudWxsLCAiVGhpcyBpcyB0aGUgcm9vdCB2YWx1ZSwgaXQgaGFzIG5vIHBhcmVudCIpOworICAgIHJldHVybiBwYXJlbnQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdmFsdWUgdGhhdCB0aGlzIGNoYWluIGxlYWRzIHRvLiBJZiB0aGUgdmFsdWUgaXMgYSBwcmltaXRpdmUsCisgICAqIGEgd3JhcHBlciBvYmplY3QgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICovCisgIHB1YmxpYyBATnVsbGFibGUgT2JqZWN0IGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCBATm9ubnVsbCBDbGFzczw/PiBnZXRWYWx1ZVR5cGUoKTsKKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIG9mIHRoZSBwYXJlbnQgY2hhaW4gYW5kIHRoaXMgY2hhaW4gaXMKKyAgICogdGhyb3VnaCBhIGZpZWxkIChvZiB0aGUgZ2V0UGFyZW50KCkuZ2V0VmFsdWUoKS5nZXRDbGFzcygpIGNsYXNzKS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzVGhyb3VnaEZpZWxkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIHBhcmVudCBjaGFpbiBhbmQgdGhpcyBjaGFpbiBpcworICAgKiB0aHJvdWdoIGFuIGFycmF5IGluZGV4LCBpLmUuIHRoZSBwYXJlbnQgbGVhZHMgdG8gYW4gYXJyYXksIGFuZCB0aGlzCisgICAqIGNoYWluIGxlYWRzIHRvIGFuIGVsZW1lbnQgb2YgdGhhdCBhcnJheS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzVGhyb3VnaEFycmF5SW5kZXgoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhpcyBjaGFpbiByZXByZXNlbnRzIGEgcHJpbWl0aXZlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7CisgICAgcmV0dXJuIGdldFZhbHVlVHlwZSgpLmlzUHJpbWl0aXZlKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcm9vdCBvYmplY3Qgb2YgdGhpcyBjaGFpbi4KKyAgICovCisgIHB1YmxpYyBATm9ubnVsbCBPYmplY3QgZ2V0Um9vdCgpIHsKKyAgICBDaGFpbiBjdXJyZW50ID0gdGhpczsKKyAgICB3aGlsZSAoY3VycmVudC5oYXNQYXJlbnQoKSkgeworICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCk7CisgICAgfQorICAgIHJldHVybiBjdXJyZW50LmdldFZhbHVlKCk7CisgIH0KKworICBEZXF1ZTxDaGFpbj4gcmV2ZXJzZSgpIHsKKyAgICBEZXF1ZTxDaGFpbj4gcmV2ZXJzZUNoYWluID0gbmV3IEFycmF5RGVxdWU8Q2hhaW4+KDgpOworICAgIENoYWluIGN1cnJlbnQgPSB0aGlzOworICAgIHJldmVyc2VDaGFpbi5hZGRGaXJzdChjdXJyZW50KTsKKyAgICB3aGlsZSAoY3VycmVudC5oYXNQYXJlbnQoKSkgeworICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCk7CisgICAgICByZXZlcnNlQ2hhaW4uYWRkRmlyc3QoY3VycmVudCk7CisgICAgfQorICAgIHJldHVybiByZXZlcnNlQ2hhaW47CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMzIpOworCisgICAgSXRlcmF0b3I8Q2hhaW4+IGl0ID0gcmV2ZXJzZSgpLml0ZXJhdG9yKCk7CisgICAgc2IuYXBwZW5kKGl0Lm5leHQoKS5nZXRWYWx1ZSgpKTsKKyAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICBzYi5hcHBlbmQoIi0+Iik7CisgICAgICBDaGFpbiBjdXJyZW50ID0gaXQubmV4dCgpOworICAgICAgaWYgKGN1cnJlbnQuaXNUaHJvdWdoRmllbGQoKSkgeworICAgICAgICBzYi5hcHBlbmQoKChGaWVsZENoYWluKWN1cnJlbnQpLmdldEZpZWxkKCkuZ2V0TmFtZSgpKTsKKyAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5pc1Rocm91Z2hBcnJheUluZGV4KCkpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJbIikuYXBwZW5kKCgoQXJyYXlJbmRleENoYWluKWN1cnJlbnQpLmdldEFycmF5SW5kZXgoKSkuYXBwZW5kKCJdIik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgc3RhdGljIGNsYXNzIEZpZWxkQ2hhaW4gZXh0ZW5kcyBDaGFpbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWVsZCBmaWVsZDsKKworICAgIEZpZWxkQ2hhaW4oQ2hhaW4gcGFyZW50LCBGaWVsZCByZWZlcnJpbmdGaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBzdXBlcihwYXJlbnQsIHZhbHVlKTsKKyAgICAgIHRoaXMuZmllbGQgPSByZWZlcnJpbmdGaWVsZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Rocm91Z2hGaWVsZCgpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVGhyb3VnaEFycmF5SW5kZXgoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8+IGdldFZhbHVlVHlwZSgpIHsKKyAgICAgIHJldHVybiBmaWVsZC5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkIGdldEZpZWxkKCkgeworICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBBcnJheUluZGV4Q2hhaW4gZXh0ZW5kcyBDaGFpbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisKKyAgICBBcnJheUluZGV4Q2hhaW4oQ2hhaW4gcGFyZW50LCBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgeworICAgICAgc3VwZXIocGFyZW50LCB2YWx1ZSk7CisgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUaHJvdWdoRmllbGQoKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUaHJvdWdoQXJyYXlJbmRleCgpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/PiBnZXRWYWx1ZVR5cGUoKSB7CisgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0VmFsdWUoKS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEFycmF5SW5kZXgoKSB7CisgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21lbW9yeS9PYmplY3RFeHBsb3Jlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tZW1vcnkvT2JqZWN0RXhwbG9yZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzRlNGNjCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tZW1vcnkvT2JqZWN0RXhwbG9yZXIuamF2YQpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIubWVtb3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRlcXVlOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKKworLyoqCisgKiBBIGRlcHRoLWZpcnN0IG9iamVjdCBncmFwaCBleHBsb3Jlci4gVGhlIHRyYXZlcnNhbCBzdGFydHMgYXQgYSByb290IChhbgorICoge0Bjb2RlIE9iamVjdH0pIGFuZCBleHBsb3JlcyBhbnkgb3RoZXIgcmVhY2hhYmxlIG9iamVjdCAocmVjdXJzaXZlbHkpIG9yCisgKiBwcmltaXRpdmUgdmFsdWUsIGV4Y2x1ZGluZyBzdGF0aWMgZmllbGRzIGZyb20gdGhlIHRyYXZlcnNhbC4gVGhlIHRyYXZlcnNhbAorICogaXMgY29udHJvbGxlZCBieSBhIHVzZXItc3VwcGxpZWQge0BsaW5rIE9iamVjdFZpc2l0b3J9LCB3aGljaCBkZWNpZGVzIGZvcgorICogZWFjaCBleHBsb3JlZCBwYXRoIHdoZXRoZXIgdG8gY29udGludWUgZXhwbG9yYXRpb24gb2YgdGhhdCBwYXRoLCBhbmQgaXQgY2FuCisgKiBhbHNvIHJldHVybiBhIHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIHRyYXZlcnNhbC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdEV4cGxvcmVyIHsKKyAgcHJpdmF0ZSBPYmplY3RFeHBsb3JlcigpIHsgfQorCisgIC8qKgorICAgKiBFeHBsb3JlcyBhbiBvYmplY3QgZ3JhcGggKGRlZmluZWQgYnkgYSByb290IG9iamVjdCBhbmQgd2hhdGV2ZXIgaXMKKyAgICogcmVhY2hhYmxlIHRocm91Z2ggaXQsIGZvbGxvd2luZyBub24tc3RhdGljIGZpZWxkcykgd2hpbGUgdXNpbmcgYW4KKyAgICoge0BsaW5rIE9iamVjdFZpc2l0b3J9IHRvIGJvdGggY29udHJvbCB0aGUgdHJhdmVyc2FsIGFuZCByZXR1cm4gYSB2YWx1ZS4KKyAgICoKKyAgICogPHA+RXF1aXZhbGVudCB0byB7QGNvZGUgZXhwbG9yZU9iamVjdChyb290T2JqZWN0LCB2aXNpdG9yLAorICAgKiBFbnVtU2V0Lm5vbmVPZihGZWF0dXJlLmNsYXNzKSl9LgorICAgKgorICAgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvYnRhaW5lZCAoYWZ0ZXIgdGhlIHRyYXZlcnNhbCkgYnkgdGhlCisgICAqIE9iamVjdFZpc2l0b3IKKyAgICogQHBhcmFtIHJvb3RPYmplY3QgYW4gb2JqZWN0IHRvIGJlIHJlY3Vyc2l2ZWx5IGV4cGxvcmVkCisgICAqIEBwYXJhbSB2aXNpdG9yIGEgdmlzaXRvciB0aGF0IGlzIG5vdGlmaWVkIGZvciBlYWNoIGV4cGxvcmVkIHBhdGggYW5kCisgICAqIGRlY2lkZXMgd2hldGhlciB0byBjb250aW51ZSBleHBsb3JhdGlvbiBvZiB0aGF0IHBhdGgsIGFuZCBjb25zdHJ1Y3RzIGEKKyAgICogcmV0dXJuIHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIGV4cGxvcmF0aW9uCisgICAqIEByZXR1cm4gd2hhdGV2ZXIgdmFsdWUgaXMgcmV0dXJuZWQgYnkgdGhlIHZpc2l0b3IgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICogdHJhdmVyc2FsCisgICAqIEBzZWUgT2JqZWN0VmlzaXRvcgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8VD4gVCBleHBsb3JlT2JqZWN0KE9iamVjdCByb290T2JqZWN0LCBPYmplY3RWaXNpdG9yPFQ+IHZpc2l0b3IpIHsKKyAgICByZXR1cm4gZXhwbG9yZU9iamVjdChyb290T2JqZWN0LCB2aXNpdG9yLCBFbnVtU2V0Lm5vbmVPZihGZWF0dXJlLmNsYXNzKSk7CisgIH0KKworICAvKioKKyAgICogRXhwbG9yZXMgYW4gb2JqZWN0IGdyYXBoIChkZWZpbmVkIGJ5IGEgcm9vdCBvYmplY3QgYW5kIHdoYXRldmVyIGlzCisgICAqIHJlYWNoYWJsZSB0aHJvdWdoIGl0LCBmb2xsb3dpbmcgbm9uLXN0YXRpYyBmaWVsZHMpIHdoaWxlIHVzaW5nIGFuCisgICAqIHtAbGluayBPYmplY3RWaXNpdG9yfSB0byBib3RoIGNvbnRyb2wgdGhlIHRyYXZlcnNhbCBhbmQgcmV0dXJuIGEgdmFsdWUuCisgICAqCisgICAqIDxwPlRoZSB7QGNvZGUgZmVhdHVyZXN9IGZ1cnRoZXIgY3VzdG9taXplcyB0aGUgZXhwbG9yYXRpb24gYmVoYXZpb3IuCisgICAqIEluIHBhcnRpY3VsYXI6CisgICAqIDx1bD4KKyAgICogPGxpPklmIHtAbGluayBGZWF0dXJlI1ZJU0lUX1BSSU1JVElWRVN9IGlzIGNvbnRhaW5lZCBpbiBmZWF0dXJlcywKKyAgICogdGhlIHZpc2l0b3Igd2lsbCBhbHNvIGJlIG5vdGlmaWVkIGFib3V0IGV4cGxvcmF0aW9uIG9mIHByaW1pdGl2ZSB2YWx1ZXMuCisgICAqIDxsaT5JZiB7QGxpbmsgRmVhdHVyZSNWSVNJVF9OVUxMfSBpcyBjb250YWluZWQgaW4gZmVhdHVyZXMsIHRoZSB2aXNpdG9yCisgICAqIHdpbGwgYWxzbyBiZSBub3RpZmllZCBhYm91dCBleHBsb3JhdGlvbiBvZiB7QGNvZGUgbnVsbH0gdmFsdWVzLgorICAgKiA8L3VsPgorICAgKiBJbiBib3RoIGNhc2VzIGFib3ZlLCB0aGUgcmV0dXJuIHZhbHVlIG9mCisgICAqIHtAbGluayBPYmplY3RWaXNpdG9yI3Zpc2l0KENoYWluKX0gaXMgaWdub3JlZCwgc2luY2UgbmVpdGhlciBwcmltaXRpdmUKKyAgICogdmFsdWVzIG9yIHtAY29kZSBudWxsfSBjYW4gYmUgZnVydGhlciBleHBsb3JlZC4KKyAgICoKKyAgICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgb2J0YWluZWQgKGFmdGVyIHRoZSB0cmF2ZXJzYWwpIGJ5IHRoZQorICAgKiBPYmplY3RWaXNpdG9yCisgICAqIEBwYXJhbSByb290T2JqZWN0IGFuIG9iamVjdCB0byBiZSByZWN1cnNpdmVseSBleHBsb3JlZAorICAgKiBAcGFyYW0gdmlzaXRvciBhIHZpc2l0b3IgdGhhdCBpcyBub3RpZmllZCBmb3IgZWFjaCBleHBsb3JlZCBwYXRoCisgICAqIGFuZCBkZWNpZGVzIHdoZXRoZXIgdG8gY29udGludWUgZXhwbG9yYXRpb24gb2YgdGhhdCBwYXRoLCBhbmQgY29uc3RydWN0cworICAgKiBhIHJldHVybiB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBleHBsb3JhdGlvbgorICAgKiBAcGFyYW0gZmVhdHVyZXMgYSBzZXQgb2YgZGVzaXJlZCBmZWF0dXJlcyB0aGF0IHRoZSBvYmplY3QgZXhwbG9yYXRpb24gc2hvdWxkIGhhdmUKKyAgICogQHJldHVybiB3aGF0ZXZlciB2YWx1ZSBpcyByZXR1cm5lZCBieSB0aGUgdmlzaXRvciBhdCB0aGUgZW5kIG9mIHRoZSB0cmF2ZXJzYWwKKyAgICogQHNlZSBPYmplY3RWaXNpdG9yCisgICAqLworICBwdWJsaWMgc3RhdGljIDxUPiBUIGV4cGxvcmVPYmplY3QoT2JqZWN0IHJvb3RPYmplY3QsCisgICAgICBPYmplY3RWaXNpdG9yPFQ+IHZpc2l0b3IsIEVudW1TZXQ8RmVhdHVyZT4gZmVhdHVyZXMpIHsKKyAgICBEZXF1ZTxDaGFpbj4gc3RhY2sgPSBuZXcgQXJyYXlEZXF1ZTxDaGFpbj4oMzIpOworICAgIGlmIChyb290T2JqZWN0ICE9IG51bGwpIHN0YWNrLnB1c2goQ2hhaW4ucm9vdChyb290T2JqZWN0KSk7CisKKyAgICB3aGlsZSAoIXN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgQ2hhaW4gY2hhaW4gPSBzdGFjay5wb3AoKTsKKyAgICAgIC8vdGhlIG9ubHkgcGxhY2Ugd2hlcmUgdGhlIHJldHVybiB2YWx1ZSBvZiB2aXNpdCgpIGlzIGNvbnNpZGVyZWQKKyAgICAgIE9iamVjdFZpc2l0b3IuVHJhdmVyc2FsIHRyYXZlcnNhbCA9IHZpc2l0b3IudmlzaXQoY2hhaW4pOworICAgICAgc3dpdGNoICh0cmF2ZXJzYWwpIHsKKyAgICAgICAgY2FzZSBTS0lQOiBjb250aW51ZTsKKyAgICAgICAgY2FzZSBFWFBMT1JFOiBicmVhazsKKyAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICB9CisKKyAgICAgIC8vb25seSBub25udWxsIHZhbHVlcyBwdXNoZWQgaW4gdGhlIHN0YWNrCisgICAgICBATm9ubnVsbCBPYmplY3QgdmFsdWUgPSBjaGFpbi5nZXRWYWx1ZSgpOworICAgICAgQ2xhc3M8Pz4gdmFsdWVDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7CisgICAgICBpZiAodmFsdWVDbGFzcy5pc0FycmF5KCkpIHsKKyAgICAgICAgYm9vbGVhbiBpc1ByaW1pdGl2ZSA9IHZhbHVlQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCk7CisgICAgICAgIC8qCisgICAgICAgICAqIFNpbmNlIHdlIHB1c2ggcGF0aHMgdG8gZXhwbG9yZSBpbiBhIHN0YWNrLCB3ZSBwdXNoIHJlZmVyZW5jZXMgZm91bmQgaW4gdGhlIGFycmF5IGluCisgICAgICAgICAqIHJldmVyc2Ugb3JkZXIsIHNvIHdoZW4gd2UgcG9wIHRoZW0sIHRoZXkgd2lsbCBiZSBpbiB0aGUgYXJyYXkncyBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaW50IGkgPSBBcnJheS5nZXRMZW5ndGgodmFsdWUpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICBPYmplY3QgY2hpbGRWYWx1ZSA9IEFycmF5LmdldCh2YWx1ZSwgaSk7CisgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKSB7CisgICAgICAgICAgICBpZiAoZmVhdHVyZXMuY29udGFpbnMoRmVhdHVyZS5WSVNJVF9QUklNSVRJVkVTKSkgeworICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0KGNoYWluLmFwcGVuZEFycmF5SW5kZXgoaSwgY2hpbGRWYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZmVhdHVyZXMuY29udGFpbnMoRmVhdHVyZS5WSVNJVF9OVUxMKSkgeworICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0KGNoYWluLmFwcGVuZEFycmF5SW5kZXgoaSwgY2hpbGRWYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFjay5wdXNoKGNoYWluLmFwcGVuZEFycmF5SW5kZXgoaSwgY2hpbGRWYWx1ZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVmbGVjdGlvbiB1c3VhbGx5IHByb3ZpZGVzIGZpZWxkcyBpbiBkZWNsYXJhdGlvbiBvcmRlci4gQXMgYWJvdmUgaW4gYXJyYXlzLCB3ZSBwdXNoCisgICAgICAgICAqIHRoZW0gdG8gdGhlIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIsIHNvIHdoZW4gd2UgcG9wIHRoZW0sIHdlIGdldCB0aGVtIGluIHRoZSBvcmlnaW5hbAorICAgICAgICAgKiAoZGVjbGFyYXRpb24pIG9yZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBnZXRBbGxGaWVsZHModmFsdWUpOworICAgICAgICBmb3IgKGludCBqID0gZmllbGRzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgZmluYWwgRmllbGQgZmllbGQgPSBmaWVsZHNbal07CisgICAgICAgICAgT2JqZWN0IGNoaWxkVmFsdWUgPSBudWxsOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGlsZFZhbHVlID0gZmllbGQuZ2V0KHZhbHVlKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7IC8vIGhhbmRsaW5nIG51bGxzCisgICAgICAgICAgICBpZiAoZmVhdHVyZXMuY29udGFpbnMoRmVhdHVyZS5WSVNJVF9OVUxMKSkgeworICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0KGNoYWluLmFwcGVuZEZpZWxkKGZpZWxkLCBjaGlsZFZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsgLy8gaGFuZGxpbmcgcHJpbWl0aXZlcyBvciByZWZlcmVuY2VzCisgICAgICAgICAgICBib29sZWFuIGlzUHJpbWl0aXZlID0gZmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCk7CisgICAgICAgICAgICBDaGFpbiBleHRlbmRlZENoYWluID0gY2hhaW4uYXBwZW5kRmllbGQoZmllbGQsIGNoaWxkVmFsdWUpOworICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKSB7CisgICAgICAgICAgICAgIGlmIChmZWF0dXJlcy5jb250YWlucyhGZWF0dXJlLlZJU0lUX1BSSU1JVElWRVMpKSB7CisgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdChleHRlbmRlZENoYWluKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhY2sucHVzaChleHRlbmRlZENoYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZpc2l0b3IucmVzdWx0KCk7CisgIH0KKworICAvKioKKyAgICogQSBzdGF0ZWZ1bCBwcmVkaWNhdGUgdGhhdCBhbGxvd3MgZXhwbG9yaW5nIGFuIG9iamVjdCAodGhlIHRhaWwgb2YgdGhlIGNoYWluKSBvbmx5IG9uY2UuCisgICAqLworICBzdGF0aWMgY2xhc3MgQXRNb3N0T25jZVByZWRpY2F0ZSBpbXBsZW1lbnRzIFByZWRpY2F0ZTxDaGFpbj4geworICAgIHByaXZhdGUgZmluYWwgU2V0PE9iamVjdD4gc2VlbiA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAoCisgICAgICAgIG5ldyBJZGVudGl0eUhhc2hNYXA8T2JqZWN0LCBCb29sZWFuPigpKTsKKworICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBhcHBseShDaGFpbiBjaGFpbikgeworICAgICAgcmV0dXJuIHNlZW4uYWRkKGNoYWluLmdldFZhbHVlKCkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8Q2hhaW4+IG5vdEVudW1GaWVsZHNPckNsYXNzZXMgPSBuZXcgUHJlZGljYXRlPENoYWluPigpIHsKKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gYXBwbHkoQ2hhaW4gY2hhaW4pIHsKKyAgICAgIHJldHVybiAhKEVudW0uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjaGFpbi5nZXRWYWx1ZVR5cGUoKSkKKyAgICAgICAgICB8fCBjaGFpbi5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ2xhc3M8Pz4pOworICAgIH0KKyAgfTsKKworICBzdGF0aWMgZmluYWwgRnVuY3Rpb248Q2hhaW4sIE9iamVjdD4gY2hhaW5Ub09iamVjdCA9CisgICAgICBuZXcgRnVuY3Rpb248Q2hhaW4sIE9iamVjdD4oKSB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2hhaW4gY2hhaW4pIHsKKyAgICAgIHJldHVybiBjaGFpbi5nZXRWYWx1ZSgpOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQSBjYWNoZSBvZiB7QGNvZGUgRmllbGR9cyB0aGF0IGFyZSBhY2Nlc3NpYmxlIGZvciBhIGdpdmVuIHtAY29kZSBDbGFzczw/Pn0uCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxDbGFzczw/PiwgRmllbGRbXT4gY2xhenpGaWVsZHMgPQorICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPENsYXNzPD8+LCBGaWVsZFtdPigpOworCisgIHByaXZhdGUgc3RhdGljIEZpZWxkW10gZ2V0QWxsRmllbGRzKE9iamVjdCBvKSB7CisgICAgQ2xhc3M8Pz4gY2xhenogPSBvLmdldENsYXNzKCk7CisgICAgcmV0dXJuIGdldEFsbEZpZWxkcyhjbGF6eik7CisgIH0KKworICAvKioKKyAgICogS2VlcCBhIGNhY2hlIG9mIGZpZWxkcyBwZXIgY2xhc3Mgb2YgaW50ZXJlc3QuCisgICAqCisgICAqIEBwYXJhbSBjbGF6eiAtIHRoZSB7QGNvZGUgQ2xhc3M8Pz59IHRvIGludGVycm9nYXRlLgorICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBGaWVsZFtdIGdldEFsbEZpZWxkcyhDbGFzczw/PiBjbGF6eikgeworICAgIEZpZWxkW10gZiA9IGNsYXp6RmllbGRzLmdldChjbGF6eik7CisgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgZiA9IGNvbXB1dGVBbGxGaWVsZHMoY2xhenopOworICAgICAgRmllbGRbXSB1ID0gY2xhenpGaWVsZHMucHV0SWZBYnNlbnQoY2xhenosIGYpOworICAgICAgcmV0dXJuIHUgPT0gbnVsbCA/IGYgOiB1OworICAgIH0KKyAgICByZXR1cm4gZjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEZpZWxkW10gY29tcHV0ZUFsbEZpZWxkcyhDbGFzczw/PiBjbGF6eikgeworICAgIExpc3Q8RmllbGQ+IGZpZWxkcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSg4KTsKKyAgICB3aGlsZSAoY2xhenogIT0gbnVsbCkgeworICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgLy8gYWRkIG9ubHkgbm9uLXN0YXRpYyBmaWVsZHMKKyAgICAgICAgaWYgKCFNb2RpZmllci5pc1N0YXRpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICBmaWVsZHMuYWRkKGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgfQorCisgICAgLy8gYWxsIHRvZ2V0aGVyIHNvIHRoZXJlIGlzIG9ubHkgb25lIHNlY3VyaXR5IGNoZWNrCisgICAgRmllbGRbXSBhZmllbGRzID0gZmllbGRzLnRvQXJyYXkobmV3IEZpZWxkW2ZpZWxkcy5zaXplKCldKTsKKyAgICBBY2Nlc3NpYmxlT2JqZWN0LnNldEFjY2Vzc2libGUoYWZpZWxkcywgdHJ1ZSk7CisgICAgcmV0dXJuIGFmaWVsZHM7CisgIH0KKworICAvKioKKyAgICogRW51bWVyYXRpb24gb2YgZmVhdHVyZXMgdGhhdCBtYXkgYmUgb3B0aW9uYWxseSByZXF1ZXN0ZWQgZm9yIGFuIG9iamVjdAorICAgKiB0cmF2ZXJzYWwuCisgICAqCisgICAqIEBzZWUgT2JqZWN0RXhwbG9yZXIjZXhwbG9yZU9iamVjdChPYmplY3QsIE9iamVjdFZpc2l0b3IsIEVudW1TZXQpCisgICAqLworICBwdWJsaWMgZW51bSBGZWF0dXJlIHsKKyAgICAvKioKKyAgICAgKiBOdWxsIHJlZmVyZW5jZXMgc2hvdWxkIGJlIHZpc2l0ZWQuCisgICAgICovCisgICAgVklTSVRfTlVMTCwKKworICAgIC8qKgorICAgICAqIFByaW1pdGl2ZSB2YWx1ZXMgc2hvdWxkIGJlIHZpc2l0ZWQuCisgICAgICovCisgICAgVklTSVRfUFJJTUlUSVZFUworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21lbW9yeS9PYmplY3RHcmFwaE1lYXN1cmVyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21lbW9yeS9PYmplY3RHcmFwaE1lYXN1cmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhY2FlYgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbWVtb3J5L09iamVjdEdyYXBoTWVhc3VyZXIuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIubWVtb3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1lbW9yeS5PYmplY3RFeHBsb3Jlci5GZWF0dXJlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5IYXNoTXVsdGlzZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTXVsdGlzZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aXNldDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCisvKioKKyAqIEEgdG9vbCB0aGF0IGNhbiBxdWFsaXRhdGl2ZWx5IG1lYXN1cmUgdGhlIGZvb3RwcmludAorICogKHtAbGl0ZXJhbCBlLmcufSwgbnVtYmVyIG9mIG9iamVjdHMsIHJlZmVyZW5jZXMsCisgKiBwcmltaXRpdmVzKSBvZiBhIGdyYXBoIHN0cnVjdHVyZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdEdyYXBoTWVhc3VyZXIgeworICAvKioKKyAgICogVGhlIGZvb3RwcmludCBvZiBhbiBvYmplY3QgZ3JhcGguCisgICAqLworICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIEZvb3RwcmludCB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb2JqZWN0czsKKyAgICBwcml2YXRlIGZpbmFsIGludCBub25OdWxsUmVmczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBudWxsUmVmczsKKyAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU11bHRpc2V0PENsYXNzPD8+PiBwcmltaXRpdmVzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1tdXRhYmxlU2V0PENsYXNzPD8+PiBwcmltaXRpdmVUeXBlcyA9IEltbXV0YWJsZVNldC48Q2xhc3M8Pz4+b2YoCisgICAgICAgIGJvb2xlYW4uY2xhc3MsIGJ5dGUuY2xhc3MsIGNoYXIuY2xhc3MsIHNob3J0LmNsYXNzLAorICAgICAgICBpbnQuY2xhc3MsIGZsb2F0LmNsYXNzLCBsb25nLmNsYXNzLCBkb3VibGUuY2xhc3MpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEZvb3RwcmludCwgYnkgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIG9iamVjdHMsCisgICAgICogcmVmZXJlbmNlcywgYW5kIHByaW1pdGl2ZXMgKHJlcHJlc2VudGVkIGFzIGEge0BsaW5rIE11bHRpc2V0fSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0cyB0aGUgbnVtYmVyIG9mIG9iamVjdHMKKyAgICAgKiBAcGFyYW0gbm9uTnVsbFJlZnMgdGhlIG51bWJlciBvZiBub24tbnVsbCByZWZlcmVuY2VzCisgICAgICogQHBhcmFtIG51bGxSZWZzIHRoZSBudW1iZXIgb2YgbnVsbCByZWZlcmVuY2VzCisgICAgICogQHBhcmFtIHByaW1pdGl2ZXMgdGhlIG51bWJlciBvZiBwcmltaXRpdmVzIChyZXByZXNlbnRlZCBieSB0aGUKKyAgICAgKiByZXNwZWN0aXZlIHByaW1pdGl2ZSBjbGFzc2VzLCBlLmcuIHtAY29kZSBpbnQuY2xhc3N9IGV0YykKKyAgICAgKi8KKyAgICBwdWJsaWMgRm9vdHByaW50KGludCBvYmplY3RzLCBpbnQgbm9uTnVsbFJlZnMsIGludCBudWxsUmVmcywKKyAgICAgICAgTXVsdGlzZXQ8Q2xhc3M8Pz4+IHByaW1pdGl2ZXMpIHsKKyAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChvYmplY3RzID49IDAsICJOZWdhdGl2ZSBudW1iZXIgb2Ygb2JqZWN0cyIpOworICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KG5vbk51bGxSZWZzID49IDAsICJOZWdhdGl2ZSBudW1iZXIgb2YgcmVmZXJlbmNlcyIpOworICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KG51bGxSZWZzID49IDAsICJOZWdhdGl2ZSBudW1iZXIgb2YgcmVmZXJlbmNlcyIpOworICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KHByaW1pdGl2ZVR5cGVzLmNvbnRhaW5zQWxsKHByaW1pdGl2ZXMuZWxlbWVudFNldCgpKSwKKyAgICAgICAgICAiVW5leHBlY3RlZCBwcmltaXRpdmUgdHlwZSIpOworICAgICAgdGhpcy5vYmplY3RzID0gb2JqZWN0czsKKyAgICAgIHRoaXMubm9uTnVsbFJlZnMgPSBub25OdWxsUmVmczsKKyAgICAgIHRoaXMubnVsbFJlZnMgPSBudWxsUmVmczsKKyAgICAgIHRoaXMucHJpbWl0aXZlcyA9IEltbXV0YWJsZU11bHRpc2V0LmNvcHlPZihwcmltaXRpdmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBvZiB0aGlzIGZvb3RwcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE9iamVjdHMoKSB7CisgICAgICByZXR1cm4gb2JqZWN0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uLW51bGwgcmVmZXJlbmNlcyBvZiB0aGlzIGZvb3RwcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE5vbk51bGxSZWZlcmVuY2VzKCkgeworICAgICAgcmV0dXJuIG5vbk51bGxSZWZzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBudWxsIHJlZmVyZW5jZXMgb2YgdGhpcyBmb290cHJpbnQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXROdWxsUmVmZXJlbmNlcygpIHsKKyAgICAgIHJldHVybiBudWxsUmVmczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWxsIHJlZmVyZW5jZXMgKG51bGwgYW5kIG5vbi1udWxsKSBvZiB0aGlzIGZvb3RwcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFsbFJlZmVyZW5jZXMoKSB7CisgICAgICByZXR1cm4gbm9uTnVsbFJlZnMgKyBudWxsUmVmczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJpbWl0aXZlcyBvZiB0aGlzIGZvb3RwcmludAorICAgICAqIChyZXByZXNlbnRlZCBieSB0aGUgcmVzcGVjdGl2ZSBwcmltaXRpdmUgY2xhc3NlcywKKyAgICAgKiB7QGxpdGVyYWwgZS5nLn0ge0Bjb2RlIGludC5jbGFzc30gZXRjKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW1tdXRhYmxlTXVsdGlzZXQ8Q2xhc3M8Pz4+IGdldFByaW1pdGl2ZXMoKSB7CisgICAgICByZXR1cm4gcHJpbWl0aXZlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUoZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisgICAgICAgICAgb2JqZWN0cywgbm9uTnVsbFJlZnMsIG51bGxSZWZzLCBwcmltaXRpdmVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgRm9vdHByaW50KSB7CisgICAgICAgIEZvb3RwcmludCB0aGF0ID0gKEZvb3RwcmludCkgbzsKKyAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0cyA9PSB0aGF0Lm9iamVjdHMKKyAgICAgICAgICAgICYmIHRoaXMubm9uTnVsbFJlZnMgPT0gdGhhdC5ub25OdWxsUmVmcworICAgICAgICAgICAgJiYgdGhpcy5udWxsUmVmcyA9PSB0aGF0Lm51bGxSZWZzCisgICAgICAgICAgICAmJiB0aGlzLnByaW1pdGl2ZXMuZXF1YWxzKHRoYXQucHJpbWl0aXZlcyk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQorICAgICAgICAgIC5hZGQoIk9iamVjdHMiLCBvYmplY3RzKQorICAgICAgICAgIC5hZGQoIk5vbk51bGxSZWZzIiwgbm9uTnVsbFJlZnMpCisgICAgICAgICAgLmFkZCgiTnVsbFJlZnMiLCBudWxsUmVmcykKKyAgICAgICAgICAuYWRkKCJQcmltaXRpdmVzIiwgcHJpbWl0aXZlcykKKyAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTWVhc3VyZXMgdGhlIGZvb3RwcmludCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBncmFwaC4KKyAgICogVGhlIG9iamVjdCBncmFwaCBpcyBkZWZpbmVkIGJ5IGEgcm9vdCBvYmplY3QgYW5kIHdoYXRldmVyIG9iamVjdCBjYW4gYmUKKyAgICogcmVhY2hlZCB0aHJvdWdoIHRoYXQsIGV4Y2x1ZGluZyBzdGF0aWMgZmllbGRzLCB7QGNvZGUgQ2xhc3N9IG9iamVjdHMsCisgICAqIGFuZCBmaWVsZHMgZGVmaW5lZCBpbiB7QGNvZGUgZW51bX1zIChhbGwgdGhlc2UgYXJlIGNvbnNpZGVyZWQgc2hhcmVkCisgICAqIHZhbHVlcywgd2hpY2ggc2hvdWxkIG5vdCBjb250cmlidXRlIHRvIHRoZSBjb3N0IG9mIGFueSBzaW5nbGUgb2JqZWN0CisgICAqIGdyYXBoKS4KKyAgICoKKyAgICogPHA+RXF1aXZhbGVudCB0byB7QGNvZGUgbWVhc3VyZShyb290T2JqZWN0LCBQcmVkaWNhdGVzLmFsd2F5c1RydWUoKSl9LgorICAgKgorICAgKiBAcGFyYW0gcm9vdE9iamVjdCB0aGUgcm9vdCBvYmplY3Qgb2YgdGhlIG9iamVjdCBncmFwaAorICAgKiBAcmV0dXJuIHRoZSBmb290cHJpbnQgb2YgdGhlIG9iamVjdCBncmFwaAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBGb290cHJpbnQgbWVhc3VyZShPYmplY3Qgcm9vdE9iamVjdCkgeworICAgIHJldHVybiBtZWFzdXJlKHJvb3RPYmplY3QsIFByZWRpY2F0ZXMuYWx3YXlzVHJ1ZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBNZWFzdXJlcyB0aGUgZm9vdHByaW50IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGdyYXBoLgorICAgKiBUaGUgb2JqZWN0IGdyYXBoIGlzIGRlZmluZWQgYnkgYSByb290IG9iamVjdCBhbmQgd2hhdGV2ZXIgb2JqZWN0IGNhbiBiZQorICAgKiByZWFjaGVkIHRocm91Z2ggdGhhdCwgZXhjbHVkaW5nIHN0YXRpYyBmaWVsZHMsIHtAY29kZSBDbGFzc30gb2JqZWN0cywKKyAgICogYW5kIGZpZWxkcyBkZWZpbmVkIGluIHtAY29kZSBlbnVtfXMgKGFsbCB0aGVzZSBhcmUgY29uc2lkZXJlZCBzaGFyZWQKKyAgICogdmFsdWVzLCB3aGljaCBzaG91bGQgbm90IGNvbnRyaWJ1dGUgdG8gdGhlIGNvc3Qgb2YgYW55IHNpbmdsZSBvYmplY3QKKyAgICogZ3JhcGgpLCBhbmQgYW55IG9iamVjdCBmb3Igd2hpY2ggdGhlIHVzZXItcHJvdmlkZWQgcHJlZGljYXRlIHJldHVybnMKKyAgICoge0Bjb2RlIGZhbHNlfS4KKyAgICoKKyAgICogQHBhcmFtIHJvb3RPYmplY3QgdGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSBvYmplY3QgZ3JhcGgKKyAgICogQHBhcmFtIG9iamVjdEFjY2VwdG9yIGEgcHJlZGljYXRlIHRoYXQgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gZm9yIG9iamVjdHMKKyAgICogdG8gYmUgZXhwbG9yZWQgKGFuZCB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIGZvb3RwcmludCksIG9yIHtAY29kZSBmYWxzZX0KKyAgICogdG8gZm9yYmlkIHRoZSB0cmF2ZXJzYWwgdG8gdHJhdmVyc2UgdGhlIGdpdmVuIG9iamVjdAorICAgKiBAcmV0dXJuIHRoZSBmb290cHJpbnQgb2YgdGhlIG9iamVjdCBncmFwaAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBGb290cHJpbnQgbWVhc3VyZShPYmplY3Qgcm9vdE9iamVjdCwgUHJlZGljYXRlPE9iamVjdD4gb2JqZWN0QWNjZXB0b3IpIHsKKyAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChvYmplY3RBY2NlcHRvciwgInByZWRpY2F0ZSIpOworCisgICAgUHJlZGljYXRlPENoYWluPiBjb21wbGV0ZVByZWRpY2F0ZSA9IFByZWRpY2F0ZXMuYW5kKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIE9iamVjdEV4cGxvcmVyLm5vdEVudW1GaWVsZHNPckNsYXNzZXMsCisgICAgICAgIG5ldyBPYmplY3RFeHBsb3Jlci5BdE1vc3RPbmNlUHJlZGljYXRlKCksCisgICAgICAgIFByZWRpY2F0ZXMuY29tcG9zZShvYmplY3RBY2NlcHRvciwgT2JqZWN0RXhwbG9yZXIuY2hhaW5Ub09iamVjdCkKKyAgICApKTsKKworICAgIHJldHVybiBPYmplY3RFeHBsb3Jlci5leHBsb3JlT2JqZWN0KHJvb3RPYmplY3QsIG5ldyBPYmplY3RHcmFwaFZpc2l0b3IoY29tcGxldGVQcmVkaWNhdGUpLAorICAgICAgICBFbnVtU2V0Lm9mKEZlYXR1cmUuVklTSVRfUFJJTUlUSVZFUywgRmVhdHVyZS5WSVNJVF9OVUxMKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPYmplY3RHcmFwaFZpc2l0b3IgaW1wbGVtZW50cyBPYmplY3RWaXNpdG9yPEZvb3RwcmludD4geworICAgIHByaXZhdGUgaW50IG9iamVjdHM7CisgICAgLy8gLTEgdG8gYWNjb3VudCBmb3IgdGhlIHJvb3QsIHdoaWNoIGhhcyBubyByZWZlcmVuY2UgbGVhZGluZyB0byBpdAorICAgIHByaXZhdGUgaW50IG5vbk51bGxSZWZlcmVuY2VzID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgbnVsbFJlZmVyZW5jZXMgPSAwOworICAgIHByaXZhdGUgZmluYWwgTXVsdGlzZXQ8Q2xhc3M8Pz4+IHByaW1pdGl2ZXMgPSBIYXNoTXVsdGlzZXQuY3JlYXRlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGU8Q2hhaW4+IHByZWRpY2F0ZTsKKworICAgIE9iamVjdEdyYXBoVmlzaXRvcihQcmVkaWNhdGU8Q2hhaW4+IHByZWRpY2F0ZSkgeworICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBUcmF2ZXJzYWwgdmlzaXQoQ2hhaW4gY2hhaW4pIHsKKyAgICAgIGlmIChjaGFpbi5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgIHByaW1pdGl2ZXMuYWRkKGNoYWluLmdldFZhbHVlVHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIFRyYXZlcnNhbC5TS0lQOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNoYWluLmdldFZhbHVlKCkgPT0gbnVsbCkgeworICAgICAgICAgIG51bGxSZWZlcmVuY2VzKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbm9uTnVsbFJlZmVyZW5jZXMrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHByZWRpY2F0ZS5hcHBseShjaGFpbikgJiYgY2hhaW4uZ2V0VmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgIG9iamVjdHMrKzsKKyAgICAgICAgcmV0dXJuIFRyYXZlcnNhbC5FWFBMT1JFOworICAgICAgfQorICAgICAgcmV0dXJuIFRyYXZlcnNhbC5TS0lQOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgRm9vdHByaW50IHJlc3VsdCgpIHsKKyAgICAgIHJldHVybiBuZXcgRm9vdHByaW50KG9iamVjdHMsIG5vbk51bGxSZWZlcmVuY2VzLCBudWxsUmVmZXJlbmNlcywKKyAgICAgICAgICBJbW11dGFibGVNdWx0aXNldC5jb3B5T2YocHJpbWl0aXZlcykpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgT2JqZWN0R3JhcGhNZWFzdXJlcigpIHt9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21lbW9yeS9PYmplY3RWaXNpdG9yLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21lbW9yeS9PYmplY3RWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExMzIwZQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbWVtb3J5L09iamVjdFZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5tZW1vcnk7CisKKy8qKgorICogQSB2aXNpdG9yIHRoYXQgY29udHJvbHMgYW4gb2JqZWN0IHRyYXZlcnNhbC4gSW1wbGVtZW50YXRpb25zCisgKiBvZiB0aGlzIGludGVyZmFjZSBhcmUgcGFzc2VkIHRvIHtAbGluayBPYmplY3RFeHBsb3Jlcn0gZXhwbG9yYXRpb24gbWV0aG9kcy4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgdGhhdCB0aGlzIHZpc2l0b3IgcmV0dXJucworICogKGNhbiBiZSBkZWZpbmVkIGFzIHtAY29kZSBWb2lkfSB0byBkZW5vdGUgbm8gcmVzdWx0fS4KKyAqCisgKiBAc2VlIE9iamVjdEV4cGxvcmVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT2JqZWN0VmlzaXRvcjxUPiB7CisgIC8qKgorICAgKiBWaXNpdHMgYW4gZXhwbG9yZWQgdmFsdWUgKHRoZSB3aG9sZSBjaGFpbiBmcm9tIHRoZSByb290IG9iamVjdAorICAgKiBsZWFkaW5nIHRvIHRoZSB2YWx1ZSBpcyBwcm92aWRlZCksIGFuZCBkZWNpZGVzIHdoZXRoZXIgdG8gY29udGludWUKKyAgICogdGhlIGV4cGxvcmF0aW9uIG9mIHRoYXQgdmFsdWUuCisgICAqCisgICAqIDxwPkluIGNhc2UgdGhlIGV4cGxvcmVkIHZhbHVlIGlzIGVpdGhlciBwcmltaXRpdmUgb3Ige0Bjb2RlIG51bGx9CisgICAqIChlLmcuLCBpZiB7QGNvZGUgY2hhaW4uaXNQcmltaXRpdmUoKSB8fCBjaGFpbi5nZXRWYWx1ZSgpID09IG51bGx9KSwKKyAgICogdGhlIHJldHVybiB2YWx1ZSBpcyBtZWFuaW5nbGVzcyBhbmQgaXMgaWdub3JlZC4KKyAgICoKKyAgICogQHBhcmFtIGNoYWluIHRoZSBjaGFpbiB0aGF0IGxlYWRzIHRvIHRoZSBleHBsb3JlZCB2YWx1ZS4KKyAgICogQHJldHVybiB7QGxpbmsgVHJhdmVyc2FsI0VYUExPUkV9IHRvIGRlbm90ZSB0aGF0IHRoZSB2aXNpdGVkIG9iamVjdAorICAgKiBzaG91bGQgYmUgZnVydGhlciBleHBsb3JlZCwgb3Ige0BsaW5rIFRyYXZlcnNhbCNTS0lQfSB0byBhdm9pZAorICAgKiBleHBsb3JpbmcgaXQuCisgICAqLworICBUcmF2ZXJzYWwgdmlzaXQoQ2hhaW4gY2hhaW4pOworCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGFyYml0cmFyeSB2YWx1ZSAocHJlc3VtYWJseSBjb25zdHJ1Y3RlZCBkdXJpbmcgdGhlIG9iamVjdAorICAgKiBncmFwaCB0cmF2ZXJzYWwpLgorICAgKi8KKyAgVCByZXN1bHQoKTsKKworICAvKioKKyAgICogQ29uc3RhbnRzIHRoYXQgZGVub3RlIGhvdyB0aGUgdHJhdmVyc2FsIG9mIGEgZ2l2ZW4gb2JqZWN0IChjaGFpbikKKyAgICogc2hvdWxkIGNvbnRpbnVlLgorICAgKi8KKyAgZW51bSBUcmF2ZXJzYWwgeworICAgIC8qKgorICAgICAqIFRoZSB2aXNpdGVkIG9iamVjdCBzaG91bGQgYmUgZnVydGhlciBleHBsb3JlZC4KKyAgICAgKi8KKyAgICBFWFBMT1JFLAorCisgICAgLyoqCisgICAgICogVGhlIHZpc2l0ZWQgb2JqZWN0IHNob3VsZCBub3QgYmUgZXhwbG9yZWQuCisgICAgICovCisgICAgU0tJUAorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL0FsbG9jYXRpb25NZWFzdXJlbWVudC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9BbGxvY2F0aW9uTWVhc3VyZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2VlZDAyCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9BbGxvY2F0aW9uTWVhc3VyZW1lbnQuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEFubm90YXRpb24gdGhhdCBpZGVudGlmaWVzIGEgZ2l2ZW4gbWV0aG9kIGFzIGFuICJhbGxvY2F0aW9uIG1lYXN1cmVtZW50IiBtZXRob2QuIFRoZSBtZXRob2QKKyAqIHNob3VsZCB0YWtlIGEgc2luZ2xlIGludCBwYXJhbWV0ZXI7IGl0cyByZXR1cm4gdmFsdWUgbWF5IGJlIGFueSB0eXBlLiBNZXRob2RzIHdpdGggdGhpcworICogYW5ub3RhdGlvbiBtYXkgYmUgdXNlZCB3aXRoIHRoZSB7QGxpbmsgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5BbGxvY2F0aW9uSW5zdHJ1bWVudH0uCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKK3B1YmxpYyBAaW50ZXJmYWNlIEFsbG9jYXRpb25NZWFzdXJlbWVudCB7fQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9BcmJpdHJhcnlNZWFzdXJlbWVudC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9BcmJpdHJhcnlNZWFzdXJlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZmRkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL0FyYml0cmFyeU1lYXN1cmVtZW50LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBBbm5vdGF0aW9uIHRoYXQgaWRlbnRpZmllcyBhIGdpdmVuIG1ldGhvZCBhcyBhbiAiYXJiaXRyYXJ5IG1lYXN1cmVtZW50IiBtZXRob2QuIFRoZSBtZXRob2Qgc2hvdWxkCisgKiB0YWtlIG5vIHBhcmFtZXRlcnMgYW5kIHJldHVybiBhIGRvdWJsZSwgd2hpY2ggaXMgdGhlIG1lYXN1cmVkIHZhbHVlLgorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCitwdWJsaWMgQGludGVyZmFjZSBBcmJpdHJhcnlNZWFzdXJlbWVudCB7CisKKyAgLyoqCisgICAqIFRoZSB1bml0cyBmb3IgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgbWVhc3VyZW1lbnQgbWV0aG9kLgorICAgKi8KKyAgU3RyaW5nIHVuaXRzKCkgZGVmYXVsdCAiIjsKKworICAvKioKKyAgICogVGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVhbnRpdHkgbWVhc3VyZWQgYnkgdGhpcyBtZWFzdXJlbWVudCBtZXRob2QuCisgICAqLworICBTdHJpbmcgZGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9CZW5jaG1hcmtTcGVjLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL0JlbmNobWFya1NwZWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmZmZjRjCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9CZW5jaG1hcmtTcGVjLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5QZXJzaXN0ZW50SGFzaGluZy5nZXRQZXJzaXN0ZW50SGFzaEZ1bmN0aW9uOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTb3J0ZWRNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guRnVubmVsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guUHJpbWl0aXZlU2luazsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKKworLyoqCisgKiBBIHNwZWNpZmljYXRpb24gYnkgd2hpY2ggYSBiZW5jaG1hcmsgbWV0aG9kIGludm9jYXRpb24gY2FuIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCisgKgorICogQGF1dGhvciBnYWtAZ29vZ2xlLmNvbSAoR3JlZ29yeSBLaWNrKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmVuY2htYXJrU3BlYyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHN0YXRpYyBmaW5hbCBCZW5jaG1hcmtTcGVjIERFRkFVTFQgPSBuZXcgQmVuY2htYXJrU3BlYygpOworCisgIEBFeGNsdWRlRnJvbUpzb24gcHJpdmF0ZSBpbnQgaWQ7CisgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKyAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZTsKKyAgcHJpdmF0ZSBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7CisgIEBFeGNsdWRlRnJvbUpzb24gcHJpdmF0ZSBpbnQgaGFzaDsKKworICBwcml2YXRlIEJlbmNobWFya1NwZWMoKSB7CisgICAgdGhpcy5jbGFzc05hbWUgPSAiIjsKKyAgICB0aGlzLm1ldGhvZE5hbWUgPSAiIjsKKyAgICB0aGlzLnBhcmFtZXRlcnMgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKyAgfQorCisgIHByaXZhdGUgQmVuY2htYXJrU3BlYyhCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICB0aGlzLmNsYXNzTmFtZSA9IGJ1aWxkZXIuY2xhc3NOYW1lOworICAgIHRoaXMubWV0aG9kTmFtZSA9IGJ1aWxkZXIubWV0aG9kTmFtZTsKKyAgICB0aGlzLnBhcmFtZXRlcnMgPSBNYXBzLm5ld1RyZWVNYXAoYnVpbGRlci5wYXJhbWV0ZXJzKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lKCkgeworICAgIHJldHVybiBjbGFzc05hbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIG1ldGhvZE5hbWUoKSB7CisgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgIH0KKworICBwdWJsaWMgSW1tdXRhYmxlU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiBJbW11dGFibGVTb3J0ZWRNYXAuY29weU9mKHBhcmFtZXRlcnMpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJlbmNobWFya1NwZWMpIHsKKyAgICAgIEJlbmNobWFya1NwZWMgdGhhdCA9IChCZW5jaG1hcmtTcGVjKSBvYmo7CisgICAgICByZXR1cm4gdGhpcy5jbGFzc05hbWUuZXF1YWxzKHRoYXQuY2xhc3NOYW1lKQorICAgICAgICAgICYmIHRoaXMubWV0aG9kTmFtZS5lcXVhbHModGhhdC5tZXRob2ROYW1lKQorICAgICAgICAgICYmIHRoaXMucGFyYW1ldGVycy5lcXVhbHModGhhdC5wYXJhbWV0ZXJzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0SGFzaCgpIHsKKyAgICBpZiAoaGFzaCA9PSAwKSB7CisgICAgICB0aGlzLmhhc2ggPSBnZXRQZXJzaXN0ZW50SGFzaEZ1bmN0aW9uKCkKKyAgICAgICAgICAuaGFzaE9iamVjdCh0aGlzLCBCZW5jaG1hcmtTcGVjRnVubmVsLklOU1RBTkNFKS5hc0ludCgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGluaXRIYXNoKCk7CisgICAgcmV0dXJuIGhhc2g7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gTW9yZU9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgICAgLmFkZCgiY2xhc3NOYW1lIiwgY2xhc3NOYW1lKQorICAgICAgICAuYWRkKCJtZXRob2ROYW1lIiwgbWV0aG9kTmFtZSkKKyAgICAgICAgLmFkZCgicGFyYW1ldGVycyIsIHBhcmFtZXRlcnMpCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKKyAgZW51bSBCZW5jaG1hcmtTcGVjRnVubmVsIGltcGxlbWVudHMgRnVubmVsPEJlbmNobWFya1NwZWM+IHsKKyAgICBJTlNUQU5DRTsKKworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBmdW5uZWwoQmVuY2htYXJrU3BlYyBmcm9tLCBQcmltaXRpdmVTaW5rIGludG8pIHsKKyAgICAgIGludG8ucHV0VW5lbmNvZGVkQ2hhcnMoZnJvbS5jbGFzc05hbWUpCisgICAgICAgICAgLnB1dFVuZW5jb2RlZENoYXJzKGZyb20ubWV0aG9kTmFtZSk7CisgICAgICBTdHJpbmdNYXBGdW5uZWwuSU5TVEFOQ0UuZnVubmVsKGZyb20ucGFyYW1ldGVycywgaW50byk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IE1hcHMubmV3VHJlZU1hcCgpOworCisgICAgcHVibGljIEJ1aWxkZXIgY2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2hlY2tOb3ROdWxsKGNsYXNzTmFtZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBtZXRob2ROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBjaGVja05vdE51bGwobWV0aG9kTmFtZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBhZGRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtZXRlck5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgdGhpcy5wYXJhbWV0ZXJzLnB1dChjaGVja05vdE51bGwocGFyYW1ldGVyTmFtZSksIGNoZWNrTm90TnVsbCh2YWx1ZSkpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgYWRkQWxsUGFyYW1ldGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKKyAgICAgIHRoaXMucGFyYW1ldGVycy5wdXRBbGwocGFyYW1ldGVycyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQmVuY2htYXJrU3BlYyBidWlsZCgpIHsKKyAgICAgIGNoZWNrU3RhdGUoY2xhc3NOYW1lICE9IG51bGwpOworICAgICAgY2hlY2tTdGF0ZShtZXRob2ROYW1lICE9IG51bGwpOworICAgICAgcmV0dXJuIG5ldyBCZW5jaG1hcmtTcGVjKHRoaXMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9EZWZhdWx0cy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9EZWZhdWx0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjVlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL0RlZmF1bHRzLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWw7CisKK2ltcG9ydCBvcmcuam9kYS50aW1lLkluc3RhbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworLyoqCisgKiBEZWZhdWx0IGluc3RhbmNlcyBvZiBub24tbW9kZWwgY2xhc3NlcyB1c2VkIGJ5IHRoZSBDYWxpcGVyIG1vZGVsLiBUaGVzZSBhcmUgcHJlc2VudCB0byBmYWNpbGl0YXRlCisgKiBHc29uIGRlc2VyaWFsaXphdGlvbi4KKyAqLworZmluYWwgY2xhc3MgRGVmYXVsdHMgeworICBzdGF0aWMgZmluYWwgVVVJRCBVVUlEID0gbmV3IFVVSUQoMEwsIDBMKTsKKyAgc3RhdGljIGZpbmFsIEluc3RhbnQgSU5TVEFOVCA9IG5ldyBJbnN0YW50KDBMKTsKKworICBwcml2YXRlIERlZmF1bHRzKCkge30KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvRXhjbHVkZUZyb21Kc29uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL0V4Y2x1ZGVGcm9tSnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjBiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL0V4Y2x1ZGVGcm9tSnNvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogSW5kaWNhdGVzIHRoYXQgYSBmaWVsZCBvciB0eXBlIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZCB0byBKU09OLgorICovCitAVGFyZ2V0KHtGSUVMRCwgVFlQRX0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBFeGNsdWRlRnJvbUpzb24ge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvSG9zdC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9Ib3N0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkMDk4YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvSG9zdC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuUGVyc2lzdGVudEhhc2hpbmcuZ2V0UGVyc2lzdGVudEhhc2hGdW5jdGlvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTb3J0ZWRNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guRnVubmVsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guSGFzaEZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guUHJpbWl0aXZlU2luazsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogVGhlIHBlcmZvcm1hbmNlLWluZm9ybWluZyBwcm9wZXJ0aWVzIG9mIHRoZSBob3N0IG9uIHdoaWNoIGEgYmVuY2htYXJrIGlzIHJ1bi4KKyAqCisgKiBAYXV0aG9yIGdha0Bnb29nbGUuY29tIChHcmVnb3J5IEtpY2spCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBIb3N0IHsKKyAgc3RhdGljIGZpbmFsIEhvc3QgREVGQVVMVCA9IG5ldyBIb3N0KCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhvc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBARXhjbHVkZUZyb21Kc29uIHByaXZhdGUgaW50IGlkOworICBwcml2YXRlIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllczsKKyAgQEV4Y2x1ZGVGcm9tSnNvbiBwcml2YXRlIGludCBoYXNoOworCisgIHByaXZhdGUgSG9zdCgpIHsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKyAgfQorCisgIHByaXZhdGUgSG9zdChCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBNYXBzLm5ld1RyZWVNYXAoYnVpbGRlci5wcm9wZXJ0aWVzKTsKKyAgICAvLyBlYWdlcmx5IGluaXRpYWxpemUgaGFzaCB0byBhbGxvdyBmb3IgdGhlIHRlc3Qtb25seSBoYXNoIGZ1bmN0aW9uCisgICAgaW5pdEhhc2goYnVpbGRlci5oYXNoRnVuY3Rpb24pOworICB9CisKKyAgcHVibGljIEltbXV0YWJsZVNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcygpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlU29ydGVkTWFwLmNvcHlPZihwcm9wZXJ0aWVzKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBIb3N0KSB7CisgICAgICBIb3N0IHRoYXQgPSAoSG9zdCkgb2JqOworICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5lcXVhbHModGhhdC5wcm9wZXJ0aWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0SGFzaChIYXNoRnVuY3Rpb24gaGFzaEZ1bmN0aW9uKSB7CisgICAgaWYgKGhhc2ggPT0gMCkgeworICAgICAgdGhpcy5oYXNoID0gaGFzaEZ1bmN0aW9uLmhhc2hPYmplY3QodGhpcywgSG9zdEZ1bm5lbC5JTlNUQU5DRSkuYXNJbnQoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdEhhc2goKSB7CisgICAgaW5pdEhhc2goZ2V0UGVyc2lzdGVudEhhc2hGdW5jdGlvbigpKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGluaXRIYXNoKCk7CisgICAgcmV0dXJuIGhhc2g7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gTW9yZU9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgICAgLmFkZCgicHJvcGVydGllcyIsIHByb3BlcnRpZXMpCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKKyAgZW51bSBIb3N0RnVubmVsIGltcGxlbWVudHMgRnVubmVsPEhvc3Q+IHsKKyAgICBJTlNUQU5DRTsKKworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBmdW5uZWwoSG9zdCBmcm9tLCBQcmltaXRpdmVTaW5rIGludG8pIHsKKyAgICAgIFN0cmluZ01hcEZ1bm5lbC5JTlNUQU5DRS5mdW5uZWwoZnJvbS5wcm9wZXJ0aWVzLCBpbnRvKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgIHByaXZhdGUgZmluYWwgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgICAgcHJpdmF0ZSBIYXNoRnVuY3Rpb24gaGFzaEZ1bmN0aW9uID0gZ2V0UGVyc2lzdGVudEhhc2hGdW5jdGlvbigpOworCisgICAgcHVibGljIEJ1aWxkZXIgYWRkUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGFkZEFsbFByb3BlcmllcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMpIHsKKyAgICAgIHRoaXMucHJvcGVydGllcy5wdXRBbGwocHJvcGVydGllcyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG9ubHkgZXhpc3RzIGZvciB0ZXN0cyB0byBpbmR1Y2UgaGFzaCBjb2xsaXNpb25zLiBPbmx5IHVzZSB0aGlzIGluIHRlc3QgY29kZSBhcyBjaGFuZ2luZworICAgICAqIHRoZSBoYXNoIGZ1bmN0aW9uIHdpbGwgYnJlYWsgcGVyc2lzdGVkIG9iamVjdHMuCisgICAgICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nIHB1YmxpYyBCdWlsZGVyIGhhc2hGdW5jdGlvbkZvclRlc3RpbmcoSGFzaEZ1bmN0aW9uIGhhc2hGdW5jdGlvbikgeworICAgICAgbG9nZ2VyLndhcm5pbmcoInNvbWVib2R5IGlzIHNldHRpbmcgdGhlIGhhc2ggZnVuY3Rpb24uIHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiB0ZXN0cyIpOworICAgICAgdGhpcy5oYXNoRnVuY3Rpb24gPSBjaGVja05vdE51bGwoaGFzaEZ1bmN0aW9uKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBIb3N0IGJ1aWxkKCkgeworICAgICAgcmV0dXJuIG5ldyBIb3N0KHRoaXMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9JbnN0cnVtZW50U3BlYy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9JbnN0cnVtZW50U3BlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2NkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL0luc3RydW1lbnRTcGVjLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5QZXJzaXN0ZW50SGFzaGluZy5nZXRQZXJzaXN0ZW50SGFzaEZ1bmN0aW9uOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTb3J0ZWRNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworCisvKioKKyAqIEEgc3BlY2lmaWNhdGlvbiBieSB3aGljaCB0aGUgYXBwbGljYXRpb24gb2YgYW4gaW5zdHJ1bWVudCBjYW4gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KKyAqCisgKiBAYXV0aG9yIGdha0Bnb29nbGUuY29tIChHcmVnb3J5IEtpY2spCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnN0cnVtZW50U3BlYyB7CisgIHN0YXRpYyBmaW5hbCBJbnN0cnVtZW50U3BlYyBERUZBVUxUID0gbmV3IEluc3RydW1lbnRTcGVjKCk7CisKKyAgQEV4Y2x1ZGVGcm9tSnNvbgorICBwcml2YXRlIGludCBpZDsKKyAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworICBwcml2YXRlIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9uczsKKyAgQEV4Y2x1ZGVGcm9tSnNvbgorICBwcml2YXRlIGludCBoYXNoOworCisgIHByaXZhdGUgSW5zdHJ1bWVudFNwZWMoKSB7CisgICAgdGhpcy5jbGFzc05hbWUgPSAiIjsKKyAgICB0aGlzLm9wdGlvbnMgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKyAgfQorCisgIHByaXZhdGUgSW5zdHJ1bWVudFNwZWMoQnVpbGRlciBidWlsZGVyKSB7CisgICAgdGhpcy5jbGFzc05hbWUgPSBidWlsZGVyLmNsYXNzTmFtZTsKKyAgICB0aGlzLm9wdGlvbnMgPSBNYXBzLm5ld1RyZWVNYXAoYnVpbGRlci5vcHRpb25zKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lKCkgeworICAgIHJldHVybiBjbGFzc05hbWU7CisgIH0KKworICBwdWJsaWMgSW1tdXRhYmxlU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKCkgeworICAgIHJldHVybiBJbW11dGFibGVTb3J0ZWRNYXAuY29weU9mKG9wdGlvbnMpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEluc3RydW1lbnRTcGVjKSB7CisgICAgICBJbnN0cnVtZW50U3BlYyB0aGF0ID0gKEluc3RydW1lbnRTcGVjKSBvYmo7CisgICAgICByZXR1cm4gdGhpcy5jbGFzc05hbWUuZXF1YWxzKHRoYXQuY2xhc3NOYW1lKQorICAgICAgICAgICYmIHRoaXMub3B0aW9ucy5lcXVhbHModGhhdC5vcHRpb25zKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0SGFzaCgpIHsKKyAgICBpZiAoaGFzaCA9PSAwKSB7CisgICAgICB0aGlzLmhhc2ggPSBnZXRQZXJzaXN0ZW50SGFzaEZ1bmN0aW9uKCkKKyAgICAgICAgICAubmV3SGFzaGVyKCkKKyAgICAgICAgICAucHV0VW5lbmNvZGVkQ2hhcnMoY2xhc3NOYW1lKQorICAgICAgICAgIC5wdXRPYmplY3Qob3B0aW9ucywgU3RyaW5nTWFwRnVubmVsLklOU1RBTkNFKQorICAgICAgICAgIC5oYXNoKCkuYXNJbnQoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBpbml0SGFzaCgpOworICAgIHJldHVybiBoYXNoOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSkKKyAgICAgICAgLmFkZCgib3B0aW9ucyIsIG9wdGlvbnMpCisgICAgICAgIC50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKworICAgIHB1YmxpYyBCdWlsZGVyIGNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNoZWNrTm90TnVsbChjbGFzc05hbWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgaW5zdHJ1bWVudENsYXNzKENsYXNzPD8+IGluc3R1cm1lbnRDbGFzcykgeworICAgICAgcmV0dXJuIGNsYXNzTmFtZShpbnN0dXJtZW50Q2xhc3MuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBhZGRPcHRpb24oU3RyaW5nIG9wdGlvbiwgU3RyaW5nIHZhbHVlKSB7CisgICAgICB0aGlzLm9wdGlvbnMucHV0KG9wdGlvbiwgdmFsdWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgYWRkQWxsT3B0aW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpIHsKKyAgICAgIHRoaXMub3B0aW9ucy5wdXRBbGwob3B0aW9ucyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5zdHJ1bWVudFNwZWMgYnVpbGQoKSB7CisgICAgICBjaGVja1N0YXRlKGNsYXNzTmFtZSAhPSBudWxsKTsKKyAgICAgIHJldHVybiBuZXcgSW5zdHJ1bWVudFNwZWModGhpcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL01lYXN1cmVtZW50LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL01lYXN1cmVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmZmNlNwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvTWVhc3VyZW1lbnQuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXBzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBzaW5nbGUsIHdlaWdodGVkIG1lYXN1cmVtZW50LgorICoKKyAqIEBhdXRob3IgZ2FrQGdvb2dsZS5jb20gKEdyZWdvcnkgS2ljaykKKyAqLworcHVibGljIGNsYXNzIE1lYXN1cmVtZW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIHN0YXRpYyBJbW11dGFibGVMaXN0TXVsdGltYXA8U3RyaW5nLCBNZWFzdXJlbWVudD4gaW5kZXhCeURlc2NyaXB0aW9uKAorICAgICAgSXRlcmFibGU8TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50cykgeworICAgIHJldHVybiBNdWx0aW1hcHMuaW5kZXgobWVhc3VyZW1lbnRzLCBuZXcgRnVuY3Rpb248TWVhc3VyZW1lbnQsIFN0cmluZz4oKSB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBhcHBseShNZWFzdXJlbWVudCBpbnB1dCkgeworICAgICAgICByZXR1cm4gaW5wdXQuZGVzY3JpcHRpb247CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBARXhjbHVkZUZyb21Kc29uCisgIHByaXZhdGUgaW50IGlkOworICBwcml2YXRlIFZhbHVlIHZhbHVlOworICBwcml2YXRlIGRvdWJsZSB3ZWlnaHQ7CisgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgIHByaXZhdGUgTWVhc3VyZW1lbnQoKSB7CisgICAgdGhpcy52YWx1ZSA9IFZhbHVlLkRFRkFVTFQ7CisgICAgdGhpcy53ZWlnaHQgPSAwLjA7CisgICAgdGhpcy5kZXNjcmlwdGlvbiA9ICIiOworICB9CisKKyAgcHJpdmF0ZSBNZWFzdXJlbWVudChCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICB0aGlzLnZhbHVlID0gYnVpbGRlci52YWx1ZTsKKyAgICB0aGlzLmRlc2NyaXB0aW9uID0gYnVpbGRlci5kZXNjcmlwdGlvbjsKKyAgICB0aGlzLndlaWdodCA9IGJ1aWxkZXIud2VpZ2h0OworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1lYXN1cmVtZW50KSB7CisgICAgICBNZWFzdXJlbWVudCB0aGF0ID0gKE1lYXN1cmVtZW50KSBvYmo7CisgICAgICByZXR1cm4gdGhpcy52YWx1ZS5lcXVhbHModGhhdC52YWx1ZSkKKyAgICAgICAgICAmJiB0aGlzLndlaWdodCA9PSB0aGF0LndlaWdodAorICAgICAgICAgICYmIHRoaXMuZGVzY3JpcHRpb24uZXF1YWxzKHRoYXQuZGVzY3JpcHRpb24pOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUodmFsdWUsIHdlaWdodCwgZGVzY3JpcHRpb24pOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoInZhbHVlIiwgdmFsdWUpCisgICAgICAgIC5hZGQoIndlaWdodCIsIHdlaWdodCkKKyAgICAgICAgLmFkZCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbikKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgVmFsdWUgdmFsdWUoKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIGRvdWJsZSB3ZWlnaHQoKSB7CisgICAgcmV0dXJuIHdlaWdodDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICBwcml2YXRlIFZhbHVlIHZhbHVlOworICAgIHByaXZhdGUgRG91YmxlIHdlaWdodDsKKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgIHB1YmxpYyBCdWlsZGVyIHZhbHVlKFZhbHVlIHZhbHVlKSB7CisgICAgICB0aGlzLnZhbHVlID0gY2hlY2tOb3ROdWxsKHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHdlaWdodChkb3VibGUgd2VpZ2h0KSB7CisgICAgICBjaGVja0FyZ3VtZW50KHdlaWdodCA+IDApOworICAgICAgdGhpcy53ZWlnaHQgPSB3ZWlnaHQ7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBkZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBjaGVja05vdE51bGwoZGVzY3JpcHRpb24pOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lYXN1cmVtZW50IGJ1aWxkKCkgeworICAgICAgY2hlY2tBcmd1bWVudCh2YWx1ZSAhPSBudWxsKTsKKyAgICAgIGNoZWNrQXJndW1lbnQod2VpZ2h0ICE9IG51bGwpOworICAgICAgY2hlY2tBcmd1bWVudChkZXNjcmlwdGlvbiAhPSBudWxsKTsKKyAgICAgIHJldHVybiBuZXcgTWVhc3VyZW1lbnQodGhpcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL1BlcnNpc3RlbnRIYXNoaW5nLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL1BlcnNpc3RlbnRIYXNoaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhM2UwOAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvUGVyc2lzdGVudEhhc2hpbmcuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guSGFzaEZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guSGFzaGluZzsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgZm9yIHN0YW5kYXJkaXppbmcgdGhlIGhhc2ggZnVuY3Rpb24gdGhhdCB3ZSdyZSB1c2luZyBmb3IgcGVyc2lzdGVuY2UuCisgKi8KK2ZpbmFsIGNsYXNzIFBlcnNpc3RlbnRIYXNoaW5nIHsKKyAgcHJpdmF0ZSBQZXJzaXN0ZW50SGFzaGluZygpIHt9CisKKyAgc3RhdGljIEhhc2hGdW5jdGlvbiBnZXRQZXJzaXN0ZW50SGFzaEZ1bmN0aW9uKCkgeworICAgIHJldHVybiBIYXNoaW5nLm11cm11cjNfMzIoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9SdW4uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvUnVuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5NzMzYgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvUnVuLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CisKK2ltcG9ydCBvcmcuam9kYS50aW1lLkluc3RhbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworLyoqCisgKiBBIHNpbmdsZSBpbnZvY2F0aW9uIG9mIGNhbGlwZXIuCisgKgorICogQGF1dGhvciBnYWtAZ29vZ2xlLmNvbSAoR3JlZ29yeSBLaWNrKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUnVuIHsKKyAgc3RhdGljIGZpbmFsIFJ1biBERUZBVUxUID0gbmV3IFJ1bigpOworCisgIHByaXZhdGUgVVVJRCBpZDsKKyAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7CisgIHByaXZhdGUgSW5zdGFudCBzdGFydFRpbWU7CisKKyAgcHJpdmF0ZSBSdW4oKSB7CisgICAgdGhpcy5pZCA9IERlZmF1bHRzLlVVSUQ7CisgICAgdGhpcy5sYWJlbCA9ICIiOworICAgIHRoaXMuc3RhcnRUaW1lID0gRGVmYXVsdHMuSU5TVEFOVDsKKyAgfQorCisgIHByaXZhdGUgUnVuKEJ1aWxkZXIgYnVpbGRlcikgeworICAgIHRoaXMuaWQgPSBidWlsZGVyLmlkOworICAgIHRoaXMubGFiZWwgPSBidWlsZGVyLmxhYmVsOworICAgIHRoaXMuc3RhcnRUaW1lID0gYnVpbGRlci5zdGFydFRpbWU7CisgIH0KKworICBwdWJsaWMgVVVJRCBpZCgpIHsKKyAgICByZXR1cm4gaWQ7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGxhYmVsKCkgeworICAgIHJldHVybiBsYWJlbDsKKyAgfQorCisgIHB1YmxpYyBJbnN0YW50IHN0YXJ0VGltZSgpIHsKKyAgICByZXR1cm4gc3RhcnRUaW1lOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJ1bikgeworICAgICAgUnVuIHRoYXQgPSAoUnVuKSBvYmo7CisgICAgICByZXR1cm4gdGhpcy5pZC5lcXVhbHModGhhdC5pZCkKKyAgICAgICAgICAmJiB0aGlzLmxhYmVsLmVxdWFscyh0aGF0LmxhYmVsKQorICAgICAgICAgICYmIHRoaXMuc3RhcnRUaW1lLmVxdWFscyh0aGF0LnN0YXJ0VGltZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShpZCwgbGFiZWwsIHN0YXJ0VGltZSk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gTW9yZU9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgICAgLmFkZCgiaWQiLCBpZCkKKyAgICAgICAgLmFkZCgibGFiZWwiLCBsYWJlbCkKKyAgICAgICAgLmFkZCgic3RhcnRUaW1lIiwgc3RhcnRUaW1lKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgcHJpdmF0ZSBVVUlEIGlkOworICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsID0gIiI7CisgICAgcHJpdmF0ZSBJbnN0YW50IHN0YXJ0VGltZTsKKworICAgIHB1YmxpYyBCdWlsZGVyKFVVSUQgaWQpIHsKKyAgICAgIHRoaXMuaWQgPSBjaGVja05vdE51bGwoaWQpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGxhYmVsKFN0cmluZyBsYWJlbCkgeworICAgICAgdGhpcy5sYWJlbCA9IGNoZWNrTm90TnVsbChsYWJlbCk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzdGFydFRpbWUoSW5zdGFudCBzdGFydFRpbWUpIHsKKyAgICAgIHRoaXMuc3RhcnRUaW1lID0gY2hlY2tOb3ROdWxsKHN0YXJ0VGltZSk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUnVuIGJ1aWxkKCkgeworICAgICAgY2hlY2tTdGF0ZShpZCAhPSBudWxsKTsKKyAgICAgIGNoZWNrU3RhdGUoc3RhcnRUaW1lICE9IG51bGwpOworICAgICAgcmV0dXJuIG5ldyBSdW4odGhpcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL1NjZW5hcmlvLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL1NjZW5hcmlvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0ZDRhYgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvU2NlbmFyaW8uamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlBlcnNpc3RlbnRIYXNoaW5nLmdldFBlcnNpc3RlbnRIYXNoRnVuY3Rpb247CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkJlbmNobWFya1NwZWMuQmVuY2htYXJrU3BlY0Z1bm5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuSG9zdC5Ib3N0RnVubmVsOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5WbVNwZWMuVm1TcGVjRnVubmVsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CisKKy8qKgorICogVGhlIGNvbWJpbmF0aW9uIG9mIHByb3BlcnRpZXMgd2hvc2UgY29tYmluYXRpb24sIHdoZW4gbWVhc3VyZWQgd2l0aCBhIHBhcnRpY3VsYXIgaW5zdHJ1bWVudCwKKyAqIHNob3VsZCBwcm9kdWNlIGEgcmVwZWF0YWJsZSByZXN1bHQKKyAqCisgKiBAYXV0aG9yIGdha0Bnb29nbGUuY29tIChHcmVnb3J5IEtpY2spCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTY2VuYXJpbyB7CisgIHN0YXRpYyBmaW5hbCBTY2VuYXJpbyBERUZBVUxUID0gbmV3IFNjZW5hcmlvKCk7CisKKyAgQEV4Y2x1ZGVGcm9tSnNvbiBwcml2YXRlIGludCBpZDsKKyAgcHJpdmF0ZSBIb3N0IGhvc3Q7CisgIHByaXZhdGUgVm1TcGVjIHZtU3BlYzsKKyAgcHJpdmF0ZSBCZW5jaG1hcmtTcGVjIGJlbmNobWFya1NwZWM7CisgIC8vIFRPRE8oZ2FrKTogaW5jbHVkZSBkYXRhIGFib3V0IGNhbGlwZXIgaXRzZWxmIGFuZCB0aGUgY29kZSBiZWluZyBiZW5jaG1hcmtlZAorICBARXhjbHVkZUZyb21Kc29uIHByaXZhdGUgaW50IGhhc2g7CisKKyAgcHJpdmF0ZSBTY2VuYXJpbygpIHsKKyAgICB0aGlzLmhvc3QgPSBIb3N0LkRFRkFVTFQ7CisgICAgdGhpcy52bVNwZWMgPSBWbVNwZWMuREVGQVVMVDsKKyAgICB0aGlzLmJlbmNobWFya1NwZWMgPSBCZW5jaG1hcmtTcGVjLkRFRkFVTFQ7CisgIH0KKworICBwcml2YXRlIFNjZW5hcmlvKEJ1aWxkZXIgYnVpbGRlcikgeworICAgIHRoaXMuaG9zdCA9IGJ1aWxkZXIuaG9zdDsKKyAgICB0aGlzLnZtU3BlYyA9IGJ1aWxkZXIudm1TcGVjOworICAgIHRoaXMuYmVuY2htYXJrU3BlYyA9IGJ1aWxkZXIuYmVuY2htYXJrU3BlYzsKKyAgfQorCisgIHB1YmxpYyBIb3N0IGhvc3QoKSB7CisgICAgcmV0dXJuIGhvc3Q7CisgIH0KKworICBwdWJsaWMgVm1TcGVjIHZtU3BlYygpIHsKKyAgICByZXR1cm4gdm1TcGVjOworICB9CisKKyAgcHVibGljIEJlbmNobWFya1NwZWMgYmVuY2htYXJrU3BlYygpIHsKKyAgICByZXR1cm4gYmVuY2htYXJrU3BlYzsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTY2VuYXJpbykgeworICAgICAgU2NlbmFyaW8gdGhhdCA9IChTY2VuYXJpbykgb2JqOworICAgICAgcmV0dXJuIHRoaXMuaG9zdC5lcXVhbHModGhhdC5ob3N0KQorICAgICAgICAgICYmIHRoaXMudm1TcGVjLmVxdWFscyh0aGF0LnZtU3BlYykKKyAgICAgICAgICAmJiB0aGlzLmJlbmNobWFya1NwZWMuZXF1YWxzKHRoYXQuYmVuY2htYXJrU3BlYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdEhhc2goKSB7CisgICAgaWYgKGhhc2ggPT0gMCkgeworICAgICAgdGhpcy5oYXNoID0gZ2V0UGVyc2lzdGVudEhhc2hGdW5jdGlvbigpCisgICAgICAgICAgLm5ld0hhc2hlcigpCisgICAgICAgICAgLnB1dE9iamVjdChob3N0LCBIb3N0RnVubmVsLklOU1RBTkNFKQorICAgICAgICAgIC5wdXRPYmplY3Qodm1TcGVjLCBWbVNwZWNGdW5uZWwuSU5TVEFOQ0UpCisgICAgICAgICAgLnB1dE9iamVjdChiZW5jaG1hcmtTcGVjLCBCZW5jaG1hcmtTcGVjRnVubmVsLklOU1RBTkNFKQorICAgICAgICAgIC5oYXNoKCkuYXNJbnQoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBpbml0SGFzaCgpOworICAgIHJldHVybiBoYXNoOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoImVudmlyb25tZW50IiwgaG9zdCkKKyAgICAgICAgLmFkZCgidm1TcGVjIiwgdm1TcGVjKQorICAgICAgICAuYWRkKCJiZW5jaG1hcmtTcGVjIiwgYmVuY2htYXJrU3BlYykKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgIHByaXZhdGUgSG9zdCBob3N0OworICAgIHByaXZhdGUgVm1TcGVjIHZtU3BlYzsKKyAgICBwcml2YXRlIEJlbmNobWFya1NwZWMgYmVuY2htYXJrU3BlYzsKKworICAgIHB1YmxpYyBCdWlsZGVyIGhvc3QoSG9zdC5CdWlsZGVyIGhvc3RCdWlsZGVyKSB7CisgICAgICByZXR1cm4gaG9zdChob3N0QnVpbGRlci5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBob3N0KEhvc3QgaG9zdCkgeworICAgICAgdGhpcy5ob3N0ID0gY2hlY2tOb3ROdWxsKGhvc3QpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgdm1TcGVjKFZtU3BlYy5CdWlsZGVyIHZtU3BlY0J1aWxkZXIpIHsKKyAgICAgIHJldHVybiB2bVNwZWModm1TcGVjQnVpbGRlci5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciB2bVNwZWMoVm1TcGVjIHZtU3BlYykgeworICAgICAgdGhpcy52bVNwZWMgPSBjaGVja05vdE51bGwodm1TcGVjKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGJlbmNobWFya1NwZWMoQmVuY2htYXJrU3BlYy5CdWlsZGVyIGJlbmNobWFya1NwZWNCdWlsZGVyKSB7CisgICAgICByZXR1cm4gYmVuY2htYXJrU3BlYyhiZW5jaG1hcmtTcGVjQnVpbGRlci5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBiZW5jaG1hcmtTcGVjKEJlbmNobWFya1NwZWMgYmVuY2htYXJrU3BlYykgeworICAgICAgdGhpcy5iZW5jaG1hcmtTcGVjID0gY2hlY2tOb3ROdWxsKGJlbmNobWFya1NwZWMpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFNjZW5hcmlvIGJ1aWxkKCkgeworICAgICAgY2hlY2tTdGF0ZShob3N0ICE9IG51bGwpOworICAgICAgY2hlY2tTdGF0ZSh2bVNwZWMgIT0gbnVsbCk7CisgICAgICBjaGVja1N0YXRlKGJlbmNobWFya1NwZWMgIT0gbnVsbCk7CisgICAgICByZXR1cm4gbmV3IFNjZW5hcmlvKHRoaXMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9TdHJpbmdNYXBGdW5uZWwuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvU3RyaW5nTWFwRnVubmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzZjQzYgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvU3RyaW5nTWFwRnVubmVsLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5oYXNoLkZ1bm5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5oYXNoLlByaW1pdGl2ZVNpbms7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKKy8qKgorICogQSBzaW1wbGUgZnVubmVsIHRoYXQgaW5zZXJ0cyBzdHJpbmcgbWFwIGVudHJpZXMgaW50byBhIGZ1bm5lbCBpbiBpdGVyYXRpb24gb3JkZXIuCisgKi8KK2VudW0gU3RyaW5nTWFwRnVubmVsIGltcGxlbWVudHMgRnVubmVsPE1hcDxTdHJpbmcsIFN0cmluZz4+IHsKKyAgSU5TVEFOQ0U7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGZ1bm5lbChNYXA8U3RyaW5nLCBTdHJpbmc+IGZyb20sIFByaW1pdGl2ZVNpbmsgaW50bykgeworICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogZnJvbS5lbnRyeVNldCgpKSB7CisgICAgICBpbnRvLnB1dFVuZW5jb2RlZENoYXJzKGVudHJ5LmdldEtleSgpKQorICAgICAgICAgIC5wdXRCeXRlKChieXRlKSAtMSkgLy8gc2VwYXJhdGUga2V5IGFuZCB2YWx1ZQorICAgICAgICAgIC5wdXRVbmVuY29kZWRDaGFycyhlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvVHJpYWwuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvVHJpYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODMzNGNmCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9UcmlhbC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKKy8qKgorICogQW4gaW52b2NhdGlvbiBvZiBhIHNpbmdsZSBzY2VuYXJpbyBtZWFzdXJlZCB3aXRoIGEgc2luZ2xlIGluc3RydW1lbnQgYW5kIHRoZSByZXN1bHRzIHRoZXJlb2YuCisgKgorICogQGF1dGhvciBnYWtAZ29vZ2xlLmNvbSAoR3JlZ29yeSBLaWNrKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHJpYWwgeyAvLyB1c2VkIHRvIGJlIFJlc3VsdAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFRyaWFsIERFRkFVTFQgPSBuZXcgVHJpYWwoKTsKKworICBwcml2YXRlIFVVSUQgaWQ7CisgIHByaXZhdGUgUnVuIHJ1bjsKKyAgcHJpdmF0ZSBJbnN0cnVtZW50U3BlYyBpbnN0cnVtZW50U3BlYzsKKyAgcHJpdmF0ZSBTY2VuYXJpbyBzY2VuYXJpbzsKKyAgcHJpdmF0ZSBMaXN0PE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHM7CisKKyAgcHJpdmF0ZSBUcmlhbCgpIHsKKyAgICB0aGlzLmlkID0gRGVmYXVsdHMuVVVJRDsKKyAgICB0aGlzLnJ1biA9IFJ1bi5ERUZBVUxUOworICAgIHRoaXMuaW5zdHJ1bWVudFNwZWMgPSBJbnN0cnVtZW50U3BlYy5ERUZBVUxUOworICAgIHRoaXMuc2NlbmFyaW8gPSBTY2VuYXJpby5ERUZBVUxUOworICAgIHRoaXMubWVhc3VyZW1lbnRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIH0KKworICBwcml2YXRlIFRyaWFsKEJ1aWxkZXIgYnVpbGRlcikgeworICAgIHRoaXMuaWQgPSBidWlsZGVyLmlkOworICAgIHRoaXMucnVuID0gYnVpbGRlci5ydW47CisgICAgdGhpcy5pbnN0cnVtZW50U3BlYyA9IGJ1aWxkZXIuaW5zdHJ1bWVudFNwZWM7CisgICAgdGhpcy5zY2VuYXJpbyA9IGJ1aWxkZXIuc2NlbmFyaW87CisgICAgdGhpcy5tZWFzdXJlbWVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoYnVpbGRlci5tZWFzdXJlbWVudHMpOworICB9CisKKyAgcHVibGljIFVVSUQgaWQoKSB7CisgICAgcmV0dXJuIGlkOworICB9CisKKyAgcHVibGljIFJ1biBydW4oKSB7CisgICAgcmV0dXJuIHJ1bjsKKyAgfQorCisgIHB1YmxpYyBJbnN0cnVtZW50U3BlYyBpbnN0cnVtZW50U3BlYygpIHsKKyAgICByZXR1cm4gaW5zdHJ1bWVudFNwZWM7CisgIH0KKworICBwdWJsaWMgU2NlbmFyaW8gc2NlbmFyaW8oKSB7CisgICAgcmV0dXJuIHNjZW5hcmlvOworICB9CisKKyAgcHVibGljIEltbXV0YWJsZUxpc3Q8TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50cygpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5jb3B5T2YobWVhc3VyZW1lbnRzKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUcmlhbCkgeworICAgICAgVHJpYWwgdGhhdCA9IChUcmlhbCkgb2JqOworICAgICAgcmV0dXJuIHRoaXMuaWQuZXF1YWxzKHRoYXQuaWQpCisgICAgICAgICAgJiYgdGhpcy5ydW4uZXF1YWxzKHRoYXQucnVuKQorICAgICAgICAgICYmIHRoaXMuaW5zdHJ1bWVudFNwZWMuZXF1YWxzKHRoYXQuaW5zdHJ1bWVudFNwZWMpCisgICAgICAgICAgJiYgdGhpcy5zY2VuYXJpby5lcXVhbHModGhhdC5zY2VuYXJpbykKKyAgICAgICAgICAmJiB0aGlzLm1lYXN1cmVtZW50cy5lcXVhbHModGhhdC5tZWFzdXJlbWVudHMpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUoaWQsIHJ1biwgaW5zdHJ1bWVudFNwZWMsIHNjZW5hcmlvLCBtZWFzdXJlbWVudHMpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoImlkIiwgaWQpCisgICAgICAgIC5hZGQoInJ1biIsIHJ1bikKKyAgICAgICAgLmFkZCgiaW5zdHJ1bWVudFNwZWMiLCBpbnN0cnVtZW50U3BlYykKKyAgICAgICAgLmFkZCgic2NlbmFyaW8iLCBzY2VuYXJpbykKKyAgICAgICAgLmFkZCgibWVhc3VyZW1lbnRzIiwgbWVhc3VyZW1lbnRzKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBVVUlEIGlkOworICAgIHByaXZhdGUgUnVuIHJ1bjsKKyAgICBwcml2YXRlIEluc3RydW1lbnRTcGVjIGluc3RydW1lbnRTcGVjOworICAgIHByaXZhdGUgU2NlbmFyaW8gc2NlbmFyaW87CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIHB1YmxpYyBCdWlsZGVyKFVVSUQgaWQpIHsKKyAgICAgIHRoaXMuaWQgPSBjaGVja05vdE51bGwoaWQpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHJ1bihSdW4uQnVpbGRlciBydW5CdWlsZGVyKSB7CisgICAgICByZXR1cm4gcnVuKHJ1bkJ1aWxkZXIuYnVpbGQoKSk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgcnVuKFJ1biBydW4pIHsKKyAgICAgIHRoaXMucnVuID0gY2hlY2tOb3ROdWxsKHJ1bik7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBpbnN0cnVtZW50U3BlYyhJbnN0cnVtZW50U3BlYy5CdWlsZGVyIGluc3RydW1lbnRTcGVjQnVpbGRlcikgeworICAgICAgcmV0dXJuIGluc3RydW1lbnRTcGVjKGluc3RydW1lbnRTcGVjQnVpbGRlci5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBpbnN0cnVtZW50U3BlYyhJbnN0cnVtZW50U3BlYyBpbnN0cnVtZW50U3BlYykgeworICAgICAgdGhpcy5pbnN0cnVtZW50U3BlYyA9IGNoZWNrTm90TnVsbChpbnN0cnVtZW50U3BlYyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzY2VuYXJpbyhTY2VuYXJpby5CdWlsZGVyIHNjZW5hcmlvQnVpbGRlcikgeworICAgICAgcmV0dXJuIHNjZW5hcmlvKHNjZW5hcmlvQnVpbGRlci5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBzY2VuYXJpbyhTY2VuYXJpbyBzY2VuYXJpbykgeworICAgICAgdGhpcy5zY2VuYXJpbyA9IGNoZWNrTm90TnVsbChzY2VuYXJpbyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBhZGRNZWFzdXJlbWVudChNZWFzdXJlbWVudC5CdWlsZGVyIG1lYXN1cmVtZW50QnVpbGRlcikgeworICAgICAgcmV0dXJuIGFkZE1lYXN1cmVtZW50KG1lYXN1cmVtZW50QnVpbGRlci5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBhZGRNZWFzdXJlbWVudChNZWFzdXJlbWVudCBtZWFzdXJlbWVudCkgeworICAgICAgdGhpcy5tZWFzdXJlbWVudHMuYWRkKG1lYXN1cmVtZW50KTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGFkZEFsbE1lYXN1cmVtZW50cyhJdGVyYWJsZTxNZWFzdXJlbWVudD4gbWVhc3VyZW1lbnRzKSB7CisgICAgICBJdGVyYWJsZXMuYWRkQWxsKHRoaXMubWVhc3VyZW1lbnRzLCBtZWFzdXJlbWVudHMpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFRyaWFsIGJ1aWxkKCkgeworICAgICAgY2hlY2tTdGF0ZShydW4gIT0gbnVsbCk7CisgICAgICBjaGVja1N0YXRlKGluc3RydW1lbnRTcGVjICE9IG51bGwpOworICAgICAgY2hlY2tTdGF0ZShzY2VuYXJpbyAhPSBudWxsKTsKKyAgICAgIHJldHVybiBuZXcgVHJpYWwodGhpcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL1ZhbHVlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL1ZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkYWVlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvVmFsdWUuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBtYWduaXR1ZGUgd2l0aCB1bml0cy4KKyAqCisgKiBAYXV0aG9yIGdha0Bnb29nbGUuY29tIChHcmVnb3J5IEtpY2spCisgKi8KK3B1YmxpYyBjbGFzcyBWYWx1ZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHN0YXRpYyBmaW5hbCBWYWx1ZSBERUZBVUxUID0gbmV3IFZhbHVlKCk7CisKKyAgcHVibGljIHN0YXRpYyBWYWx1ZSBjcmVhdGUoZG91YmxlIHZhbHVlLCBTdHJpbmcgdW5pdCkgeworICAgIHJldHVybiBuZXcgVmFsdWUodmFsdWUsIGNoZWNrTm90TnVsbCh1bml0KSk7CisgIH0KKworICBwcml2YXRlIGRvdWJsZSBtYWduaXR1ZGU7CisgIC8vIFRPRE8oZ2FrKTogZG8gc29tZXRoaW5nIHNtYXJ0ZXIgdGhhbiBzdHJpbmcgZm9yIHVuaXRzCisgIC8vIFRPRE8oZ2FrKTogZ2l2ZSBndWlkZWxpbmVzIGZvciBob3cgdG8gc3BlY2lmeSB1bml0cy4gIEUuZy4gcyBvciBzZWNvbmRzCisgIHByaXZhdGUgU3RyaW5nIHVuaXQ7CisKKyAgcHJpdmF0ZSBWYWx1ZSgpIHsKKyAgICB0aGlzLm1hZ25pdHVkZSA9IDAuMDsKKyAgICB0aGlzLnVuaXQgPSAiIjsKKyAgfQorCisgIHByaXZhdGUgVmFsdWUoZG91YmxlIHZhbHVlLCBTdHJpbmcgdW5pdCkgeworICAgIHRoaXMubWFnbml0dWRlID0gdmFsdWU7CisgICAgdGhpcy51bml0ID0gdW5pdDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdW5pdCgpIHsKKyAgICByZXR1cm4gdW5pdDsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgbWFnbml0dWRlKCkgeworICAgIHJldHVybiBtYWduaXR1ZGU7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqID09IHRoaXMpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVmFsdWUpIHsKKyAgICAgIFZhbHVlIHRoYXQgPSAoVmFsdWUpIG9iajsKKyAgICAgIHJldHVybiB0aGlzLm1hZ25pdHVkZSA9PSB0aGF0Lm1hZ25pdHVkZQorICAgICAgICAgICYmIHRoaXMudW5pdC5lcXVhbHModGhhdC51bml0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG1hZ25pdHVkZSwgdW5pdCk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQobWFnbml0dWRlKS5hcHBlbmQodW5pdCkudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9WbVNwZWMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvVm1TcGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiODM1YgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvbW9kZWwvVm1TcGVjLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5QZXJzaXN0ZW50SGFzaGluZy5nZXRQZXJzaXN0ZW50SGFzaEZ1bmN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNvcnRlZE1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaGFzaC5GdW5uZWw7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaGFzaC5QcmltaXRpdmVTaW5rOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworCisvKioKKyAqIEEgY29uZmlndXJhdGlvbiBvZiBhIHZpcnR1YWwgbWFjaGluZS4KKyAqCisgKiBAYXV0aG9yIGdha0Bnb29nbGUuY29tIChHcmVnb3J5IEtpY2spCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBWbVNwZWMgeworICBzdGF0aWMgZmluYWwgVm1TcGVjIERFRkFVTFQgPSBuZXcgVm1TcGVjKCk7CisKKyAgQEV4Y2x1ZGVGcm9tSnNvbiBwcml2YXRlIGludCBpZDsKKyAgcHJpdmF0ZSBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXM7CisgIHByaXZhdGUgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zOworICBARXhjbHVkZUZyb21Kc29uIHByaXZhdGUgaW50IGhhc2g7CisKKyAgcHJpdmF0ZSBWbVNwZWMoKSB7CisgICAgdGhpcy5wcm9wZXJ0aWVzID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgICAgdGhpcy5vcHRpb25zID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgIH0KKworICBwcml2YXRlIFZtU3BlYyhCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICB0aGlzLnByb3BlcnRpZXMgPSBNYXBzLm5ld1RyZWVNYXAoYnVpbGRlci5wcm9wZXJ0aWVzKTsKKyAgICB0aGlzLm9wdGlvbnMgPSBNYXBzLm5ld1RyZWVNYXAoYnVpbGRlci5vcHRpb25zKTsKKyAgfQorCisgIHB1YmxpYyBJbW11dGFibGVTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMoKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVNvcnRlZE1hcC5jb3B5T2Yob3B0aW9ucyk7CisgIH0KKworICBwdWJsaWMgSW1tdXRhYmxlU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzKCkgeworICAgIHJldHVybiBJbW11dGFibGVTb3J0ZWRNYXAuY29weU9mKHByb3BlcnRpZXMpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFZtU3BlYykgeworICAgICAgVm1TcGVjIHRoYXQgPSAoVm1TcGVjKSBvYmo7CisgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmVxdWFscyh0aGF0LnByb3BlcnRpZXMpCisgICAgICAgICAgJiYgdGhpcy5vcHRpb25zLmVxdWFscyh0aGF0Lm9wdGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRIYXNoKCkgeworICAgIGlmIChoYXNoID09IDApIHsKKyAgICAgIHRoaXMuaGFzaCA9IGdldFBlcnNpc3RlbnRIYXNoRnVuY3Rpb24oKS5oYXNoT2JqZWN0KHRoaXMsIFZtU3BlY0Z1bm5lbC5JTlNUQU5DRSkuYXNJbnQoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBpbml0SGFzaCgpOworICAgIHJldHVybiBoYXNoOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgIC5hZGQoInByb3BlcnRpZXMiLCBwcm9wZXJ0aWVzKQorICAgICAgICAuYWRkKCJvcHRpb25zIiwgb3B0aW9ucykKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KKworICBlbnVtIFZtU3BlY0Z1bm5lbCBpbXBsZW1lbnRzIEZ1bm5lbDxWbVNwZWM+IHsKKyAgICBJTlNUQU5DRTsKKworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBmdW5uZWwoVm1TcGVjIGZyb20sIFByaW1pdGl2ZVNpbmsgaW50bykgeworICAgICAgU3RyaW5nTWFwRnVubmVsLklOU1RBTkNFLmZ1bm5lbChmcm9tLnByb3BlcnRpZXMsIGludG8pOworICAgICAgU3RyaW5nTWFwRnVubmVsLklOU1RBTkNFLmZ1bm5lbChmcm9tLm9wdGlvbnMsIGludG8pOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKyAgICBwcml2YXRlIGZpbmFsIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IE1hcHMubmV3VHJlZU1hcCgpOworCisgICAgcHVibGljIEJ1aWxkZXIgYWRkT3B0aW9uKFN0cmluZyBvcHRpb25OYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgIHRoaXMub3B0aW9ucy5wdXQob3B0aW9uTmFtZSwgdmFsdWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgYWRkQWxsT3B0aW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpIHsKKyAgICAgIHRoaXMub3B0aW9ucy5wdXRBbGwob3B0aW9ucyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBhZGRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIFN0cmluZyB2YWx1ZSkgeworICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eSwgdmFsdWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgYWRkQWxsUHJvcGVydGllcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMpIHsKKyAgICAgIHRoaXMucHJvcGVydGllcy5wdXRBbGwocHJvcGVydGllcyk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVm1TcGVjIGJ1aWxkKCkgeworICAgICAgcmV0dXJuIG5ldyBWbVNwZWModGhpcyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21vZGVsL3BhY2thZ2UtaW5mby5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJjYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tb2RlbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRoZXNlIGNsYXNzZXMgbW9kZWwgdGhlIGRhdGEgdGhhdCBpcyBjb2xsZWN0ZWQgYnkgdGhlIGNhbGlwZXIge0BsaW5rcGxhaW4KKyAqIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIgcnVubmVyfTogdGhlIHJlY29yZCBvZiB3aGljaCBzY2VuYXJpb3Mgd2VyZSB0ZXN0ZWQgb24gd2hpY2ggVk1zIGJ5CisgKiB3aGljaCBpbnN0cnVtZW50cyBhbmQsIG1vc3QgaW1wb3J0YW50bHksIGFsbCB0aGUgbWVhc3VyZW1lbnRzIHRoYXQgd2VyZSBvYnNlcnZlZC4KKyAqCisgKiA8cD5UaGUgcHJpbWFyeSBnb2FsIG9mIHRoZXNlIGNsYXNzZXMgaXMgdG8gYmUgYXMgZWFzaWx5IGNvbnZlcnRpYmxlIGJhY2sgYW5kIGZvcnRoIHRvIEpTT04gdGV4dAorICogYXMgcG9zc2libGUuIFRoZSBzZWNvbmRhcnkgZ29hbCBpcyB0byBiZSBlYXNpbHkgcGVyc2lzdGFibGUgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvQ2FsaXBlckRpcmVjdG9yeS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9vcHRpb25zL0NhbGlwZXJEaXJlY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGY4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9vcHRpb25zL0NhbGlwZXJEaXJlY3RvcnkuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqIEJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgdGhlIGRpcmVjdG9yeSB0aGF0IGNhbGlwZXIgc2hvdWxkIHVzZSB0byBzdG9yZSBkYXRhICgtLWRpcmVjdG9yeSkuICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAVGFyZ2V0KHtGSUVMRCwgUEFSQU1FVEVSLCBNRVRIT0R9KQorQFF1YWxpZmllcgorcHVibGljIEBpbnRlcmZhY2UgQ2FsaXBlckRpcmVjdG9yeSB7fQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9vcHRpb25zL0NhbGlwZXJPcHRpb25zLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvQ2FsaXBlck9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI5NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9vcHRpb25zL0NhbGlwZXJPcHRpb25zLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5TaG9ydER1cmF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0TXVsdGltYXA7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgQ2FsaXBlck9wdGlvbnMgeworICBTdHJpbmcgYmVuY2htYXJrQ2xhc3NOYW1lKCk7CisgIEltbXV0YWJsZVNldDxTdHJpbmc+IGJlbmNobWFya01ldGhvZE5hbWVzKCk7CisgIEltbXV0YWJsZVNldDxTdHJpbmc+IHZtTmFtZXMoKTsKKyAgSW1tdXRhYmxlU2V0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJQYXJhbWV0ZXJzKCk7CisgIEltbXV0YWJsZVNldE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB2bUFyZ3VtZW50cygpOworICBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbmZpZ1Byb3BlcnRpZXMoKTsKKyAgSW1tdXRhYmxlU2V0PFN0cmluZz4gaW5zdHJ1bWVudE5hbWVzKCk7CisgIGludCB0cmlhbHNQZXJTY2VuYXJpbygpOworICBTaG9ydER1cmF0aW9uIHRpbWVMaW1pdCgpOworICBTdHJpbmcgcnVuTmFtZSgpOworICBib29sZWFuIHByaW50Q29uZmlndXJhdGlvbigpOworICBib29sZWFuIGRyeVJ1bigpOworICBGaWxlIGNhbGlwZXJEaXJlY3RvcnkoKTsKKyAgRmlsZSBjYWxpcGVyQ29uZmlnRmlsZSgpOworfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9vcHRpb25zL0NvbW1hbmRMaW5lUGFyc2VyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvQ29tbWFuZExpbmVQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTY3OTA0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9vcHRpb25zL0NvbW1hbmRMaW5lUGFyc2VyLmphdmEKQEAgLTAsMCArMSw0NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuRGlzcGxheVVzYWdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLkludmFsaWRDb21tYW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5QYXJzZXJzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLlByaW1pdGl2ZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vIGJhc2VkIG9uIHIxMzUgb2YgT3B0aW9uUGFyc2VyLmphdmEgZnJvbSB2b2dhcgorLy8gTk9URTogdGhpcyBjbGFzcyBpcyBzdGlsbCBwcmV0dHkgbWVzc3kgYnV0IHdpbGwgYmUgY2xlYW5lZCB1cCBmdXJ0aGVyIGFuZCBwb3NzaWJseSBvZmZlcmVkIHRvCisvLyBHdWF2YS4KKworLyoqCisgKiBQYXJzZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgKgorICogU3RyaW5ncyBpbiB0aGUgcGFzc2VkLWluIFN0cmluZ1tdIGFyZSBwYXJzZWQgbGVmdC10by1yaWdodC4gRWFjaCBTdHJpbmcgaXMgY2xhc3NpZmllZCBhcyBhIHNob3J0CisgKiBvcHRpb24gKHN1Y2ggYXMgIi12IiksIGEgbG9uZyBvcHRpb24gKHN1Y2ggYXMgIi0tdmVyYm9zZSIpLCBhbiBhcmd1bWVudCB0byBhbiBvcHRpb24gKHN1Y2ggYXMKKyAqICJvdXQudHh0IiBpbiAiLWYgb3V0LnR4dCIpLCBvciBhIG5vbi1vcHRpb24gcG9zaXRpb25hbCBhcmd1bWVudC4KKyAqCisgKiBBIHNpbXBsZSBzaG9ydCBvcHRpb24gaXMgYSAiLSIgZm9sbG93ZWQgYnkgYSBzaG9ydCBvcHRpb24gY2hhcmFjdGVyLiBJZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuCisgKiBhcmd1bWVudCAod2hpY2ggaXMgdHJ1ZSBvZiBhbnkgbm9uLWJvb2xlYW4gb3B0aW9uKSwgaXQgbWF5IGJlIHdyaXR0ZW4gYXMgYSBzZXBhcmF0ZSBwYXJhbWV0ZXIsCisgKiBidXQgbmVlZCBub3QgYmUuIFRoYXQgaXMsICItZiBvdXQudHh0IiBhbmQgIi1mb3V0LnR4dCIgYXJlIGJvdGggYWNjZXB0YWJsZS4KKyAqCisgKiBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IG11bHRpcGxlIHNob3J0IG9wdGlvbnMgYWZ0ZXIgYSBzaW5nbGUgIi0iIGFzIGxvbmcgYXMgYWxsIChleGNlcHQKKyAqIHBvc3NpYmx5IHRoZSBsYXN0KSBkbyBub3QgcmVxdWlyZSBhcmd1bWVudHMuCisgKgorICogQSBsb25nIG9wdGlvbiBiZWdpbnMgd2l0aCAiLS0iIGZvbGxvd2VkIGJ5IHNldmVyYWwgY2hhcmFjdGVycy4gSWYgdGhlIG9wdGlvbiByZXF1aXJlcyBhbgorICogYXJndW1lbnQsIGl0IG1heSBiZSB3cml0dGVuIGRpcmVjdGx5IGFmdGVyIHRoZSBvcHRpb24gbmFtZSwgc2VwYXJhdGVkIGJ5ICI9Iiwgb3IgYXMgdGhlIG5leHQKKyAqIGFyZ3VtZW50LiAoVGhhdCBpcywgIi0tZmlsZT1vdXQudHh0IiBvciAiLS1maWxlIG91dC50eHQiLikKKyAqCisgKiBBIGJvb2xlYW4gbG9uZyBvcHRpb24gJy0tbmFtZScgYXV0b21hdGljYWxseSBnZXRzIGEgJy0tbm8tbmFtZScgY29tcGFuaW9uLiBHaXZlbiBhbiBvcHRpb24KKyAqICItLWZsYWciLCB0aGVuLCAiLS1mbGFnIiwgIi0tbm8tZmxhZyIsICItLWZsYWc9dHJ1ZSIgYW5kICItLWZsYWc9ZmFsc2UiIGFyZSBhbGwgdmFsaWQsIHRob3VnaAorICogbmVpdGhlciAiLS1mbGFnIHRydWUiIG5vciAiLS1mbGFnIGZhbHNlIiBhcmUgYWxsb3dlZCAoc2luY2UgIi0tZmxhZyIgYnkgaXRzZWxmIGlzIHN1ZmZpY2llbnQsIHRoZQorICogZm9sbG93aW5nICJ0cnVlIiBvciAiZmFsc2UiIGlzIGludGVycHJldGVkIHNlcGFyYXRlbHkpLiBZb3UgY2FuIHVzZSAieWVzIiBhbmQgIm5vIiBhcyBzeW5vbnltcworICogZm9yICJ0cnVlIiBhbmQgImZhbHNlIi4KKyAqCisgKiBFYWNoIFN0cmluZyBub3Qgc3RhcnRpbmcgd2l0aCBhICItIiBhbmQgbm90IGEgcmVxdWlyZWQgYXJndW1lbnQgb2YgYSBwcmV2aW91cyBvcHRpb24gaXMgYQorICogbm9uLW9wdGlvbiBwb3NpdGlvbmFsIGFyZ3VtZW50LCBhcyBhcmUgYWxsIHN1Y2Nlc3NpdmUgU3RyaW5ncy4gRWFjaCBTdHJpbmcgYWZ0ZXIgYSAiLS0iIGlzIGEKKyAqIG5vbi1vcHRpb24gcG9zaXRpb25hbCBhcmd1bWVudC4KKyAqCisgKiBUaGUgZmllbGRzIGNvcnJlc3BvbmRpbmcgdG8gb3B0aW9ucyBhcmUgdXBkYXRlZCBhcyB0aGVpciBvcHRpb25zIGFyZSBwcm9jZXNzZWQuIEFueSByZW1haW5pbmcKKyAqIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFyZSByZXR1cm5lZCBhcyBhbiBJbW11dGFibGVMaXN0PFN0cmluZz4uCisgKgorICogSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGU6CisgKgorICogLy8gVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgYSBzZXBhcmF0ZSBjbGFzcywgaWYgeW91ciBhcHBsaWNhdGlvbiBkb2Vzbid0IHdhcnJhbnQgaXQuIC8vCisgKiBOb24tQE9wdGlvbiBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkLiBjbGFzcyBPcHRpb25zIHsKKyAqCisgKiBAT3B0aW9uKG5hbWVzID0geyAiLXEiLCAiLS1xdWlldCIgfSkgYm9vbGVhbiBxdWlldCA9IGZhbHNlOworICoKKyAqIC8vIEJvb2xlYW4gb3B0aW9ucyByZXF1aXJlIGEgbG9uZyBuYW1lIGlmIGl0J3MgdG8gYmUgcG9zc2libGUgdG8gZXhwbGljaXRseSB0dXJuIHRoZW0gb2ZmLiAvLworICogSGVyZSB0aGUgdXNlciBjYW4gdXNlIC0tbm8tY29sb3IuCisgKiBAT3B0aW9uKG5hbWVzID0geyAiLS1jb2xvciIgfSkgYm9vbGVhbiBjb2xvciA9IHRydWU7CisgKiBAT3B0aW9uKG5hbWVzID0geyAiLW0iLCAiLS1tb2RlIiB9KSBTdHJpbmcgbW9kZSA9ICJzdGFuZGFyZDsgLy8gU3VwcGx5IGEgZGVmYXVsdCBqdXN0IGJ5IHNldHRpbmcKKyAqIHRoZSBmaWVsZC4KKyAqIEBPcHRpb24obmFtZXMgPSB7ICItcCIsICItLXBvcnQiIH0pIGludCBwb3J0TnVtYmVyID0gODg4ODsKKyAqCisgKiAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gb2ZmZXIgYSBzaG9ydCBuYW1lIGZvciByYXJlbHktdXNlZCBvcHRpb25zLgorICogQE9wdGlvbihuYW1lcyA9IHsgIi0tdGltZW91dCIgfSkgZG91YmxlIHRpbWVvdXQgPSAxLjA7CisgKiBAT3B0aW9uKG5hbWVzID0geyAiLW8iLCAiLS1vdXRwdXQtZmlsZSIgfSkgU3RyaW5nIG91dHB1dEZpbGU7CisgKgorICogfQorICoKKyAqIFNlZSBhbHNvOgorICoKKyAqIHRoZSBnZXRvcHQoMSkgbWFuIHBhZ2UgUHl0aG9uJ3MgIm9wdHBhcnNlIiBtb2R1bGUgKGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS9vcHRwYXJzZS5odG1sKQorICogdGhlIFBPU0lYICJVdGlsaXR5IFN5bnRheCBHdWlkZWxpbmVzIiAoaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Jhc2VkZWZzL3hiZF9jaGFwMTIuaHRtbCN0YWdfMTJfMDIpCisgKiB0aGUgR05VICJTdGFuZGFyZHMgZm9yIENvbW1hbmQgTGluZSBJbnRlcmZhY2VzIiAoaHR0cDovL3d3dy5nbnUub3JnL3ByZXAvc3RhbmRhcmRzL3N0YW5kYXJkcy5odG1sI0NvbW1hbmRfMDAyZExpbmUtSW50ZXJmYWNlcykKKyAqLworZmluYWwgY2xhc3MgQ29tbWFuZExpbmVQYXJzZXI8VD4geworICAvKioKKyAgICogQW5ub3RhdGVzIGEgZmllbGQgb3IgbWV0aG9kIGluIGFuIG9wdGlvbnMgY2xhc3MgdG8gc2lnbmlmeSB0aGF0IHBhcnNlZCB2YWx1ZXMgc2hvdWxkIGJlCisgICAqIGluamVjdGVkLgorICAgKi8KKyAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgQFRhcmdldCh7RWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgIHB1YmxpYyBAaW50ZXJmYWNlIE9wdGlvbiB7CisgICAgLyoqCisgICAgICogVGhlIG5hbWVzIGZvciB0aGlzIG9wdGlvbiwgc3VjaCBhcyB7ICItaCIsICItLWhlbHAiIH0uIE5hbWVzIG11c3Qgc3RhcnQgd2l0aCBvbmUgb3IgdHdvICctJ3MuCisgICAgICogQW4gb3B0aW9uIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbmFtZS4KKyAgICAgKi8KKyAgICBTdHJpbmdbXSB2YWx1ZSgpOworICB9CisKKyAgLyoqCisgICAqIEFubm90YXRlcyBhIHNpbmdsZSBtZXRob2QgaW4gYW4gb3B0aW9ucyBjbGFzcyB0byByZWNlaXZlIGFueSAibGVmdG92ZXIiIGFyZ3VtZW50cy4gVGhlIG1ldGhvZAorICAgKiBtdXN0IGFjY2VwdCB7QGNvZGUgSW1tdXRhYmxlTGlzdDxTdHJpbmc+fSBvciBhIHN1cGVydHlwZS4gVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgZXZlbiBpZgorICAgKiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgICovCisgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLkZJRUxELCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICBwdWJsaWMgQGludGVyZmFjZSBMZWZ0b3ZlcnMge30KKworICBwdWJsaWMgc3RhdGljIDxUPiBDb21tYW5kTGluZVBhcnNlcjxUPiBmb3JDbGFzcyhDbGFzczw/IGV4dGVuZHMgVD4gYykgeworICAgIHJldHVybiBuZXcgQ29tbWFuZExpbmVQYXJzZXI8VD4oYyk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIEluamVjdGlvbk1hcCBpbmplY3Rpb25NYXA7CisgIHByaXZhdGUgVCBpbmplY3RlZTsKKworICAvLyBUT0RPKGtldmluYik6IG1ha2UgYSBoZWxwZXIgb2JqZWN0IHRoYXQgY2FuIGJlIG11dGF0ZWQgZHVyaW5nIHByb2Nlc3NpbmcKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBlbmRpbmdJbmplY3Rpb24+IHBlbmRpbmdJbmplY3Rpb25zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgY29tbWFuZC1saW5lIHBhcnNlciB0aGF0IHdpbGwgaW5qZWN0IHZhbHVlcyBpbnRvIHtAY29kZSBpbmplY3RlZX0uCisgICAqCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBpbmplY3RlZX0gY29udGFpbnMgbXVsdGlwbGUgb3B0aW9ucyB1c2luZyB0aGUgc2FtZQorICAgKiAgICAgbmFtZQorICAgKi8KKyAgcHJpdmF0ZSBDb21tYW5kTGluZVBhcnNlcihDbGFzczw/IGV4dGVuZHMgVD4gYykgeworICAgIHRoaXMuaW5qZWN0aW9uTWFwID0gSW5qZWN0aW9uTWFwLmZvckNsYXNzKGMpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyAnYXJncycsIHNldHRpbmcgdGhlIEBPcHRpb24gZmllbGRzIG9mIHRoZSAnb3B0aW9uU291cmNlJworICAgKiBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IuIFJldHVybnMgYSBsaXN0IG9mIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBsZWZ0IG92ZXIgYWZ0ZXIKKyAgICogcHJvY2Vzc2luZyBhbGwgb3B0aW9ucy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHBhcnNlQW5kSW5qZWN0KFN0cmluZ1tdIGFyZ3MsIFQgaW5qZWN0ZWUpIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgICAgdGhpcy5pbmplY3RlZSA9IGluamVjdGVlOworICAgIHBlbmRpbmdJbmplY3Rpb25zLmNsZWFyKCk7CisgICAgSXRlcmF0b3I8U3RyaW5nPiBhcmdzSXRlciA9IEl0ZXJhdG9ycy5mb3JBcnJheShhcmdzKTsKKyAgICBJbW11dGFibGVMaXN0LkJ1aWxkZXI8U3RyaW5nPiBidWlsZGVyID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7CisKKyAgICB3aGlsZSAoYXJnc0l0ZXIuaGFzTmV4dCgpKSB7CisgICAgICBTdHJpbmcgYXJnID0gYXJnc0l0ZXIubmV4dCgpOworICAgICAgaWYgKGFyZy5lcXVhbHMoIi0tIikpIHsKKyAgICAgICAgYnJlYWs7IC8vICItLSIgbWFya3MgdGhlIGVuZCBvZiBvcHRpb25zIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzLgorICAgICAgfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aCgiLS0iKSkgeworICAgICAgICBwYXJzZUxvbmdPcHRpb24oYXJnLCBhcmdzSXRlcik7CisgICAgICB9IGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgcGFyc2VTaG9ydE9wdGlvbnMoYXJnLCBhcmdzSXRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBidWlsZGVyLmFkZChhcmcpOworICAgICAgICAvLyBhbGxvdyBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBtaXggd2l0aCBvcHRpb25zIHNpbmNlIG1hbnkgbGludXggY29tbWFuZHMgZG8KKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKFBlbmRpbmdJbmplY3Rpb24gcGkgOiBwZW5kaW5nSW5qZWN0aW9ucykgeworICAgICAgcGkuaW5qZWN0YWJsZU9wdGlvbi5pbmplY3QocGkudmFsdWUsIGluamVjdGVlKTsKKyAgICB9CisKKyAgICBJbW11dGFibGVMaXN0PFN0cmluZz4gbGVmdG92ZXJzID0gYnVpbGRlci5hZGRBbGwoYXJnc0l0ZXIpLmJ1aWxkKCk7CisgICAgaW52b2tlTWV0aG9kKGluamVjdGVlLCBpbmplY3Rpb25NYXAubGVmdG92ZXJzTWV0aG9kLCBsZWZ0b3ZlcnMpOworICB9CisKKyAgLy8gUHJpdmF0ZSBzdHVmZiBmcm9tIGhlcmUgb24gZG93bgorCisgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEluamVjdGFibGVPcHRpb24geworICAgIGFic3RyYWN0IGJvb2xlYW4gaXNCb29sZWFuKCk7CisgICAgYWJzdHJhY3Qgdm9pZCBpbmplY3QoU3RyaW5nIHZhbHVlVGV4dCwgT2JqZWN0IGluamVjdGVlKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb247CisgICAgYm9vbGVhbiBkZWxheWVkSW5qZWN0aW9uKCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluamVjdGlvbk1hcCB7CisgICAgcHVibGljIHN0YXRpYyBJbmplY3Rpb25NYXAgZm9yQ2xhc3MoQ2xhc3M8Pz4gaW5qZWN0ZWRDbGFzcykgeworICAgICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U3RyaW5nLCBJbmplY3RhYmxlT3B0aW9uPiBidWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKworICAgICAgSW5qZWN0YWJsZU9wdGlvbiBoZWxwT3B0aW9uID0gbmV3IEluamVjdGFibGVPcHRpb24oKSB7CisgICAgICAgIEBPdmVycmlkZSBib29sZWFuIGlzQm9vbGVhbigpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgdm9pZCBpbmplY3QoU3RyaW5nIHZhbHVlVGV4dCwgT2JqZWN0IGluamVjdGVlKSB0aHJvd3MgRGlzcGxheVVzYWdlRXhjZXB0aW9uIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGlzcGxheVVzYWdlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBidWlsZGVyLnB1dCgiLWgiLCBoZWxwT3B0aW9uKTsKKyAgICAgIGJ1aWxkZXIucHV0KCItLWhlbHAiLCBoZWxwT3B0aW9uKTsKKworICAgICAgTWV0aG9kIGxlZnRvdmVyTWV0aG9kID0gbnVsbDsKKworICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGluamVjdGVkQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkgeworICAgICAgICBjaGVja0FyZ3VtZW50KCFmaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KExlZnRvdmVycy5jbGFzcyksCisgICAgICAgICAgICAiU29ycnksIEBMZWZ0b3ZlcnMgb25seSB3b3JrcyBmb3IgbWV0aG9kcyBhdCBwcmVzZW50Iik7IC8vIFRPRE8oa2V2aW5iKQorICAgICAgICBPcHRpb24gb3B0aW9uID0gZmllbGQuZ2V0QW5ub3RhdGlvbihPcHRpb24uY2xhc3MpOworICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICBJbmplY3RhYmxlT3B0aW9uIGluamVjdGFibGUgPSBGaWVsZE9wdGlvbi5jcmVhdGUoZmllbGQpOworICAgICAgICAgIGZvciAoU3RyaW5nIG9wdGlvbk5hbWUgOiBvcHRpb24udmFsdWUoKSkgeworICAgICAgICAgICAgYnVpbGRlci5wdXQob3B0aW9uTmFtZSwgaW5qZWN0YWJsZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBpbmplY3RlZENsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgIGlmIChtZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChMZWZ0b3ZlcnMuY2xhc3MpKSB7CisgICAgICAgICAgY2hlY2tBcmd1bWVudCghaXNTdGF0aWNPckFic3RyYWN0KG1ldGhvZCksCisgICAgICAgICAgICAgICJATGVmdG92ZXJzIG1ldGhvZCBjYW5ub3QgYmUgc3RhdGljIG9yIGFic3RyYWN0Iik7CisgICAgICAgICAgY2hlY2tBcmd1bWVudCghbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoT3B0aW9uLmNsYXNzKSwKKyAgICAgICAgICAgICAgIm1ldGhvZCBoYXMgYm90aCBAT3B0aW9uIGFuZCBATGVmdG92ZXJzIik7CisgICAgICAgICAgY2hlY2tBcmd1bWVudChsZWZ0b3Zlck1ldGhvZCA9PSBudWxsLCAiVHdvIG1ldGhvZHMgaGF2ZSBATGVmdG92ZXJzIik7CisKKyAgICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICBsZWZ0b3Zlck1ldGhvZCA9IG1ldGhvZDsKKworICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHR5cGUgaXMgYSBzdXBlcnR5cGUgb2YgSW1tdXRhYmxlTGlzdDxTdHJpbmc+CisgICAgICAgIH0KKyAgICAgICAgT3B0aW9uIG9wdGlvbiA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKE9wdGlvbi5jbGFzcyk7CisgICAgICAgIGlmIChvcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgIEluamVjdGFibGVPcHRpb24gaW5qZWN0YWJsZSA9IE1ldGhvZE9wdGlvbi5jcmVhdGUobWV0aG9kKTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBvcHRpb25OYW1lIDogb3B0aW9uLnZhbHVlKCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucHV0KG9wdGlvbk5hbWUsIGluamVjdGFibGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBJbW11dGFibGVNYXA8U3RyaW5nLCBJbmplY3RhYmxlT3B0aW9uPiBvcHRpb25NYXAgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICByZXR1cm4gbmV3IEluamVjdGlvbk1hcChvcHRpb25NYXAsIGxlZnRvdmVyTWV0aG9kKTsKKyAgICB9CisKKyAgICBmaW5hbCBJbW11dGFibGVNYXA8U3RyaW5nLCBJbmplY3RhYmxlT3B0aW9uPiBvcHRpb25NYXA7CisgICAgZmluYWwgTWV0aG9kIGxlZnRvdmVyc01ldGhvZDsKKworICAgIEluamVjdGlvbk1hcChJbW11dGFibGVNYXA8U3RyaW5nLCBJbmplY3RhYmxlT3B0aW9uPiBvcHRpb25NYXAsIE1ldGhvZCBsZWZ0b3ZlcnNNZXRob2QpIHsKKyAgICAgIHRoaXMub3B0aW9uTWFwID0gb3B0aW9uTWFwOworICAgICAgdGhpcy5sZWZ0b3ZlcnNNZXRob2QgPSBsZWZ0b3ZlcnNNZXRob2Q7CisgICAgfQorCisgICAgSW5qZWN0YWJsZU9wdGlvbiBnZXRJbmplY3RhYmxlT3B0aW9uKFN0cmluZyBvcHRpb25OYW1lKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgICAgSW5qZWN0YWJsZU9wdGlvbiBpbmplY3RhYmxlID0gb3B0aW9uTWFwLmdldChvcHRpb25OYW1lKTsKKyAgICAgIGlmIChpbmplY3RhYmxlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDb21tYW5kRXhjZXB0aW9uKCJJbnZhbGlkIG9wdGlvbjogJXMiLCBvcHRpb25OYW1lKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmplY3RhYmxlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpZWxkT3B0aW9uIGV4dGVuZHMgSW5qZWN0YWJsZU9wdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgSW5qZWN0YWJsZU9wdGlvbiBjcmVhdGUoRmllbGQgZmllbGQpIHsKKyAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICBUeXBlIHR5cGUgPSBmaWVsZC5nZXRHZW5lcmljVHlwZSgpOworCisgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGRPcHRpb24oZmllbGQsIChDbGFzczw/PikgdHlwZSk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4ndCBpbmplY3QgcGFyYW1ldGVyaXplZCB0eXBlcyBldGMuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWVsZCBmaWVsZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNCb29sZWFuOworICAgIHByaXZhdGUgUGFyc2VyPD8+IHBhcnNlcjsKKworICAgIHByaXZhdGUgRmllbGRPcHRpb24oRmllbGQgZmllbGQsIENsYXNzPD8+IGMpIHsKKyAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgIHRoaXMuaXNCb29sZWFuID0gYyA9PSBib29sZWFuLmNsYXNzIHx8IGMgPT0gQm9vbGVhbi5jbGFzczsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMucGFyc2VyID0gUGFyc2Vycy5jb252ZW50aW9uYWxQYXJzZXIoUHJpbWl0aXZlcy53cmFwKGMpKTsKKyAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHN1aXRhYmxlIFN0cmluZy1jb252ZXJzaW9uIG1ldGhvZCIpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZSBib29sZWFuIGlzQm9vbGVhbigpIHsKKyAgICAgIHJldHVybiBpc0Jvb2xlYW47CisgICAgfQorCisgICAgQE92ZXJyaWRlIHZvaWQgaW5qZWN0KFN0cmluZyB2YWx1ZVRleHQsIE9iamVjdCBpbmplY3RlZSkgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbnZlcnQocGFyc2VyLCB2YWx1ZVRleHQpOworICAgICAgdHJ5IHsKKyAgICAgICAgZmllbGQuc2V0KGluamVjdGVlLCB2YWx1ZSk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGltcG9zc2libGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGltcG9zc2libGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGhvZE9wdGlvbiBleHRlbmRzIEluamVjdGFibGVPcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIEluamVjdGFibGVPcHRpb24gY3JlYXRlKE1ldGhvZCBtZXRob2QpIHsKKyAgICAgIGNoZWNrQXJndW1lbnQoIWlzU3RhdGljT3JBYnN0cmFjdChtZXRob2QpLAorICAgICAgICAgICJAT3B0aW9uIG1ldGhvZHMgY2Fubm90IGJlIHN0YXRpYyBvciBhYnN0cmFjdCIpOworICAgICAgQ2xhc3M8Pz5bXSBjbGFzc2VzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICBjaGVja0FyZ3VtZW50KGNsYXNzZXMubGVuZ3RoID09IDEsICJNZXRob2QgZG9lcyBub3QgaGF2ZSBleGFjdGx5IG9uZSBhcmd1bWVudDogIiArIG1ldGhvZCk7CisgICAgICByZXR1cm4gbmV3IE1ldGhvZE9wdGlvbihtZXRob2QsIGNsYXNzZXNbMF0pOworICAgIH0KKworICAgIHByaXZhdGUgTWV0aG9kIG1ldGhvZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNCb29sZWFuOworICAgIHByaXZhdGUgUGFyc2VyPD8+IHBhcnNlcjsKKworICAgIHByaXZhdGUgTWV0aG9kT3B0aW9uKE1ldGhvZCBtZXRob2QsIENsYXNzPD8+IGMpIHsKKyAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgICAgdGhpcy5pc0Jvb2xlYW4gPSBjID09IGJvb2xlYW4uY2xhc3MgfHwgYyA9PSBCb29sZWFuLmNsYXNzOworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5wYXJzZXIgPSBQYXJzZXJzLmNvbnZlbnRpb25hbFBhcnNlcihQcmltaXRpdmVzLndyYXAoYykpOworICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gc3VpdGFibGUgU3RyaW5nLWNvbnZlcnNpb24gbWV0aG9kIik7CisgICAgICB9CisKKyAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZSBib29sZWFuIGlzQm9vbGVhbigpIHsKKyAgICAgIHJldHVybiBpc0Jvb2xlYW47CisgICAgfQorCisgICAgQE92ZXJyaWRlIGJvb2xlYW4gZGVsYXllZEluamVjdGlvbigpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZSB2b2lkIGluamVjdChTdHJpbmcgdmFsdWVUZXh0LCBPYmplY3QgaW5qZWN0ZWUpIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgICAgICBpbnZva2VNZXRob2QoaW5qZWN0ZWUsIG1ldGhvZCwgY29udmVydChwYXJzZXIsIHZhbHVlVGV4dCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjb252ZXJ0KFBhcnNlcjw/PiBwYXJzZXIsIFN0cmluZyB2YWx1ZVRleHQpIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0IHZhbHVlOworICAgIHRyeSB7CisgICAgICB2YWx1ZSA9IHBhcnNlci5wYXJzZSh2YWx1ZVRleHQpOworICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbigid3JvbmcgZGF0YXR5cGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwYXJzZUxvbmdPcHRpb24oU3RyaW5nIGFyZywgSXRlcmF0b3I8U3RyaW5nPiBhcmdzKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIFN0cmluZyBuYW1lID0gYXJnLnJlcGxhY2VGaXJzdCgiXi0tbm8tIiwgIi0tIik7CisgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKworICAgIC8vIFN1cHBvcnQgIi0tbmFtZT12YWx1ZSIgYXMgd2VsbCBhcyAiLS1uYW1lIHZhbHVlIi4KKyAgICBpbnQgZXF1YWxzSW5kZXggPSBuYW1lLmluZGV4T2YoJz0nKTsKKyAgICBpZiAoZXF1YWxzSW5kZXggIT0gLTEpIHsKKyAgICAgIHZhbHVlID0gbmFtZS5zdWJzdHJpbmcoZXF1YWxzSW5kZXggKyAxKTsKKyAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBlcXVhbHNJbmRleCk7CisgICAgfQorCisgICAgSW5qZWN0YWJsZU9wdGlvbiBpbmplY3RhYmxlID0gaW5qZWN0aW9uTWFwLmdldEluamVjdGFibGVPcHRpb24obmFtZSk7CisKKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgdmFsdWUgPSBpbmplY3RhYmxlLmlzQm9vbGVhbigpCisgICAgICAgICAgPyBCb29sZWFuLnRvU3RyaW5nKCFhcmcuc3RhcnRzV2l0aCgiLS1uby0iKSkKKyAgICAgICAgICA6IGdyYWJOZXh0VmFsdWUoYXJncywgbmFtZSk7CisgICAgfQorICAgIGluamVjdE5vd09yTGF0ZXIoaW5qZWN0YWJsZSwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluamVjdE5vd09yTGF0ZXIoSW5qZWN0YWJsZU9wdGlvbiBpbmplY3RhYmxlLCBTdHJpbmcgdmFsdWUpCisgICAgICB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIGlmIChpbmplY3RhYmxlLmRlbGF5ZWRJbmplY3Rpb24oKSkgeworICAgICAgcGVuZGluZ0luamVjdGlvbnMuYWRkKG5ldyBQZW5kaW5nSW5qZWN0aW9uKGluamVjdGFibGUsIHZhbHVlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluamVjdGFibGUuaW5qZWN0KHZhbHVlLCBpbmplY3RlZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGVuZGluZ0luamVjdGlvbiB7CisgICAgSW5qZWN0YWJsZU9wdGlvbiBpbmplY3RhYmxlT3B0aW9uOworICAgIFN0cmluZyB2YWx1ZTsKKworICAgIHByaXZhdGUgUGVuZGluZ0luamVjdGlvbihJbmplY3RhYmxlT3B0aW9uIGluamVjdGFibGVPcHRpb24sIFN0cmluZyB2YWx1ZSkgeworICAgICAgdGhpcy5pbmplY3RhYmxlT3B0aW9uID0gaW5qZWN0YWJsZU9wdGlvbjsKKyAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICAvLyBHaXZlbiBib29sZWFuIG9wdGlvbnMgYSBhbmQgYiwgYW5kIG5vbi1ib29sZWFuIG9wdGlvbiBmLCB3ZSB3YW50IHRvIGFsbG93OgorICAvLyAtYWIKKyAgLy8gLWFiZiBvdXQudHh0CisgIC8vIC1hYmZvdXQudHh0CisgIC8vIChCdXQgbm90IC1hYmY9b3V0LnR4dCAtLS0gUE9TSVggZG9lc24ndCBtZW50aW9uIHRoYXQgZWl0aGVyIHdheSwgYnV0IEdOVSBleHByZXNzbHkgZm9yYmlkcyBpdC4pCisKKyAgcHJpdmF0ZSB2b2lkIHBhcnNlU2hvcnRPcHRpb25zKFN0cmluZyBhcmcsIEl0ZXJhdG9yPFN0cmluZz4gYXJncykgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZy5sZW5ndGgoKTsgKytpKSB7CisgICAgICBTdHJpbmcgbmFtZSA9ICItIiArIGFyZy5jaGFyQXQoaSk7CisgICAgICBJbmplY3RhYmxlT3B0aW9uIGluamVjdGFibGUgPSBpbmplY3Rpb25NYXAuZ2V0SW5qZWN0YWJsZU9wdGlvbihuYW1lKTsKKworICAgICAgU3RyaW5nIHZhbHVlOworICAgICAgaWYgKGluamVjdGFibGUuaXNCb29sZWFuKCkpIHsKKyAgICAgICAgdmFsdWUgPSAidHJ1ZSI7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBuZWVkIGEgdmFsdWUuIElmIHRoZXJlJ3MgYW55dGhpbmcgbGVmdCwgd2UgdGFrZSB0aGUgcmVzdCBvZiB0aGlzICJzaG9ydCBvcHRpb24iLgorICAgICAgICBpZiAoaSArIDEgPCBhcmcubGVuZ3RoKCkpIHsKKyAgICAgICAgICB2YWx1ZSA9IGFyZy5zdWJzdHJpbmcoaSArIDEpOworICAgICAgICAgIGkgPSBhcmcubGVuZ3RoKCkgLSAxOyAvLyBkZWxheWVkICJicmVhayIKKworICAgICAgICAvLyBvdGhlcndpc2UgdGhlIG5leHQgYXJnCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmFsdWUgPSBncmFiTmV4dFZhbHVlKGFyZ3MsIG5hbWUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmplY3ROb3dPckxhdGVyKGluamVjdGFibGUsIHZhbHVlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGludm9rZU1ldGhvZChPYmplY3QgaW5qZWN0ZWUsIE1ldGhvZCBtZXRob2QsIE9iamVjdCB2YWx1ZSkKKyAgICAgIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIG1ldGhvZC5pbnZva2UoaW5qZWN0ZWUsIHZhbHVlKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGltcG9zc2libGUpIHsKKyAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihpbXBvc3NpYmxlKTsKKyAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlSWZQb3NzaWJsZShjYXVzZSwgSW52YWxpZENvbW1hbmRFeGNlcHRpb24uY2xhc3MpOworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ3JhYk5leHRWYWx1ZShJdGVyYXRvcjxTdHJpbmc+IGFyZ3MsIFN0cmluZyBuYW1lKQorICAgICAgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICBpZiAoYXJncy5oYXNOZXh0KCkpIHsKKyAgICAgIHJldHVybiBhcmdzLm5leHQoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRDb21tYW5kRXhjZXB0aW9uKCJvcHRpb24gJyIgKyBuYW1lICsgIicgcmVxdWlyZXMgYW4gYXJndW1lbnQiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3RhdGljT3JBYnN0cmFjdChNZXRob2QgbWV0aG9kKSB7CisgICAgaW50IG1vZGlmaWVycyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKKyAgICByZXR1cm4gTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSB8fCBNb2RpZmllci5pc0Fic3RyYWN0KG1vZGlmaWVycyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvb3B0aW9ucy9PcHRpb25zTW9kdWxlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvT3B0aW9uc01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDc0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvT3B0aW9uc01vZHVsZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5JbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbjsKKworaW1wb3J0IGRhZ2dlci5Nb2R1bGU7CitpbXBvcnQgZGFnZ2VyLlByb3ZpZGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBCaW5kaW5ncyBmb3IgQ2FsaXBlciBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAqLworQE1vZHVsZQorcHVibGljIGZpbmFsIGNsYXNzIE9wdGlvbnNNb2R1bGUgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0FSR1MgPSBuZXcgU3RyaW5nW10ge307CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBhcmdzOworCisgIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlQmVuY2htYXJrQ2xhc3NOYW1lOworCisgIC8qKgorICAgKiBSZXR1cm4gYSBtb2R1bGUgdGhhdCB3aWxsIHByb3ZpZGUgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgdGhlIG5hbWUgb2YgdGhlCisgICAqIGJlbmNobWFyayBjbGFzcy4KKyAgICoKKyAgICogQHBhcmFtIGFyZ3MgdGhlIGFyZ3VtZW50cyBmcm9tIHdoaWNoIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIHRoZSBiZW5jaG1hcmsgY2xhc3MgbmFtZQorICAgKiAgICAgYXJlIHBhcnNlZDsgbXVzdCBoYXZlIG9uZSBub24tb3B0aW9uIHZhbHVlIHRoYXQgaXMgdGhlIGJlbmNobWFyayBjbGFzcyBuYW1lLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBPcHRpb25zTW9kdWxlIHdpdGhCZW5jaG1hcmtDbGFzcyhTdHJpbmcgW10gYXJncykgeworICAgIHJldHVybiBuZXcgT3B0aW9uc01vZHVsZShhcmdzLCB0cnVlKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYSBtb2R1bGUgdGhhdCB3aWxsIHByb3ZpZGUgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3aXRob3V0IHRoZSBuYW1lIG9mIHRoZQorICAgKiBiZW5jaG1hcmsgY2xhc3MuCisgICAqCisgICAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgZnJvbSB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBwYXJzZWQ7IGl0IG11c3QgaGF2ZSBubworICAgKiAgICAgbm9uLW9wdGlvbiB2YWx1ZXMuCisgICAqLworICBwdWJsaWMgc3RhdGljIE9wdGlvbnNNb2R1bGUgd2l0aG91dEJlbmNobWFya0NsYXNzKFN0cmluZyBbXSBhcmdzKSB7CisgICAgcmV0dXJuIG5ldyBPcHRpb25zTW9kdWxlKGFyZ3MsIGZhbHNlKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYSBtb2R1bGUgdGhhdCB3aWxsIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgT3B0aW9uc01vZHVsZSBkZWZhdWx0T3B0aW9uc01vZHVsZSgpIHsKKyAgICByZXR1cm4gbmV3IE9wdGlvbnNNb2R1bGUoRU1QVFlfQVJHUywgZmFsc2UpOworICB9CisKKyAgcHVibGljIE9wdGlvbnNNb2R1bGUoU3RyaW5nW10gYXJncywgYm9vbGVhbiByZXF1aXJlQmVuY2htYXJrQ2xhc3NOYW1lKSB7CisgICAgdGhpcy5hcmdzID0gYXJncy5jbG9uZSgpOyAvLyBkZWZlbnNpdmUgY29weSwganVzdCBpbiBjYXNlCisgICAgdGhpcy5yZXF1aXJlQmVuY2htYXJrQ2xhc3NOYW1lID0gcmVxdWlyZUJlbmNobWFya0NsYXNzTmFtZTsKKyAgfQorCisgIEBQcm92aWRlcworICBAU2luZ2xldG9uCisgIENhbGlwZXJPcHRpb25zIHByb3ZpZGVPcHRpb25zKCkgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gUGFyc2VkT3B0aW9ucy5mcm9tKGFyZ3MsIHJlcXVpcmVCZW5jaG1hcmtDbGFzc05hbWUpOworICB9CisKKyAgQFByb3ZpZGVzIEBDYWxpcGVyRGlyZWN0b3J5IHN0YXRpYyBGaWxlIHByb3ZpZGVDYWxpcGVyRGlyZWN0b3J5KENhbGlwZXJPcHRpb25zIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gb3B0aW9ucy5jYWxpcGVyRGlyZWN0b3J5KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvb3B0aW9ucy9QYXJzZWRPcHRpb25zLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvUGFyc2VkT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZGQ4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvUGFyc2VkT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNDE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9uczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSU5VVEVTOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnMuQ29tbWFuZExpbmVQYXJzZXIuTGVmdG92ZXJzOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zLkNvbW1hbmRMaW5lUGFyc2VyLk9wdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5JbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5TaG9ydER1cmF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5PcmRlcmluZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitmaW5hbCBjbGFzcyBQYXJzZWRPcHRpb25zIGltcGxlbWVudHMgQ2FsaXBlck9wdGlvbnMgeworCisgIHB1YmxpYyBzdGF0aWMgUGFyc2VkT3B0aW9ucyBmcm9tKFN0cmluZ1tdIGFyZ3MsIGJvb2xlYW4gcmVxdWlyZUJlbmNobWFya0NsYXNzTmFtZSkKKyAgICAgIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgICAgUGFyc2VkT3B0aW9ucyBvcHRpb25zID0gbmV3IFBhcnNlZE9wdGlvbnMocmVxdWlyZUJlbmNobWFya0NsYXNzTmFtZSk7CisKKyAgICBDb21tYW5kTGluZVBhcnNlcjxQYXJzZWRPcHRpb25zPiBwYXJzZXIgPSBDb21tYW5kTGluZVBhcnNlci5mb3JDbGFzcyhQYXJzZWRPcHRpb25zLmNsYXNzKTsKKyAgICB0cnkgeworICAgICAgcGFyc2VyLnBhcnNlQW5kSW5qZWN0KGFyZ3MsIG9wdGlvbnMpOworICAgIH0gY2F0Y2ggKEludmFsaWRDb21tYW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUuc2V0VXNhZ2UoVVNBR0UpOworICAgICAgdGhyb3cgZTsKKyAgICB9CisgICAgcmV0dXJuIG9wdGlvbnM7CisgIH0KKworICAvKioKKyAgICogVHJ1ZSBpZiB0aGUgYmVuY2htYXJrIGNsYXNzIG5hbWUgaXMgZXhwZWN0ZWQgYXMgdGhlIGxhc3QgYXJndW1lbnQsIGZhbHNlIGlmIGl0IGlzIG5vdCBhbGxvd2VkLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVCZW5jaG1hcmtDbGFzc05hbWU7CisKKyAgcHJpdmF0ZSBQYXJzZWRPcHRpb25zKGJvb2xlYW4gcmVxdWlyZUJlbmNobWFya0NsYXNzTmFtZSkgeworICAgIHRoaXMucmVxdWlyZUJlbmNobWFya0NsYXNzTmFtZSA9IHJlcXVpcmVCZW5jaG1hcmtDbGFzc05hbWU7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBEcnkgcnVuIC0tIHNpbXBsZSBib29sZWFuLCBuZWVkcyB0byBiZSBjaGVja2VkIGluIHNvbWUgbWV0aG9kcworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEBPcHRpb24oeyItbiIsICItLWRyeS1ydW4ifSkKKyAgcHJpdmF0ZSBib29sZWFuIGRyeVJ1bjsKKworICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZHJ5UnVuKCkgeworICAgIHJldHVybiBkcnlSdW47CisgIH0KKworICBwcml2YXRlIHZvaWQgZHJ5UnVuSW5jb21wYXRpYmxlKFN0cmluZyBvcHRpb25OYW1lKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIC8vIFRoaXMgb25seSB3b3JrcyBiZWNhdXNlIENMUCBkb2VzIGZpZWxkIGluamVjdGlvbiBiZWZvcmUgbWV0aG9kIGluamVjdGlvbgorICAgIGlmIChkcnlSdW4pIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbigiT3B0aW9uIG5vdCBhdmFpbGFibGUgaW4gZHJ5LXJ1biBtb2RlOiAiICsgb3B0aW9uTmFtZSk7CisgICAgfQorICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRGVsaW1pdGVyIC0tIGluamVjdGVkIGVhcmx5IHNvIG1ldGhvZHMgY2FuIHVzZSBpdAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEBPcHRpb24oeyItZCIsICItLWRlbGltaXRlciJ9KQorICBwcml2YXRlIFN0cmluZyBkZWxpbWl0ZXIgPSAiLCI7CisKKyAgcHJpdmF0ZSBJbW11dGFibGVTZXQ8U3RyaW5nPiBzcGxpdChTdHJpbmcgc3RyaW5nKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoU3BsaXR0ZXIub24oZGVsaW1pdGVyKS5zcGxpdChzdHJpbmcpKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEJlbmNobWFyayBtZXRob2QgbmFtZXMgdG8gcnVuCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBJbW11dGFibGVTZXQ8U3RyaW5nPiBiZW5jaG1hcmtOYW1lcyA9IEltbXV0YWJsZVNldC5vZigpOworCisgIEBPcHRpb24oeyItYiIsICItLWJlbmNobWFyayJ9KQorICBwcml2YXRlIHZvaWQgc2V0QmVuY2htYXJrTmFtZXMoU3RyaW5nIGJlbmNobWFya3NTdHJpbmcpIHsKKyAgICBiZW5jaG1hcmtOYW1lcyA9IHNwbGl0KGJlbmNobWFya3NTdHJpbmcpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBJbW11dGFibGVTZXQ8U3RyaW5nPiBiZW5jaG1hcmtNZXRob2ROYW1lcygpIHsKKyAgICByZXR1cm4gYmVuY2htYXJrTmFtZXM7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBQcmludCBjb25maWd1cmF0aW9uPworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEBPcHRpb24oeyItcCIsICItLXByaW50LWNvbmZpZyJ9KQorICBwcml2YXRlIGJvb2xlYW4gcHJpbnRDb25maWd1cmF0aW9uID0gZmFsc2U7CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByaW50Q29uZmlndXJhdGlvbigpIHsKKyAgICByZXR1cm4gcHJpbnRDb25maWd1cmF0aW9uOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVHJpYWxzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBpbnQgdHJpYWxzID0gMTsKKworICBAT3B0aW9uKHsiLXQiLCAiLS10cmlhbHMifSkKKyAgcHJpdmF0ZSB2b2lkIHNldFRyaWFscyhpbnQgdHJpYWxzKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIGRyeVJ1bkluY29tcGF0aWJsZSgidHJpYWxzIik7CisgICAgaWYgKHRyaWFscyA8IDEpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbigidHJpYWxzIG11c3QgYmUgYXQgbGVhc3QgMTogIiArIHRyaWFscyk7CisgICAgfQorICAgIHRoaXMudHJpYWxzID0gdHJpYWxzOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgdHJpYWxzUGVyU2NlbmFyaW8oKSB7CisgICAgcmV0dXJuIHRyaWFsczsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRpbWUgbGltaXQKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcml2YXRlIFNob3J0RHVyYXRpb24gcnVuVGltZSA9IFNob3J0RHVyYXRpb24ub2YoNSwgTUlOVVRFUyk7CisKKyAgQE9wdGlvbih7Ii1sIiwgIi0tdGltZS1saW1pdCJ9KQorICBwcml2YXRlIHZvaWQgc2V0VGltZUxpbWl0KFN0cmluZyB0aW1lTGltaXRTdHJpbmcpIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMucnVuVGltZSA9IFNob3J0RHVyYXRpb24udmFsdWVPZih0aW1lTGltaXRTdHJpbmcpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbW1hbmRFeGNlcHRpb24oIkludmFsaWQgdGltZSBsaW1pdDogIiArIHRpbWVMaW1pdFN0cmluZyk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTaG9ydER1cmF0aW9uIHRpbWVMaW1pdCgpIHsKKyAgICByZXR1cm4gcnVuVGltZTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFJ1biBuYW1lCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBTdHJpbmcgcnVuTmFtZSA9ICIiOworCisgIEBPcHRpb24oeyItciIsICItLXJ1bi1uYW1lIn0pCisgIHByaXZhdGUgdm9pZCBzZXRSdW5OYW1lKFN0cmluZyBydW5OYW1lKSB7CisgICAgdGhpcy5ydW5OYW1lID0gY2hlY2tOb3ROdWxsKHJ1bk5hbWUpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgcnVuTmFtZSgpIHsKKyAgICByZXR1cm4gcnVuTmFtZTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFZNIHNwZWNpZmljYXRpb25zCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBJbW11dGFibGVTZXQ8U3RyaW5nPiB2bU5hbWVzID0gSW1tdXRhYmxlU2V0Lm9mKCk7CisKKyAgQE9wdGlvbih7Ii1tIiwgIi0tdm0ifSkKKyAgcHJpdmF0ZSB2b2lkIHNldFZtcyhTdHJpbmcgdm1zU3RyaW5nKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIGRyeVJ1bkluY29tcGF0aWJsZSgidm0iKTsKKyAgICB2bU5hbWVzID0gc3BsaXQodm1zU3RyaW5nKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgSW1tdXRhYmxlU2V0PFN0cmluZz4gdm1OYW1lcygpIHsKKyAgICByZXR1cm4gdm1OYW1lczsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1lYXN1cmluZyBpbnN0cnVtZW50cyB0byB1c2UKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVTZXQ8U3RyaW5nPiBERUZBVUxUX0lOU1RSVU1FTlRfTkFNRVMgPQorICAgICAgbmV3IEltbXV0YWJsZVNldC5CdWlsZGVyPFN0cmluZz4oKQorICAgICAgLmFkZCgiYWxsb2NhdGlvbiIpCisgICAgICAuYWRkKCJydW50aW1lIikKKyAgICAgIC5idWlsZCgpOworCisgIHByaXZhdGUgSW1tdXRhYmxlU2V0PFN0cmluZz4gaW5zdHJ1bWVudE5hbWVzID0gREVGQVVMVF9JTlNUUlVNRU5UX05BTUVTOworCisgIEBPcHRpb24oeyItaSIsICItLWluc3RydW1lbnQifSkKKyAgcHJpdmF0ZSB2b2lkIHNldEluc3RydW1lbnRzKFN0cmluZyBpbnN0cnVtZW50c1N0cmluZykgeworICAgIGluc3RydW1lbnROYW1lcyA9IHNwbGl0KGluc3RydW1lbnRzU3RyaW5nKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgSW1tdXRhYmxlU2V0PFN0cmluZz4gaW5zdHJ1bWVudE5hbWVzKCkgeworICAgIHJldHVybiBpbnN0cnVtZW50TmFtZXM7CisgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQmVuY2htYXJrIHBhcmFtZXRlcnMKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcml2YXRlIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBtdXRhYmxlVXNlclBhcmFtZXRlcnMgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKworICBAT3B0aW9uKCItRCIpCisgIHByaXZhdGUgdm9pZCBhZGRQYXJhbWV0ZXJTcGVjKFN0cmluZyBuYW1lQW5kVmFsdWVzKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIGFkZFRvTXVsdGltYXAobmFtZUFuZFZhbHVlcywgbXV0YWJsZVVzZXJQYXJhbWV0ZXJzKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgSW1tdXRhYmxlU2V0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJQYXJhbWV0ZXJzKCkgeworICAgIC8vIGRlLWR1cCB2YWx1ZXMsIGJ1dCBrZWVwIGluIG9yZGVyCisgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTZXRNdWx0aW1hcC5CdWlsZGVyPFN0cmluZywgU3RyaW5nPigpCisgICAgICAgIC5vcmRlcktleXNCeShPcmRlcmluZy5uYXR1cmFsKCkpCisgICAgICAgIC5wdXRBbGwobXV0YWJsZVVzZXJQYXJhbWV0ZXJzKQorICAgICAgICAuYnVpbGQoKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFZNIGFyZ3VtZW50cworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHByaXZhdGUgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IG11dGFibGVWbUFyZ3VtZW50cyA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOworCisgIEBPcHRpb24oIi1KIikKKyAgcHJpdmF0ZSB2b2lkIGFkZFZtQXJndW1lbnRzU3BlYyhTdHJpbmcgbmFtZUFuZFZhbHVlcykgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICBkcnlSdW5JbmNvbXBhdGlibGUoIi1KIik7CisgICAgYWRkVG9NdWx0aW1hcChuYW1lQW5kVmFsdWVzLCBtdXRhYmxlVm1Bcmd1bWVudHMpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBJbW11dGFibGVTZXRNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gdm1Bcmd1bWVudHMoKSB7CisgICAgLy8gZGUtZHVwIHZhbHVlcywgYnV0IGtlZXAgaW4gb3JkZXIKKyAgICByZXR1cm4gbmV3IEltbXV0YWJsZVNldE11bHRpbWFwLkJ1aWxkZXI8U3RyaW5nLCBTdHJpbmc+KCkKKyAgICAgICAgLm9yZGVyS2V5c0J5KE9yZGVyaW5nLm5hdHVyYWwoKSkKKyAgICAgICAgLnB1dEFsbChtdXRhYmxlVm1Bcmd1bWVudHMpCisgICAgICAgIC5idWlsZCgpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVk0gYXJndW1lbnRzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG11dGFibGVDb25maWdQcm9wZXJ0ZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICBAT3B0aW9uKCItQyIpCisgIHByaXZhdGUgdm9pZCBhZGRDb25maWdQcm9wZXJ0eShTdHJpbmcgbmFtZUFuZFZhbHVlKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIExpc3Q8U3RyaW5nPiB0b2tlbnMgPSBzcGxpdFByb3BlcnR5KG5hbWVBbmRWYWx1ZSk7CisgICAgbXV0YWJsZUNvbmZpZ1Byb3BlcnRlcy5wdXQodG9rZW5zLmdldCgwKSwgdG9rZW5zLmdldCgxKSk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gY29uZmlnUHJvcGVydGllcygpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTWFwLmNvcHlPZihtdXRhYmxlQ29uZmlnUHJvcGVydGVzKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIExvY2F0aW9uIG9mIC5jYWxpcGVyCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBGaWxlIGNhbGlwZXJEaXJlY3RvcnkgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLCAiLmNhbGlwZXIiKTsKKworICBAT3B0aW9uKHsiLS1kaXJlY3RvcnkifSkKKyAgcHJpdmF0ZSB2b2lkIHNldENhbGlwZXJEaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKKyAgICBjYWxpcGVyRGlyZWN0b3J5ID0gbmV3IEZpbGUocGF0aCk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIEZpbGUgY2FsaXBlckRpcmVjdG9yeSgpIHsKKyAgICByZXR1cm4gY2FsaXBlckRpcmVjdG9yeTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIExvY2F0aW9uIG9mIGNvbmZpZy5wcm9wZXJ0aWVzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBPcHRpb25hbDxGaWxlPiBjYWxpcGVyQ29uZmlnRmlsZSA9IE9wdGlvbmFsLmFic2VudCgpOworCisgIEBPcHRpb24oeyItYyIsICItLWNvbmZpZyJ9KQorICBwcml2YXRlIHZvaWQgc2V0Q2FsaXBlckNvbmZpZ0ZpbGUoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgY2FsaXBlckNvbmZpZ0ZpbGUgPSBPcHRpb25hbC5vZihuZXcgRmlsZShmaWxlbmFtZSkpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBGaWxlIGNhbGlwZXJDb25maWdGaWxlKCkgeworICAgIHJldHVybiBjYWxpcGVyQ29uZmlnRmlsZS5vcihuZXcgRmlsZShjYWxpcGVyRGlyZWN0b3J5LCAiY29uZmlnLnByb3BlcnRpZXMiKSk7CisgIH0KKworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIExlZnRvdmVyIC0gYmVuY2htYXJrIGNsYXNzIG5hbWUKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcml2YXRlIFN0cmluZyBiZW5jaG1hcmtDbGFzc05hbWU7CisKKyAgQExlZnRvdmVycworICBwcml2YXRlIHZvaWQgc2V0TGVmdG92ZXJzKEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBsZWZ0b3ZlcnMpIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgICAgaWYgKHJlcXVpcmVCZW5jaG1hcmtDbGFzc05hbWUpIHsKKyAgICAgIGlmIChsZWZ0b3ZlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbigiTm8gYmVuY2htYXJrIGNsYXNzIHNwZWNpZmllZCIpOworICAgICAgfQorICAgICAgaWYgKGxlZnRvdmVycy5zaXplKCkgPiAxKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbigiRXh0cmEgc3R1ZmYsIGV4cGVjdGVkIG9ubHkgY2xhc3MgbmFtZTogIiArIGxlZnRvdmVycyk7CisgICAgICB9CisgICAgICB0aGlzLmJlbmNobWFya0NsYXNzTmFtZSA9IGxlZnRvdmVycy5nZXQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghbGVmdG92ZXJzLmlzRW1wdHkoKSkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbW1hbmRFeGNlcHRpb24oCisgICAgICAgICAgICAiRXh0cmEgc3R1ZmYsIGRpZCBub3QgZXhwZWN0IG5vbi1vcHRpb24gYXJndW1lbnRzOiAiICsgbGVmdG92ZXJzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBiZW5jaG1hcmtDbGFzc05hbWUoKSB7CisgICAgcmV0dXJuIGJlbmNobWFya0NsYXNzTmFtZTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEhlbHBlciBtZXRob2RzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHNwbGl0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5U3RyaW5nKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIExpc3Q8U3RyaW5nPiB0b2tlbnMgPSBJbW11dGFibGVMaXN0LmNvcHlPZihTcGxpdHRlci5vbignPScpLmxpbWl0KDIpLnNwbGl0KHByb3BlcnR5U3RyaW5nKSk7CisgICAgaWYgKHRva2Vucy5zaXplKCkgIT0gMikgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRDb21tYW5kRXhjZXB0aW9uKCJubyAnPScgZm91bmQgaW46ICIgKyBwcm9wZXJ0eVN0cmluZyk7CisgICAgfQorICAgIHJldHVybiB0b2tlbnM7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkVG9NdWx0aW1hcChTdHJpbmcgbmFtZUFuZFZhbHVlcywgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IG11bHRpbWFwKQorICAgICAgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICBMaXN0PFN0cmluZz4gdG9rZW5zID0gc3BsaXRQcm9wZXJ0eShuYW1lQW5kVmFsdWVzKTsKKyAgICBTdHJpbmcgbmFtZSA9IHRva2Vucy5nZXQoMCk7CisgICAgU3RyaW5nIHZhbHVlcyA9IHRva2Vucy5nZXQoMSk7CisKKyAgICBpZiAobXVsdGltYXAuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbigibXVsdGlwbGUgcGFyYW1ldGVyIHNldHMgZm9yOiAiICsgbmFtZSk7CisgICAgfQorICAgIG11bHRpbWFwLnB1dEFsbChuYW1lLCBzcGxpdCh2YWx1ZXMpKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQorICAgICAgICAuYWRkKCJiZW5jaG1hcmtDbGFzc05hbWUiLCB0aGlzLmJlbmNobWFya0NsYXNzTmFtZSgpKQorICAgICAgICAuYWRkKCJiZW5jaG1hcmtNZXRob2ROYW1lcyIsIHRoaXMuYmVuY2htYXJrTWV0aG9kTmFtZXMoKSkKKyAgICAgICAgLmFkZCgiYmVuY2htYXJrUGFyYW1ldGVycyIsIHRoaXMudXNlclBhcmFtZXRlcnMoKSkKKyAgICAgICAgLmFkZCgiZHJ5UnVuIiwgdGhpcy5kcnlSdW4oKSkKKyAgICAgICAgLmFkZCgiaW5zdHJ1bWVudE5hbWVzIiwgdGhpcy5pbnN0cnVtZW50TmFtZXMoKSkKKyAgICAgICAgLmFkZCgidm1zIiwgdGhpcy52bU5hbWVzKCkpCisgICAgICAgIC5hZGQoInZtQXJndW1lbnRzIiwgdGhpcy52bUFyZ3VtZW50cygpKQorICAgICAgICAuYWRkKCJ0cmlhbHMiLCB0aGlzLnRyaWFsc1BlclNjZW5hcmlvKCkpCisgICAgICAgIC5hZGQoInByaW50Q29uZmlnIiwgdGhpcy5wcmludENvbmZpZ3VyYXRpb24oKSkKKyAgICAgICAgLmFkZCgiZGVsaW1pdGVyIiwgdGhpcy5kZWxpbWl0ZXIpCisgICAgICAgIC5hZGQoImNhbGlwZXJDb25maWdGaWxlIiwgdGhpcy5jYWxpcGVyQ29uZmlnRmlsZSkKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBVc2FnZQorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFRPRE8oa2V2aW5iKToga2luZGEgbmljZSBpZiBDb21tYW5kTGluZVBhcnNlciBjb3VsZCBhdXRvZ2VuZXJhdGUgbW9zdCBvZiB0aGlzLi4uCisgIC8vIFRPRE8oa2V2aW5iKTogYSB0ZXN0IGNvdWxkIGFjdHVhbGx5IGNoZWNrIHRoYXQgd2UgZG9uJ3QgZXhjZWVkIDc5IGNvbHVtbnMuCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBVU0FHRSA9IEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAiVXNhZ2U6IiwKKyAgICAgICIgamF2YSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLkNhbGlwZXJNYWluIDxiZW5jaG1hcmtfY2xhc3NfbmFtZT4gW29wdGlvbnMuLi5dIiwKKyAgICAgICIiLAorICAgICAgIk9wdGlvbnM6IiwKKyAgICAgICIgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSIsCisgICAgICAiIC1uLCAtLWRyeS1ydW4gICAgICBpbnN0ZWFkIG9mIG1lYXN1cmluZywgZXhlY3V0ZSBhIHNpbmdsZSByZXAgZm9yIGVhY2ggc2NlbmFyaW8iLAorICAgICAgIiAgICAgICAgICAgICAgICAgICAgaW4tcHJvY2VzcyIsCisgICAgICAiIC1iLCAtLWJlbmNobWFyayAgICBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBiZW5jaG1hcmsgbWV0aG9kcyB0byBydW47ICdmb28nIGlzIiwKKyAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuIGFsaWFzIGZvciAndGltZUZvbycgKGRlZmF1bHQ6IGFsbCBmb3VuZCBpbiBjbGFzcykiLAorICAgICAgIiAtbSwgLS12bSAgICAgICAgICAgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVk1zIHRvIHRlc3Qgb247IHBvc3NpYmxlIHZhbHVlcyBhcmUiLAorICAgICAgIiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCBpbiBDYWxpcGVyJ3MgY29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0OiIsCisgICAgICAiICAgICAgICAgICAgICAgICAgICB3aGljaGV2ZXIgVk0gY2FsaXBlciBpdHNlbGYgaXMgcnVubmluZyBpbiwgb25seSkiLAorICAgICAgIiAtaSwgLS1pbnN0cnVtZW50ICAgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVhc3VyaW5nIGluc3RydW1lbnRzIHRvIHVzZTsgcG9zc2libGUgIiwKKyAgICAgICIgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBhcmUgY29uZmlndXJlZCBpbiBDYWxpcGVyJ3MgY29uZmlndXJhdGlvbiBmaWxlICIsCisgICAgICAiICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogXCIiICsgSm9pbmVyLm9uKCIsIikuam9pbihERUZBVUxUX0lOU1RSVU1FTlRfTkFNRVMpICsgIlwiKSIsCisgICAgICAiIC10LCAtLXRyaWFscyAgICAgICBudW1iZXIgb2YgaW5kZXBlbmRlbnQgdHJpYWxzIHRvIHBlZm9ybSBwZXIgYmVuY2htYXJrIHNjZW5hcmlvOyAiLAorICAgICAgIiAgICAgICAgICAgICAgICAgICAgYSBwb3NpdGl2ZSBpbnRlZ2VyIChkZWZhdWx0OiAxKSIsCisgICAgICAiIC1sLCAtLXRpbWUtbGltaXQgICBtYXhpbXVtIGxlbmd0aCBvZiB0aW1lIGFsbG93ZWQgZm9yIGEgc2luZ2xlIHRyaWFsOyB1c2UgMCB0byBhbGxvdyAiLAorICAgICAgIiAgICAgICAgICAgICAgICAgICAgdHJpYWxzIHRvIHJ1biBpbmRlZmluaXRlbHkuIChkZWZhdWx0OiAzMHMpICIsCisgICAgICAiIC1yLCAtLXJ1bi1uYW1lICAgICBhIHVzZXItZnJpZW5kbHkgc3RyaW5nIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHJ1biIsCisgICAgICAiIC1wLCAtLXByaW50LWNvbmZpZyBwcmludCB0aGUgZWZmZWN0aXZlIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgYnkgQ2FsaXBlciIsCisgICAgICAiIC1kLCAtLWRlbGltaXRlciAgICBzZXBhcmF0b3IgdXNlZCBpbiBvcHRpb25zIHRoYXQgdGFrZSBtdWx0aXBsZSB2YWx1ZXMgKGRlZmF1bHQ6ICcsJykiLAorICAgICAgIiAtYywgLS1jb25maWcgICAgICAgbG9jYXRpb24gb2YgQ2FsaXBlcidzIGNvbmZpZ3VyYXRpb24gZmlsZSAoZGVmYXVsdDoiLAorICAgICAgIiAgICAgICAgICAgICAgICAgICAgJEhPTUUvLmNhbGlwZXIvY29uZmlnLnByb3BlcnRpZXMpIiwKKyAgICAgICIgLS1kaXJlY3RvcnkgICAgICAgIGxvY2F0aW9uIG9mIENhbGlwZXIncyBjb25maWd1cmF0aW9uIGFuZCBkYXRhIGRpcmVjdG9yeSAiLAorICAgICAgIiAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICRIT01FLy5jYWxpcGVyKSIsCisgICAgICAiIiwKKyAgICAgICIgLURwYXJhbT12YWwxLHZhbDIsLi4uIiwKKyAgICAgICIgICAgIFNwZWNpZmllcyB0aGUgdmFsdWVzIHRvIGluamVjdCBpbnRvIHRoZSAncGFyYW0nIGZpZWxkIG9mIHRoZSBiZW5jaG1hcmsiLAorICAgICAgIiAgICAgY2xhc3M7IGlmIG11bHRpcGxlIHZhbHVlcyBvciBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaW4gdGhpcyB3YXksIGNhbGlwZXIiLAorICAgICAgIiAgICAgd2lsbCB0cnkgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4iLAorICAgICAgIiIsCisgICAgICAvLyBjb21tZW50ZWQgb3V0IHVudGlsIHRoaXMgZmxhZyBpcyBmaXhlZAorICAgICAgLy8gIiAtSmRpc3BsYXlOYW1lPSd2bSBhcmcgbGlzdCBjaG9pY2UgMSx2bSBhcmcgbGlzdCBjaG9pY2UgMiwuLi4nIiwKKyAgICAgIC8vICIgICAgIFNwZWNpZmllcyBhbHRlcm5hdGUgc2V0cyBvZiBWTSBhcmd1bWVudHMgdG8gcGFzcy4gQXMgd2l0aCBhbnkgdmFyaWFibGUsIiwKKyAgICAgIC8vICIgICAgIGNhbGlwZXIgd2lsbCB0ZXN0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMuIEV4YW1wbGU6IiwKKyAgICAgIC8vICIgICAgIC1KbWVtb3J5PSctWG1zMzJtIC1YbXgzMm0sLVhtczUxMm0gLVhteDUxMm0nIiwKKyAgICAgIC8vICIiLAorICAgICAgIiAtQ2NvbmZpZ1Byb3BlcnR5PXZhbHVlIiwKKyAgICAgICIgICAgIFNwZWNpZmllcyBhIHZhbHVlIGZvciBhbnkgcHJvcGVydHkgdGhhdCBjb3VsZCBvdGhlcndpc2UgYmUgc3BlY2lmaWVkIGluICIsCisgICAgICAiICAgICAkSE9NRS8uY2FsaXBlci9jb25maWcucHJvcGVydGllcy4gUHJvcGVydGllcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSIsCisgICAgICAiICAgICB3aWxsIG92ZXJyaWRlIHRob3NlIHNwZWNpZmllZCBpbiB0aGUgZmlsZS4iLAorICAgICAgIiIsCisgICAgICAiU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jYWxpcGVyL3dpa2kvQ29tbWFuZExpbmVPcHRpb25zIGZvciBtb3JlIGRldGFpbHMuIiwKKyAgICAgICIiKTsKK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvb3B0aW9ucy9wYWNrYWdlLWluZm8uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvb3B0aW9ucy9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGJiYTFmCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9vcHRpb25zL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIENvbnRhaW5zIGNvZGUgcmVsYXRpbmcgdG8gcGFyc2luZyBhbmQgbWFuYWdpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMuIFRoaXMgaXMgZGlzdGluY3QgZnJvbQorICogY29uZmlndXJhdGlvbiAoe0Bjb2RlIH4vLmNhbGlwZXIvY29uZmlnLnByb3BlcnRpZXN9KSwgd2hpY2ggbGl2ZXMgaW4gdGhlCisgKiB7QGxpbmsgY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZ30gcGFja2FnZS4KKyAqLworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9uczsKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vUGxhdGZvcm0uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vUGxhdGZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI2Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9QbGF0Zm9ybS5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBbiBhYnN0cmFjdGlvbiBvZiB0aGUgcGxhdGZvcm0gd2l0aGluIHdoaWNoIGNhbGlwZXIgKGJvdGggdGhlIHNjaGVkdWxlciBhbmQgdGhlIGFjdHVhbCB3b3JrZXJzKQorICogd2lsbCBydW4uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQbGF0Zm9ybSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBQbGF0Zm9ybS5UeXBlIHBsYXRmb3JtVHlwZTsKKworICBwdWJsaWMgUGxhdGZvcm0oVHlwZSBwbGF0Zm9ybVR5cGUpIHsKKyAgICB0aGlzLnBsYXRmb3JtVHlwZSA9IGNoZWNrTm90TnVsbChwbGF0Zm9ybVR5cGUpOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgZXhlY3V0YWJsZSBmb3IgdGhlIHZpcnR1YWwgbWFjaGluZSBmb3IgdGhpcyBwbGF0Zm9ybS4KKyAgICoKKyAgICogQHBhcmFtIHZtSG9tZSB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIHZpcnR1YWwgbWFjaGluZSwgYWxsb3dzIHRlc3RpbmcgYWNyb3NzIG11bHRpcGxlIHZtcyBvbgorICAgKiAgICAgdGhlIHNhbWUgcGxhdGZvcm0gaW4gb25lIGdvLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IEZpbGUgdm1FeGVjdXRhYmxlKEZpbGUgdm1Ib21lKTsKKworICAvKioKKyAgICogQWRkaXRpb25hbCB2aXJ0dWFsIG1hY2hpbmUgYXJndW1lbnRzIGNvbW1vbiB0byBhbGwgaW5zdHJ1bWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIGEgd29ya2VyLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IEltbXV0YWJsZVNldDxTdHJpbmc+IGNvbW1vbkluc3RydW1lbnRWbUFyZ3MoKTsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtIHR5cGUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgcmV0dXJuIHBsYXRmb3JtVHlwZS5uYW1lOworICB9CisKKyAgLyoqCisgICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byBhIHdvcmtlci4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBJbW11dGFibGVTZXQ8U3RyaW5nPiB3b3JrZXJQcm9jZXNzQXJncygpOworCisgIC8qKgorICAgKiBUaGUgY2xhc3MgcGF0aCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJ1biBhIHdvcmtlci4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHdvcmtlckNsYXNzUGF0aCgpOworCisgIC8qKgorICAgKiBDaGVja3MgdG8gc2VlIHdoZXRoZXIgdGhlIHNwZWNpZmljIGNsYXNzIGlzIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLgorICAgKgorICAgKiA8cD5UaGlzIGNoZWNrcyB0byBzZWUgd2hldGhlciB7QGxpbmsgU3VwcG9ydGVkUGxhdGZvcm19IHNwZWNpZmllcyBhIHtAbGluayBUeXBlfSB0aGF0CisgICAqIG1hdGNoZXMgdGhpcyBwbGF0Zm9ybS4KKyAgICoKKyAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyB0byBjaGVjay4KKyAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzIHN1cHBvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQ2xhc3M8Pz4gY2xhenopIHsKKyAgICBTdXBwb3J0ZWRQbGF0Zm9ybSBhbm5vdGF0aW9uID0gY2xhenouZ2V0QW5ub3RhdGlvbihTdXBwb3J0ZWRQbGF0Zm9ybS5jbGFzcyk7CisgICAgaWYgKGFubm90YXRpb24gPT0gbnVsbCkgeworICAgICAgLy8gU3VwcG9ydCBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGxhdGZvcm0uVHlwZVtdIHR5cGVzID0gYW5ub3RhdGlvbi52YWx1ZSgpOworICAgIGZvciAoVHlwZSB0eXBlIDogdHlwZXMpIHsKKyAgICAgIGlmICh0eXBlLmVxdWFscyhwbGF0Zm9ybVR5cGUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGlucHV0IGFyZ3VtZW50cyBmb3IgdGhlIGN1cnJlbnQgcnVubmluZyBKVk0uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdGlvbjxTdHJpbmc+IGlucHV0QXJndW1lbnRzKCk7CisKKyAgLyoqCisgICAqIFNlbGVjdHMgdGhlIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcG9wdWxhdGUgdGhlCisgICAqIHtAbGluayBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuVm1TcGVjfSBmb3IgYSBzcGVjaWZpYyBydW4uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgUHJlZGljYXRlPFN0cmluZz4gdm1Qcm9wZXJ0aWVzVG9SZXRhaW4oKTsKKworICAvKioKKyAgICogQ2hlY2tzIHRoYXQgdGhlIHZtIG9wdGlvbnMgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBsYXRmb3JtLCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlCisgICAqIG5vdC4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNoZWNrVm1Qcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgZGVmYXVsdCB2bSBob21lIGRpcmVjdG9yeS4KKyAgICovCisgIHB1YmxpYyBGaWxlIGRlZmF1bHRWbUhvbWVEaXIoKSB7CisgICAgLy8gQ3VycmVudGx5IGJvdGggc3VwcG9ydGVkIHBsYXRmb3JtcyB1c2UgamF2YS5ob21lIHByb3BlcnR5IHRvIHJlZmVyIHRvIHRoZSAnaG9tZScgZGlyZWN0b3J5CisgICAgLy8gb2YgdGhlIHZtLCBpbiB0aGUgY2FzZSBvZiBBbmRyb2lkIGl0IGlzIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZGFsdmlrdm0gZXhlY3V0YWJsZS4KKyAgICByZXR1cm4gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBob21lIGRpcmVjdG9yeSBvZiBhIGN1c3RvbSB2aXJ0dWFsIG1hY2hpbmUuCisgICAqIEBwYXJhbSB2bUdyb3VwTWFwIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIGFsbCBWTXMsIG1heSBjb250YWluIGRlZmF1bHQgcHJvcGVydGllcyB0aGF0CisgICAqICAgICBhcHBseSB0byBhbGwgVk1zLgorICAgKiBAcGFyYW0gdm1Db25maWdOYW1lIHRoZSBuYW1lIG9mIHRoZSBWTSB3aXRoaW4gdGhlIGNvbmZpZ3VyYXRpb24sIHVzZWQgdG8gYWNjZXNzIFZNIHNwZWNpZmljCisgICAqICAgICBwcm9wZXJ0aWVzIGZyb20gdGhlIHtAY29kZSB2bUdyb3VwTWFwfS4KKyAgICogQHRocm93cyBWaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIFZNLCBlaXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICogICAgIG9yIHRoZSBmaWxlIHN5c3RlbS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBGaWxlIGN1c3RvbVZtSG9tZURpcihNYXA8U3RyaW5nLCBTdHJpbmc+IHZtR3JvdXBNYXAsIFN0cmluZyB2bUNvbmZpZ05hbWUpCisgICAgICAgICAgdGhyb3dzIFZpcnR1YWxNYWNoaW5lRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBUaGUgdHlwZSBvZiBwbGF0Zm9ybXMgc3VwcG9ydGVkLgorICAgKi8KKyAgcHVibGljIGVudW0gVHlwZSB7CisgICAgREFMVklLKCJEYWx2aWsiKSwKKyAgICBKVk0oIkphdmEiKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICBUeXBlKFN0cmluZyBuYW1lKSB7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9TdXBwb3J0ZWRQbGF0Zm9ybS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9TdXBwb3J0ZWRQbGF0Zm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYWM3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3BsYXRmb3JtL1N1cHBvcnRlZFBsYXRmb3JtLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm07CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogSW5kaWNhdGVzIHRoZSBwbGF0Zm9ybXMgc3VwcG9ydGVkIGJ5IHRoZSBhbm5vdGF0ZWQgdHlwZS4KKyAqLworQFRhcmdldChUWVBFKQorQFJldGVudGlvbihSVU5USU1FKQorQERvY3VtZW50ZWQKK3B1YmxpYyBAaW50ZXJmYWNlIFN1cHBvcnRlZFBsYXRmb3JtIHsKKyAgUGxhdGZvcm0uVHlwZVtdIHZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vVmlydHVhbE1hY2hpbmVFeGNlcHRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9VcGxvYWRSZXN1bHRzLmphdmEKY29weSB0byBjYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3BsYXRmb3JtL1ZpcnR1YWxNYWNoaW5lRXhjZXB0aW9uLmphdmEKaW5kZXggN2RhZTdhZi4uYjI0MTIxMiAxMDA2NDQKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9VcGxvYWRSZXN1bHRzLmphdmEKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9WaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxNSArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm07CiAKIC8qKgotICogVXNhZ2U6IFVwbG9hZFJlc3VsdHMgPGZpbGVfb3JfZGlyPgorICogVGhyb3duIHdoZW4gYSBwcm9ibGVtIHdhcyBmb3VuZCB3aXRoIGEgY3VzdG9tIFZNIGNvbmZpZ3VyYXRpb24uCiAgKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRSZXN1bHRzIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIG5ldyBSdW5uZXIoKS51cGxvYWRSZXN1bHRzRmlsZU9yRGlyKG5ldyBGaWxlKGFyZ3NbMF0pKTsKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgcHVibGljIFZpcnR1YWxNYWNoaW5lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vZGFsdmlrL0RhbHZpa01vZHVsZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9kYWx2aWsvRGFsdmlrTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjNWIwMAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vZGFsdmlrL0RhbHZpa01vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLmRhbHZpazsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT3B0aW9uYWw7CisKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogUHJvdmlkZXIgb2YgYSB7QGxpbmsgRGFsdmlrUGxhdGZvcm19IGluc3RhbmNlLgorICoKKyAqIDxwPlRoZSB7QGxpbmsgRGFsdmlrUGxhdGZvcm19IGlzIG9wdGlvbmFsIGFzIGl0IGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gcnVubmluZyBvbiBBbmRyb2lkLgorICovCitATW9kdWxlCitwdWJsaWMgZmluYWwgY2xhc3MgRGFsdmlrTW9kdWxlIHsKKworICBAUHJvdmlkZXMKKyAgQFNpbmdsZXRvbgorICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPERhbHZpa1BsYXRmb3JtPiBwcm92aWRlT3B0aW9uYWxQbGF0Zm9ybSgpIHsKKyAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnNwZWNpZmljYXRpb24ubmFtZSIpLmVxdWFscygiRGFsdmlrIENvcmUgTGlicmFyeSIpKSB7CisgICAgICByZXR1cm4gT3B0aW9uYWwub2YobmV3IERhbHZpa1BsYXRmb3JtKCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gT3B0aW9uYWwuYWJzZW50KCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3BsYXRmb3JtL2RhbHZpay9EYWx2aWtQbGF0Zm9ybS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9kYWx2aWsvRGFsdmlrUGxhdGZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTk3MWQzCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9kYWx2aWsvRGFsdmlrUGxhdGZvcm0uamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5kYWx2aWs7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBbiBhYnN0cmFjdGlvbiBvZiB0aGUgRGFsdmlrIChha2EgQW5kcm9pZCkgcGxhdGZvcm0uCisgKgorICogPHA+QWx0aG91Z2ggdGhpcyB0YWxrcyBhYm91dCBkYWx2aWsgaXQgYWN0dWFsbHkgd29ya3Mgd2l0aCBBUlQgdG9vLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGFsdmlrUGxhdGZvcm0gZXh0ZW5kcyBQbGF0Zm9ybSB7CisKKyAgcHVibGljIERhbHZpa1BsYXRmb3JtKCkgeworICAgIHN1cGVyKFR5cGUuREFMVklLKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRmlsZSB2bUV4ZWN1dGFibGUoRmlsZSB2bUhvbWUpIHsKKyAgICAvLyBUT0RPKHVzZXIpOiBBbGxvdyB0aGUgMzIvNjQgdmVyc2lvbiBvZiBkYWx2aWsgdG8gYmUgc2VsZWN0ZWQgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQKKyAgICAvLyBzdGFuZGFyZCBjb25maWd1cmF0aW9ucyBvZiBBbmRyb2lkIHN5c3RlbXMgYW5kIHdpbmRvd3MuCisgICAgRmlsZSBiaW4gPSBuZXcgRmlsZSh2bUhvbWUsICJiaW4iKTsKKyAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoYmluLmV4aXN0cygpICYmIGJpbi5pc0RpcmVjdG9yeSgpLAorICAgICAgICAiQ291bGQgbm90IGZpbmQgJXMgdW5kZXIgYW5kcm9pZCByb290ICVzIiwgYmluLCB2bUhvbWUpOworICAgIFN0cmluZyBleGVjdXRhYmxlTmFtZSA9ICJkYWx2aWt2bSI7CisgICAgRmlsZSBkYWx2aWt2bSA9IG5ldyBGaWxlKGJpbiwgZXhlY3V0YWJsZU5hbWUpOworICAgIGlmICghZGFsdmlrdm0uZXhpc3RzKCkgfHwgZGFsdmlrdm0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDYW5ub3QgZmluZCAlcyBiaW5hcnkgaW4gJXMiLCBleGVjdXRhYmxlTmFtZSwgYmluKSk7CisgICAgfQorCisgICAgcmV0dXJuIGRhbHZpa3ZtOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbW11dGFibGVTZXQ8U3RyaW5nPiBjb21tb25JbnN0cnVtZW50Vm1BcmdzKCkgeworICAgIHJldHVybiBJbW11dGFibGVTZXQub2YoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSW1tdXRhYmxlU2V0PFN0cmluZz4gd29ya2VyUHJvY2Vzc0FyZ3MoKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgd29ya2VyQ2xhc3NQYXRoKCkgeworICAgIC8vIFRPRE8odXNlcik6IEZpbmQgYSB3YXkgdG8gZ2V0IHRoZSBjbGFzcyBwYXRoIHByb2dyYW1tYXRpY2FsbHkgZnJvbSB0aGUgY2xhc3MgbG9hZGVyLgorICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gaW5wdXRBcmd1bWVudHMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQcmVkaWNhdGU8U3RyaW5nPiB2bVByb3BlcnRpZXNUb1JldGFpbigpIHsKKyAgICByZXR1cm4gUHJlZGljYXRlcy5hbHdheXNGYWxzZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNoZWNrVm1Qcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykgeworICAgIGNoZWNrU3RhdGUob3B0aW9ucy5pc0VtcHR5KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBGaWxlIGN1c3RvbVZtSG9tZURpcihNYXA8U3RyaW5nLCBTdHJpbmc+IHZtR3JvdXBNYXAsIFN0cmluZyB2bUNvbmZpZ05hbWUpIHsKKyAgICAvLyBUT0RPKHVzZXIpOiBTaG91bGQgcHJvYmFibHkgdXNlIHRoaXMgdG8gc3VwcG9ydCBzcGVjaWZ5aW5nIGRhbHZpa3ZtMzIvZGFsdmlrdm02NAorICAgIC8vIGFuZCBtYXliZSBldmVuIGFwcF9wcm9jZXNzLgorICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICJSdW5uaW5nIHdpdGggYSBjdXN0b20gRGFsdmlrIFZNIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vanZtL0VmZmVjdGl2ZUNsYXNzUGF0aC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9qdm0vRWZmZWN0aXZlQ2xhc3NQYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2MzYzOAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vanZtL0VmZmVjdGl2ZUNsYXNzUGF0aC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLmp2bTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBQcm92aWRlcyBhIGNsYXNzIHBhdGggY29udGFpbmluZyBhbGwgb2YgdGhlIGphcnMgcHJlc2VudCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0aGF0IGFyZSByZWZlcmVuY2VkCisgKiBieSBhIGdpdmVuIHtAbGluayBDbGFzc0xvYWRlcn0uCisgKi8KK2ZpbmFsIGNsYXNzIEVmZmVjdGl2ZUNsYXNzUGF0aCB7CisgIHByaXZhdGUgRWZmZWN0aXZlQ2xhc3NQYXRoKCkge30KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0NMQVNTX1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOworCisgIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NQYXRoRm9yQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAvLyBPcmRlciBvZiBKQVIgZmlsZXMgbWF5IGhhdmUgc29tZSBzaWduaWZpY2FuY2UuIFRyeSB0byBwcmVzZXJ2ZSBpdC4KKyAgICBMaW5rZWRIYXNoU2V0PEZpbGU+IGZpbGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8RmlsZT4oKTsKKyAgICBmb3IgKFN0cmluZyBlbnRyeSA6IFNwbGl0dGVyLm9uKFBBVEhfU0VQQVJBVE9SKS5zcGxpdChKQVZBX0NMQVNTX1BBVEgpKSB7CisgICAgICBmaWxlcy5hZGQobmV3IEZpbGUoZW50cnkpKTsKKyAgICB9CisgICAgZmlsZXMuYWRkQWxsKGdldENsYXNzUGF0aEZpbGVzKGNsYXNzTG9hZGVyKSk7CisKKyAgICByZXR1cm4gSm9pbmVyLm9uKFBBVEhfU0VQQVJBVE9SKS5qb2luKGZpbGVzKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFNldDxGaWxlPiBnZXRDbGFzc1BhdGhGaWxlcyhDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgIEltbXV0YWJsZVNldC5CdWlsZGVyPEZpbGU+IGZpbGVzID0gSW1tdXRhYmxlU2V0LmJ1aWxkZXIoKTsKKyAgICBATnVsbGFibGUgQ2xhc3NMb2FkZXIgcGFyZW50ID0gY2xhc3NMb2FkZXIuZ2V0UGFyZW50KCk7CisgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICBmaWxlcy5hZGRBbGwoZ2V0Q2xhc3NQYXRoRmlsZXMocGFyZW50KSk7CisgICAgfQorICAgIGlmIChjbGFzc0xvYWRlciBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7CisgICAgICBVUkxDbGFzc0xvYWRlciB1cmxDbGFzc0xvYWRlciA9IChVUkxDbGFzc0xvYWRlcikgY2xhc3NMb2FkZXI7CisgICAgICBmb3IgKFVSTCB1cmwgOiB1cmxDbGFzc0xvYWRlci5nZXRVUkxzKCkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmaWxlcy5hZGQobmV3IEZpbGUodXJsLnRvVVJJKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAvLyBza2lwIGl0IHRoZW4KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAvLyBza2lwIGl0IHRoZW4KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmlsZXMuYnVpbGQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9VcGxvYWRSZXN1bHRzLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3BsYXRmb3JtL2p2bS9Kdm1Nb2R1bGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9VcGxvYWRSZXN1bHRzLmphdmEKY29weSB0byBjYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3BsYXRmb3JtL2p2bS9Kdm1Nb2R1bGUuamF2YQppbmRleCA3ZGFlN2FmLi42NDkwMzc0IDEwMDY0NAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YQorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3BsYXRmb3JtL2p2bS9Kdm1Nb2R1bGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBHb29nbGUgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTUgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlcjsKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLmp2bTsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKIAogLyoqCi0gKiBVc2FnZTogVXBsb2FkUmVzdWx0cyA8ZmlsZV9vcl9kaXI+CisgKiBQcm92aWRlciBvZiB0aGUgZGVmYXVsdCB7QGxpbmsgSnZtUGxhdGZvcm19LCB0aGlzIGlzIGFzc3VtZWQgdG8gYWx3YXlzIGJlIGF2YWlsYWJsZS4KICAqLwotcHVibGljIGNsYXNzIFVwbG9hZFJlc3VsdHMgewotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgbmV3IFJ1bm5lcigpLnVwbG9hZFJlc3VsdHNGaWxlT3JEaXIobmV3IEZpbGUoYXJnc1swXSkpOworQE1vZHVsZQorcHVibGljIGZpbmFsIGNsYXNzIEp2bU1vZHVsZSB7CisKKyAgQFByb3ZpZGVzCisgIHB1YmxpYyBzdGF0aWMgSnZtUGxhdGZvcm0gcHJvdmlkZUp2bVBsYXRmb3JtKCkgeworICAgIHJldHVybiBuZXcgSnZtUGxhdGZvcm0oKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9wbGF0Zm9ybS9qdm0vSnZtUGxhdGZvcm0uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vanZtL0p2bVBsYXRmb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5Y2RkOQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcGxhdGZvcm0vanZtL0p2bVBsYXRmb3JtLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLmp2bTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlRocmVhZC5jdXJyZW50VGhyZWFkOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLlBsYXRmb3JtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5WaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3Rpb25zMjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBBbiBhYnN0cmFjdGlvbiBvZiBhIHN0YW5kYXJkIEphdmEgVmlydHVhbCBNYWNoaW5lIHBsYXRmb3JtLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSnZtUGxhdGZvcm0gZXh0ZW5kcyBQbGF0Zm9ybSB7CisKKyAgLyoqCisgICAqIFNvbWUgZGVmYXVsdCBKVk0gYXJncyB0byBrZWVwIHdvcmtlciBWTXMgc29tZXdoYXQgcHJlZGljdGFibGUuCisgICAqLworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVTZXQ8U3RyaW5nPiBJTlNUUlVNRU5UX0pWTV9BUkdTID0gSW1tdXRhYmxlU2V0Lm9mKAorICAgICAgLy8gZG8gY29tcGlsYXRpb24gc2VyaWFsbHkKKyAgICAgICItWGJhdGNoIiwKKyAgICAgIC8vIG1ha2Ugc3VyZSBjb21waWxhdGlvbiBkb2Vzbid0IHJ1biBpbiBwYXJhbGxlbCB3aXRoIGl0c2VsZgorICAgICAgIi1YWDpDSUNvbXBpbGVyQ291bnQ9MSIsCisgICAgICAvLyBlbnN1cmUgdGhlIHBhcmFsbGVsIGdhcmJhZ2UgY29sbGVjdG9yCisgICAgICAiLVhYOitVc2VQYXJhbGxlbEdDIiwKKyAgICAgIC8vIGdlbmVyYXRlIGNsYXNzZXMgb3IgZG9uJ3QsIGJ1dCBkbyBpdCBpbW1lZGlhdGVseQorICAgICAgIi1Ec3VuLnJlZmxlY3QuaW5mbGF0aW9uVGhyZXNob2xkPTAiKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVTZXQ8U3RyaW5nPiBXT1JLRVJfUFJPQ0VTU19BUkdTID0gSW1tdXRhYmxlU2V0Lm9mKAorICAgICAgIi1YWDorUHJpbnRGbGFnc0ZpbmFsIiwKKyAgICAgICItWFg6K1ByaW50Q29tcGlsYXRpb24iLAorICAgICAgIi1YWDorUHJpbnRHQyIpOworCisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFN0cmluZz4gUFJPUEVSVElFU19UT19SRVRBSU4gPSBuZXcgUHJlZGljYXRlPFN0cmluZz4oKSB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGFwcGx5KFN0cmluZyBpbnB1dCkgeworICAgICAgcmV0dXJuIGlucHV0LnN0YXJ0c1dpdGgoImphdmEudm0iKQorICAgICAgICAgIHx8IGlucHV0LnN0YXJ0c1dpdGgoImphdmEucnVudGltZSIpCisgICAgICAgICAgfHwgaW5wdXQuZXF1YWxzKCJqYXZhLnZlcnNpb24iKQorICAgICAgICAgIHx8IGlucHV0LmVxdWFscygiamF2YS52ZW5kb3IiKQorICAgICAgICAgIHx8IGlucHV0LmVxdWFscygic3VuLnJlZmxlY3Qubm9JbmZsYXRpb24iKQorICAgICAgICAgIHx8IGlucHV0LmVxdWFscygic3VuLnJlZmxlY3QuaW5mbGF0aW9uVGhyZXNob2xkIik7CisgICAgfQorICB9OworCisgIHB1YmxpYyBKdm1QbGF0Zm9ybSgpIHsKKyAgICBzdXBlcihUeXBlLkpWTSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEZpbGUgdm1FeGVjdXRhYmxlKEZpbGUgamF2YUhvbWUpIHsKKyAgICAvLyBUT0RPKGdhayk6IHN1cHBvcnQgb3RoZXIgcGxhdGZvcm1zLiBUaGlzIGN1cnJlbnRseSBzdXBwb3J0cyBmaW5kaW5nIHRoZSBqYXZhIGV4ZWN1dGFibGUgb24KKyAgICAvLyBzdGFuZGFyZCBjb25maWd1cmF0aW9ucyBvZiB1bml4IHN5c3RlbXMgYW5kIHdpbmRvd3MuCisgICAgRmlsZSBiaW4gPSBuZXcgRmlsZShqYXZhSG9tZSwgImJpbiIpOworICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShiaW4uZXhpc3RzKCkgJiYgYmluLmlzRGlyZWN0b3J5KCksCisgICAgICAgICJDb3VsZCBub3QgZmluZCAlcyB1bmRlciBqYXZhIGhvbWUgJXMiLCBiaW4sIGphdmFIb21lKTsKKyAgICBGaWxlIGp2bSA9IG5ldyBGaWxlKGJpbiwgImphdmEiKTsKKyAgICBpZiAoIWp2bS5leGlzdHMoKSB8fCBqdm0uaXNEaXJlY3RvcnkoKSkgeworICAgICAganZtID0gbmV3IEZpbGUoYmluLCAiamF2YS5leGUiKTsKKyAgICAgIGlmICghanZtLmV4aXN0cygpIHx8IGp2bS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDYW5ub3QgZmluZCBqYXZhIGJpbmFyeSBpbiAlcywgbG9va2VkIGZvciBqYXZhIGFuZCBqYXZhLmV4ZSIsIGJpbikpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBqdm07CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEltbXV0YWJsZVNldDxTdHJpbmc+IGNvbW1vbkluc3RydW1lbnRWbUFyZ3MoKSB7CisgICAgcmV0dXJuIElOU1RSVU1FTlRfSlZNX0FSR1M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEltbXV0YWJsZVNldDxTdHJpbmc+IHdvcmtlclByb2Nlc3NBcmdzKCkgeworICAgIHJldHVybiBXT1JLRVJfUFJPQ0VTU19BUkdTOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgd29ya2VyQ2xhc3NQYXRoKCkgeworICAgIHJldHVybiBnZXRDbGFzc1BhdGgoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKSB7CisgICAgLy8gVXNlIHRoZSBlZmZlY3RpdmUgY2xhc3MgcGF0aCBpbiBjYXNlIHRoaXMgaXMgYmVpbmcgaW52b2tlZCBpbiBhbiBpc29sYXRlZCBjbGFzcyBsb2FkZXIKKyAgICBTdHJpbmcgY2xhc3NwYXRoID0KKyAgICAgICAgRWZmZWN0aXZlQ2xhc3NQYXRoLmdldENsYXNzUGF0aEZvckNsYXNzTG9hZGVyKGN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGlucHV0QXJndW1lbnRzKCkgeworICAgIHJldHVybiBDb2xsZWN0aW9uczIuZmlsdGVyKE1hbmFnZW1lbnRGYWN0b3J5LmdldFJ1bnRpbWVNWEJlYW4oKS5nZXRJbnB1dEFyZ3VtZW50cygpLAorICAgICAgICBuZXcgUHJlZGljYXRlPFN0cmluZz4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIGJvb2xlYW4gYXBwbHkoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICAvLyBFeGNsdWRlIHRoZSAtYWdlbnRsaWI6amR3cCBwYXJhbSB3aGljaCBjb25maWd1cmVzIHRoZSBzb2NrZXQgZGVidWdnaW5nIHByb3RvY29sLgorICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBzZXQgaW4gdGhlIHBhcmVudCBWTSB3ZSBkbyBub3Qgd2FudCBpdCB0byBiZSBpbmhlcml0ZWQgYnkgdGhlIGNoaWxkCisgICAgICAgICAgICAvLyBWTS4gIElmIGl0IGlzLCB0aGUgY2hpbGQgd2lsbCBkaWUgaW1tZWRpYXRlbHkgb24gc3RhcnR1cCBiZWNhdXNlIGl0IHdpbGwgZmFpbCB0bworICAgICAgICAgICAgLy8gYmluZCB0byB0aGUgZGVidWcgcG9ydCAoYmVjYXVzZSB0aGUgcGFyZW50IFZNIGlzIGFscmVhZHkgYm91bmQgdG8gaXQpLgorICAgICAgICAgICAgcmV0dXJuICFpbnB1dC5zdGFydHNXaXRoKCItYWdlbnRsaWI6amR3cCIpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByZWRpY2F0ZTxTdHJpbmc+IHZtUHJvcGVydGllc1RvUmV0YWluKCkgeworICAgIHJldHVybiBQUk9QRVJUSUVTX1RPX1JFVEFJTjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjaGVja1ZtUHJvcGVydGllcyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpIHsKKyAgICBjaGVja1N0YXRlKCFvcHRpb25zLmlzRW1wdHkoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEZpbGUgY3VzdG9tVm1Ib21lRGlyKE1hcDxTdHJpbmcsIFN0cmluZz4gdm1Hcm91cE1hcCwgU3RyaW5nIHZtQ29uZmlnTmFtZSkKKyAgICAgICAgICB0aHJvd3MgVmlydHVhbE1hY2hpbmVFeGNlcHRpb24geworICAgIC8vIENvbmZpZ3VyYXRpb24gY2FuIGVpdGhlciBiZToKKyAgICAvLyAgIHZtLjx2bUNvbmZpZ05hbWU+LmhvbWUgPSA8aG9tZURpcj4KKyAgICAvLyBvcgorICAgIC8vICAgdm0uYmFzZURpcmVjdG9yeSA9IDxiYXNlRGlyPgorICAgIC8vICAgaG9tZURpciA9IDxiYXNlRGlyPi88dm1Db25maWdOYW1lPgorICAgIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gdm1NYXAgPSBVdGlsLnN1Ymdyb3VwTWFwKHZtR3JvdXBNYXAsIHZtQ29uZmlnTmFtZSk7CisgICAgcmV0dXJuIGdldEpka0hvbWVEaXIodm1Hcm91cE1hcC5nZXQoImJhc2VEaXJlY3RvcnkiKSwgdm1NYXAuZ2V0KCJob21lIiksIHZtQ29uZmlnTmFtZSk7CisgIH0KKworICAvLyBUT0RPKGdhayk6IGNoZWNrIHRoYXQgdGhlIGRpcmVjdG9yeSBzZWVtcyB0byBiZSBhIGpkayBob21lICh3aXRoIGEgamF2YSBiaW5hcnkgYW5kIGFsbCBvZiB0aGF0KQorICAvLyBUT0RPKGdhayk6IG1ha2UgdGhpcyB3b3JrIHdpdGggZGlmZmVyZW50IGRpcmVjdG9yeSBsYXlvdXRzLiAgSSdtIGxvb2tpbmcgYXQgeW91IE9TIFguLi4KKyAgcHVibGljIHN0YXRpYyBGaWxlIGdldEpka0hvbWVEaXIoQE51bGxhYmxlIFN0cmluZyBiYXNlRGlyZWN0b3J5UGF0aCwKKyAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGhvbWVEaXJQYXRoLCBTdHJpbmcgdm1Db25maWdOYW1lKQorICAgICAgICAgIHRocm93cyBWaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbiB7CisgICAgaWYgKGhvbWVEaXJQYXRoID09IG51bGwpIHsKKyAgICAgIEZpbGUgYmFzZURpcmVjdG9yeSA9IGdldEJhc2VEaXJlY3RvcnkoYmFzZURpcmVjdG9yeVBhdGgpOworICAgICAgRmlsZSBob21lRGlyID0gbmV3IEZpbGUoYmFzZURpcmVjdG9yeSwgdm1Db25maWdOYW1lKTsKKyAgICAgIGNoZWNrQ29uZmlndXJhdGlvbihob21lRGlyLmlzRGlyZWN0b3J5KCksICIlcyBpcyBub3QgYSBkaXJlY3RvcnkiLCBob21lRGlyKTsKKyAgICAgIHJldHVybiBob21lRGlyOworICAgIH0gZWxzZSB7CisgICAgICBGaWxlIHBvdGVudGlhbEhvbWVEaXIgPSBuZXcgRmlsZShob21lRGlyUGF0aCk7CisgICAgICBpZiAocG90ZW50aWFsSG9tZURpci5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgY2hlY2tDb25maWd1cmF0aW9uKHBvdGVudGlhbEhvbWVEaXIuaXNEaXJlY3RvcnkoKSwgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIsCisgICAgICAgICAgICAgICAgcG90ZW50aWFsSG9tZURpcik7CisgICAgICAgIHJldHVybiBwb3RlbnRpYWxIb21lRGlyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRmlsZSBiYXNlRGlyZWN0b3J5ID0gZ2V0QmFzZURpcmVjdG9yeShiYXNlRGlyZWN0b3J5UGF0aCk7CisgICAgICAgIEZpbGUgaG9tZURpciA9IG5ldyBGaWxlKGJhc2VEaXJlY3RvcnksIGhvbWVEaXJQYXRoKTsKKyAgICAgICAgY2hlY2tDb25maWd1cmF0aW9uKGhvbWVEaXIuaXNEaXJlY3RvcnkoKSwgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIsIHBvdGVudGlhbEhvbWVEaXIpOworICAgICAgICByZXR1cm4gaG9tZURpcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldEJhc2VEaXJlY3RvcnkoQE51bGxhYmxlIFN0cmluZyBiYXNlRGlyZWN0b3J5UGF0aCkKKyAgICAgICAgICB0aHJvd3MgVmlydHVhbE1hY2hpbmVFeGNlcHRpb24geworICAgIGlmIChiYXNlRGlyZWN0b3J5UGF0aCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgVmlydHVhbE1hY2hpbmVFeGNlcHRpb24oCisgICAgICAgICAgICAgICJtdXN0IHNldCBlaXRoZXIgYSBob21lIGRpcmVjdG9yeSBvciBhIGJhc2UgZGlyZWN0b3J5Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpbGUgYmFzZURpcmVjdG9yeSA9IG5ldyBGaWxlKGJhc2VEaXJlY3RvcnlQYXRoKTsKKyAgICAgIGNoZWNrQ29uZmlndXJhdGlvbihiYXNlRGlyZWN0b3J5LmlzQWJzb2x1dGUoKSwgImJhc2UgZGlyZWN0b3J5IGNhbm5vdCBiZSBhIHJlbGF0aXZlIHBhdGgiKTsKKyAgICAgIGNoZWNrQ29uZmlndXJhdGlvbihiYXNlRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCksICJiYXNlIGRpcmVjdG9yeSBtdXN0IGJlIGEgZGlyZWN0b3J5Iik7CisgICAgICByZXR1cm4gYmFzZURpcmVjdG9yeTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbihib29sZWFuIGNoZWNrLCBTdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICB0aHJvd3MgVmlydHVhbE1hY2hpbmVFeGNlcHRpb24geworICAgIGlmICghY2hlY2spIHsKKyAgICAgIHRocm93IG5ldyBWaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbihib29sZWFuIGNoZWNrLCBTdHJpbmcgbWVzc2FnZUZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpCisgICAgICAgICAgdGhyb3dzIFZpcnR1YWxNYWNoaW5lRXhjZXB0aW9uIHsKKyAgICBpZiAoIWNoZWNrKSB7CisgICAgICB0aHJvdyBuZXcgVmlydHVhbE1hY2hpbmVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdChtZXNzYWdlRm9ybWF0LCBhcmdzKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9BbGxvY2F0aW9uSW5zdHJ1bWVudC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQWxsb2NhdGlvbkluc3RydW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDY5MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQWxsb2NhdGlvbkluc3RydW1lbnQuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXMucHJvcGFnYXRlSWZJbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuU2tpcFRoaXNTY2VuYXJpb0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLlZtQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5QbGF0Zm9ybTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uU3VwcG9ydGVkUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlci5NYWNyb2JlbmNobWFya0FsbG9jYXRpb25Xb3JrZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlci5NaWNyb2JlbmNobWFya0FsbG9jYXRpb25Xb3JrZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlci5Xb3JrZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5tb25pdG9yaW5nLnJ1bnRpbWUuaW5zdHJ1bWVudGF0aW9uLkFsbG9jYXRpb25JbnN0cnVtZW50ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICoge0BsaW5rIEluc3RydW1lbnR9IHRoYXQgd2F0Y2hlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb25zIGluIGFuIGludm9jYXRpb24gb2YgdGhlCisgKiBiZW5jaG1hcmsgbWV0aG9kIGFuZCByZXBvcnRzIHNvbWUgc3RhdGlzdGljLiBUaGUgYmVuY2htYXJrIG1ldGhvZCBtdXN0IGFjY2VwdCBhCisgKiBzaW5nbGUgaW50IGFyZ3VtZW50ICdyZXBzJywgd2hpY2ggaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0byBleGVjdXRlIHRoZSBndXRzIG9mCisgKiB0aGUgYmVuY2htYXJrIG1ldGhvZCwgYW5kIGl0IG11c3QgYmUgcHVibGljIGFuZCBub24tc3RhdGljLgorICoKKyAqIDxwPk5vdGUgdGhhdCB0aGUgYWxsb2NhdGlvbiBpbnN0cnVtZW50cyByZXBvcnRzIGEgIndvcnN0IGNhc2UiIGZvciBhbGxvY2F0aW9uIGluIHRoYXQgaXQgcmVwb3J0cworICogdGhlIGJ5dGVzIGFuZCBvYmplY3RzIGFsbG9jYXRlZCBpbiBpbnRlcnByZXRlZCBtb2RlIChubyBKSVQpLgorICovCitAU3VwcG9ydGVkUGxhdGZvcm0oUGxhdGZvcm0uVHlwZS5KVk0pCitwdWJsaWMgZmluYWwgY2xhc3MgQWxsb2NhdGlvbkluc3RydW1lbnQgZXh0ZW5kcyBJbnN0cnVtZW50IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9DQVRJT05fQUdFTlRfSkFSX09QVElPTiA9ICJhbGxvY2F0aW9uQWdlbnRKYXIiOworICAvKioKKyAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIHtAY29kZSB0cnVlfSB0aGVuIGV2ZXJ5IGluZGl2aWR1YWwgYWxsb2NhdGlvbiB3aWxsIGJlIHRyYWNrZWQgYW5kCisgICAqIGxvZ2dlZC4gIFRoaXMgd2lsbCBhbHNvIGluY3JlYXNlIHRoZSBkZXRhaWwgb2YgY2VydGFpbiBlcnJvciBtZXNzYWdlcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDS19BTExPQ0FUSU9OU19PUFRJT04gPSAidHJhY2tBbGxvY2F0aW9ucyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFsbG9jYXRpb25JbnN0cnVtZW50LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVuY2htYXJrTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICByZXR1cm4gbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoQmVuY2htYXJrLmNsYXNzKSB8fCBCZW5jaG1hcmtNZXRob2RzLmlzVGltZU1ldGhvZChtZXRob2QpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbnN0cnVtZW50YXRpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9uKE1ldGhvZCBiZW5jaG1hcmtNZXRob2QpCisgICAgICB0aHJvd3MgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbiB7CisgICAgY2hlY2tOb3ROdWxsKGJlbmNobWFya01ldGhvZCk7CisgICAgY2hlY2tBcmd1bWVudChpc0JlbmNobWFya01ldGhvZChiZW5jaG1hcmtNZXRob2QpKTsKKyAgICB0cnkgeworICAgICAgc3dpdGNoIChCZW5jaG1hcmtNZXRob2RzLlR5cGUub2YoYmVuY2htYXJrTWV0aG9kKSkgeworICAgICAgICBjYXNlIE1BQ1JPOgorICAgICAgICAgIHJldHVybiBuZXcgTWFjcm9BbGxvY2F0aW9uSW5zdHJ1bWVudGF0aW9uKGJlbmNobWFya01ldGhvZCk7CisgICAgICAgIGNhc2UgTUlDUk86CisgICAgICAgIGNhc2UgUElDTzoKKyAgICAgICAgICByZXR1cm4gbmV3IE1pY3JvQWxsb2NhdGlvbkluc3RydW1lbnRhdGlvbihiZW5jaG1hcmtNZXRob2QpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigidW5rbm93biB0eXBlIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKCJCZW5jaG1hcmsgbWV0aG9kcyBtdXN0IGhhdmUgbm8gYXJndW1lbnRzIG9yIGFjY2VwdCAiCisgICAgICAgICAgKyAiYSBzaW5nbGUgaW50IG9yIGxvbmcgcGFyYW1ldGVyOiAlcyIsIGJlbmNobWFya01ldGhvZC5nZXROYW1lKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgY2xhc3MgTWljcm9BbGxvY2F0aW9uSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uIHsKKyAgICBNaWNyb0FsbG9jYXRpb25JbnN0cnVtZW50YXRpb24oTWV0aG9kIGJlbmNobWFya01ldGhvZCkgeworICAgICAgc3VwZXIoYmVuY2htYXJrTWV0aG9kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcnlSdW4oT2JqZWN0IGJlbmNobWFyaykgdGhyb3dzIFVzZXJDb2RlRXhjZXB0aW9uIHsKKyAgICAgIC8vIGV4ZWN1dGUgdGhlIGJlbmNobWFyayBtZXRob2QsIGJ1dCBkb24ndCB0cnkgdG8gdGFrZSBhbnkgbWVhc3VyZW1lbnRzLCBiZWNhdXNlIHRoaXMgSlZNCisgICAgICAvLyBtYXkgbm90IGhhdmUgdGhlIGFsbG9jYXRpb24gaW5zdHJ1bWVudGVyIGFnZW50LgorICAgICAgdHJ5IHsKKyAgICAgICAgYmVuY2htYXJrTWV0aG9kLmludm9rZShiZW5jaG1hcmssIDEpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpbXBvc3NpYmxlKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihpbXBvc3NpYmxlKTsKKyAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICBUaHJvd2FibGUgdXNlckV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgcHJvcGFnYXRlSWZJbnN0YW5jZU9mKHVzZXJFeGNlcHRpb24sIFNraXBUaGlzU2NlbmFyaW9FeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvdyBuZXcgVXNlckNvZGVFeGNlcHRpb24odXNlckV4Y2VwdGlvbik7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IHdvcmtlck9wdGlvbnMoKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKFRSQUNLX0FMTE9DQVRJT05TX09QVElPTiwgb3B0aW9ucy5nZXQoVFJBQ0tfQUxMT0NBVElPTlNfT1BUSU9OKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBXb3JrZXI+IHdvcmtlckNsYXNzKCkgeworICAgICAgcmV0dXJuIE1pY3JvYmVuY2htYXJrQWxsb2NhdGlvbldvcmtlci5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBNZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yIGdldE1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IoKSB7CisgICAgICByZXR1cm4gbmV3IEluc3RydW1lbnQuRGVmYXVsdE1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IoCisgICAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKCJieXRlcyIsICJvYmplY3RzIikpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgVHJpYWxTY2hlZHVsaW5nUG9saWN5IHNjaGVkdWxpbmdQb2xpY3koKSB7CisgICAgLy8gQXNzdW1pbmcgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeSBpdCBzaG91bGQgYmUgZmluZSB0byBydW4gdGhlc2UgaW4gcGFyYWxsZWwuCisgICAgcmV0dXJuIFRyaWFsU2NoZWR1bGluZ1BvbGljeS5QQVJBTExFTDsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgY2xhc3MgTWFjcm9BbGxvY2F0aW9uSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uIHsKKyAgICBNYWNyb0FsbG9jYXRpb25JbnN0cnVtZW50YXRpb24oTWV0aG9kIGJlbmNobWFya01ldGhvZCkgeworICAgICAgc3VwZXIoYmVuY2htYXJrTWV0aG9kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcnlSdW4oT2JqZWN0IGJlbmNobWFyaykgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24geworICAgICAgLy8gZXhlY3V0ZSB0aGUgYmVuY2htYXJrIG1ldGhvZCwgYnV0IGRvbid0IHRyeSB0byB0YWtlIGFueSBtZWFzdXJlbWVudHMsIGJlY2F1c2UgdGhpcyBKVk0KKyAgICAgIC8vIG1heSBub3QgaGF2ZSB0aGUgYWxsb2NhdGlvbiBpbnN0cnVtZW50ZXIgYWdlbnQuCisgICAgICB0cnkgeworICAgICAgICBiZW5jaG1hcmtNZXRob2QuaW52b2tlKGJlbmNobWFyayk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGltcG9zc2libGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGltcG9zc2libGUpOworICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFRocm93YWJsZSB1c2VyRXhjZXB0aW9uID0gZS5nZXRDYXVzZSgpOworICAgICAgICBwcm9wYWdhdGVJZkluc3RhbmNlT2YodXNlckV4Y2VwdGlvbiwgU2tpcFRoaXNTY2VuYXJpb0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93IG5ldyBVc2VyQ29kZUV4Y2VwdGlvbih1c2VyRXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gd29ya2VyT3B0aW9ucygpIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVNYXAub2YoVFJBQ0tfQUxMT0NBVElPTlNfT1BUSU9OLCBvcHRpb25zLmdldChUUkFDS19BTExPQ0FUSU9OU19PUFRJT04pKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIFdvcmtlcj4gd29ya2VyQ2xhc3MoKSB7CisgICAgICByZXR1cm4gTWFjcm9iZW5jaG1hcmtBbGxvY2F0aW9uV29ya2VyLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIE1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IgZ2V0TWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvcigpIHsKKyAgICAgIHJldHVybiBuZXcgSW5zdHJ1bWVudC5EZWZhdWx0TWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvcigKKyAgICAgICAgICBJbW11dGFibGVTZXQub2YoImJ5dGVzIiwgIm9iamVjdHMiKSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbW11dGFibGVTZXQ8U3RyaW5nPiBpbnN0cnVtZW50T3B0aW9ucygpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlU2V0Lm9mKEFMTE9DQVRJT05fQUdFTlRfSkFSX09QVElPTiwgVFJBQ0tfQUxMT0NBVElPTlNfT1BUSU9OKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE9wdGlvbmFsPEZpbGU+IGZpbmRBbGxvY2F0aW9uSW5zdHJ1bWVudEphck9uQ2xhc3NwYXRoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBJbW11dGFibGVTZXQ8RmlsZT4gamFyRmlsZXMgPSBKYXJGaW5kZXIuZmluZEphckZpbGVzKAorICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLAorICAgICAgICBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKKyAgICBmb3IgKEZpbGUgZmlsZSA6IGphckZpbGVzKSB7CisgICAgICBKYXJGaWxlIGphckZpbGUgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUpOworICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGphckZpbGUuZ2V0TWFuaWZlc3QoKTsKKyAgICAgICAgaWYgKChtYW5pZmVzdCAhPSBudWxsKQorICAgICAgICAgICAgJiYgQWxsb2NhdGlvbkluc3RydW1lbnRlci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoIlByZW1haW4tQ2xhc3MiKSkpIHsKKyAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoZmlsZSk7CisgICAgICAgIH0KKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChqYXJGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICBqYXJGaWxlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9wdGlvbmFsLmFic2VudCgpOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgaW5zdHJ1bWVudCdzIHdvcmtlciByZXF1aXJlcyB0aGUgYWxsb2NhdGlvbmluc3RydW1lbnRlciBhZ2VudCBqYXIsIHNwZWNpZmllZAorICAgKiBvbiB0aGUgd29ya2VyIFZNJ3MgY29tbWFuZCBsaW5lIHdpdGggIi1qYXZhYWdlbnQ6W2phcmZpbGVdIi4KKyAgICovCisgIEBPdmVycmlkZSBJbW11dGFibGVTZXQ8U3RyaW5nPiBnZXRFeHRyYUNvbW1hbmRMaW5lQXJncyhWbUNvbmZpZyB2bUNvbmZpZykgeworICAgIFN0cmluZyBhZ2VudEphciA9IG9wdGlvbnMuZ2V0KEFMTE9DQVRJT05fQUdFTlRfSkFSX09QVElPTik7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShhZ2VudEphcikpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIE9wdGlvbmFsPEZpbGU+IGluc3RydW1lbnRKYXIgPSBmaW5kQWxsb2NhdGlvbkluc3RydW1lbnRKYXJPbkNsYXNzcGF0aCgpOworICAgICAgICAvLyBUT0RPKGdhayk6IGJ1bmRsZSB1cCB0aGUgYWxsb2NhdGlvbiBqYXIgYW5kIHVucGFjayBpdCBpZiBpdCdzIG5vdCBvbiB0aGUgY2xhc3NwYXRoCisgICAgICAgIGlmIChpbnN0cnVtZW50SmFyLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgYWdlbnRKYXIgPSBpbnN0cnVtZW50SmFyLmdldCgpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ2dlci5sb2coU0VWRVJFLAorICAgICAgICAgICAgIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB0cnlpbmcgdG8gbG9jYXRlIHRoZSBhbGxvY2F0aW9uIGFnZW50IGphciBvbiB0aGUgY2xhc3NwYXRoIiwgZSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoYWdlbnRKYXIpIHx8ICFuZXcgRmlsZShhZ2VudEphcikuZXhpc3RzKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGZpbmQgcmVxdWlyZWQgYWxsb2NhdGlvbmluc3RydW1lbnRlciBhZ2VudCBqYXIiKTsKKyAgICB9CisgICAgLy8gQWRkIG1pY3JvYmVuY2htYXJrIGFyZ3MgdG8gbWluaW1pemUgZGlmZmVyZW5jZXMgaW4gdGhlIG91dHB1dAorICAgIHJldHVybiBuZXcgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8U3RyaW5nPigpCisgICAgICAgIC5hZGRBbGwoc3VwZXIuZ2V0RXh0cmFDb21tYW5kTGluZUFyZ3Modm1Db25maWcpKQorICAgICAgICAvLyB3ZSBqdXN0IHJ1biBpbiBpbnRlcnByZXRlZCBtb2RlIHRvIGVuc3VyZSB0aGF0IGludHJpbnNpY3MgZG9uJ3QgYnJlYWsgdGhlIGluc3RydW1lbnRhdGlvbgorICAgICAgICAuYWRkKCItWGludCIpCisgICAgICAgIC5hZGQoIi1qYXZhYWdlbnQ6IiArIGFnZW50SmFyKQorICAgICAgICAvLyBTb21lIGVudmlyb25tZW50cyByZW5hbWUgZmlsZXMgYW5kIHVzZSBzeW1saW5rcyB0byBpbXByb3ZlIHJlc291cmNlIGNhY2hpbmcsCisgICAgICAgIC8vIGlmIHRoZSBhZ2VudCBqYXIgcGF0aCBpcyBhY3R1YWxseSBhIHN5bWxpbmsgaXQgd2lsbCBwcmV2ZW50IHRoZSBhZ2VudCBmcm9tIGZpbmRpbmcgaXRzZWxmCisgICAgICAgIC8vIGFuZCBhZGRpbmcgaXRzZWxmIHRvIHRoZSBib290Y2xhc3NwYXRoLCBzbyB3ZSBkbyBpdCBtYW51YWxseSBoZXJlLgorICAgICAgICAuYWRkKCItWGJvb3RjbGFzc3BhdGgvYToiICsgYWdlbnRKYXIpCisgICAgICAgIC5idWlsZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9BcmJpdHJhcnlNZWFzdXJlbWVudEluc3RydW1lbnQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0FyYml0cmFyeU1lYXN1cmVtZW50SW5zdHJ1bWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDVjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9BcmJpdHJhcnlNZWFzdXJlbWVudEluc3RydW1lbnQuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuQ29tbW9uSW5zdHJ1bWVudE9wdGlvbnMuR0NfQkVGT1JFX0VBQ0hfT1BUSU9OOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXMucHJvcGFnYXRlSWZJbnN0YW5jZU9mOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5Ta2lwVGhpc1NjZW5hcmlvRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuQWJzdHJhY3RMb2dNZXNzYWdlVmlzaXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLlN0b3BNZWFzdXJlbWVudExvZ01lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkFyYml0cmFyeU1lYXN1cmVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLlN1cHBvcnRlZFBsYXRmb3JtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlci5BcmJpdHJhcnlNZWFzdXJlbWVudFdvcmtlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyLldvcmtlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9wdGlvbmFsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIEluc3RydW1lbnQgZm9yIHRha2luZyBhbiBhcmJpdHJhcnkgbWVhc3VyZW1lbnQuIFdoZW4gdXNpbmcgdGhpcyBpbnN0cnVtZW50LCB0aGUgYmVuY2htYXJrIGNvZGUKKyAqIGl0c2VsZiByZXR1cm5zIHRoZSB2YWx1ZS4gU2VlIHtAbGluayBBcmJpdHJhcnlNZWFzdXJlbWVudH0uCisgKi8KK0BTdXBwb3J0ZWRQbGF0Zm9ybShQbGF0Zm9ybS5UeXBlLkpWTSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBBcmJpdHJhcnlNZWFzdXJlbWVudEluc3RydW1lbnQgZXh0ZW5kcyBJbnN0cnVtZW50IHsKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGlzQmVuY2htYXJrTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICByZXR1cm4gbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoQXJiaXRyYXJ5TWVhc3VyZW1lbnQuY2xhc3MpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbnN0cnVtZW50YXRpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9uKE1ldGhvZCBiZW5jaG1hcmtNZXRob2QpCisgICAgICB0aHJvd3MgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbiB7CisgICAgaWYgKGJlbmNobWFya01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbigKKyAgICAgICAgICAiQXJiaXRyYXJ5IG1lYXN1cmVtZW50IG1ldGhvZHMgc2hvdWxkIHRha2Ugbm8gcGFyYW1ldGVyczogIiArIGJlbmNobWFya01ldGhvZC5nZXROYW1lKCkpOworICAgIH0KKworICAgIGlmIChiZW5jaG1hcmtNZXRob2QuZ2V0UmV0dXJuVHlwZSgpICE9IGRvdWJsZS5jbGFzcykgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24oCisgICAgICAgICAgIkFyYml0cmFyeSBtZWFzdXJlbWVudCBtZXRob2RzIG11c3QgaGF2ZSBhIHJldHVybiB0eXBlIG9mIGRvdWJsZTogIgorICAgICAgICAgICAgICArIGJlbmNobWFya01ldGhvZC5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8vIFN0YXRpYyB0ZWNobmljYWxseSBkb2Vzbid0IGh1cnQgYW55dGhpbmcsIGJ1dCBpdCdzIGp1c3QgdGhlIGNvbXBsZXRlbHkgd3JvbmcgaWRlYQorICAgIGlmIChVdGlsLmlzU3RhdGljKGJlbmNobWFya01ldGhvZCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKAorICAgICAgICAgICJBcmJpdHJhcnkgbWVhc3VyZW1lbnQgbWV0aG9kcyBtdXN0IG5vdCBiZSBzdGF0aWM6ICIgKyBiZW5jaG1hcmtNZXRob2QuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBpZiAoIVV0aWwuaXNQdWJsaWMoYmVuY2htYXJrTWV0aG9kKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24oCisgICAgICAgICAgIkFyYml0cmFyeSBtZWFzdXJlbWVudCBtZXRob2RzIG11c3QgYmUgcHVibGljOiAiICsgYmVuY2htYXJrTWV0aG9kLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBcmJpdHJhcnlNZWFzdXJlbWVudEluc3RydW1lbnRhdGlvbihiZW5jaG1hcmtNZXRob2QpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBUcmlhbFNjaGVkdWxpbmdQb2xpY3kgc2NoZWR1bGluZ1BvbGljeSgpIHsKKyAgICAvLyBXZSBjb3VsZCBhbGxvdyBpdCBoZXJlIGJ1dCBpbiBnZW5lcmFsIGl0IHdvdWxkIGRlcGVuZCBvbiB0aGUgcGFydGljdWxhciBtZWFzdXJlbWVudCBzbyBpdAorICAgIC8vIHNob3VsZCBwcm9iYWJseSBiZSBjb25maWd1cmVkIGJ5IHRoZSB1c2VyLiAgRm9yIG5vdyB3ZSBqdXN0IGRpc2FibGUgaXQuCisgICAgcmV0dXJuIFRyaWFsU2NoZWR1bGluZ1BvbGljeS5TRVJJQUw7CisgIH0KKworICBwcml2YXRlIGZpbmFsIGNsYXNzIEFyYml0cmFyeU1lYXN1cmVtZW50SW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uIHsKKyAgICBwcm90ZWN0ZWQgQXJiaXRyYXJ5TWVhc3VyZW1lbnRJbnN0cnVtZW50YXRpb24oTWV0aG9kIGJlbmNobWFya01ldGhvZCkgeworICAgICAgc3VwZXIoYmVuY2htYXJrTWV0aG9kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcnlSdW4oT2JqZWN0IGJlbmNobWFyaykgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgYmVuY2htYXJrTWV0aG9kLmludm9rZShiZW5jaG1hcmspOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpbXBvc3NpYmxlKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihpbXBvc3NpYmxlKTsKKyAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICBUaHJvd2FibGUgdXNlckV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgcHJvcGFnYXRlSWZJbnN0YW5jZU9mKHVzZXJFeGNlcHRpb24sIFNraXBUaGlzU2NlbmFyaW9FeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvdyBuZXcgVXNlckNvZGVFeGNlcHRpb24odXNlckV4Y2VwdGlvbik7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBXb3JrZXI+IHdvcmtlckNsYXNzKCkgeworICAgICAgcmV0dXJuIEFyYml0cmFyeU1lYXN1cmVtZW50V29ya2VyLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiB3b3JrZXJPcHRpb25zKCkgeworICAgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5vZihHQ19CRUZPUkVfRUFDSF9PUFRJT04sIG9wdGlvbnMuZ2V0KEdDX0JFRk9SRV9FQUNIX09QVElPTikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIE1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IgZ2V0TWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvcigpIHsKKyAgICAgIHJldHVybiBuZXcgU2luZ2xlTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvcigpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSW1tdXRhYmxlU2V0PFN0cmluZz4gaW5zdHJ1bWVudE9wdGlvbnMoKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZihHQ19CRUZPUkVfRUFDSF9PUFRJT04pOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ2xlTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciBleHRlbmRzIEFic3RyYWN0TG9nTWVzc2FnZVZpc2l0b3IKKyAgICAgIGltcGxlbWVudHMgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciB7CisgICAgT3B0aW9uYWw8TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50ID0gT3B0aW9uYWwuYWJzZW50KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvbmVDb2xsZWN0aW5nKCkgeworICAgICAgcmV0dXJuIG1lYXN1cmVtZW50LmlzUHJlc2VudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV2FybXVwQ29tcGxldGUoKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW1tdXRhYmxlTGlzdDxNZWFzdXJlbWVudD4gZ2V0TWVhc3VyZW1lbnRzKCkgeworICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKG1lYXN1cmVtZW50LmFzU2V0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KFN0b3BNZWFzdXJlbWVudExvZ01lc3NhZ2UgbG9nTWVzc2FnZSkgeworICAgICAgdGhpcy5tZWFzdXJlbWVudCA9IE9wdGlvbmFsLm9mKEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChsb2dNZXNzYWdlLm1lYXN1cmVtZW50cygpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIAorICAgIHB1YmxpYyBJbW11dGFibGVMaXN0PFN0cmluZz4gZ2V0TWVzc2FnZXMoKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZigpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ2xhc3MuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0JlbmNobWFya0NsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhNmUxYQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0JlbmNobWFya0NsYXNzLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXMucHJvcGFnYXRlSWZJbnN0YW5jZU9mOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkFmdGVyRXhwZXJpbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVmb3JlRXhwZXJpbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5Ta2lwVGhpc1NjZW5hcmlvRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuVm1PcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLkludmFsaWRDb21tYW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlJlZmxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0TXVsdGltYXA7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQW4gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlIHJlcHJlc2VudHMgYSB1c2VyLXByb3ZpZGVkIGNsYXNzLiBJdCBtYW5hZ2VzIGNyZWF0aW5nLCBzZXR0aW5nIHVwIGFuZAorICogZGVzdHJveWluZyBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcy4KKyAqLworZmluYWwgY2xhc3MgQmVuY2htYXJrQ2xhc3MgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihCZW5jaG1hcmtDbGFzcy5jbGFzcy5nZXROYW1lKCkpOworCisgIHN0YXRpYyBCZW5jaG1hcmtDbGFzcyBmb3JDbGFzcyhDbGFzczw/PiB0aGVDbGFzcykgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24geworICAgIHJldHVybiBuZXcgQmVuY2htYXJrQ2xhc3ModGhlQ2xhc3MpOworICB9CisKKyAgZmluYWwgQ2xhc3M8Pz4gdGhlQ2xhc3M7CisgIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyU2V0IHVzZXJQYXJhbWV0ZXJzOworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNldDxTdHJpbmc+IGJlbmNobWFya0ZsYWdzOworCisgIHByaXZhdGUgQmVuY2htYXJrQ2xhc3MoQ2xhc3M8Pz4gdGhlQ2xhc3MpIHRocm93cyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIHsKKyAgICB0aGlzLnRoZUNsYXNzID0gY2hlY2tOb3ROdWxsKHRoZUNsYXNzKTsKKworICAgIGlmICghdGhlQ2xhc3MuZ2V0U3VwZXJjbGFzcygpLmVxdWFscyhPYmplY3QuY2xhc3MpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbigKKyAgICAgICAgICAiJXMgbXVzdCBub3QgZXh0ZW5kIGFueSBjbGFzcyBvdGhlciB0aGFuICVzLiBQcmVmZXIgY29tcG9zaXRpb24uIiwKKyAgICAgICAgICB0aGVDbGFzcywgT2JqZWN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBpZiAoTW9kaWZpZXIuaXNBYnN0cmFjdCh0aGVDbGFzcy5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKCJDbGFzcyAnJXMnIGlzIGFic3RyYWN0IiwgdGhlQ2xhc3MpOworICAgIH0KKworICAgIC8vIFRPRE86IGNoZWNrIGZvciBuZXN0ZWQsIG5vbi1zdGF0aWMgY2xhc3NlcyAobm9uLWFic3RyYWN0LCBidXQgbm8gY29uc3RydWN0b3I/KQorICAgIC8vIHRoaXMgd2lsbCBmYWlsIGxhdGVyIGFueXdheSAobm8gd2F5IHRvIGRlY2xhcmUgcGFyYW1ldGVybGVzcyBuZXN0ZWQgY29uc3RyLiwgYnV0CisgICAgLy8gbWF5YmUgc2lnbmFsIHRoaXMgYmV0dGVyPworCisgICAgdGhpcy51c2VyUGFyYW1ldGVycyA9IFBhcmFtZXRlclNldC5jcmVhdGUodGhlQ2xhc3MsIFBhcmFtLmNsYXNzKTsKKworICAgIHRoaXMuYmVuY2htYXJrRmxhZ3MgPSBnZXRWbU9wdGlvbnModGhlQ2xhc3MpOworICB9CisKKyAgSW1tdXRhYmxlU2V0PE1ldGhvZD4gYmVmb3JlRXhwZXJpbWVudE1ldGhvZHMoKSB7CisgICAgcmV0dXJuIFJlZmxlY3Rpb24uZ2V0QW5ub3RhdGVkTWV0aG9kcyh0aGVDbGFzcywgQmVmb3JlRXhwZXJpbWVudC5jbGFzcyk7CisgIH0KKworICBJbW11dGFibGVTZXQ8TWV0aG9kPiBhZnRlckV4cGVyaW1lbnRNZXRob2RzKCkgeworICAgIHJldHVybiBSZWZsZWN0aW9uLmdldEFubm90YXRlZE1ldGhvZHModGhlQ2xhc3MsIEFmdGVyRXhwZXJpbWVudC5jbGFzcyk7CisgIH0KKworICBwdWJsaWMgUGFyYW1ldGVyU2V0IHVzZXJQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiB1c2VyUGFyYW1ldGVyczsKKyAgfQorCisgIHB1YmxpYyBJbW11dGFibGVTZXQ8U3RyaW5nPiB2bU9wdGlvbnMoKSB7CisgICAgcmV0dXJuIGJlbmNobWFya0ZsYWdzOworICB9CisKKyAgLy8gVE9ETyhnYWspOiB1c2UgdGhlc2UgbWV0aG9kcyBpbiB0aGUgd29ya2VyIGFzIHdlbGwKKyAgcHVibGljIHZvaWQgc2V0VXBCZW5jaG1hcmsoT2JqZWN0IGJlbmNobWFya0luc3RhbmNlKSB0aHJvd3MgVXNlckNvZGVFeGNlcHRpb24geworICAgIGJvb2xlYW4gc2V0dXBTdWNjZXNzID0gZmFsc2U7CisgICAgdHJ5IHsKKyAgICAgIGNhbGxTZXRVcChiZW5jaG1hcmtJbnN0YW5jZSk7CisgICAgICBzZXR1cFN1Y2Nlc3MgPSB0cnVlOworICAgIH0gZmluYWxseSB7CisgICAgICAvLyBJZiBzZXRVcCBmYWlscywgd2Ugc2hvdWxkIGNhbGwgdGVhckRvd24uIElmIHRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHdlCisgICAgICAvLyBuZWVkIHRvIGNhbGwgdGVhckRvd24gZnJvbSBoZXJlLCBiZWNhdXNlIG5vIG9uZSBlbHNlIGhhcyB0aGUgcmVmZXJlbmNlIHRvIHRoZQorICAgICAgLy8gQmVuY2htYXJrLgorICAgICAgaWYgKCFzZXR1cFN1Y2Nlc3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjYWxsVGVhckRvd24oYmVuY2htYXJrSW5zdGFuY2UpOworICAgICAgICB9IGNhdGNoIChVc2VyQ29kZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgLy8gVGhlIGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIHNldFVwIHNob3VsZG4ndCBiZSBsb3N0LCBhcyBpdCdzIHByb2JhYmx5IG1vcmUKKyAgICAgICAgICAvLyBpbXBvcnRhbnQgdG8gdGhlIHVzZXIuCisgICAgICAgICAgbG9nZ2VyLmxvZygKKyAgICAgICAgICAgICAgTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICAgImluIEBBZnRlckV4cGVyaW1lbnQgbWV0aG9kcyBjYWxsZWQgYmVjYXVzZSBAQmVmb3JlRXhwZXJpbWVudCBtZXRob2RzIGZhaWxlZCIsCisgICAgICAgICAgICAgIGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgY2xlYW51cChPYmplY3QgYmVuY2htYXJrKSB0aHJvd3MgVXNlckNvZGVFeGNlcHRpb24geworICAgIGNhbGxUZWFyRG93bihiZW5jaG1hcmspOworICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nIENsYXNzPD8+IGJlbmNobWFya0NsYXNzKCkgeworICAgIHJldHVybiB0aGVDbGFzczsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICByZXR1cm4gdGhlQ2xhc3MuZ2V0TmFtZSgpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJlbmNobWFya0NsYXNzKSB7CisgICAgICBCZW5jaG1hcmtDbGFzcyB0aGF0ID0gKEJlbmNobWFya0NsYXNzKSBvYmo7CisgICAgICByZXR1cm4gdGhpcy50aGVDbGFzcy5lcXVhbHModGhhdC50aGVDbGFzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZSh0aGVDbGFzcyk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gbmFtZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNhbGxTZXRVcChPYmplY3QgYmVuY2htYXJrKSB0aHJvd3MgVXNlckNvZGVFeGNlcHRpb24geworICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGJlZm9yZUV4cGVyaW1lbnRNZXRob2RzKCkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIG1ldGhvZC5pbnZva2UoYmVuY2htYXJrKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CisgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcHJvcGFnYXRlSWZJbnN0YW5jZU9mKGUuZ2V0Q2F1c2UoKSwgU2tpcFRoaXNTY2VuYXJpb0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93IG5ldyBVc2VyQ29kZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJFeGNlcHRpb24gdGhyb3duIGZyb20gYSBAQmVmb3JlRXhwZXJpbWVudCBtZXRob2QiLCBlLmdldENhdXNlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjYWxsVGVhckRvd24oT2JqZWN0IGJlbmNobWFyaykgdGhyb3dzIFVzZXJDb2RlRXhjZXB0aW9uIHsKKyAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBhZnRlckV4cGVyaW1lbnRNZXRob2RzKCkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIG1ldGhvZC5pbnZva2UoYmVuY2htYXJrKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CisgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcHJvcGFnYXRlSWZJbnN0YW5jZU9mKGUuZ2V0Q2F1c2UoKSwgU2tpcFRoaXNTY2VuYXJpb0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93IG5ldyBVc2VyQ29kZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJFeGNlcHRpb24gdGhyb3duIGZyb20gYW4gQEFmdGVyRXhwZXJpbWVudCBtZXRob2QiLCBlLmdldENhdXNlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEltbXV0YWJsZVNldDxTdHJpbmc+IGdldFZtT3B0aW9ucyhDbGFzczw/PiBiZW5jaG1hcmtDbGFzcykgeworICAgIFZtT3B0aW9ucyBhbm5vdGF0aW9uID0gYmVuY2htYXJrQ2xhc3MuZ2V0QW5ub3RhdGlvbihWbU9wdGlvbnMuY2xhc3MpOworICAgIHJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKQorICAgICAgICA/IEltbXV0YWJsZVNldC48U3RyaW5nPm9mKCkKKyAgICAgICAgOiBJbW11dGFibGVTZXQuY29weU9mKGFubm90YXRpb24udmFsdWUoKSk7CisgIH0KKworICB2b2lkIHZhbGlkYXRlUGFyYW1ldGVycyhJbW11dGFibGVTZXRNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykKKyAgICAgIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgICAgZm9yIChTdHJpbmcgcGFyYW1OYW1lIDogcGFyYW1ldGVycy5rZXlTZXQoKSkgeworICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHVzZXJQYXJhbWV0ZXJzLmdldChwYXJhbU5hbWUpOworICAgICAgaWYgKHBhcmFtZXRlciA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbigidW5yZWNvZ25pemVkIHBhcmFtZXRlcjogIiArIHBhcmFtTmFtZSk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBwYXJhbWV0ZXIudmFsaWRhdGUocGFyYW1ldGVycy5nZXQocGFyYW1OYW1lKSk7CisgICAgICB9IGNhdGNoIChJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gVE9ETyhrZXZpbmIpOiB0aGlzIGlzIHdlaXJkLgorICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbW1hbmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ2xhc3NDaGVja2VyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CZW5jaG1hcmtDbGFzc0NoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M3NzdkCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ2xhc3NDaGVja2VyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuQ29uZmlnTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zLk9wdGlvbnNNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuT3V0cHV0TW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworCitpbXBvcnQgZGFnZ2VyLkNvbXBvbmVudDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjbGFzcyBjb250YWlucyBvbmUgb3IgbW9yZSBiZW5jaG1hcmtzIG9yIG5vdC4KKyAqCisgKiA8cD5Vc2VmdWwgZm9yIHRvb2xzIHRoYXQgbmVlZCB0byBjaGVjayB3aGV0aGVyIGEgY2xhc3MgY29udGFpbnMgYmVuY2htYXJrcyBiZWZvcmUgcnVubmluZyB0aGVtCisgKiBieSBjYWxsaW5nIGFuIGFwcHJvcHJpYXRlIG1ldGhvZCBvbiB7QGxpbmsgQ2FsaXBlck1haW59LgorICovCisvLyBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgYWxvbmdzaWRlIHtAbGluayBDYWxpcGVyTWFpbn0uCitwdWJsaWMgZmluYWwgY2xhc3MgQmVuY2htYXJrQ2xhc3NDaGVja2VyIHsKKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBCZW5jaG1hcmtDbGFzc0NoZWNrZXJ9LgorICAgKgorICAgKiBAcGFyYW0gYXJndW1lbnRzIGEgbGlzdCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBDYWxpcGVyLCBjYW4gaW5jbHVkZSBhbnkgb2YgdGhlCisgICAqICAgICBvcHRpb25zIHN1cHBvcnRlZCBieSBDYWxpcGVyLgorICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBCZW5jaG1hcmtDbGFzc0NoZWNrZXJ9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCZW5jaG1hcmtDbGFzc0NoZWNrZXIgY3JlYXRlKExpc3Q8U3RyaW5nPiBhcmd1bWVudHMpIHsKKyAgICByZXR1cm4gbmV3IEJlbmNobWFya0NsYXNzQ2hlY2tlcihhcmd1bWVudHMpOworICB9CisKKyAgLyoqCisgICAqIFRoZSBzZXQgb2Yge0BsaW5rIEluc3RydW1lbnQgaW5zdHJ1bWVudHN9IHRoYXQgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjbGFzcyBoYXMgYW55CisgICAqIG1ldGhvZHMgc3VpdGFibGUgZm9yIGJlbmNobWFya2luZy4KKyAgICovCisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PEluc3RydW1lbnQ+IGluc3RydW1lbnRzOworCisgIHByaXZhdGUgQmVuY2htYXJrQ2xhc3NDaGVja2VyKExpc3Q8U3RyaW5nPiBhcmd1bWVudHMpIHsKKyAgICBTdHJpbmdbXSBhcmdzID0gYXJndW1lbnRzLnRvQXJyYXkobmV3IFN0cmluZ1thcmd1bWVudHMuc2l6ZSgpXSk7CisgICAgSW5zdHJ1bWVudFByb3ZpZGVyIGluc3RydW1lbnRQcm92aWRlciA9IERhZ2dlckJlbmNobWFya0NsYXNzQ2hlY2tlcl9JbnN0cnVtZW50UHJvdmlkZXIuYnVpbGRlcigpCisgICAgICAgIC5vcHRpb25zTW9kdWxlKE9wdGlvbnNNb2R1bGUud2l0aG91dEJlbmNobWFya0NsYXNzKGFyZ3MpKQorICAgICAgICAub3V0cHV0TW9kdWxlKG5ldyBPdXRwdXRNb2R1bGUobmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVycikpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGluc3RydW1lbnRzID0gaW5zdHJ1bWVudFByb3ZpZGVyLmluc3RydW1lbnRzKCk7CisgIH0KKworICAvKioKKyAgICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHN1cHBsaWVkIGNsYXNzIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBiZW5jaG1hcmsgbWV0aG9kIHRoYXQgY2FuIGJlIHJ1bgorICAgKiBieSBjYWxpcGVyLgorICAgKgorICAgKiBAcGFyYW0gdGhlQ2xhc3MgdGhlIGNsYXNzIHRoYXQgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgYmVuY2htYXJrIG1ldGhvZHMuCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xhc3MgZG9lcyBjb250YWluIGEgYmVuY2htYXJrIG1ldGhvZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNCZW5jaG1hcmsoQ2xhc3M8Pz4gdGhlQ2xhc3MpIHsKKyAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiB0aGVDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgZm9yIChJbnN0cnVtZW50IGluc3RydW1lbnQgOiBpbnN0cnVtZW50cykgeworICAgICAgICBpZiAoaW5zdHJ1bWVudC5pc0JlbmNobWFya01ldGhvZChtZXRob2QpKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAU2luZ2xldG9uCisgIEBDb21wb25lbnQobW9kdWxlcyA9IHsKKyAgICAgIENvbmZpZ01vZHVsZS5jbGFzcywKKyAgICAgIEV4cGVyaW1lbnRpbmdSdW5uZXJNb2R1bGUuY2xhc3MsCisgICAgICBPcHRpb25zTW9kdWxlLmNsYXNzLAorICAgICAgT3V0cHV0TW9kdWxlLmNsYXNzLAorICAgICAgUGxhdGZvcm1Nb2R1bGUuY2xhc3MsCisgICAgICBSdW5uZXJNb2R1bGUuY2xhc3MsCisgIH0pCisgIC8qKgorICAgKiBQcm92aWRlcyB0aGUgc2V0IG9mIHN1cHBvcnRlZCB7QGxpbmsgSW5zdHJ1bWVudCBpbnN0cnVtZW50c30uCisgICAqLworICBpbnRlcmZhY2UgSW5zdHJ1bWVudFByb3ZpZGVyIHsKKyAgICBJbW11dGFibGVTZXQ8SW5zdHJ1bWVudD4gaW5zdHJ1bWVudHMoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ2xhc3NNb2R1bGUuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0JlbmNobWFya0NsYXNzTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViNzZiZQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0JlbmNobWFya0NsYXNzTW9kdWxlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkFmdGVyRXhwZXJpbWVudE1ldGhvZHM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkJlZm9yZUV4cGVyaW1lbnRNZXRob2RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGRhZ2dlci5Nb2R1bGU7CitpbXBvcnQgZGFnZ2VyLlByb3ZpZGVzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogQmluZHMgb2JqZWN0cyByZWxhdGVkIHRvIGEgYmVuY2htYXJrIGNsYXNzLgorICovCisvLyBUT0RPKGdhayk6IG1vdmUgbW9yZSBvZiBiZW5jaG1hcmsgY2xhc3MgaW50byB0aGlzIG1vZHVsZQorQE1vZHVsZQorcHVibGljIGZpbmFsIGNsYXNzIEJlbmNobWFya0NsYXNzTW9kdWxlIHsKKworICBAUHJvdmlkZXMKKyAgQFNpbmdsZXRvbgorICBzdGF0aWMgQmVuY2htYXJrQ2xhc3MgcHJvdmlkZUJlbmNobWFya0NsYXNzKEBSdW5uaW5nLkJlbmNobWFya0NsYXNzIENsYXNzPD8+IGJlbmNobWFya0NsYXNzT2JqZWN0KQorICAgICAgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24geworICAgIHJldHVybiBCZW5jaG1hcmtDbGFzcy5mb3JDbGFzcyhiZW5jaG1hcmtDbGFzc09iamVjdCk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgQEJlZm9yZUV4cGVyaW1lbnRNZXRob2RzCisgIHN0YXRpYyBJbW11dGFibGVTZXQ8TWV0aG9kPiBwcm92aWRlQmVmb3JlRXhwZXJpbWVudE1ldGhvZHMoCisgICAgICBCZW5jaG1hcmtDbGFzcyBiZW5jaG1hcmtDbGFzcykgeworICAgIHJldHVybiBiZW5jaG1hcmtDbGFzcy5iZWZvcmVFeHBlcmltZW50TWV0aG9kcygpOworICB9CisKKyAgQFByb3ZpZGVzCisgIEBBZnRlckV4cGVyaW1lbnRNZXRob2RzCisgIHN0YXRpYyBJbW11dGFibGVTZXQ8TWV0aG9kPiBwcm92aWRlQWZ0ZXJFeHBlcmltZW50TWV0aG9kcygKKyAgICAgIEJlbmNobWFya0NsYXNzIGJlbmNobWFya0NsYXNzKSB7CisgICAgcmV0dXJuIGJlbmNobWFya0NsYXNzLmFmdGVyRXhwZXJpbWVudE1ldGhvZHMoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ3JlYXRvci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OGQyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CZW5jaG1hcmtDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5QYXJzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuUGFyc2VyczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNvcnRlZE1hcDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBSZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIHRoZSBiZW5jaG1hcmsgY2xhc3MuCisgKi8KK2ZpbmFsIGNsYXNzIEJlbmNobWFya0NyZWF0b3IgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRU5DSE1BUktfTk9fUFVCTElDX0RFRkFVTFRfQ09OU1RSVUNUT1IgPQorICAgICAgIkJlbmNobWFyayAlcyBkb2VzIG5vdCBoYXZlIGEgcHVibGljbHkgdmlzaWJsZSBkZWZhdWx0IGNvbnN0cnVjdG9yIjsKKworICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGJlbmNobWFya0NsYXNzOworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyczsKKyAgcHJpdmF0ZSBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBiZW5jaG1hcmtDbGFzc0N0b3I7CisKKyAgQEluamVjdAorICBCZW5jaG1hcmtDcmVhdG9yKAorICAgICAgQFJ1bm5pbmcuQmVuY2htYXJrQ2xhc3MgQ2xhc3M8Pz4gYmVuY2htYXJrQ2xhc3MsCisgICAgICBAUnVubmluZy5CZW5jaG1hcmsgSW1tdXRhYmxlU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgdGhpcy5iZW5jaG1hcmtDbGFzcyA9IGJlbmNobWFya0NsYXNzOworICAgIHRoaXMuYmVuY2htYXJrQ2xhc3NDdG9yID0gZmluZERlZmF1bHRDb25zdHJ1Y3RvcihiZW5jaG1hcmtDbGFzcyk7CisgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIENvbnN0cnVjdG9yPD8+IGZpbmREZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3M8Pz4gYmVuY2htYXJrQ2xhc3MpIHsKKyAgICBDb25zdHJ1Y3Rvcjw/PiBkZWZhdWx0Q29uc3RydWN0b3IgPSBudWxsOworICAgIGZvciAoQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IgOiBiZW5jaG1hcmtDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpKSB7CisgICAgICBpZiAoY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgeworICAgICAgICBkZWZhdWx0Q29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKKyAgICAgICAgZGVmYXVsdENvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVmYXVsdENvbnN0cnVjdG9yID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBVc2VyQ29kZUV4Y2VwdGlvbigKKyAgICAgICAgICBTdHJpbmcuZm9ybWF0KEJFTkNITUFSS19OT19QVUJMSUNfREVGQVVMVF9DT05TVFJVQ1RPUiwgYmVuY2htYXJrQ2xhc3MpLCBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIGRlZmF1bHRDb25zdHJ1Y3RvcjsKKyAgfQorCisgIE9iamVjdCBjcmVhdGVCZW5jaG1hcmtJbnN0YW5jZSgpIHsKKyAgICBPYmplY3QgaW5zdGFuY2U7CisgICAgdHJ5IHsKKyAgICAgIGluc3RhbmNlID0gYmVuY2htYXJrQ2xhc3NDdG9yLm5ld0luc3RhbmNlKCk7CisgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CisgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICBUaHJvd2FibGUgdXNlckV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgIHRocm93IG5ldyBVc2VyQ29kZUV4Y2VwdGlvbih1c2VyRXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICAvLyBJbmplY3QgdmFsdWVzIGZvciB0aGUgdXNlciBwYXJhbWV0ZXJzLgorICAgIGZvciAoRmllbGQgZmllbGQgOiBiZW5jaG1hcmtDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICBpZiAoZmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChQYXJhbS5jbGFzcykpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgIFBhcnNlcjw/PiBwYXJzZXIgPSBQYXJzZXJzLmNvbnZlbnRpb25hbFBhcnNlcihmaWVsZC5nZXRUeXBlKCkpOworICAgICAgICAgIGZpZWxkLnNldChpbnN0YW5jZSwgcGFyc2VyLnBhcnNlKHBhcmFtZXRlcnMuZ2V0KGZpZWxkLmdldE5hbWUoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigidHlwZXMgaGF2ZSBiZWVuIGNoZWNrZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJhbHJlYWR5IHNldCBhY2Nlc3MiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbnN0YW5jZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrTWV0aG9kcy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrTWV0aG9kcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDliNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CZW5jaG1hcmtNZXRob2RzLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggbWV0aG9kcyBhbm5vdGF0ZWQgYnkge0BsaW5rIEJlbmNobWFya30uCisgKi8KK2ZpbmFsIGNsYXNzIEJlbmNobWFya01ldGhvZHMgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIE1BQ1JPQkVOQ0hNQVJLX1BBUkFNUyA9IG5ldyBDbGFzczw/PltdIHt9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIE1JQ1JPQkVOQ0hNQVJLX1BBUkFNUyA9IG5ldyBDbGFzczw/PltdIHtpbnQuY2xhc3N9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIFBJQ09CRU5DSE1BUktfUEFSQU1TID0gbmV3IENsYXNzPD8+W10ge2xvbmcuY2xhc3N9OworCisgIHByaXZhdGUgQmVuY2htYXJrTWV0aG9kcygpIHt9CisKKyAgZW51bSBUeXBlIHsKKyAgICBNQUNSTywKKyAgICBNSUNSTywKKyAgICBQSUNPOworCisgICAgc3RhdGljIFR5cGUgb2YoTWV0aG9kIGJlbmNobWFya01ldGhvZCkgeworICAgICAgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcyA9IGJlbmNobWFya01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgaWYgKEFycmF5cy5lcXVhbHMocGFyYW1ldGVyVHlwZXMsIE1BQ1JPQkVOQ0hNQVJLX1BBUkFNUykpIHsKKyAgICAgICAgcmV0dXJuIE1BQ1JPOworICAgICAgfSBlbHNlIGlmIChBcnJheXMuZXF1YWxzKHBhcmFtZXRlclR5cGVzLCBNSUNST0JFTkNITUFSS19QQVJBTVMpKSB7CisgICAgICAgIHJldHVybiBNSUNSTzsKKyAgICAgIH0gZWxzZSBpZiAoQXJyYXlzLmVxdWFscyhwYXJhbWV0ZXJUeXBlcywgUElDT0JFTkNITUFSS19QQVJBTVMpKSB7CisgICAgICAgIHJldHVybiBQSUNPOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBtZXRob2QgcGFyYW1ldGVyczogIiArIGJlbmNobWFya01ldGhvZCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNldmVyYWwgaW5zdHJ1bWVudHMgbG9vayBmb3IgYmVuY2htYXJrIG1ldGhvZHMgbGlrZSB7QGNvZGUgdGltZUJsYWgoaW50IHJlcHMpfTsgdGhpcyBpcyB0aGUKKyAgICogY2VudHJhbGl6ZWQgY29kZSB0aGF0IGlkZW50aWZpZXMgc3VjaCBtZXRob2RzLgorICAgKgorICAgKiA8cD5UaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGFyZ3VtZW50IHR5cGVzLgorICAgKi8KKyAgc3RhdGljIGJvb2xlYW4gaXNUaW1lTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICByZXR1cm4gbWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJ0aW1lIikgJiYgVXRpbC5pc1B1YmxpYyhtZXRob2QpOworICB9CisKKyAgLyoqCisgICAqIEZvciBpbnN0cnVtZW50cyB0aGF0IHVzZSB7QGxpbmsgI2lzVGltZU1ldGhvZH0gdG8gaWRlbnRpZnkgdGhlaXIgbWV0aG9kcywgdGhpcyBtZXRob2QgY2hlY2tzCisgICAqIHRoZSB7QGxpbmsgTWV0aG9kfSBhcHByb3ByaWF0ZWx5LgorICAgKi8KKyAgc3RhdGljIE1ldGhvZCBjaGVja1RpbWVNZXRob2QoTWV0aG9kIHRpbWVNZXRob2QpIHRocm93cyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIHsKKyAgICBjaGVja0FyZ3VtZW50KGlzVGltZU1ldGhvZCh0aW1lTWV0aG9kKSk7CisgICAgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcyA9IHRpbWVNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICBpZiAoIUFycmF5cy5lcXVhbHMocGFyYW1ldGVyVHlwZXMsIG5ldyBDbGFzczw/PltdIHtpbnQuY2xhc3N9KQorICAgICAgICAmJiAhQXJyYXlzLmVxdWFscyhwYXJhbWV0ZXJUeXBlcywgbmV3IENsYXNzPD8+W10ge2xvbmcuY2xhc3N9KSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24oCisgICAgICAgICAgIk1pY3JvYmVuY2htYXJrIG1ldGhvZHMgbXVzdCBhY2NlcHQgYSBzaW5nbGUgaW50IHBhcmFtZXRlcjogIiArIHRpbWVNZXRob2QuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBTdGF0aWMgdGVjaG5pY2FsbHkgZG9lc24ndCBodXJ0IGFueXRoaW5nLCBidXQgaXQncyBqdXN0IHRoZSBjb21wbGV0ZWx5IHdyb25nIGlkZWEKKyAgICBpZiAoVXRpbC5pc1N0YXRpYyh0aW1lTWV0aG9kKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24oCisgICAgICAgICAgIk1pY3JvYmVuY2htYXJrIG1ldGhvZHMgbXVzdCBub3QgYmUgc3RhdGljOiAiICsgdGltZU1ldGhvZC5nZXROYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gdGltZU1ldGhvZDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrUGFyYW1ldGVycy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrUGFyYW1ldGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OWMyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CZW5jaG1hcmtQYXJhbWV0ZXJzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqIEJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHBhcmFtZXRlcnMgYXBwbGllZCB0byBhIGJlbmNobWFyay4gKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoe0ZJRUxELCBQQVJBTUVURVIsIE1FVEhPRH0pCitAUXVhbGlmaWVyCitAaW50ZXJmYWNlIEJlbmNobWFya1BhcmFtZXRlcnMge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0NhbGlwZXJNYWluLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9DYWxpcGVyTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MWU0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9DYWxpcGVyTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT2JqZWN0QXJyYXlzLmNvbmNhdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnMuQ2FsaXBlck9wdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnMuT3B0aW9uc01vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5JbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5PdXRwdXRNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU29ydGVkTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5TZXJ2aWNlTWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBQcmltYXJ5IGVudHJ5IHBvaW50IGZvciB0aGUgY2FsaXBlciBiZW5jaG1hcmsgcnVubmVyIGFwcGxpY2F0aW9uOyBydW4gd2l0aCB7QGNvZGUgLS1oZWxwfSBmb3IKKyAqIGRldGFpbHMuIFRoaXMgY2xhc3MncyBvbmx5IHB1cnBvc2UgaXMgdG8gdGFrZSBjYXJlIG9mIGFueXRoaW5nIHRoYXQncyBzcGVjaWZpYyB0byBjb21tYW5kLWxpbmUKKyAqIGludm9jYXRpb24gYW5kIHRoZW4gaGFuZCBvZmYgdG8ge0Bjb2RlIENhbGlwZXJSdW59LiBUaGF0IGlzLCBhIGh5cG90aGV0aWNhbCBHVUkgYmVuY2htYXJrIHJ1bm5lcgorICogbWlnaHQgc3RpbGwgdXNlIHtAY29kZSBDYWxpcGVyUnVufSBidXQgd291bGQgc2tpcCB1c2luZyB0aGlzIGNsYXNzLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2FsaXBlck1haW4geworICAvKioKKyAgICogWW91ciBiZW5jaG1hcmsgY2xhc3NlcyBjYW4gaW1wbGVtZW50IG1haW4oKSBsaWtlIHRoaXM6IDxwcmU+ICAge0Bjb2RlCisgICAqCisgICAqICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgKiAgICAgQ2FsaXBlck1haW4ubWFpbihNeUJlbmNobWFyay5jbGFzcywgYXJncyk7CisgICAqICAgfX08L3ByZT4KKyAgICoKKyAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgaW52b2tlIHtAbGluayBTeXN0ZW0jZXhpdH0gd2hlbiBpdCBmaW5pc2hlcy4gQ29uc2lkZXIge0BsaW5rCisgICAqICNleGl0bGVzc01haW59IGlmIHlvdSBkb24ndCB3YW50IHRoYXQuCisgICAqCisgICAqIDxwPk1lYXN1cmVtZW50IGlzIGhhbmRsZWQgaW4gYSBzdWJwcm9jZXNzLCBzbyBpdCB3aWxsIG5vdCB1c2Uge0Bjb2RlIGJlbmNobWFya0NsYXNzfSBpdHNlbGY7CisgICAqIHRoZSBjbGFzcyBpcyBwcm92aWRlZCBoZXJlIG9ubHkgYXMgYSBzaG9ydGN1dCBmb3Igc3BlY2lmeWluZyB0aGUgZnVsbCBjbGFzcyA8aT5uYW1lPC9pPi4gVGhlCisgICAqIGNsYXNzIHRoYXQgZ2V0cyBsb2FkZWQgbGF0ZXIgY291bGQgYmUgY29tcGxldGVseSBkaWZmZXJlbnQuCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihDbGFzczw/PiBiZW5jaG1hcmtDbGFzcywgU3RyaW5nW10gYXJncykgeworICAgIG1haW4oY29uY2F0KGFyZ3MsIGJlbmNobWFya0NsYXNzLmdldE5hbWUoKSkpOworICB9CisKKyAgLyoqCisgICAqIEVudHJ5IHBvaW50IGZvciB0aGUgY2FsaXBlciBiZW5jaG1hcmsgcnVubmVyIGFwcGxpY2F0aW9uOyBydW4gd2l0aCB7QGNvZGUgLS1oZWxwfSBmb3IgZGV0YWlscy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBQcmludFdyaXRlciBzdGRvdXQgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCwgdHJ1ZSk7CisgICAgUHJpbnRXcml0ZXIgc3RkZXJyID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIsIHRydWUpOworICAgIGludCBjb2RlID0gMTsgLy8gcGVzc2ltaXNtIQorCisgICAgdHJ5IHsKKyAgICAgIGV4aXRsZXNzTWFpbihhcmdzLCBzdGRvdXQsIHN0ZGVycik7CisgICAgICBjb2RlID0gMDsKKworICAgIH0gY2F0Y2ggKEludmFsaWRDb21tYW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUuZGlzcGxheShzdGRlcnIpOworICAgICAgY29kZSA9IGUuZXhpdENvZGUoKTsKKworICAgIH0gY2F0Y2ggKEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24gZSkgeworICAgICAgZS5kaXNwbGF5KHN0ZGVycik7CisKKyAgICB9IGNhdGNoIChJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBlLmRpc3BsYXkoc3RkZXJyKTsKKworICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICB0LnByaW50U3RhY2tUcmFjZShzdGRlcnIpOworICAgICAgc3Rkb3V0LnByaW50bG4oKTsKKyAgICAgIHN0ZG91dC5wcmludGxuKCJBbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24gYnkgdGhlIGNhbGlwZXIgcnVubmVyLiIpOworICAgICAgc3Rkb3V0LnByaW50bG4oIlBsZWFzZSBzZWUgaHR0cHM6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvY2FsaXBlcnVzZXJzL2lzc3VlcyIpOworICAgIH0KKworICAgIHN0ZG91dC5mbHVzaCgpOworICAgIHN0ZGVyci5mbHVzaCgpOworICAgIFN5c3RlbS5leGl0KGNvZGUpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9FTlYgPSAiVVNFX0xFR0FDWV9DQUxJUEVSIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgZXhpdGxlc3NNYWluKFN0cmluZ1tdIGFyZ3MsIFByaW50V3JpdGVyIHN0ZG91dCwgUHJpbnRXcml0ZXIgc3RkZXJyKQorICAgICAgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uLCBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uLCBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgQE51bGxhYmxlIFN0cmluZyBsZWdhY3lDYWxpcGVyRW52ID0gU3lzdGVtLmdldGVudihMRUdBQ1lfRU5WKTsKKyAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShsZWdhY3lDYWxpcGVyRW52KSkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJMZWdhY3kgQ2FsaXBlciBpcyBubyBtb3JlLiAiICsgTEVHQUNZX0VOViArICIgaGFzIG5vIGVmZmVjdC4iKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIE1haW5Db21wb25lbnQgbWFpbkNvbXBvbmVudCA9IERhZ2dlck1haW5Db21wb25lbnQuYnVpbGRlcigpCisgICAgICAgICAgLm9wdGlvbnNNb2R1bGUoT3B0aW9uc01vZHVsZS53aXRoQmVuY2htYXJrQ2xhc3MoYXJncykpCisgICAgICAgICAgLm91dHB1dE1vZHVsZShuZXcgT3V0cHV0TW9kdWxlKHN0ZG91dCwgc3RkZXJyKSkKKyAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgIENhbGlwZXJPcHRpb25zIG9wdGlvbnMgPSBtYWluQ29tcG9uZW50LmdldENhbGlwZXJPcHRpb25zKCk7CisgICAgICBpZiAob3B0aW9ucy5wcmludENvbmZpZ3VyYXRpb24oKSkgeworICAgICAgICBzdGRvdXQucHJpbnRsbigiQ29uZmlndXJhdGlvbjoiKTsKKyAgICAgICAgSW1tdXRhYmxlU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBzb3J0ZWRQcm9wZXJ0aWVzID0KKyAgICAgICAgICAgIEltbXV0YWJsZVNvcnRlZE1hcC5jb3B5T2YobWFpbkNvbXBvbmVudC5nZXRDYWxpcGVyQ29uZmlnKCkucHJvcGVydGllcygpKTsKKyAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBzb3J0ZWRQcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICBzdGRvdXQucHJpbnRmKCIgICVzID0gJXMlbiIsIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgcGFyYW1ldGVycyBhcmUgdmFsaWQKKyAgICAgIG1haW5Db21wb25lbnQuZ2V0QmVuY2htYXJrQ2xhc3MoKS52YWxpZGF0ZVBhcmFtZXRlcnMob3B0aW9ucy51c2VyUGFyYW1ldGVycygpKTsKKyAgICAgIFNlcnZpY2VNYW5hZ2VyIHNlcnZpY2VNYW5hZ2VyID0gbWFpbkNvbXBvbmVudC5nZXRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgc2VydmljZU1hbmFnZXIuc3RhcnRBc3luYygpLmF3YWl0SGVhbHRoeSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgQ2FsaXBlclJ1biBydW4gPSBtYWluQ29tcG9uZW50LmdldENhbGlwZXJSdW4oKTsKKyAgICAgICAgcnVuLnJ1bigpOyAvLyB0aHJvd3MgSUJFCisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeworICAgICAgICAgIC8vIFdlIGhhdmUgc29tZSBzaHV0ZG93biBsb2dpYyB0byBlbnN1cmUgdGhhdCBmaWxlcyBhcmUgY2xlYW5lZCB1cCBzbyBnaXZlIGl0IGEgY2hhbmNlIHRvCisgICAgICAgICAgLy8gcnVuCisgICAgICAgICAgc2VydmljZU1hbmFnZXIuc3RvcEFzeW5jKCkuYXdhaXRTdG9wcGVkKDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgLy8gVGhhdCdzIGZpbmUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICAvLyBjb3VydGVzeSBmbHVzaAorICAgICAgc3RkZXJyLmZsdXNoKCk7CisgICAgICBzdGRvdXQuZmx1c2goKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRUeXBlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9DYWxpcGVyUnVuLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFR5cGUuamF2YQpyZW5hbWUgdG8gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQ2FsaXBlclJ1bi5qYXZhCmluZGV4IDMwZGU2OWYuLjI1NTUwMTYgMTAwNjQ0Ci0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRUeXBlLmphdmEKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQ2FsaXBlclJ1bi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMSArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKLQotQEd3dENvbXBhdGlibGUKLXB1YmxpYyBlbnVtIE1lYXN1cmVtZW50VHlwZSB7Ci0gIFRJTUUsIElOU1RBTkNFLCBNRU1PUlksIERFQlVHCisvKioKKyAqIEEgc2luZ2xlIGludm9jYXRpb24gb2YgY2FsaXBlci4KKyAqLworcHVibGljIGludGVyZmFjZSBDYWxpcGVyUnVuIHsKKyAgdm9pZCBydW4oKSB0aHJvd3MgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0NvbW1vbkluc3RydW1lbnRPcHRpb25zLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9Db21tb25JbnN0cnVtZW50T3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTg2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9Db21tb25JbnN0cnVtZW50T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworLyoqCisgKiBJbnN0cnVtZW50IG9wdGlvbiBpZGVudGlmaWVycyBzaGFyZWQgYmV0d2VlbiBpbnN0cnVtZW50cy4KKyAqLworZmluYWwgY2xhc3MgQ29tbW9uSW5zdHJ1bWVudE9wdGlvbnMgeworICBwcml2YXRlIENvbW1vbkluc3RydW1lbnRPcHRpb25zKCkge30KKworICBzdGF0aWMgZmluYWwgU3RyaW5nIE1FQVNVUkVNRU5UU19PUFRJT04gPSAibWVhc3VyZW1lbnRzIjsKKyAgc3RhdGljIGZpbmFsIFN0cmluZyBHQ19CRUZPUkVfRUFDSF9PUFRJT04gPSAiZ2NCZWZvcmVFYWNoIjsKKyAgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJNVVBfT1BUSU9OID0gIndhcm11cCI7CisgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1dBUk1VUF9XQUxMX1RJTUVfT1BUSU9OID0gIm1heFdhcm11cFdhbGxUaW1lIjsKK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0NvbnNvbGVPdXRwdXQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0NvbnNvbGVPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA4YzU4Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQ29uc29sZU91dHB1dC5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkJlbmNobWFya1NwZWM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkluc3RydW1lbnRTcGVjOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuU2NlbmFyaW87CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlRyaWFsOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5WbVNwZWM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuU3Rkb3V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdG9wd2F0Y2g7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5GbHVlbnRJdGVyYWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9yZGVyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tYXRoLnN0YXQuZGVzY3JpcHRpdmUuRGVzY3JpcHRpdmVTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tYXRoLnN0YXQuZGVzY3JpcHRpdmUucmFuay5QZXJjZW50aWxlOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogUHJpbnRzIGEgYnJpZWYgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBjb2xsZWN0ZWQuICBJdCBkb2VzIG5vdCBjb250YWluIHRoZSBtZWFzdXJlbWVudHMgdGhlbXNlbHZlcworICogYXMgdGhhdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHdlYmFwcC4KKyAqLworZmluYWwgY2xhc3MgQ29uc29sZU91dHB1dCBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisgIHByaXZhdGUgZmluYWwgUHJpbnRXcml0ZXIgc3Rkb3V0OworCisgIHByaXZhdGUgZmluYWwgU2V0PEluc3RydW1lbnRTcGVjPiBpbnN0cnVtZW50U3BlY3MgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgcHJpdmF0ZSBmaW5hbCBTZXQ8Vm1TcGVjPiB2bVNwZWNzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgIHByaXZhdGUgZmluYWwgU2V0PEJlbmNobWFya1NwZWM+IGJlbmNobWFya1NwZWNzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgIHByaXZhdGUgaW50IG51bU1lYXN1cmVtZW50cyA9IDA7CisgIHByaXZhdGUgaW50IHRyaWFsc0NvbXBsZXRlZCA9IDA7CisgIHByaXZhdGUgZmluYWwgaW50IG51bWJlck9mVHJpYWxzOworICBwcml2YXRlIGZpbmFsIFN0b3B3YXRjaCBzdG9wd2F0Y2g7CisKKworICBDb25zb2xlT3V0cHV0KEBTdGRvdXQgUHJpbnRXcml0ZXIgc3Rkb3V0LCBpbnQgbnVtYmVyT2ZUcmlhbHMsIFN0b3B3YXRjaCBzdG9wd2F0Y2gpIHsKKyAgICB0aGlzLnN0ZG91dCA9IHN0ZG91dDsKKyAgICB0aGlzLm51bWJlck9mVHJpYWxzID0gbnVtYmVyT2ZUcmlhbHM7CisgICAgdGhpcy5zdG9wd2F0Y2ggPSBzdG9wd2F0Y2g7CisgIH0KKworICAvKioKKyAgICogUHJpbnRzIGEgc2hvcnQgbWVzc2FnZSB3aGVuIHdlIG9ic2VydmUgYSB0cmlhbCBmYWlsdXJlLgorICAgKi8gIAorICB2b2lkIHByb2Nlc3NGYWlsZWRUcmlhbChUcmlhbEZhaWx1cmVFeGNlcHRpb24gZSkgeworICAgIHRyaWFsc0NvbXBsZXRlZCsrOworICAgIC8vIFRPRE8obHVrZXMpOiBpdCB3b3VsZCBiZSBuaWNlIHRvIHByaW50IHdoaWNoIHRyaWFsIGZhaWxlZC4gIENvbnNpZGVyIGFkZGluZyBFeHBlcmltZW50IGRhdGEKKyAgICAvLyB0byB0aGUgVHJpYWxGYWlsdXJlRXhjZXB0aW9uLgorICAgIHN0ZG91dC5wcmludGxuKAorICAgICAgICAiRVJST1I6IFRyaWFsIGZhaWxlZCB0byBjb21wbGV0ZSAoaXRzIHJlc3VsdHMgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJ1bik6XG4iCisgICAgICAgICAgICArICIgICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgc3Rkb3V0LmZsdXNoKCk7CisgIH0KKyAgCisgIC8qKgorICAgKiBQcmludHMgYSBzdW1tYXJ5IG9mIGEgc3VjY2Vzc2Z1bCB0cmlhbCByZXN1bHQuCisgICAqLworICB2b2lkIHByb2Nlc3NUcmlhbChUcmlhbFJlc3VsdCByZXN1bHQpIHsKKyAgICB0cmlhbHNDb21wbGV0ZWQrKzsKKyAgICBzdGRvdXQucHJpbnRmKCJUcmlhbCBSZXBvcnQgKCVkIG9mICVkKTolbiAgRXhwZXJpbWVudCAlcyVuIiwgCisgICAgICAgIHRyaWFsc0NvbXBsZXRlZCwgbnVtYmVyT2ZUcmlhbHMsIHJlc3VsdC5nZXRFeHBlcmltZW50KCkpOworICAgIGlmICghcmVzdWx0LmdldFRyaWFsTWVzc2FnZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgIHN0ZG91dC5wcmludGxuKCIgIE1lc3NhZ2VzOiIpOworICAgICAgZm9yIChTdHJpbmcgbWVzc2FnZSA6IHJlc3VsdC5nZXRUcmlhbE1lc3NhZ2VzKCkpIHsKKyAgICAgICAgc3Rkb3V0LnByaW50KCIgICAgIik7CisgICAgICAgIHN0ZG91dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKyAgICBUcmlhbCB0cmlhbCA9IHJlc3VsdC5nZXRUcmlhbCgpOworICAgIEltbXV0YWJsZUxpc3RNdWx0aW1hcDxTdHJpbmcsIE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHNJbmRleCA9CisgICAgICAgIG5ldyBJbW11dGFibGVMaXN0TXVsdGltYXAuQnVpbGRlcjxTdHJpbmcsIE1lYXN1cmVtZW50PigpCisgICAgICAgICAgICAub3JkZXJLZXlzQnkoT3JkZXJpbmcubmF0dXJhbCgpKQorICAgICAgICAgICAgLnB1dEFsbChNdWx0aW1hcHMuaW5kZXgodHJpYWwubWVhc3VyZW1lbnRzKCksIG5ldyBGdW5jdGlvbjxNZWFzdXJlbWVudCwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgYXBwbHkoTWVhc3VyZW1lbnQgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuZGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICBzdGRvdXQucHJpbnRsbigiICBSZXN1bHRzOiIpOworICAgIGZvciAoRW50cnk8U3RyaW5nLCBDb2xsZWN0aW9uPE1lYXN1cmVtZW50Pj4gZW50cnkgOiBtZWFzdXJlbWVudHNJbmRleC5hc01hcCgpLmVudHJ5U2V0KCkpIHsKKyAgICAgIENvbGxlY3Rpb248TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50cyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICBJbW11dGFibGVTZXQ8U3RyaW5nPiB1bml0cyA9IEZsdWVudEl0ZXJhYmxlLmZyb20obWVhc3VyZW1lbnRzKQorICAgICAgICAgIC50cmFuc2Zvcm0obmV3IEZ1bmN0aW9uPE1lYXN1cmVtZW50LCBTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgYXBwbHkoTWVhc3VyZW1lbnQgaW5wdXQpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LnZhbHVlKCkudW5pdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pLnRvU2V0KCk7CisgICAgICBkb3VibGVbXSB3ZWlnaHRlZFZhbHVlcyA9IG5ldyBkb3VibGVbbWVhc3VyZW1lbnRzLnNpemUoKV07CisgICAgICBpbnQgaSA9IDA7CisgICAgICBmb3IgKE1lYXN1cmVtZW50IG1lYXN1cmVtZW50IDogbWVhc3VyZW1lbnRzKSB7CisgICAgICAgIHdlaWdodGVkVmFsdWVzW2ldID0gbWVhc3VyZW1lbnQudmFsdWUoKS5tYWduaXR1ZGUoKSAvIG1lYXN1cmVtZW50LndlaWdodCgpOworICAgICAgICBpKys7CisgICAgICB9CisgICAgICBQZXJjZW50aWxlIHBlcmNlbnRpbGUgPSBuZXcgUGVyY2VudGlsZSgpOworICAgICAgcGVyY2VudGlsZS5zZXREYXRhKHdlaWdodGVkVmFsdWVzKTsKKyAgICAgIERlc2NyaXB0aXZlU3RhdGlzdGljcyBkZXNjcmlwdGl2ZVN0YXRpc3RpY3MgPSBuZXcgRGVzY3JpcHRpdmVTdGF0aXN0aWNzKHdlaWdodGVkVmFsdWVzKTsKKyAgICAgIFN0cmluZyB1bml0ID0gSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KHVuaXRzKTsKKyAgICAgIHN0ZG91dC5wcmludGYoCisgICAgICAgICAgIiAgICAlcyVzOiBtaW49JS4yZiwgMXN0IHF1Lj0lLjJmLCBtZWRpYW49JS4yZiwgbWVhbj0lLjJmLCAzcmQgcXUuPSUuMmYsIG1heD0lLjJmJW4iLAorICAgICAgICAgIGVudHJ5LmdldEtleSgpLCB1bml0LmlzRW1wdHkoKSA/ICIiIDogIigiICsgdW5pdCArICIpIiwKKyAgICAgICAgICBkZXNjcmlwdGl2ZVN0YXRpc3RpY3MuZ2V0TWluKCksIHBlcmNlbnRpbGUuZXZhbHVhdGUoMjUpLAorICAgICAgICAgIHBlcmNlbnRpbGUuZXZhbHVhdGUoNTApLCBkZXNjcmlwdGl2ZVN0YXRpc3RpY3MuZ2V0TWVhbigpLAorICAgICAgICAgIHBlcmNlbnRpbGUuZXZhbHVhdGUoNzUpLCBkZXNjcmlwdGl2ZVN0YXRpc3RpY3MuZ2V0TWF4KCkpOworICAgIH0KKyAgICAKKyAgICBpbnN0cnVtZW50U3BlY3MuYWRkKHRyaWFsLmluc3RydW1lbnRTcGVjKCkpOworICAgIFNjZW5hcmlvIHNjZW5hcmlvID0gdHJpYWwuc2NlbmFyaW8oKTsKKyAgICB2bVNwZWNzLmFkZChzY2VuYXJpby52bVNwZWMoKSk7CisgICAgYmVuY2htYXJrU3BlY3MuYWRkKHNjZW5hcmlvLmJlbmNobWFya1NwZWMoKSk7CisgICAgbnVtTWVhc3VyZW1lbnRzICs9IHRyaWFsLm1lYXN1cmVtZW50cygpLnNpemUoKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAodHJpYWxzQ29tcGxldGVkID09IG51bWJlck9mVHJpYWxzKSB7ICAvLyBpZiB3ZSBmaW5pc2hlZCBhbGwgdGhlIHRyaWFscworICAgICAgc3Rkb3V0LnByaW50ZigiQ29sbGVjdGVkICVkIG1lYXN1cmVtZW50cyBmcm9tOiVuIiwgbnVtTWVhc3VyZW1lbnRzKTsKKyAgICAgIHN0ZG91dC5wcmludGYoIiAgJWQgaW5zdHJ1bWVudChzKSVuIiwgaW5zdHJ1bWVudFNwZWNzLnNpemUoKSk7CisgICAgICBzdGRvdXQucHJpbnRmKCIgICVkIHZpcnR1YWwgbWFjaGluZShzKSVuIiwgdm1TcGVjcy5zaXplKCkpOworICAgICAgc3Rkb3V0LnByaW50ZigiICAlZCBiZW5jaG1hcmsocyklbiIsIGJlbmNobWFya1NwZWNzLnNpemUoKSk7CisgICAgICBzdGRvdXQucHJpbnRsbigpOworICAgICAgc3Rkb3V0LmZvcm1hdCgiRXhlY3V0aW9uIGNvbXBsZXRlOiAlcy4lbiIsIHN0b3B3YXRjaC5zdG9wKCkpOworICAgICAgc3Rkb3V0LmZsdXNoKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9FbnZpcm9ubWVudEdldHRlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRW52aXJvbm1lbnRHZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThlNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRW52aXJvbm1lbnRHZXR0ZXIuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkhvc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU11bHRpc2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIGEgTWFwIHRoYXQgZGVzY3JpYmVzIHRoZSBlbnZpcm9ubWVudDoKKyAqIEpWTSB2ZXJzaW9uLCBvcyBkZXRhaWxzLCBldGMuCisgKi8KK2ZpbmFsIGNsYXNzIEVudmlyb25tZW50R2V0dGVyIHsKKyAgSG9zdCBnZXRIb3N0KCkgeworICAgIHJldHVybiBuZXcgSG9zdC5CdWlsZGVyKCkKKyAgICAgICAgLmFkZEFsbFByb3BlcmllcyhnZXRQcm9wZXJ0aWVzKCkpCisgICAgICAgIC5idWlsZCgpOworICB9CisgIAorICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpIHsKKyAgICBUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU1hcCA9IE1hcHMubmV3VHJlZU1hcCgpOworCisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzeXNQcm9wcyA9IE1hcHMuZnJvbVByb3BlcnRpZXMoU3lzdGVtLmdldFByb3BlcnRpZXMoKSk7CisKKyAgICAvLyBTb21ldGltZXMgamF2YS5ydW50aW1lLnZlcnNpb24gaXMgbW9yZSBkZXNjcmlwdGl2ZSB0aGFuIGphdmEudmVyc2lvbgorICAgIFN0cmluZyB2ZXJzaW9uID0gc3lzUHJvcHMuZ2V0KCJqYXZhLnZlcnNpb24iKTsKKyAgICBTdHJpbmcgYWx0ZXJuYXRlVmVyc2lvbiA9IHN5c1Byb3BzLmdldCgiamF2YS5ydW50aW1lLnZlcnNpb24iKTsKKyAgICBpZiAoYWx0ZXJuYXRlVmVyc2lvbiAhPSBudWxsICYmIGFsdGVybmF0ZVZlcnNpb24ubGVuZ3RoKCkgPiB2ZXJzaW9uLmxlbmd0aCgpKSB7CisgICAgICB2ZXJzaW9uID0gYWx0ZXJuYXRlVmVyc2lvbjsKKyAgICB9CisgICAgcHJvcGVydHlNYXAucHV0KCJob3N0LmF2YWlsYWJsZVByb2Nlc3NvcnMiLAorICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKSkpOworCisgICAgU3RyaW5nIG9zTmFtZSA9IHN5c1Byb3BzLmdldCgib3MubmFtZSIpOworICAgIHByb3BlcnR5TWFwLnB1dCgib3MubmFtZSIsIG9zTmFtZSk7CisgICAgcHJvcGVydHlNYXAucHV0KCJvcy52ZXJzaW9uIiwgc3lzUHJvcHMuZ2V0KCJvcy52ZXJzaW9uIikpOworICAgIHByb3BlcnR5TWFwLnB1dCgib3MuYXJjaCIsIHN5c1Byb3BzLmdldCgib3MuYXJjaCIpKTsKKworICAgIGlmIChvc05hbWUuZXF1YWxzKCJMaW51eCIpKSB7CisgICAgICBnZXRMaW51eEVudmlyb25tZW50KHByb3BlcnR5TWFwKTsKKyAgICB9CisKKyAgICByZXR1cm4gcHJvcGVydHlNYXA7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ2V0TGludXhFbnZpcm9ubWVudChNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TWFwKSB7CisgICAgLy8gdGhlIGZvbGxvd2luZyBwcm9iYWJseSBkb2Vzbid0IHdvcmsgb24gQUxMIGxpbnV4CisgICAgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGNwdUluZm8gPSBwcm9wZXJ0aWVzRnJvbUxpbnV4RmlsZSgiL3Byb2MvY3B1aW5mbyIpOworICAgIHByb3BlcnR5TWFwLnB1dCgiaG9zdC5jcHVzIiwgSW50ZWdlci50b1N0cmluZyhjcHVJbmZvLmdldCgicHJvY2Vzc29yIikuc2l6ZSgpKSk7CisgICAgU3RyaW5nIHMgPSAiY3B1IGNvcmVzIjsKKyAgICBwcm9wZXJ0eU1hcC5wdXQoImhvc3QuY3B1LmNvcmVzIiwgZGVzY3JpYmUoY3B1SW5mbywgcykpOworICAgIHByb3BlcnR5TWFwLnB1dCgiaG9zdC5jcHUubmFtZXMiLCBkZXNjcmliZShjcHVJbmZvLCAibW9kZWwgbmFtZSIpKTsKKyAgICBwcm9wZXJ0eU1hcC5wdXQoImhvc3QuY3B1LmNhY2hlc2l6ZSIsIGRlc2NyaWJlKGNwdUluZm8sICJjYWNoZSBzaXplIikpOworCisgICAgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IG1lbUluZm8gPSBwcm9wZXJ0aWVzRnJvbUxpbnV4RmlsZSgiL3Byb2MvbWVtaW5mbyIpOworICAgIC8vIFRPRE8gcmVkbyBtZW1JbmZvLnRvU3RyaW5nKCkgc28gd2UgZG9uJ3QgZ2V0IHNxdWFyZSBicmFja2V0cworICAgIHByb3BlcnR5TWFwLnB1dCgiaG9zdC5tZW1vcnkucGh5c2ljYWwiLCBtZW1JbmZvLmdldCgiTWVtVG90YWwiKS50b1N0cmluZygpKTsKKyAgICBwcm9wZXJ0eU1hcC5wdXQoImhvc3QubWVtb3J5LnN3YXAiLCBtZW1JbmZvLmdldCgiU3dhcFRvdGFsIikudG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVzY3JpYmUoTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGNwdUluZm8sIFN0cmluZyBzKSB7CisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBjcHVJbmZvLmdldChzKTsKKyAgICAvLyBUT0RPIHJlZG8gdGhlIEltbXV0YWJsZU11bHRpc2V0LnRvU3RyaW5nKCkgY2FsbCBzbyB3ZSBkb24ndCBnZXQgc3F1YXJlIGJyYWNrZXRzCisgICAgcmV0dXJuIChzdHJpbmdzLnNpemUoKSA9PSAxKQorICAgICAgICA/IHN0cmluZ3MuaXRlcmF0b3IoKS5uZXh0KCkKKyAgICAgICAgOiBJbW11dGFibGVNdWx0aXNldC5jb3B5T2Yoc3RyaW5ncykudG9TdHJpbmcoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMtZmlsZSBsaWtlIGZpbGUuCisgICAqIFVubGlrZSBzdGFuZGFyZCBKYXZhIHByb3BlcnRpZXMgZmlsZXMsIHtAY29kZSByZWFkZXJ9IGlzIGFsbG93ZWQgdG8gbGlzdAorICAgKiB0aGUgc2FtZSBwcm9wZXJ0eSBtdWx0aXBsZSB0aW1lcy4gQ29tbWVudHMgZXRjLiBhcmUgdW5zdXBwb3J0ZWQuCisgICAqCisgICAqIDxwPklmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVhZGluZyB0aGUgZmlsZSdzIGNvbnRlbnRzLCB3ZSdsbCByZXR1cm4gYW4KKyAgICogZW1wdHkgTXVsdGltYXAuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllc0Zyb21MaW51eEZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICB0cnkgeworICAgICAgTGlzdDxTdHJpbmc+IGxpbmVzID0gRmlsZXMucmVhZExpbmVzKG5ldyBGaWxlKGZpbGUpLCBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkpOworICAgICAgSW1tdXRhYmxlTXVsdGltYXAuQnVpbGRlcjxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gSW1tdXRhYmxlTXVsdGltYXAuYnVpbGRlcigpOworICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CisgICAgICAgIC8vIFRPRE8oc2NobW9lKTogcmVwbGFjZSB3aXRoIFNwbGl0dGVyIChpbiBHdWF2YSByZWxlYXNlIDEwKQorICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoIlxccypcXDpcXHMqIiwgMik7CisgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMikgeworICAgICAgICAgIHJlc3VsdC5wdXQocGFydHNbMF0sIHBhcnRzWzFdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdC5idWlsZCgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIElmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVhZGluZyB0aGUgZmlsZSwganVzdCByZXR1cm4gYW4gZW1wdHkgbXVsdGltYXAuCisgICAgICByZXR1cm4gSW1tdXRhYmxlTXVsdGltYXAub2YoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0V4cGVyaW1lbnQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0V4cGVyaW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE4NzdmCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRXhwZXJpbWVudC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5JbnN0cnVtZW50Lkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk1vcmVPYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNvcnRlZE1hcDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBzaW5nbGUgInByZW1pc2UiIGZvciBtYWtpbmcgYmVuY2htYXJrIG1lYXN1cmVtZW50czogd2hpY2ggY2xhc3MgYW5kIG1ldGhvZCB0byBpbnZva2UsIHdoaWNoIFZNCisgKiB0byB1c2UsIHdoaWNoIGNob2ljZXMgZm9yIHVzZXIgcGFyYW1ldGVycyBhbmQgdm1Bcmd1bWVudHMgdG8gZmlsbCBpbiBhbmQgd2hpY2ggaW5zdHJ1bWVudCB0byB1c2UKKyAqIHRvIG1lYXN1cmUuIEEgY2FsaXBlciBydW4gd2lsbCBjb21wdXRlIGFsbCBwb3NzaWJsZSBzY2VuYXJpb3MgdXNpbmcKKyAqIHtAbGluayBGdWxsQ2FydGVzaWFuRXhwZXJpbWVudFNlbGVjdG9yfSwgYW5kIHdpbGwgcnVuIG9uZSBvciBtb3JlIHRyaWFscyBvZiBlYWNoLgorICovCitmaW5hbCBjbGFzcyBFeHBlcmltZW50IHsKKyAgcHJpdmF0ZSBmaW5hbCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uOworICBwcml2YXRlIGZpbmFsIFZpcnR1YWxNYWNoaW5lIHZtOworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gdXNlclBhcmFtZXRlcnM7CisKKyAgRXhwZXJpbWVudCgKKyAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24sCisgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJQYXJhbWV0ZXJzLAorICAgICAgVmlydHVhbE1hY2hpbmUgdm0pIHsKKyAgICB0aGlzLmluc3RydW1lbnRhdGlvbiA9IGNoZWNrTm90TnVsbChpbnN0cnVtZW50YXRpb24pOworICAgIHRoaXMudXNlclBhcmFtZXRlcnMgPSBJbW11dGFibGVTb3J0ZWRNYXAuY29weU9mKHVzZXJQYXJhbWV0ZXJzKTsKKyAgICB0aGlzLnZtID0gY2hlY2tOb3ROdWxsKHZtKTsKKyAgfQorCisgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24oKSB7CisgICAgcmV0dXJuIGluc3RydW1lbnRhdGlvbjsKKyAgfQorCisgIEltbXV0YWJsZVNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gdXNlclBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIHVzZXJQYXJhbWV0ZXJzOworICB9CisKKyAgVmlydHVhbE1hY2hpbmUgdm0oKSB7CisgICAgcmV0dXJuIHZtOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEV4cGVyaW1lbnQpIHsKKyAgICAgIEV4cGVyaW1lbnQgdGhhdCA9IChFeHBlcmltZW50KSBvYmplY3Q7CisgICAgICByZXR1cm4gdGhpcy5pbnN0cnVtZW50YXRpb24uZXF1YWxzKHRoYXQuaW5zdHJ1bWVudGF0aW9uKQorICAgICAgICAgICYmIHRoaXMudm0uZXF1YWxzKHRoYXQudm0pCisgICAgICAgICAgJiYgdGhpcy51c2VyUGFyYW1ldGVycy5lcXVhbHModGhhdC51c2VyUGFyYW1ldGVycyk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKGluc3RydW1lbnRhdGlvbiwgdm0sIHVzZXJQYXJhbWV0ZXJzKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcigiIikKKyAgICAgICAgLmFkZCgiaW5zdHJ1bWVudCIsIGluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50KCkpCisgICAgICAgIC5hZGQoImJlbmNobWFya01ldGhvZCIsIGluc3RydW1lbnRhdGlvbi5iZW5jaG1hcmtNZXRob2QuZ2V0TmFtZSgpKQorICAgICAgICAuYWRkKCJ2bSIsIHZtLm5hbWUpCisgICAgICAgIC5hZGQoInBhcmFtZXRlcnMiLCB1c2VyUGFyYW1ldGVycykKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvVXBsb2FkUmVzdWx0cy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRXhwZXJpbWVudENvbXBvbmVudC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBjYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YQpjb3B5IHRvIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0V4cGVyaW1lbnRDb21wb25lbnQuamF2YQppbmRleCA3ZGFlN2FmLi4xNzRjNWY1IDEwMDY0NAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YQorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9FeHBlcmltZW50Q29tcG9uZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE1ICsxNCwxNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7CitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVubmluZy5CZW5jaG1hcms7CisKK2ltcG9ydCBkYWdnZXIuU3ViY29tcG9uZW50OwogCiAvKioKLSAqIFVzYWdlOiBVcGxvYWRSZXN1bHRzIDxmaWxlX29yX2Rpcj4KKyAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYmVuY2htYXJrIGluc3RhbmNlIHRvIHVzZSBmb3IgdGhlIGV4cGVyaW1lbnQuCiAgKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRSZXN1bHRzIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIG5ldyBSdW5uZXIoKS51cGxvYWRSZXN1bHRzRmlsZU9yRGlyKG5ldyBGaWxlKGFyZ3NbMF0pKTsKLSAgfQorQFN1YmNvbXBvbmVudChtb2R1bGVzID0gRXhwZXJpbWVudE1vZHVsZS5jbGFzcykKK3B1YmxpYyBpbnRlcmZhY2UgRXhwZXJpbWVudENvbXBvbmVudCB7CisgIEBCZW5jaG1hcmsgT2JqZWN0IGdldEJlbmNobWFya0luc3RhbmNlKCk7CiB9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9FeHBlcmltZW50TW9kdWxlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9FeHBlcmltZW50TW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3MTFhMQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0V4cGVyaW1lbnRNb2R1bGUuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkJlbmNobWFyazsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkJlbmNobWFya01ldGhvZDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuV29ya2VyU3BlYzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNvcnRlZE1hcDsKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBBIG1vZHVsZSB0aGF0IGJpbmRzIGRhdGEgc3BlY2lmaWMgdG8gYSBzaW5nbGUgZXhwZXJpbWVudC4KKyAqLworQE1vZHVsZQorcHVibGljIGZpbmFsIGNsYXNzIEV4cGVyaW1lbnRNb2R1bGUgeworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyczsKKyAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgYmVuY2htYXJrTWV0aG9kOworCisgIHByaXZhdGUgRXhwZXJpbWVudE1vZHVsZSgKKyAgICAgIE1ldGhvZCBiZW5jaG1hcmtNZXRob2QsCisgICAgICBJbW11dGFibGVTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKKyAgICB0aGlzLnBhcmFtZXRlcnMgPSBjaGVja05vdE51bGwocGFyYW1ldGVycyk7CisgICAgdGhpcy5iZW5jaG1hcmtNZXRob2QgPSBjaGVja05vdE51bGwoYmVuY2htYXJrTWV0aG9kKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgRXhwZXJpbWVudE1vZHVsZSBmb3JFeHBlcmltZW50KEV4cGVyaW1lbnQgZXhwZXJpbWVudCkgeworICAgIE1ldGhvZCBiZW5jaG1hcmtNZXRob2QgPSBleHBlcmltZW50Lmluc3RydW1lbnRhdGlvbigpLmJlbmNobWFya01ldGhvZCgpOworICAgIHJldHVybiBuZXcgRXhwZXJpbWVudE1vZHVsZSgKKyAgICAgICAgYmVuY2htYXJrTWV0aG9kLAorICAgICAgICBleHBlcmltZW50LnVzZXJQYXJhbWV0ZXJzKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBFeHBlcmltZW50TW9kdWxlIGZvcldvcmtlclNwZWMoV29ya2VyU3BlYyBzcGVjKQorICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIENsYXNzPD8+IGJlbmNobWFya0NsYXNzID0gVXRpbC5sb2FkQ2xhc3Moc3BlYy5iZW5jaG1hcmtTcGVjLmNsYXNzTmFtZSgpKTsKKyAgICBNZXRob2QgYmVuY2htYXJrTWV0aG9kID0gZmluZEJlbmNobWFya01ldGhvZChiZW5jaG1hcmtDbGFzcywgc3BlYy5iZW5jaG1hcmtTcGVjLm1ldGhvZE5hbWUoKSwKKyAgICAgICAgc3BlYy5tZXRob2RQYXJhbWV0ZXJDbGFzc2VzKTsKKyAgICBiZW5jaG1hcmtNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICByZXR1cm4gbmV3IEV4cGVyaW1lbnRNb2R1bGUoYmVuY2htYXJrTWV0aG9kLCBzcGVjLmJlbmNobWFya1NwZWMucGFyYW1ldGVycygpKTsKKyAgfQorCisgIEBQcm92aWRlcworICBAQmVuY2htYXJrCisgIHN0YXRpYyBPYmplY3QgcHJvdmlkZVJ1bm5pbmdCZW5jaG1hcmsoQmVuY2htYXJrQ3JlYXRvciBjcmVhdG9yKSB7CisgICAgcmV0dXJuIGNyZWF0b3IuY3JlYXRlQmVuY2htYXJrSW5zdGFuY2UoKTsKKyAgfQorCisgIEBQcm92aWRlcworICBAQmVuY2htYXJrTWV0aG9kCisgIFN0cmluZyBwcm92aWRlUnVubmluZ0JlbmNobWFya01ldGhvZE5hbWUoKSB7CisgICAgcmV0dXJuIGJlbmNobWFya01ldGhvZC5nZXROYW1lKCk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgQEJlbmNobWFya01ldGhvZAorICBNZXRob2QgcHJvdmlkZVJ1bm5pbmdCZW5jaG1hcmtNZXRob2QoKSB7CisgICAgcmV0dXJuIGJlbmNobWFya01ldGhvZDsKKyAgfQorCisgIEBQcm92aWRlcworICBAQmVuY2htYXJrCisgIEltbXV0YWJsZVNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvdmlkZVVzZXJQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiBwYXJhbWV0ZXJzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGZpbmRCZW5jaG1hcmtNZXRob2QoQ2xhc3M8Pz4gYmVuY2htYXJrLCBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgIEltbXV0YWJsZUxpc3Q8Q2xhc3M8Pz4+IG1ldGhvZFBhcmFtZXRlckNsYXNzZXMpIHsKKyAgICBDbGFzczw/PltdIHBhcmFtcyA9IG1ldGhvZFBhcmFtZXRlckNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3M8Pz5bbWV0aG9kUGFyYW1ldGVyQ2xhc3Nlcy5zaXplKCldKTsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGJlbmNobWFyay5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbXMpOworICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBhc3NlcnRpb24gZXJyb3I/CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0V4cGVyaW1lbnRTZWxlY3Rvci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRXhwZXJpbWVudFNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzMjA1NwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0V4cGVyaW1lbnRTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0TXVsdGltYXA7CisKK3B1YmxpYyBpbnRlcmZhY2UgRXhwZXJpbWVudFNlbGVjdG9yIHsKKyAgSW1tdXRhYmxlU2V0PEluc3RydW1lbnQ+IGluc3RydW1lbnRzKCk7CisgIEltbXV0YWJsZVNldDxWaXJ0dWFsTWFjaGluZT4gdm1zKCk7CisgIEltbXV0YWJsZVNldE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB1c2VyUGFyYW1ldGVycygpOworCisgIC8vIFRoZSBpbXBvcnRhbnQgbWV0aG9kCisgIEltbXV0YWJsZVNldDxFeHBlcmltZW50PiBzZWxlY3RFeHBlcmltZW50cygpOworCisgIFN0cmluZyBzZWxlY3Rpb25UeXBlKCk7Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9FeHBlcmltZW50aW5nQ2FsaXBlclJ1bi5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRXhwZXJpbWVudGluZ0NhbGlwZXJSdW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjE0MTkzCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRXhwZXJpbWVudGluZ0NhbGlwZXJSdW4uamF2YQpAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5XQVJOSU5HOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5SZXN1bHRQcm9jZXNzb3I7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5Ta2lwVGhpc1NjZW5hcmlvRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zLkNhbGlwZXJPcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlN0ZG91dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RvcHdhdGNoOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkZsdWVudEl0ZXJhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuUXVldWVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5Bc3luY0Z1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5GdXR1cmVGYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5Nb3JlRXhlY3V0b3JzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5TZXR0YWJsZUZ1dHVyZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworLyoqCisgKiBBbiBleGVjdXRpb24gb2YgZWFjaCB7QGxpbmsgRXhwZXJpbWVudH0gZm9yIHRoZSBjb25maWd1cmVkIG51bWJlciBvZiB0cmlhbHMuCisgKi8KK0BWaXNpYmxlRm9yVGVzdGluZworcHVibGljIGZpbmFsIGNsYXNzIEV4cGVyaW1lbnRpbmdDYWxpcGVyUnVuIGltcGxlbWVudHMgQ2FsaXBlclJ1biB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoRXhwZXJpbWVudGluZ0NhbGlwZXJSdW4uY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdXR1cmVGYWxsYmFjazxPYmplY3Q+IEZBTExCQUNLX1RPX05VTEwgPSBuZXcgRnV0dXJlRmFsbGJhY2s8T2JqZWN0PigpIHsKKyAgICBmaW5hbCBMaXN0ZW5hYmxlRnV0dXJlPE9iamVjdD4gbnVsbEZ1dHVyZSA9IEZ1dHVyZXMuaW1tZWRpYXRlRnV0dXJlKG51bGwpOworICAgIEBPdmVycmlkZSBwdWJsaWMgTGlzdGVuYWJsZUZ1dHVyZTxPYmplY3Q+IGNyZWF0ZShUaHJvd2FibGUgdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbnVsbEZ1dHVyZTsKKyAgICB9CisgIH07CisKKyAgcHJpdmF0ZSBmaW5hbCBNYWluQ29tcG9uZW50IG1haW5Db21wb25lbnQ7CisgIHByaXZhdGUgZmluYWwgQ2FsaXBlck9wdGlvbnMgb3B0aW9uczsKKyAgcHJpdmF0ZSBmaW5hbCBQcmludFdyaXRlciBzdGRvdXQ7CisgIHByaXZhdGUgZmluYWwgQmVuY2htYXJrQ2xhc3MgYmVuY2htYXJrQ2xhc3M7CisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PEluc3RydW1lbnQ+IGluc3RydW1lbnRzOworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNldDxSZXN1bHRQcm9jZXNzb3I+IHJlc3VsdFByb2Nlc3NvcnM7CisgIHByaXZhdGUgZmluYWwgRXhwZXJpbWVudFNlbGVjdG9yIHNlbGVjdG9yOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZT4gZXhlY3V0b3JQcm92aWRlcjsKKworICBASW5qZWN0IEBWaXNpYmxlRm9yVGVzdGluZworICBwdWJsaWMgRXhwZXJpbWVudGluZ0NhbGlwZXJSdW4oCisgICAgICBNYWluQ29tcG9uZW50IG1haW5Db21wb25lbnQsCisgICAgICBDYWxpcGVyT3B0aW9ucyBvcHRpb25zLAorICAgICAgQFN0ZG91dCBQcmludFdyaXRlciBzdGRvdXQsCisgICAgICBCZW5jaG1hcmtDbGFzcyBiZW5jaG1hcmtDbGFzcywKKyAgICAgIEltbXV0YWJsZVNldDxJbnN0cnVtZW50PiBpbnN0cnVtZW50cywKKyAgICAgIEltbXV0YWJsZVNldDxSZXN1bHRQcm9jZXNzb3I+IHJlc3VsdFByb2Nlc3NvcnMsCisgICAgICBFeHBlcmltZW50U2VsZWN0b3Igc2VsZWN0b3IsCisgICAgICBQcm92aWRlcjxMaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2U+IGV4ZWN1dG9yUHJvdmlkZXIpIHsKKyAgICB0aGlzLm1haW5Db21wb25lbnQgPSBtYWluQ29tcG9uZW50OworICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgdGhpcy5zdGRvdXQgPSBzdGRvdXQ7CisgICAgdGhpcy5iZW5jaG1hcmtDbGFzcyA9IGJlbmNobWFya0NsYXNzOworICAgIHRoaXMuaW5zdHJ1bWVudHMgPSBpbnN0cnVtZW50czsKKyAgICB0aGlzLnJlc3VsdFByb2Nlc3NvcnMgPSByZXN1bHRQcm9jZXNzb3JzOworICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICB0aGlzLmV4ZWN1dG9yUHJvdmlkZXIgPSBleGVjdXRvclByb3ZpZGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIHsKKyAgICBJbW11dGFibGVTZXQ8RXhwZXJpbWVudD4gYWxsRXhwZXJpbWVudHMgPSBzZWxlY3Rvci5zZWxlY3RFeHBlcmltZW50cygpOworICAgIC8vIFRPRE8obHVrZXMpOiBtb3ZlIHRoaXMgc3RhbmRhcmQtb3V0IGhhbmRsaW5nIGludG8gdGhlIENvbnNvbGVPdXRwdXQgY2xhc3M/CisgICAgc3Rkb3V0LnByaW50bG4oIkV4cGVyaW1lbnQgc2VsZWN0aW9uOiAiKTsKKyAgICBzdGRvdXQucHJpbnRsbigiICBCZW5jaG1hcmsgTWV0aG9kczogICAiICsgRmx1ZW50SXRlcmFibGUuZnJvbShhbGxFeHBlcmltZW50cykKKyAgICAgICAgLnRyYW5zZm9ybShuZXcgRnVuY3Rpb248RXhwZXJpbWVudCwgU3RyaW5nPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBhcHBseShFeHBlcmltZW50IGV4cGVyaW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBleHBlcmltZW50Lmluc3RydW1lbnRhdGlvbigpLmJlbmNobWFya01ldGhvZCgpLmdldE5hbWUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pLnRvU2V0KCkpOworICAgIHN0ZG91dC5wcmludGxuKCIgIEluc3RydW1lbnRzOiAgICIgKyBGbHVlbnRJdGVyYWJsZS5mcm9tKHNlbGVjdG9yLmluc3RydW1lbnRzKCkpCisgICAgICAgIC50cmFuc2Zvcm0obmV3IEZ1bmN0aW9uPEluc3RydW1lbnQsIFN0cmluZz4oKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIGFwcGx5KEluc3RydW1lbnQgaW5zdHJ1bWVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnN0cnVtZW50Lm5hbWUoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgIHN0ZG91dC5wcmludGxuKCIgIFVzZXIgcGFyYW1ldGVyczogICAiICsgc2VsZWN0b3IudXNlclBhcmFtZXRlcnMoKSk7CisgICAgc3Rkb3V0LnByaW50bG4oIiAgVmlydHVhbCBtYWNoaW5lczogICIgKyBGbHVlbnRJdGVyYWJsZS5mcm9tKHNlbGVjdG9yLnZtcygpKQorICAgICAgICAudHJhbnNmb3JtKAorICAgICAgICAgICAgbmV3IEZ1bmN0aW9uPFZpcnR1YWxNYWNoaW5lLCBTdHJpbmc+KCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBhcHBseShWaXJ0dWFsTWFjaGluZSB2bSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2bS5uYW1lOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgc3Rkb3V0LnByaW50bG4oIiAgU2VsZWN0aW9uIHR5cGU6ICAgICIgKyBzZWxlY3Rvci5zZWxlY3Rpb25UeXBlKCkpOworICAgIHN0ZG91dC5wcmludGxuKCk7CisKKyAgICBpZiAoYWxsRXhwZXJpbWVudHMuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbigKKyAgICAgICAgICAiVGhlcmUgd2VyZSBubyBleHBlcmltZW50cyB0byBiZSBwZXJmb3JtZWQgZm9yIHRoZSBjbGFzcyAlcyB1c2luZyB0aGUgaW5zdHJ1bWVudHMgJXMiLAorICAgICAgICAgIGJlbmNobWFya0NsYXNzLmJlbmNobWFya0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBpbnN0cnVtZW50cyk7CisgICAgfQorCisgICAgc3Rkb3V0LmZvcm1hdCgiVGhpcyBzZWxlY3Rpb24geWllbGRzICVzIGV4cGVyaW1lbnRzLiVuIiwgYWxsRXhwZXJpbWVudHMuc2l6ZSgpKTsKKyAgICBzdGRvdXQuZmx1c2goKTsKKworICAgIC8vIGFsd2F5cyBkcnkgcnVuIGZpcnN0LgorICAgIEltbXV0YWJsZVNldDxFeHBlcmltZW50PiBleHBlcmltZW50c1RvUnVuID0gZHJ5UnVuKGFsbEV4cGVyaW1lbnRzKTsKKyAgICBpZiAoZXhwZXJpbWVudHNUb1J1bi5zaXplKCkgIT0gYWxsRXhwZXJpbWVudHMuc2l6ZSgpKSB7CisgICAgICBzdGRvdXQuZm9ybWF0KCIlZCBleHBlcmltZW50cyB3ZXJlIHNraXBwZWQuJW4iLAorICAgICAgICAgIGFsbEV4cGVyaW1lbnRzLnNpemUoKSAtIGV4cGVyaW1lbnRzVG9SdW4uc2l6ZSgpKTsKKyAgICB9CisKKyAgICBpZiAoZXhwZXJpbWVudHNUb1J1bi5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKCJBbGwgZXhwZXJpbWVudHMgd2VyZSBza2lwcGVkLiIpOworICAgIH0KKworICAgIGlmIChvcHRpb25zLmRyeVJ1bigpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3Rkb3V0LmZsdXNoKCk7CisKKyAgICBpbnQgdG90YWxUcmlhbHMgPSBleHBlcmltZW50c1RvUnVuLnNpemUoKSAqIG9wdGlvbnMudHJpYWxzUGVyU2NlbmFyaW8oKTsKKyAgICBTdG9wd2F0Y2ggc3RvcHdhdGNoID0gU3RvcHdhdGNoLmNyZWF0ZVN0YXJ0ZWQoKTsKKyAgICBMaXN0PFNjaGVkdWxlZFRyaWFsPiB0cmlhbHMgPSBjcmVhdGVTY2hlZHVsZWRUcmlhbHMoZXhwZXJpbWVudHNUb1J1biwgdG90YWxUcmlhbHMpOworCisgICAgZmluYWwgTGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gZXhlY3V0b3JQcm92aWRlci5nZXQoKTsKKyAgICBMaXN0PExpc3RlbmFibGVGdXR1cmU8VHJpYWxSZXN1bHQ+PiBwZW5kaW5nVHJpYWxzID0gc2NoZWR1bGVUcmlhbHModHJpYWxzLCBleGVjdXRvcik7CisgICAgQ29uc29sZU91dHB1dCBvdXRwdXQgPSBuZXcgQ29uc29sZU91dHB1dChzdGRvdXQsIHRvdGFsVHJpYWxzLCBzdG9wd2F0Y2gpOworICAgIHRyeSB7CisgICAgICAvLyBQcm9jZXNzIHJlc3VsdHMgYXMgdGhleSBjb21wbGV0ZS4KKyAgICAgIGZvciAoTGlzdGVuYWJsZUZ1dHVyZTxUcmlhbFJlc3VsdD4gdHJpYWxGdXR1cmUgOiBpbkNvbXBsZXRpb25PcmRlcihwZW5kaW5nVHJpYWxzKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIFRyaWFsUmVzdWx0IHJlc3VsdCA9IHRyaWFsRnV0dXJlLmdldCgpOworICAgICAgICAgIG91dHB1dC5wcm9jZXNzVHJpYWwocmVzdWx0KTsKKyAgICAgICAgICBmb3IgKFJlc3VsdFByb2Nlc3NvciByZXN1bHRQcm9jZXNzb3IgOiByZXN1bHRQcm9jZXNzb3JzKSB7CisgICAgICAgICAgICByZXN1bHRQcm9jZXNzb3IucHJvY2Vzc1RyaWFsKHJlc3VsdC5nZXRUcmlhbCgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFRyaWFsRmFpbHVyZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgb3V0cHV0LnByb2Nlc3NGYWlsZWRUcmlhbCgoVHJpYWxGYWlsdXJlRXhjZXB0aW9uKSBlLmdldENhdXNlKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKExpc3RlbmFibGVGdXR1cmU8Pz4gdG9DYW5jZWwgOiBwZW5kaW5nVHJpYWxzKSB7CisgICAgICAgICAgICAgIHRvQ2FuY2VsLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgLy8gYmUgcmVzcG9uc2l2ZSB0byBpbnRlcnJ1cHRpb24sIGNhbmNlbCBvdXRzdGFuZGluZyB3b3JrIGFuZCBleGl0CisgICAgICAgICAgZm9yIChMaXN0ZW5hYmxlRnV0dXJlPD8+IHRvQ2FuY2VsIDogcGVuZGluZ1RyaWFscykgeworICAgICAgICAgICAgLy8gTi5CLiBUcmlhbFJ1bkxvb3AgaXMgcmVzcG9uc2l2ZSB0byBpbnRlcnJ1cHRpb24uCisgICAgICAgICAgICB0b0NhbmNlbC5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBmb3IgKFJlc3VsdFByb2Nlc3NvciByZXN1bHRQcm9jZXNzb3IgOiByZXN1bHRQcm9jZXNzb3JzKSB7CisgICAgICB0cnkgeworICAgICAgICByZXN1bHRQcm9jZXNzb3IuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nZ2VyLmxvZyhXQVJOSU5HLCAiQ291bGQgbm90IGNsb3NlIGEgcmVzdWx0IHByb2Nlc3NvcjogIiArIHJlc3VsdFByb2Nlc3NvciwgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNjaGVkdWxlIGFsbCB0aGUgdHJpYWxzLgorICAgKgorICAgKiA8cD5UaGlzIG1ldGhvZCBhcnJhbmdlcyBhbGwgdGhlIHtAbGluayBTY2hlZHVsZWRUcmlhbCB0cmlhbHN9IHRvIHJ1biBhY2NvcmRpbmcgdG8gdGhlaXIKKyAgICogc2NoZWR1bGluZyBjcml0ZXJpYS4gIFRoZSBleGVjdXRvciBpbnN0YW5jZSBpcyByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIG1heCBwYXJhbGxlbGlzbS4KKyAgICovCisgIHByaXZhdGUgTGlzdDxMaXN0ZW5hYmxlRnV0dXJlPFRyaWFsUmVzdWx0Pj4gc2NoZWR1bGVUcmlhbHMoTGlzdDxTY2hlZHVsZWRUcmlhbD4gdHJpYWxzLAorICAgICAgZmluYWwgTGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yKSB7CisgICAgTGlzdDxMaXN0ZW5hYmxlRnV0dXJlPFRyaWFsUmVzdWx0Pj4gcGVuZGluZ1RyaWFscyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIExpc3Q8U2NoZWR1bGVkVHJpYWw+IHNlcmlhbFRyaWFscyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoZmluYWwgU2NoZWR1bGVkVHJpYWwgc2NoZWR1bGVkVHJpYWwgOiB0cmlhbHMpIHsKKyAgICAgIGlmIChzY2hlZHVsZWRUcmlhbC5wb2xpY3koKSA9PSBUcmlhbFNjaGVkdWxpbmdQb2xpY3kuUEFSQUxMRUwpIHsKKyAgICAgICAgcGVuZGluZ1RyaWFscy5hZGQoZXhlY3V0b3Iuc3VibWl0KHNjaGVkdWxlZFRyaWFsLnRyaWFsVGFzaygpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXJpYWxUcmlhbHMuYWRkKHNjaGVkdWxlZFRyaWFsKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gQSBmdXR1cmUgcmVwcmVzZW50aW5nIHRoZSBjb21wbGV0aW9uIG9mIGFsbCBwcmlvciB0YXNrcy4gRnV0dXJlcy5zdWNjZXNzZnVsQXNMaXN0IGFsbG93cyB1cworICAgIC8vIHRvIGlnbm9yZSBmYWlsdXJlLgorICAgIExpc3RlbmFibGVGdXR1cmU8Pz4gcHJldmlvdXMgPSBGdXR1cmVzLnN1Y2Nlc3NmdWxBc0xpc3QocGVuZGluZ1RyaWFscyk7CisgICAgZm9yIChmaW5hbCBTY2hlZHVsZWRUcmlhbCBzY2hlZHVsZWRUcmlhbCA6IHNlcmlhbFRyaWFscykgeworICAgICAgLy8gZWFjaCBvZiB0aGVzZSB0cmlhbHMgY2FuIG9ubHkgc3RhcnQgYWZ0ZXIgYWxsIHByaW9yIHRyaWFscyBoYXZlIGZpbmlzaGVkLCBzbyB3ZSB1c2UKKyAgICAgIC8vIEZ1dHVyZXMudHJhbnNmb3JtIHRvIGZvcmNlIHRoZSBzZXF1ZW5jaW5nLgorICAgICAgTGlzdGVuYWJsZUZ1dHVyZTxUcmlhbFJlc3VsdD4gY3VycmVudCA9CisgICAgICAgICAgRnV0dXJlcy50cmFuc2Zvcm0oCisgICAgICAgICAgICAgIHByZXZpb3VzLAorICAgICAgICAgICAgICBuZXcgQXN5bmNGdW5jdGlvbjxPYmplY3QsIFRyaWFsUmVzdWx0PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIExpc3RlbmFibGVGdXR1cmU8VHJpYWxSZXN1bHQ+IGFwcGx5KE9iamVjdCBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0b3Iuc3VibWl0KHNjaGVkdWxlZFRyaWFsLnRyaWFsVGFzaygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0pOworICAgICAgcGVuZGluZ1RyaWFscy5hZGQoY3VycmVudCk7CisgICAgICAvLyBpZ25vcmUgZmFpbHVyZSBvZiB0aGUgcHJpb3IgdGFzay4KKyAgICAgIHByZXZpb3VzID0gRnV0dXJlcy53aXRoRmFsbGJhY2soY3VycmVudCwgRkFMTEJBQ0tfVE9fTlVMTCk7CisgICAgfQorICAgIHJldHVybiBwZW5kaW5nVHJpYWxzOworICB9CisKKyAgLyoqIFJldHVybnMgYWxsIHRoZSBTY2hlZHVsZWRUcmlhbHMgZm9yIHRoaXMgcnVuLiAqLworICBwcml2YXRlIExpc3Q8U2NoZWR1bGVkVHJpYWw+IGNyZWF0ZVNjaGVkdWxlZFRyaWFscyhJbW11dGFibGVTZXQ8RXhwZXJpbWVudD4gZXhwZXJpbWVudHNUb1J1biwKKyAgICAgIGludCB0b3RhbFRyaWFscykgeworICAgIExpc3Q8U2NoZWR1bGVkVHJpYWw+IHRyaWFscyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSh0b3RhbFRyaWFscyk7CisgICAgLyoqIFRoaXMgaXMgMS1pbmRleGVkIGJlY2F1c2UgaXQncyBvbmx5IHVzZWQgZm9yIGRpc3BsYXkgdG8gdXNlcnMuICBFLmcuICJUcmlhbCAxIG9mIDI3IiAqLworICAgIGludCB0cmlhbE51bWJlciA9IDE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLnRyaWFsc1BlclNjZW5hcmlvKCk7IGkrKykgeworICAgICAgZm9yIChFeHBlcmltZW50IGV4cGVyaW1lbnQgOiBleHBlcmltZW50c1RvUnVuKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgVHJpYWxTY29wZUNvbXBvbmVudCB0cmlhbFNjb3BlQ29tcG9uZW50ID0gbWFpbkNvbXBvbmVudC5uZXdUcmlhbENvbXBvbmVudCgKKyAgICAgICAgICAgICAgbmV3IFRyaWFsTW9kdWxlKFVVSUQucmFuZG9tVVVJRCgpLCB0cmlhbE51bWJlciwgZXhwZXJpbWVudCkpOworCisgICAgICAgICAgdHJpYWxzLmFkZCh0cmlhbFNjb3BlQ29tcG9uZW50LmdldFNjaGVkdWxlZFRyaWFsKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHRyaWFsTnVtYmVyKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRyaWFsczsKKyAgfQorCisgIC8qKgorICAgKiBBdHRlbXB0cyB0byBydW4gZWFjaCBnaXZlbiBzY2VuYXJpbyBvbmNlLCBpbiB0aGUgY3VycmVudCBWTS4gUmV0dXJucyBhIHNldCBvZiBhbGwgb2YgdGhlCisgICAqIHNjZW5hcmlvcyB0aGF0IGRpZG4ndCB0aHJvdyBhIHtAbGluayBTa2lwVGhpc1NjZW5hcmlvRXhjZXB0aW9ufS4KKyAgICovCisgIEltbXV0YWJsZVNldDxFeHBlcmltZW50PiBkcnlSdW4oSXRlcmFibGU8RXhwZXJpbWVudD4gZXhwZXJpbWVudHMpCisgICAgICB0aHJvd3MgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbiB7CisgICAgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8RXhwZXJpbWVudD4gYnVpbGRlciA9IEltbXV0YWJsZVNldC5idWlsZGVyKCk7CisgICAgZm9yIChFeHBlcmltZW50IGV4cGVyaW1lbnQgOiBleHBlcmltZW50cykgeworICAgICAgdHJ5IHsKKyAgICAgICAgRXhwZXJpbWVudENvbXBvbmVudCBleHBlcmltZW50Q29tcG9uZW50ID0KKyAgICAgICAgICAgIG1haW5Db21wb25lbnQubmV3RXhwZXJpbWVudENvbXBvbmVudChFeHBlcmltZW50TW9kdWxlLmZvckV4cGVyaW1lbnQoZXhwZXJpbWVudCkpOworICAgICAgICBPYmplY3QgYmVuY2htYXJrID0gZXhwZXJpbWVudENvbXBvbmVudC5nZXRCZW5jaG1hcmtJbnN0YW5jZSgpOworICAgICAgICBiZW5jaG1hcmtDbGFzcy5zZXRVcEJlbmNobWFyayhiZW5jaG1hcmspOworICAgICAgICB0cnkgeworICAgICAgICAgIGV4cGVyaW1lbnQuaW5zdHJ1bWVudGF0aW9uKCkuZHJ5UnVuKGJlbmNobWFyayk7CisgICAgICAgICAgYnVpbGRlci5hZGQoZXhwZXJpbWVudCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgLy8gZGlzY2FyZCAnYmVuY2htYXJrJyBub3c7IHRoZSB3b3JrZXIgd2lsbCBoYXZlIHRvIGluc3RhbnRpYXRlIGl0cyBvd24gYW55d2F5CisgICAgICAgICAgYmVuY2htYXJrQ2xhc3MuY2xlYW51cChiZW5jaG1hcmspOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChTa2lwVGhpc1NjZW5hcmlvRXhjZXB0aW9uIGlubm9jdW91cykge30KKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgPFQ+IEltbXV0YWJsZUxpc3Q8TGlzdGVuYWJsZUZ1dHVyZTxUPj4gaW5Db21wbGV0aW9uT3JkZXIoCisgICAgICBJdGVyYWJsZTw/IGV4dGVuZHMgTGlzdGVuYWJsZUZ1dHVyZTw/IGV4dGVuZHMgVD4+IGZ1dHVyZXMpIHsKKyAgICBmaW5hbCBDb25jdXJyZW50TGlua2VkUXVldWU8U2V0dGFibGVGdXR1cmU8VD4+IGRlbGVnYXRlcyA9IFF1ZXVlcy5uZXdDb25jdXJyZW50TGlua2VkUXVldWUoKTsKKyAgICBJbW11dGFibGVMaXN0LkJ1aWxkZXI8TGlzdGVuYWJsZUZ1dHVyZTxUPj4gbGlzdEJ1aWxkZXIgPSBJbW11dGFibGVMaXN0LmJ1aWxkZXIoKTsKKyAgICBmb3IgKGZpbmFsIExpc3RlbmFibGVGdXR1cmU8PyBleHRlbmRzIFQ+IGZ1dHVyZSA6IGZ1dHVyZXMpIHsKKyAgICAgIFNldHRhYmxlRnV0dXJlPFQ+IGRlbGVnYXRlID0gU2V0dGFibGVGdXR1cmUuY3JlYXRlKCk7CisgICAgICAvLyBNdXN0IG1ha2Ugc3VyZSB0byBhZGQgdGhlIGRlbGVnYXRlIHRvIHRoZSBxdWV1ZSBmaXJzdCBpbiBjYXNlIHRoZSBmdXR1cmUgaXMgYWxyZWFkeSBkb25lCisgICAgICBkZWxlZ2F0ZXMuYWRkKGRlbGVnYXRlKTsKKyAgICAgIGZ1dHVyZS5hZGRMaXN0ZW5lcihuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgU2V0dGFibGVGdXR1cmU8VD4gZGVsZWdhdGUgPSBkZWxlZ2F0ZXMucmVtb3ZlKCk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRlbGVnYXRlLnNldChVbmludGVycnVwdGlibGVzLmdldFVuaW50ZXJydXB0aWJseShmdXR1cmUpKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZGVsZWdhdGUuc2V0RXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgfSBjYXRjaCAoQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sIE1vcmVFeGVjdXRvcnMuZGlyZWN0RXhlY3V0b3IoKSk7CisgICAgICBsaXN0QnVpbGRlci5hZGQoZGVsZWdhdGUpOworICAgIH0KKyAgICByZXR1cm4gbGlzdEJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRXhwZXJpbWVudGluZ1J1bm5lck1vZHVsZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRXhwZXJpbWVudGluZ1J1bm5lck1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmNiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9FeHBlcmltZW50aW5nUnVubmVyTW9kdWxlLmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuUmVzdWx0UHJvY2Vzc29yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuQ2FsaXBlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLkluc3RydW1lbnRDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkhvc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnMuQ2FsaXBlck9wdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLlBsYXRmb3JtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuSW5zdHJ1bWVudC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuSW52YWxpZENvbW1hbmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuU2hvcnREdXJhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5TdGRlcnI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTb3J0ZWRTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5PcmRlcmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5Nb3JlRXhlY3V0b3JzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5TZXJ2aWNlOworCitpbXBvcnQgZGFnZ2VyLk1hcEtleTsKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKK2ltcG9ydCBkYWdnZXIuUHJvdmlkZXMuVHlwZTsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBDb25maWd1cmVzIGEge0BsaW5rIENhbGlwZXJSdW59IHRoYXQgcGVyZm9ybXMgZXhwZXJpbWVudHMuCisgKi8KK0BNb2R1bGUKK2ZpbmFsIGNsYXNzIEV4cGVyaW1lbnRpbmdSdW5uZXJNb2R1bGUgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOTkVSX01BWF9QQVJBTExFTElTTV9PUFRJT04gPSAicnVubmVyLm1heFBhcmFsbGVsaXNtIjsKKworICBAUHJvdmlkZXModHlwZSA9IFR5cGUuU0VUKQorICBzdGF0aWMgU2VydmljZSBwcm92aWRlU2VydmVyU29ja2V0U2VydmljZShTZXJ2ZXJTb2NrZXRTZXJ2aWNlIGltcGwpIHsKKyAgICByZXR1cm4gaW1wbDsKKyAgfQorCisgIEBQcm92aWRlcyh0eXBlID0gVHlwZS5TRVQpCisgIHN0YXRpYyBTZXJ2aWNlIHByb3ZpZGVUcmlhbE91dHB1dEZhY3RvcnlTZXJ2aWNlKFRyaWFsT3V0cHV0RmFjdG9yeVNlcnZpY2UgaW1wbCkgeworICAgIHJldHVybiBpbXBsOworICB9CisKKyAgQFByb3ZpZGVzCisgIHN0YXRpYyBUcmlhbE91dHB1dEZhY3RvcnkgcHJvdmlkZVRyaWFsT3V0cHV0RmFjdG9yeShUcmlhbE91dHB1dEZhY3RvcnlTZXJ2aWNlIGltcGwpIHsKKyAgICByZXR1cm4gaW1wbDsKKyAgfQorCisgIEBQcm92aWRlcworICBzdGF0aWMgRXhwZXJpbWVudFNlbGVjdG9yIHByb3ZpZGVFeHBlcmltZW50U2VsZWN0b3IoRnVsbENhcnRlc2lhbkV4cGVyaW1lbnRTZWxlY3RvciBpbXBsKSB7CisgICAgcmV0dXJuIGltcGw7CisgIH0KKworICBAUHJvdmlkZXMKKyAgc3RhdGljIExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZSBwcm92aWRlRXhlY3V0b3JTZXJ2aWNlKENhbGlwZXJDb25maWcgY29uZmlnKSB7CisgICAgaW50IHBvb2xTaXplID0gSW50ZWdlci5wYXJzZUludChjb25maWcucHJvcGVydGllcygpLmdldChSVU5ORVJfTUFYX1BBUkFMTEVMSVNNX09QVElPTikpOworICAgIHJldHVybiBNb3JlRXhlY3V0b3JzLmxpc3RlbmluZ0RlY29yYXRvcihFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKHBvb2xTaXplKSk7CisgIH0KKworICBATG9jYWxQb3J0CisgIEBQcm92aWRlcworICBzdGF0aWMgaW50IHByb3ZpZGVQb3J0TnVtYmVyKFNlcnZlclNvY2tldFNlcnZpY2Ugc2VydmVyU29ja2V0U2VydmljZSkgeworICAgIHJldHVybiBzZXJ2ZXJTb2NrZXRTZXJ2aWNlLmdldFBvcnQoKTsKKyAgfQorCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhlIHtAbGluayBDbGFzc30gb2JqZWN0IHRvIHVzZSBhcyBhIGtleSBpbiB0aGUgbWFwIG9mIGF2YWlsYWJsZQorICAgKiB7QGxpbmsgUmVzdWx0UHJvY2Vzc29yIHJlc3VsdCBwcm9jZXNzb3JzfSBwYXNzZWQgdG8KKyAgICoge0BsaW5rICNwcm92aWRlUmVzdWx0UHJvY2Vzc29ycyhDYWxpcGVyQ29uZmlnLCBNYXApfS4KKyAgICovCisgIEBNYXBLZXkodW53cmFwVmFsdWUgPSB0cnVlKQorICBwdWJsaWMgQGludGVyZmFjZSBSZXN1bHRQcm9jZXNzb3JDbGFzc0tleSB7CisgICAgQ2xhc3M8PyBleHRlbmRzIFJlc3VsdFByb2Nlc3Nvcj4gdmFsdWUoKTsKKyAgfQorCisgIEBQcm92aWRlcyh0eXBlID0gVHlwZS5NQVApCisgIEBSZXN1bHRQcm9jZXNzb3JDbGFzc0tleShPdXRwdXRGaWxlRHVtcGVyLmNsYXNzKQorICBzdGF0aWMgUmVzdWx0UHJvY2Vzc29yIHByb3ZpZGVPdXRwdXRGaWxlRHVtcGVyKE91dHB1dEZpbGVEdW1wZXIgaW1wbCkgeworICAgIHJldHVybiBpbXBsOworICB9CisKKyAgQFByb3ZpZGVzKHR5cGUgPSBUeXBlLk1BUCkKKyAgQFJlc3VsdFByb2Nlc3NvckNsYXNzS2V5KEh0dHBVcGxvYWRlci5jbGFzcykKKyAgc3RhdGljIFJlc3VsdFByb2Nlc3NvciBwcm92aWRlSHR0cFVwbG9hZGVyKEh0dHBVcGxvYWRlciBpbXBsKSB7CisgICAgcmV0dXJuIGltcGw7CisgIH0KKworICBAUHJvdmlkZXMgc3RhdGljIEltbXV0YWJsZVNldDxSZXN1bHRQcm9jZXNzb3I+IHByb3ZpZGVSZXN1bHRQcm9jZXNzb3JzKAorICAgICAgQ2FsaXBlckNvbmZpZyBjb25maWcsCisgICAgICBNYXA8Q2xhc3M8PyBleHRlbmRzIFJlc3VsdFByb2Nlc3Nvcj4sIFByb3ZpZGVyPFJlc3VsdFByb2Nlc3Nvcj4+IGF2YWlsYWJsZVByb2Nlc3NvcnMpIHsKKyAgICBJbW11dGFibGVTZXQuQnVpbGRlcjxSZXN1bHRQcm9jZXNzb3I+IGJ1aWxkZXIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOworICAgIGZvciAoQ2xhc3M8PyBleHRlbmRzIFJlc3VsdFByb2Nlc3Nvcj4gcHJvY2Vzc29yQ2xhc3MgOiBjb25maWcuZ2V0Q29uZmlndXJlZFJlc3VsdFByb2Nlc3NvcnMoKSkgeworICAgICAgUHJvdmlkZXI8UmVzdWx0UHJvY2Vzc29yPiByZXN1bHRQcm9jZXNzb3JQcm92aWRlciA9IGF2YWlsYWJsZVByb2Nlc3NvcnMuZ2V0KHByb2Nlc3NvckNsYXNzKTsKKyAgICAgIFJlc3VsdFByb2Nlc3NvciByZXN1bHRQcm9jZXNzb3IgPSByZXN1bHRQcm9jZXNzb3JQcm92aWRlciA9PSBudWxsCisgICAgICAgICAgPyBSZXN1bHRQcm9jZXNzb3JDcmVhdG9yLmNyZWF0ZVJlc3VsdFByb2Nlc3Nvcihwcm9jZXNzb3JDbGFzcykKKyAgICAgICAgICA6IHJlc3VsdFByb2Nlc3NvclByb3ZpZGVyLmdldCgpOworICAgICAgYnVpbGRlci5hZGQocmVzdWx0UHJvY2Vzc29yKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIEBQcm92aWRlcyBzdGF0aWMgVVVJRCBwcm92aWRlVXVpZCgpIHsKKyAgICByZXR1cm4gVVVJRC5yYW5kb21VVUlEKCk7CisgIH0KKworICBAUHJvdmlkZXMgQEJlbmNobWFya1BhcmFtZXRlcnMKKyAgc3RhdGljIEltbXV0YWJsZVNldE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwcm92aWRlQmVuY2htYXJrUGFyYW1ldGVycygKKyAgICAgIEJlbmNobWFya0NsYXNzIGJlbmNobWFya0NsYXNzLCBDYWxpcGVyT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJlbmNobWFya0NsYXNzLnVzZXJQYXJhbWV0ZXJzKCkuZmlsbEluRGVmYXVsdHNGb3Iob3B0aW9ucy51c2VyUGFyYW1ldGVycygpKTsKKyAgfQorCisgIEBQcm92aWRlcyBAU2luZ2xldG9uCisgIHN0YXRpYyBIb3N0IHByb3ZpZGVIb3N0KEVudmlyb25tZW50R2V0dGVyIGVudmlyb25tZW50R2V0dGVyKSB7CisgICAgcmV0dXJuIGVudmlyb25tZW50R2V0dGVyLmdldEhvc3QoKTsKKyAgfQorCisgIEBQcm92aWRlcyBAU2luZ2xldG9uCisgIHN0YXRpYyBFbnZpcm9ubWVudEdldHRlciBwcm92aWRlRW52aXJvbm1lbnRHZXR0ZXIoKSB7CisgICAgcmV0dXJuIG5ldyBFbnZpcm9ubWVudEdldHRlcigpOworICB9CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGUge0BsaW5rIENsYXNzfSBvYmplY3QgdG8gdXNlIGFzIGEga2V5IGluIHRoZSBtYXAgb2YgYXZhaWxhYmxlCisgICAqIHtAbGluayBJbnN0cnVtZW50IGluc3RydW1lbnRzfSBwYXNzZWQgdG8ge0BsaW5rICNwcm92aWRlSW5zdHJ1bWVudHN9LAorICAgKi8KKyAgQE1hcEtleSh1bndyYXBWYWx1ZSA9IHRydWUpCisgIHB1YmxpYyBAaW50ZXJmYWNlIEluc3RydW1lbnRDbGFzc0tleSB7CisgICAgQ2xhc3M8PyBleHRlbmRzIEluc3RydW1lbnQ+IHZhbHVlKCk7CisgIH0KKworICBAUHJvdmlkZXModHlwZSA9IFR5cGUuTUFQKQorICBASW5zdHJ1bWVudENsYXNzS2V5KEFyYml0cmFyeU1lYXN1cmVtZW50SW5zdHJ1bWVudC5jbGFzcykKKyAgc3RhdGljIEluc3RydW1lbnQgcHJvdmlkZUFyYml0cmFyeU1lYXN1cmVtZW50SW5zdHJ1bWVudCgpIHsKKyAgICByZXR1cm4gbmV3IEFyYml0cmFyeU1lYXN1cmVtZW50SW5zdHJ1bWVudCgpOworICB9CisKKyAgQFByb3ZpZGVzKHR5cGUgPSBUeXBlLk1BUCkKKyAgQEluc3RydW1lbnRDbGFzc0tleShBbGxvY2F0aW9uSW5zdHJ1bWVudC5jbGFzcykKKyAgc3RhdGljIEluc3RydW1lbnQgcHJvdmlkZUFsbG9jYXRpb25JbnN0cnVtZW50KCkgeworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvbkluc3RydW1lbnQoKTsKKyAgfQorCisgIEBQcm92aWRlcyh0eXBlID0gVHlwZS5NQVApCisgIEBJbnN0cnVtZW50Q2xhc3NLZXkoUnVudGltZUluc3RydW1lbnQuY2xhc3MpCisgIHN0YXRpYyBJbnN0cnVtZW50IHByb3ZpZGVSdW50aW1lSW5zdHJ1bWVudCgKKyAgICAgIEBOYW5vVGltZUdyYW51bGFyaXR5IFNob3J0RHVyYXRpb24gbmFub1RpbWVHcmFudWxhcml0eSkgeworICAgIHJldHVybiBuZXcgUnVudGltZUluc3RydW1lbnQobmFub1RpbWVHcmFudWxhcml0eSk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgc3RhdGljIEltbXV0YWJsZVNldDxJbnN0cnVtZW50PiBwcm92aWRlSW5zdHJ1bWVudHMoCisgICAgICBDYWxpcGVyT3B0aW9ucyBvcHRpb25zLAorICAgICAgZmluYWwgQ2FsaXBlckNvbmZpZyBjb25maWcsCisgICAgICBNYXA8Q2xhc3M8PyBleHRlbmRzIEluc3RydW1lbnQ+LCBQcm92aWRlcjxJbnN0cnVtZW50Pj4gYXZhaWxhYmxlSW5zdHJ1bWVudHMsCisgICAgICBQbGF0Zm9ybSBwbGF0Zm9ybSwKKyAgICAgIEBTdGRlcnIgUHJpbnRXcml0ZXIgc3RkZXJyKQorICAgICAgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKworICAgIEltbXV0YWJsZVNldC5CdWlsZGVyPEluc3RydW1lbnQ+IGJ1aWxkZXIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOworICAgIEltbXV0YWJsZVNldDxTdHJpbmc+IGNvbmZpZ3VyZWRJbnN0cnVtZW50cyA9IGNvbmZpZy5nZXRDb25maWd1cmVkSW5zdHJ1bWVudHMoKTsKKyAgICBmb3IgKGZpbmFsIFN0cmluZyBpbnN0cnVtZW50TmFtZSA6IG9wdGlvbnMuaW5zdHJ1bWVudE5hbWVzKCkpIHsKKyAgICAgIGlmICghY29uZmlndXJlZEluc3RydW1lbnRzLmNvbnRhaW5zKGluc3RydW1lbnROYW1lKSkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbW1hbmRFeGNlcHRpb24oIiVzIGlzIG5vdCBhIGNvbmZpZ3VyZWQgaW5zdHJ1bWVudCAoJXMpLiAiCisgICAgICAgICAgICArICJ1c2UgLS1wcmludC1jb25maWcgdG8gc2VlIHRoZSBjb25maWd1cmVkIGluc3RydW1lbnRzLiIsCisgICAgICAgICAgICBpbnN0cnVtZW50TmFtZSwgY29uZmlndXJlZEluc3RydW1lbnRzKTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIEluc3RydW1lbnRDb25maWcgaW5zdHJ1bWVudENvbmZpZyA9IGNvbmZpZy5nZXRJbnN0cnVtZW50Q29uZmlnKGluc3RydW1lbnROYW1lKTsKKyAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBpbnN0cnVtZW50Q29uZmlnLmNsYXNzTmFtZSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEluc3RydW1lbnQ+IGNsYXp6ID0KKyAgICAgICAgICAgIFV0aWwubGVuaWVudENsYXNzRm9yTmFtZShjbGFzc05hbWUpLmFzU3ViY2xhc3MoSW5zdHJ1bWVudC5jbGFzcyk7CisgICAgICAgIFByb3ZpZGVyPEluc3RydW1lbnQ+IGluc3RydW1lbnRQcm92aWRlciA9IGF2YWlsYWJsZUluc3RydW1lbnRzLmdldChjbGF6eik7CisgICAgICAgIGlmIChpbnN0cnVtZW50UHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5zdHJ1bWVudEV4Y2VwdGlvbigiSW5zdHJ1bWVudCAlcyBub3Qgc3VwcG9ydGVkIiwgY2xhc3NOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbnN0cnVtZW50IGlzIHN1cHBvcnRlZCBvbiB0aGUgcGxhdGZvcm0uCisgICAgICAgIGlmIChwbGF0Zm9ybS5zdXBwb3J0cyhjbGF6eikpIHsKKyAgICAgICAgICBJbnN0cnVtZW50IGluc3RydW1lbnQgPSBpbnN0cnVtZW50UHJvdmlkZXIuZ2V0KCk7CisgICAgICAgICAgSW5zdHJ1bWVudEluamVjdG9yTW9kdWxlIGluamVjdG9yTW9kdWxlID0KKyAgICAgICAgICAgICAgbmV3IEluc3RydW1lbnRJbmplY3Rvck1vZHVsZShpbnN0cnVtZW50Q29uZmlnLCBpbnN0cnVtZW50TmFtZSk7CisgICAgICAgICAgSW5zdHJ1bWVudENvbXBvbmVudCBpbnN0cnVtZW50Q29tcG9uZW50ID0gRGFnZ2VySW5zdHJ1bWVudENvbXBvbmVudC5idWlsZGVyKCkKKyAgICAgICAgICAgICAgLmluc3RydW1lbnRJbmplY3Rvck1vZHVsZShpbmplY3Rvck1vZHVsZSkKKyAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgaW5zdHJ1bWVudENvbXBvbmVudC5pbmplY3RJbnN0cnVtZW50KGluc3RydW1lbnQpOworICAgICAgICAgIGJ1aWxkZXIuYWRkKGluc3RydW1lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0ZGVyci5mb3JtYXQoIkluc3RydW1lbnQgJXMgbm90IHN1cHBvcnRlZCBvbiAlcywgaWdub3JpbmdcbiIsCisgICAgICAgICAgICAgIGNsYXNzTmFtZSwgcGxhdGZvcm0ubmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgaW5zdHJ1bWVudCBjbGFzcyAnJXMnIiwgY2xhc3NOYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIEBQcm92aWRlcyBAU2luZ2xldG9uIHN0YXRpYyBOYW5vVGltZUdyYW51bGFyaXR5VGVzdGVyIHByb3ZpZGVOYW5vVGltZUdyYW51bGFyaXR5VGVzdGVyKCkgeworICAgIHJldHVybiBuZXcgTmFub1RpbWVHcmFudWxhcml0eVRlc3RlcigpOworICB9CisKKyAgQFByb3ZpZGVzIEBTaW5nbGV0b24gQE5hbm9UaW1lR3JhbnVsYXJpdHkgc3RhdGljIFNob3J0RHVyYXRpb24gcHJvdmlkZU5hbm9UaW1lR3JhbnVsYXJpdHkoCisgICAgICBOYW5vVGltZUdyYW51bGFyaXR5VGVzdGVyIHRlc3RlcikgeworICAgIHJldHVybiB0ZXN0ZXIudGVzdE5hbm9UaW1lR3JhbnVsYXJpdHkoKTsKKyAgfQorCisgIEBQcm92aWRlcyBzdGF0aWMgSW1tdXRhYmxlU2V0PEluc3RydW1lbnRhdGlvbj4gcHJvdmlkZUluc3RydW1lbnRhdGlvbnMoQ2FsaXBlck9wdGlvbnMgb3B0aW9ucywKKyAgICAgIEJlbmNobWFya0NsYXNzIGJlbmNobWFya0NsYXNzLCBJbW11dGFibGVTZXQ8SW5zdHJ1bWVudD4gaW5zdHJ1bWVudHMpCisgICAgICAgICAgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24geworICAgIEltbXV0YWJsZVNldC5CdWlsZGVyPEluc3RydW1lbnRhdGlvbj4gYnVpbGRlciA9IEltbXV0YWJsZVNldC5idWlsZGVyKCk7CisgICAgSW1tdXRhYmxlU2V0PFN0cmluZz4gYmVuY2htYXJrTWV0aG9kTmFtZXMgPSBvcHRpb25zLmJlbmNobWFya01ldGhvZE5hbWVzKCk7CisgICAgU2V0PFN0cmluZz4gdW51c2VkQmVuY2htYXJrTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KGJlbmNobWFya01ldGhvZE5hbWVzKTsKKyAgICBmb3IgKEluc3RydW1lbnQgaW5zdHJ1bWVudCA6IGluc3RydW1lbnRzKSB7CisgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBmaW5kQWxsQmVuY2htYXJrTWV0aG9kcyhiZW5jaG1hcmtDbGFzcy5iZW5jaG1hcmtDbGFzcygpLCBpbnN0cnVtZW50KSkgeworICAgICAgICBpZiAoYmVuY2htYXJrTWV0aG9kTmFtZXMuaXNFbXB0eSgpIHx8IGJlbmNobWFya01ldGhvZE5hbWVzLmNvbnRhaW5zKG1ldGhvZC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgYnVpbGRlci5hZGQoaW5zdHJ1bWVudC5jcmVhdGVJbnN0cnVtZW50YXRpb24obWV0aG9kKSk7CisgICAgICAgICAgdW51c2VkQmVuY2htYXJrTmFtZXMucmVtb3ZlKG1ldGhvZC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghdW51c2VkQmVuY2htYXJrTmFtZXMuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbigKKyAgICAgICAgICAiSW52YWxpZCBiZW5jaG1hcmsgbWV0aG9kKHMpIHNwZWNpZmllZCBpbiBvcHRpb25zOiAiICsgdW51c2VkQmVuY2htYXJrTmFtZXMpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSW1tdXRhYmxlU29ydGVkU2V0PE1ldGhvZD4gZmluZEFsbEJlbmNobWFya01ldGhvZHMoQ2xhc3M8Pz4gYmVuY2htYXJrQ2xhc3MsCisgICAgICBJbnN0cnVtZW50IGluc3RydW1lbnQpIHRocm93cyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIHsKKyAgICBJbW11dGFibGVTb3J0ZWRTZXQuQnVpbGRlcjxNZXRob2Q+IHJlc3VsdCA9IEltbXV0YWJsZVNvcnRlZFNldC5vcmRlcmVkQnkoCisgICAgICAgIE9yZGVyaW5nLm5hdHVyYWwoKS5vblJlc3VsdE9mKG5ldyBGdW5jdGlvbjxNZXRob2QsIFN0cmluZz4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgYXBwbHkoTWV0aG9kIG1ldGhvZCkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9KSk7CisgICAgU2V0PFN0cmluZz4gYmVuY2htYXJrTWV0aG9kTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgU2V0PFN0cmluZz4gb3ZlcmxvYWRlZE1ldGhvZE5hbWVzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGJlbmNobWFya0NsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICBpZiAoaW5zdHJ1bWVudC5pc0JlbmNobWFya01ldGhvZChtZXRob2QpKSB7CisgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICByZXN1bHQuYWRkKG1ldGhvZCk7CisgICAgICAgIGlmICghYmVuY2htYXJrTWV0aG9kTmFtZXMuYWRkKG1ldGhvZC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgb3ZlcmxvYWRlZE1ldGhvZE5hbWVzLmFkZChtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIW92ZXJsb2FkZWRNZXRob2ROYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKAorICAgICAgICAgICJPdmVybG9hZHMgYXJlIGRpc2FsbG93ZWQgZm9yIGJlbmNobWFyayBtZXRob2RzLCBmb3VuZCBvdmVybG9hZHMgb2YgJXMgaW4gYmVuY2htYXJrICVzIiwKKyAgICAgICAgICBvdmVybG9hZGVkTWV0aG9kTmFtZXMsCisgICAgICAgICAgYmVuY2htYXJrQ2xhc3MpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LmJ1aWxkKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0Z1bGxDYXJ0ZXNpYW5FeHBlcmltZW50U2VsZWN0b3IuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0Z1bGxDYXJ0ZXNpYW5FeHBlcmltZW50U2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcyY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRnVsbENhcnRlc2lhbkV4cGVyaW1lbnRTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLkluc3RydW1lbnQuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5GbHVlbnRJdGVyYWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogQSBzZXQgb2Yge0BsaW5rIEV4cGVyaW1lbnQgZXhwZXJpbWVudHN9IGNvbnN0cnVjdGVkIGJ5IHRha2luZyBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mCisgKiBpbnN0cnVtZW50cywgYmVuY2htYXJrIG1ldGhvZHMsIHVzZXIgcGFyYW1ldGVycywgVk0gc3BlY3MgYW5kIFZNIGFyZ3VtZW50cy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZ1bGxDYXJ0ZXNpYW5FeHBlcmltZW50U2VsZWN0b3IgaW1wbGVtZW50cyBFeHBlcmltZW50U2VsZWN0b3IgeworICBwcml2YXRlIEltbXV0YWJsZVNldDxJbnN0cnVtZW50YXRpb24+IGluc3RydW1lbnRhdGlvbnM7CisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PFZpcnR1YWxNYWNoaW5lPiB2bXM7CisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJQYXJhbWV0ZXJzOworCisgIEBJbmplY3QgRnVsbENhcnRlc2lhbkV4cGVyaW1lbnRTZWxlY3RvcigKKyAgICAgIEltbXV0YWJsZVNldDxJbnN0cnVtZW50YXRpb24+IGluc3RydW1lbnRhdGlvbnMsCisgICAgICBJbW11dGFibGVTZXQ8VmlydHVhbE1hY2hpbmU+IHZtcywKKyAgICAgIEBCZW5jaG1hcmtQYXJhbWV0ZXJzIEltbXV0YWJsZVNldE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB1c2VyUGFyYW1ldGVycykgeworICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9ucyA9IGluc3RydW1lbnRhdGlvbnM7CisgICAgdGhpcy52bXMgPSB2bXM7CisgICAgdGhpcy51c2VyUGFyYW1ldGVycyA9IHVzZXJQYXJhbWV0ZXJzOworICB9CisKKyAgLy8gVE9ETyhnYWspOiBwdXQgdGhpcyBzb21lcGxhY2UgbW9yZSBzZW5zaWJsZQorICBAT3ZlcnJpZGUgcHVibGljIEltbXV0YWJsZVNldDxJbnN0cnVtZW50PiBpbnN0cnVtZW50cygpIHsKKyAgICByZXR1cm4gRmx1ZW50SXRlcmFibGUuZnJvbShpbnN0cnVtZW50YXRpb25zKQorICAgICAgICAudHJhbnNmb3JtKG5ldyBGdW5jdGlvbjxJbnN0cnVtZW50YXRpb24sIEluc3RydW1lbnQ+KCkgeworICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgSW5zdHJ1bWVudCBhcHBseShJbnN0cnVtZW50YXRpb24gaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC5pbnN0cnVtZW50KCk7CisgICAgICAgICAgfQorICAgICAgICB9KQorICAgICAgICAudG9TZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgSW1tdXRhYmxlU2V0PFZpcnR1YWxNYWNoaW5lPiB2bXMoKSB7CisgICAgcmV0dXJuIHZtczsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgSW1tdXRhYmxlU2V0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiB1c2VyUGFyYW1ldGVyczsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgSW1tdXRhYmxlU2V0PEV4cGVyaW1lbnQ+IHNlbGVjdEV4cGVyaW1lbnRzKCkgeworICAgIExpc3Q8RXhwZXJpbWVudD4gZXhwZXJpbWVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gOiBpbnN0cnVtZW50YXRpb25zKSB7CisgICAgICBmb3IgKFZpcnR1YWxNYWNoaW5lIHZtIDogdm1zKSB7CisgICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IHVzZXJQYXJhbXNDaG9pY2UgOiBjYXJ0ZXNpYW4odXNlclBhcmFtZXRlcnMpKSB7CisgICAgICAgICAgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiB0aGVzZVVzZXJQYXJhbXMgPQorICAgICAgICAgICAgICB6aXAodXNlclBhcmFtZXRlcnMua2V5U2V0KCksIHVzZXJQYXJhbXNDaG9pY2UpOworICAgICAgICAgIGV4cGVyaW1lbnRzLmFkZChuZXcgRXhwZXJpbWVudChpbnN0cnVtZW50YXRpb24sIHRoZXNlVXNlclBhcmFtcywgdm0pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZihleHBlcmltZW50cyk7CisgIH0KKworICBwcm90ZWN0ZWQgc3RhdGljIDxUPiBTZXQ8TGlzdDxUPj4gY2FydGVzaWFuKFNldE11bHRpbWFwPFN0cmluZywgVD4gbXVsdGltYXApIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCIsICJyYXd0eXBlcyJ9KSAvLyBwcm9taXNlZCBieSBzcGVjCisgICAgSW1tdXRhYmxlTWFwPFN0cmluZywgU2V0PFQ+PiBwYXJhbXNBc01hcCA9IChJbW11dGFibGVNYXApIG11bHRpbWFwLmFzTWFwKCk7CisgICAgcmV0dXJuIFNldHMuY2FydGVzaWFuUHJvZHVjdChwYXJhbXNBc01hcC52YWx1ZXMoKS5hc0xpc3QoKSk7CisgIH0KKworICBwcm90ZWN0ZWQgc3RhdGljIDxLLCBWPiBJbW11dGFibGVNYXA8SywgVj4gemlwKFNldDxLPiBrZXlzLCBDb2xsZWN0aW9uPFY+IHZhbHVlcykgeworICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPEssIFY+IGJ1aWxkZXIgPSBJbW11dGFibGVNYXAuYnVpbGRlcigpOworCisgICAgSXRlcmF0b3I8Sz4ga2V5SXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7CisgICAgSXRlcmF0b3I8Vj4gdmFsdWVJdGVyYXRvciA9IHZhbHVlcy5pdGVyYXRvcigpOworCisgICAgd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSAmJiB2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgYnVpbGRlci5wdXQoa2V5SXRlcmF0b3IubmV4dCgpLCB2YWx1ZUl0ZXJhdG9yLm5leHQoKSk7CisgICAgfQorCisgICAgaWYgKGtleUl0ZXJhdG9yLmhhc05leHQoKSB8fCB2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7IC8vIEkgcmVhbGx5IHNjcmV3ZWQgdXAsIHRoZW4uCisgICAgfQorICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBzZWxlY3Rpb25UeXBlKCkgeworICAgIHJldHVybiAiRnVsbCBjYXJ0ZXNpYW4gcHJvZHVjdCI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0h0dHBVcGxvYWRlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvSHR0cFVwbG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5OWE1MAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0h0dHBVcGxvYWRlci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuUmVzdWx0UHJvY2Vzc29yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuQ2FsaXBlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLkludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlN0ZG91dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworaW1wb3J0IGNvbS5zdW4uamVyc2V5LmFwaS5jbGllbnQuQ2xpZW50OworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogQSB7QGxpbmsgUmVzdWx0UHJvY2Vzc29yfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHB1Ymxpc2hlcyByZXN1bHRzIHRvIHRoZSB3ZWJhcHAgdXNpbmcgYW4gSFRUUAorICogcmVxdWVzdC4KKyAqLworcHVibGljIGNsYXNzIEh0dHBVcGxvYWRlciBleHRlbmRzIFJlc3VsdHNVcGxvYWRlciB7CisgIEBJbmplY3QgSHR0cFVwbG9hZGVyKEBTdGRvdXQgUHJpbnRXcml0ZXIgc3Rkb3V0LCBHc29uIGdzb24sIENhbGlwZXJDb25maWcgY29uZmlnKQorICAgICAgdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICBzdXBlcihzdGRvdXQsIGdzb24sIENsaWVudC5jcmVhdGUoKSwgY29uZmlnLmdldFJlc3VsdFByb2Nlc3NvckNvbmZpZyhIdHRwVXBsb2FkZXIuY2xhc3MpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvSW5zdHJ1bWVudC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvSW5zdHJ1bWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmJjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9JbnN0cnVtZW50LmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuQWJzdHJhY3RMb2dNZXNzYWdlVmlzaXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLkxvZ01lc3NhZ2VWaXNpdG9yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuU3RvcE1lYXN1cmVtZW50TG9nTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLlZtQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5JbnN0cnVtZW50U3BlYzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlci5Xb3JrZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnN0cnVtZW50IHsKKyAgcHJvdGVjdGVkIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9uczsKKyAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOworCisgIEBJbmplY3Qgdm9pZCBzZXRPcHRpb25zKEBJbnN0cnVtZW50T3B0aW9ucyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpIHsKKyAgICB0aGlzLm9wdGlvbnMgPSBJbW11dGFibGVNYXAuY29weU9mKAorICAgICAgICBNYXBzLmZpbHRlcktleXMob3B0aW9ucywgUHJlZGljYXRlcy5pbihpbnN0cnVtZW50T3B0aW9ucygpKSkpOworICB9CisKKyAgQEluamVjdCB2b2lkIHNldEluc3RydW1lbnROYW1lKEBJbnN0cnVtZW50TmFtZSBTdHJpbmcgbmFtZSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgIH0KKworICBTdHJpbmcgbmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBuYW1lKCk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0JlbmNobWFya01ldGhvZChNZXRob2QgbWV0aG9kKTsKKworICBwdWJsaWMgYWJzdHJhY3QgSW5zdHJ1bWVudGF0aW9uIGNyZWF0ZUluc3RydW1lbnRhdGlvbihNZXRob2QgYmVuY2htYXJrTWV0aG9kKQorICAgICAgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb247CisKKyAgLyoqCisgICAqIEluZGljYXRlcyB0aGF0IHRyaWFscyB1c2luZyB0aGlzIGluc3RydW1lbnQgY2FuIGJlIHJ1biBpbiBwYXJhbGxlbCB3aXRoIG90aGVyIHRyaWFscy4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBUcmlhbFNjaGVkdWxpbmdQb2xpY3kgc2NoZWR1bGluZ1BvbGljeSgpOworCisgIC8qKgorICAgKiBUaGUgYXBwbGljYXRpb24gb2YgYW4gaW5zdHJ1bWVudCB0byBhIHBhcnRpY3VsYXIgYmVuY2htYXJrIG1ldGhvZC4KKyAgICovCisgIC8vIFRPRE8oZ2FrKTogY29uc2lkZXIgcGFzc2luZyBpbiBJbnN0cnVtZW50IGV4cGxpY2l0bHkgZm9yIERJCisgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnN0cnVtZW50YXRpb24geworICAgIHByb3RlY3RlZCBNZXRob2QgYmVuY2htYXJrTWV0aG9kOworCisgICAgcHJvdGVjdGVkIEluc3RydW1lbnRhdGlvbihNZXRob2QgYmVuY2htYXJrTWV0aG9kKSB7CisgICAgICB0aGlzLmJlbmNobWFya01ldGhvZCA9IGNoZWNrTm90TnVsbChiZW5jaG1hcmtNZXRob2QpOworICAgIH0KKworICAgIEluc3RydW1lbnQgaW5zdHJ1bWVudCgpIHsKKyAgICAgIHJldHVybiBJbnN0cnVtZW50LnRoaXM7CisgICAgfQorCisgICAgTWV0aG9kIGJlbmNobWFya01ldGhvZCgpIHsKKyAgICAgIHJldHVybiBiZW5jaG1hcmtNZXRob2Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW5zdHJ1bWVudGF0aW9uKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvbiB0aGF0ID0gKEluc3RydW1lbnRhdGlvbikgb2JqOworICAgICAgICByZXR1cm4gSW5zdHJ1bWVudC50aGlzLmVxdWFscyh0aGF0Lmluc3RydW1lbnQoKSkKKyAgICAgICAgICAgICYmIHRoaXMuYmVuY2htYXJrTWV0aG9kLmVxdWFscyh0aGF0LmJlbmNobWFya01ldGhvZCk7CisgICAgICB9CisgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKEluc3RydW1lbnQudGhpcywgYmVuY2htYXJrTWV0aG9kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKEluc3RydW1lbnRhdGlvbi5jbGFzcykKKyAgICAgICAgICAuYWRkKCJpbnN0cnVtZW50IiwgSW5zdHJ1bWVudC50aGlzKQorICAgICAgICAgIC5hZGQoImJlbmNobWFya01ldGhvZCIsIGJlbmNobWFya01ldGhvZCkKKyAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcnlSdW4oT2JqZWN0IGJlbmNobWFyaykgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb247CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3M8PyBleHRlbmRzIFdvcmtlcj4gd29ya2VyQ2xhc3MoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3Vic2V0IG9mIG9wdGlvbnMgKGFuZCBwb3NzaWJseSBhIHRyYW5zZm9ybWF0aW9uIHRoZXJlb2YpIHRvIGJlIHVzZWQgaW4gdGhlCisgICAgICogd29ya2VyLiBSZXR1cm5zIGFsbCBpbnN0cnVtZW50IG9wdGlvbnMgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiB3b3JrZXJPcHRpb25zKCkgeworICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorCisgICAgYWJzdHJhY3QgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciBnZXRNZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yKCk7CisgIH0KKworICBwdWJsaWMgZmluYWwgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKCkgeworICAgIHJldHVybiBvcHRpb25zOworICB9CisKKyAgZmluYWwgSW5zdHJ1bWVudFNwZWMgZ2V0U3BlYygpIHsKKyAgICByZXR1cm4gbmV3IEluc3RydW1lbnRTcGVjLkJ1aWxkZXIoKQorICAgICAgICAuaW5zdHJ1bWVudENsYXNzKGdldENsYXNzKCkpCisgICAgICAgIC5hZGRBbGxPcHRpb25zKG9wdGlvbnMoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgIH0KKworICAvKioKKyAgICogRGVmaW5lcyB0aGUgbGlzdCBvZiBvcHRpb25zIGFwcGxpY2FibGUgdG8gdGhpcyBpbnN0cnVtZW50LiBJbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2Ugb3B0aW9ucworICAgKiB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgICAqLworICBwcm90ZWN0ZWQgSW1tdXRhYmxlU2V0PFN0cmluZz4gaW5zdHJ1bWVudE9wdGlvbnMoKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZigpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgc29tZSBhcmd1bWVudHMgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGludm9raW5nCisgICAqIHRoaXMgaW5zdHJ1bWVudCdzIHdvcmtlci4KKyAgICoKKyAgICogQHBhcmFtIHZtQ29uZmlnIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgVk0gb24gd2hpY2ggdGhpcyBpcyBydW5uaW5nLgorICAgKi8KKyAgSW1tdXRhYmxlU2V0PFN0cmluZz4gZ2V0RXh0cmFDb21tYW5kTGluZUFyZ3MoVm1Db25maWcgdm1Db25maWcpIHsKKyAgICByZXR1cm4gdm1Db25maWcuY29tbW9uSW5zdHJ1bWVudFZtQXJncygpOworICB9CisKKyAgaW50ZXJmYWNlIE1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IgZXh0ZW5kcyBMb2dNZXNzYWdlVmlzaXRvciB7CisgICAgYm9vbGVhbiBpc0RvbmVDb2xsZWN0aW5nKCk7CisgICAgYm9vbGVhbiBpc1dhcm11cENvbXBsZXRlKCk7CisgICAgSW1tdXRhYmxlTGlzdDxNZWFzdXJlbWVudD4gZ2V0TWVhc3VyZW1lbnRzKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgdGhlIG1lc3NhZ2VzIGNyZWF0ZWQgd2hpbGUgY29sbGVjdGluZyBtZWFzdXJtZW50cy4KKyAgICAgKiAKKyAgICAgKiA8cD5BIG1lc3NhZ2UgaXMgc29tZSBwaWVjZSBvZiB1c2VyIHZpc2libGUgZGF0YSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWxvbmcKKyAgICAgKiB3aXRoIHRoZSB0cmlhbCByZXN1bHRzLgorICAgICAqIAorICAgICAqIDxwPlRPRE8obHVrZXMpOiBzaG91bGQgd2UgbW9kZWwgdGhlc2UgYXMgYW55dGhpbmcgbW9yZSB0aGFuIHN0cmluZ3MuICBUaGVzZSBtZXNzYWdlcyBhbHJlYWR5CisgICAgICogaGF2ZSBhIGNvbmNlcHQgb2YgJ2xldmVsJyBiYXNlZCBvbiB0aGUgcHJlZml4LgorICAgICAqLworICAgIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBnZXRNZXNzYWdlcygpOworICB9CisKKyAgLyoqCisgICAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvcn0gdGhhdCBjb2xsZWN0cyBtZWFzdXJlbWVudHMgZm9yCisgICAqIHByZS1zcGVjaWZpZWQgZGVzY3JpcHRpb25zLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWZhdWx0TWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvcgorICAgICAgZXh0ZW5kcyBBYnN0cmFjdExvZ01lc3NhZ2VWaXNpdG9yIGltcGxlbWVudHMgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciB7CisgICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX05VTUJFUl9PRl9NRUFTVVJFTUVOVFMgPSA5OworICAgIGZpbmFsIEltbXV0YWJsZVNldDxTdHJpbmc+IHJlcXVpcmVkRGVzY3JpcHRpb25zOworICAgIGZpbmFsIExpc3RNdWx0aW1hcDxTdHJpbmcsIE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHNCeURlc2NyaXB0aW9uOworICAgIGZpbmFsIGludCByZXF1aXJlZE1lYXN1cmVtZW50czsKKworICAgIERlZmF1bHRNZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yKEltbXV0YWJsZVNldDxTdHJpbmc+IHJlcXVpcmVkRGVzY3JpcHRpb25zKSB7CisgICAgICB0aGlzKHJlcXVpcmVkRGVzY3JpcHRpb25zLCBERUZBVUxUX05VTUJFUl9PRl9NRUFTVVJFTUVOVFMpOworICAgIH0KKworICAgIERlZmF1bHRNZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yKEltbXV0YWJsZVNldDxTdHJpbmc+IHJlcXVpcmVkRGVzY3JpcHRpb25zLAorICAgICAgICBpbnQgcmVxdWlyZWRNZWFzdXJlbWVudHMpIHsKKyAgICAgIHRoaXMucmVxdWlyZWREZXNjcmlwdGlvbnMgPSByZXF1aXJlZERlc2NyaXB0aW9uczsKKyAgICAgIGNoZWNrQXJndW1lbnQoIXJlcXVpcmVkRGVzY3JpcHRpb25zLmlzRW1wdHkoKSk7CisgICAgICB0aGlzLnJlcXVpcmVkTWVhc3VyZW1lbnRzID0gcmVxdWlyZWRNZWFzdXJlbWVudHM7CisgICAgICBjaGVja0FyZ3VtZW50KHJlcXVpcmVkTWVhc3VyZW1lbnRzID4gMCk7CisgICAgICB0aGlzLm1lYXN1cmVtZW50c0J5RGVzY3JpcHRpb24gPQorICAgICAgICAgIEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZShyZXF1aXJlZERlc2NyaXB0aW9ucy5zaXplKCksIHJlcXVpcmVkTWVhc3VyZW1lbnRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoU3RvcE1lYXN1cmVtZW50TG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7CisgICAgICBmb3IgKE1lYXN1cmVtZW50IG1lYXN1cmVtZW50IDogbG9nTWVzc2FnZS5tZWFzdXJlbWVudHMoKSkgeworICAgICAgICBtZWFzdXJlbWVudHNCeURlc2NyaXB0aW9uLnB1dChtZWFzdXJlbWVudC5kZXNjcmlwdGlvbigpLCBtZWFzdXJlbWVudCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGlzRG9uZUNvbGxlY3RpbmcoKSB7CisgICAgICBmb3IgKFN0cmluZyBkZXNjcmlwdGlvbiA6IHJlcXVpcmVkRGVzY3JpcHRpb25zKSB7CisgICAgICAgIGlmIChtZWFzdXJlbWVudHNCeURlc2NyaXB0aW9uLmdldChkZXNjcmlwdGlvbikuc2l6ZSgpIDwgcmVxdWlyZWRNZWFzdXJlbWVudHMpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV2FybXVwQ29tcGxldGUoKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIEltbXV0YWJsZUxpc3Q8TWVhc3VyZW1lbnQ+IGdldE1lYXN1cmVtZW50cygpIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVMaXN0LmNvcHlPZihtZWFzdXJlbWVudHNCeURlc2NyaXB0aW9uLnZhbHVlcygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBnZXRNZXNzYWdlcygpIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0luc3RydW1lbnRDb21wb25lbnQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDY1JQpjb3B5IGZyb20gY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9VcGxvYWRSZXN1bHRzLmphdmEKY29weSB0byBjYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9JbnN0cnVtZW50Q29tcG9uZW50LmphdmEKaW5kZXggN2RhZTdhZi4uNTUxNTdlNyAxMDA2NDQKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9VcGxvYWRSZXN1bHRzLmphdmEKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvSW5zdHJ1bWVudENvbXBvbmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxNSArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGRhZ2dlci5Db21wb25lbnQ7CiAKIC8qKgotICogVXNhZ2U6IFVwbG9hZFJlc3VsdHMgPGZpbGVfb3JfZGlyPgorICogQ29tcG9uZW50IHRvIHVzZSB0byBpbmplY3QgdmFsdWVzIGludG8gYW4ge0BsaW5rIEluc3RydW1lbnR9LgogICovCi1wdWJsaWMgY2xhc3MgVXBsb2FkUmVzdWx0cyB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBuZXcgUnVubmVyKCkudXBsb2FkUmVzdWx0c0ZpbGVPckRpcihuZXcgRmlsZShhcmdzWzBdKSk7Ci0gIH0KK0BDb21wb25lbnQobW9kdWxlcyA9IEluc3RydW1lbnRJbmplY3Rvck1vZHVsZS5jbGFzcykKK2ludGVyZmFjZSBJbnN0cnVtZW50Q29tcG9uZW50IHsKKworICB2b2lkIGluamVjdEluc3RydW1lbnQoSW5zdHJ1bWVudCBpbnN0cnVtZW50KTsKIH0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0luc3RydW1lbnRJbmplY3Rvck1vZHVsZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvSW5zdHJ1bWVudEluamVjdG9yTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxNTllMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0luc3RydW1lbnRJbmplY3Rvck1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuSW5zdHJ1bWVudENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKKworLyoqCisgKiBUaGUgc2V0IG9mIGJpbmRpbmdzIGF2YWlsYWJsZSBmb3IgaW5qZWN0aW5nIGludG8ge0BsaW5rIEluc3RydW1lbnR9IGluc3RhbmNlcy4KKyAqLworQE1vZHVsZQorZmluYWwgY2xhc3MgSW5zdHJ1bWVudEluamVjdG9yTW9kdWxlIHsKKworICBwcml2YXRlIGZpbmFsIEluc3RydW1lbnRDb25maWcgaW5zdHJ1bWVudENvbmZpZzsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBpbnN0cnVtZW50TmFtZTsKKworICBJbnN0cnVtZW50SW5qZWN0b3JNb2R1bGUoSW5zdHJ1bWVudENvbmZpZyBpbnN0cnVtZW50Q29uZmlnLCBTdHJpbmcgaW5zdHJ1bWVudE5hbWUpIHsKKyAgICB0aGlzLmluc3RydW1lbnRDb25maWcgPSBpbnN0cnVtZW50Q29uZmlnOworICAgIHRoaXMuaW5zdHJ1bWVudE5hbWUgPSBpbnN0cnVtZW50TmFtZTsKKyAgfQorCisgIEBQcm92aWRlcworICBJbnN0cnVtZW50Q29uZmlnIHByb3ZpZGVJbnN0cnVtZW50Q29uZmlnKCkgeworICAgIHJldHVybiBpbnN0cnVtZW50Q29uZmlnOworICB9CisKKyAgQFByb3ZpZGVzCisgIEBJbnN0cnVtZW50T3B0aW9ucworICBzdGF0aWMgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiBwcm92aWRlSW5zdHJ1bWVudE9wdGlvbnMoSW5zdHJ1bWVudENvbmZpZyBjb25maWcpIHsKKyAgICByZXR1cm4gY29uZmlnLm9wdGlvbnMoKTsKKyAgfQorCisgIEBQcm92aWRlcworICBASW5zdHJ1bWVudE5hbWUKKyAgU3RyaW5nIHByb3ZpZGVJbnN0cnVtZW50TmFtZSgpIHsKKyAgICByZXR1cm4gaW5zdHJ1bWVudE5hbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0luc3RydW1lbnROYW1lLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9JbnN0cnVtZW50TmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjAyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9JbnN0cnVtZW50TmFtZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKiBCaW5kaW5nIGFubm90YXRpb24gZm9yIHRoZSBuYW1lIHVzZWQgdG8gY29uZmlndXJlIGFuIGluc3RydW1lbnQuICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAVGFyZ2V0KHtGSUVMRCwgUEFSQU1FVEVSLCBNRVRIT0R9KQorQFF1YWxpZmllcgorQGludGVyZmFjZSBJbnN0cnVtZW50TmFtZSB7fQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvSW5zdHJ1bWVudE9wdGlvbnMuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0luc3RydW1lbnRPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmMDY4MQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0luc3RydW1lbnRPcHRpb25zLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqIEJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgdGhlIG9wdGlvbnMgYXBwbGllZCB0byBhbiBpbnN0cnVtZW50LiAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldCh7RklFTEQsIFBBUkFNRVRFUiwgTUVUSE9EfSkKK0BRdWFsaWZpZXIKK0BpbnRlcmZhY2UgSW5zdHJ1bWVudE9wdGlvbnMge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0ludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0ludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWFhZWMyCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCisvKioKKyAqCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgcHVibGljIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgc3VwZXIoU3RyaW5nLmZvcm1hdChtZXNzYWdlLCBmaXhBcmdzKGFyZ3MpKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBmaXhBcmdzKE9iamVjdFtdIGFyZ3MpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChhcmdzW2ldIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgYXJnc1tpXSA9ICgoQ2xhc3M8Pz4pIGFyZ3NbaV0pLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFyZ3M7CisgIH0KKworICBwdWJsaWMgdm9pZCBkaXNwbGF5KFByaW50V3JpdGVyIHdyaXRlcikgeworICAgIHdyaXRlci5wcmludGxuKGdldE1lc3NhZ2UoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0ludmFsaWRJbnN0cnVtZW50RXhjZXB0aW9uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9JbnZhbGlkSW5zdHJ1bWVudEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZGIxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9JbnZhbGlkSW5zdHJ1bWVudEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCisvKioKKyAqCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIEludmFsaWRJbnN0cnVtZW50RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgIHB1YmxpYyBJbnZhbGlkSW5zdHJ1bWVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICBzdXBlcihTdHJpbmcuZm9ybWF0KG1lc3NhZ2UsIGFyZ3MpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRpc3BsYXkoUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgcHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0phckZpbmRlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvSmFyRmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0ZWY4MQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0phckZpbmRlci5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5yZWZsZWN0LkNsYXNzUGF0aDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBTY2FucyB0aGUgc291cmNlIG9mIGEge0BsaW5rIENsYXNzTG9hZGVyfSBhbmQgZmluZHMgYWxsIGphciBmaWxlcy4gIFRoaXMgaXMgYSBtb2RpZmllZCB2ZXJzaW9uCisgKiBvZiB7QGxpbmsgQ2xhc3NQYXRofSB0aGF0IGZpbmRzIGphcnMgaW5zdGVhZCBvZiByZXNvdXJjZXMuCisgKi8KK2ZpbmFsIGNsYXNzIEphckZpbmRlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEphckZpbmRlci5jbGFzcy5nZXROYW1lKCkpOworCisgIC8qKiBTZXBhcmF0b3IgZm9yIHRoZSBDbGFzcy1QYXRoIG1hbmlmZXN0IGF0dHJpYnV0ZSB2YWx1ZSBpbiBqYXIgZmlsZXMuICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwbGl0dGVyIENMQVNTX1BBVEhfQVRUUklCVVRFX1NFUEFSQVRPUiA9CisgICAgICBTcGxpdHRlci5vbignICcpLm9taXRFbXB0eVN0cmluZ3MoKTsKKworICAvKioKKyAgICogUmV0dXJucyBhIGxpc3Qgb2YgamFyIGZpbGVzIHJlYWNoYWJsZSBmcm9tIHRoZSBnaXZlbiBjbGFzcyBsb2FkZXJzLgorICAgKgorICAgKiA8cD5DdXJyZW50bHkgb25seSB7QGxpbmsgVVJMQ2xhc3NMb2FkZXJ9IGFuZCBvbmx5IHtAY29kZSBmaWxlOi8vfSB1cmxzIGFyZSBzdXBwb3J0ZWQuCisgICAqCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGF0dGVtcHQgdG8gcmVhZCBjbGFzcyBwYXRoIHJlc291cmNlcyAoamFyIGZpbGVzIG9yIGRpcmVjdG9yaWVzKQorICAgKiAgICAgICAgIGZhaWxlZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSW1tdXRhYmxlU2V0PEZpbGU+IGZpbmRKYXJGaWxlcyhDbGFzc0xvYWRlciBmaXJzdCwgQ2xhc3NMb2FkZXIuLi4gcmVzdCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoKTsKKyAgICBNYXA8VVJJLCBDbGFzc0xvYWRlcj4gbWFwID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisgICAgZm9yIChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA6IExpc3RzLmFzTGlzdChmaXJzdCwgcmVzdCkpIHsKKyAgICAgIG1hcC5wdXRBbGwoZ2V0Q2xhc3NQYXRoRW50cmllcyhjbGFzc0xvYWRlcikpOworICAgIH0KKyAgICBmb3IgKE1hcC5FbnRyeTxVUkksIENsYXNzTG9hZGVyPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisgICAgICBzY2FubmVyLnNjYW4oZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gc2Nhbm5lci5qYXJGaWxlcygpOworICB9CisKKyAgQFZpc2libGVGb3JUZXN0aW5nIHN0YXRpYyBJbW11dGFibGVNYXA8VVJJLCBDbGFzc0xvYWRlcj4gZ2V0Q2xhc3NQYXRoRW50cmllcygKKyAgICAgIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB7CisgICAgTWFwPFVSSSwgQ2xhc3NMb2FkZXI+IGVudHJpZXMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICAvLyBTZWFyY2ggcGFyZW50IGZpcnN0LCBzaW5jZSBpdCdzIHRoZSBvcmRlciBDbGFzc0xvYWRlciNsb2FkQ2xhc3MoKSB1c2VzLgorICAgIENsYXNzTG9hZGVyIHBhcmVudCA9IGNsYXNzbG9hZGVyLmdldFBhcmVudCgpOworICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgZW50cmllcy5wdXRBbGwoZ2V0Q2xhc3NQYXRoRW50cmllcyhwYXJlbnQpKTsKKyAgICB9CisgICAgaWYgKGNsYXNzbG9hZGVyIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpIHsKKyAgICAgIFVSTENsYXNzTG9hZGVyIHVybENsYXNzTG9hZGVyID0gKFVSTENsYXNzTG9hZGVyKSBjbGFzc2xvYWRlcjsKKyAgICAgIGZvciAoVVJMIGVudHJ5IDogdXJsQ2xhc3NMb2FkZXIuZ2V0VVJMcygpKSB7CisgICAgICAgIFVSSSB1cmk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdXJpID0gZW50cnkudG9VUkkoKTsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIGlmICghZW50cmllcy5jb250YWluc0tleSh1cmkpKSB7CisgICAgICAgICAgZW50cmllcy5wdXQodXJpLCBjbGFzc2xvYWRlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5jb3B5T2YoZW50cmllcyk7CisgIH0KKworICBAVmlzaWJsZUZvclRlc3Rpbmcgc3RhdGljIGZpbmFsIGNsYXNzIFNjYW5uZXIgeworICAgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8RmlsZT4gamFyRmlsZXMgPSBuZXcgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8RmlsZT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxVUkk+IHNjYW5uZWRVcmlzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisKKyAgICBJbW11dGFibGVTZXQ8RmlsZT4gamFyRmlsZXMoKSB7CisgICAgICByZXR1cm4gamFyRmlsZXMuYnVpbGQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNjYW4oVVJJIHVyaSwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAodXJpLmdldFNjaGVtZSgpLmVxdWFscygiZmlsZSIpICYmIHNjYW5uZWRVcmlzLmFkZCh1cmkpKSB7CisgICAgICAgIHNjYW5Gcm9tKG5ldyBGaWxlKHVyaSksIGNsYXNzbG9hZGVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3Rpbmcgdm9pZCBzY2FuRnJvbShGaWxlIGZpbGUsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgc2NhbkRpcmVjdG9yeShmaWxlLCBjbGFzc2xvYWRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzY2FuSmFyKGZpbGUsIGNsYXNzbG9hZGVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2NhbkRpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHsKKyAgICAgIHNjYW5EaXJlY3RvcnkoZGlyZWN0b3J5LCBjbGFzc2xvYWRlciwgIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzY2FuRGlyZWN0b3J5KAorICAgICAgICBGaWxlIGRpcmVjdG9yeSwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIsIFN0cmluZyBwYWNrYWdlUHJlZml4KSB7CisgICAgICBmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgc2NhbkRpcmVjdG9yeShmaWxlLCBjbGFzc2xvYWRlciwgcGFja2FnZVByZWZpeCArIG5hbWUgKyAiLyIpOworICAgICAgICB9CisgICAgICAgIC8vIGRvIHdlIG5lZWQgdG8gbG9vayBmb3IgamFycyBoZXJlPworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzY2FuSmFyKEZpbGUgZmlsZSwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBKYXJGaWxlIGphckZpbGU7CisgICAgICB0cnkgeworICAgICAgICBqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIE5vdCBhIGphciBmaWxlCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGphckZpbGVzLmFkZChmaWxlKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoVVJJIHVyaSA6IGdldENsYXNzUGF0aEZyb21NYW5pZmVzdChmaWxlLCBqYXJGaWxlLmdldE1hbmlmZXN0KCkpKSB7CisgICAgICAgICAgc2Nhbih1cmksIGNsYXNzbG9hZGVyKTsKKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBqYXJGaWxlLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHt9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MgcGF0aCBVUklzIHNwZWNpZmllZCBieSB0aGUge0Bjb2RlIENsYXNzLVBhdGh9IG1hbmlmZXN0IGF0dHJpYnV0ZSwgYWNjb3JkaW5nCisgICAgICogdG8gPGEKKyAgICAgKiBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwjTWFpbiUyMEF0dHJpYnV0ZXMiPgorICAgICAqIEpBUiBGaWxlIFNwZWNpZmljYXRpb248L2E+LiBJZiB7QGNvZGUgbWFuaWZlc3R9IGlzIG51bGwsIGl0IG1lYW5zIHRoZSBqYXIgZmlsZSBoYXMgbm8KKyAgICAgKiBtYW5pZmVzdCwgYW5kIGFuIGVtcHR5IHNldCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZyBzdGF0aWMgSW1tdXRhYmxlU2V0PFVSST4gZ2V0Q2xhc3NQYXRoRnJvbU1hbmlmZXN0KAorICAgICAgICBGaWxlIGphckZpbGUsIEBOdWxsYWJsZSBNYW5pZmVzdCBtYW5pZmVzdCkgeworICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZigpOworICAgICAgfQorICAgICAgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8VVJJPiBidWlsZGVyID0gSW1tdXRhYmxlU2V0LmJ1aWxkZXIoKTsKKyAgICAgIFN0cmluZyBjbGFzc3BhdGhBdHRyaWJ1dGUgPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpCisgICAgICAgICAgLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRILnRvU3RyaW5nKCkpOworICAgICAgaWYgKGNsYXNzcGF0aEF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBDTEFTU19QQVRIX0FUVFJJQlVURV9TRVBBUkFUT1Iuc3BsaXQoY2xhc3NwYXRoQXR0cmlidXRlKSkgeworICAgICAgICAgIFVSSSB1cmk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVyaSA9IGdldENsYXNzUGF0aEVudHJ5KGphckZpbGUsIHBhdGgpOworICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgYmFkIGVudHJ5CisgICAgICAgICAgICBsb2dnZXIud2FybmluZygiSW52YWxpZCBDbGFzcy1QYXRoIGVudHJ5OiAiICsgcGF0aCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnVpbGRlci5hZGQodXJpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB1cmkgb2YgdGhlIENsYXNzLVBhdGggZW50cnkgdmFsdWUgYXMgc3BlY2lmaWVkIGluCisgICAgICogPGEKKyAgICAgKiBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwjTWFpbiUyMEF0dHJpYnV0ZXMiPgorICAgICAqIEpBUiBGaWxlIFNwZWNpZmljYXRpb248L2E+LiBFdmVuIHRob3VnaCB0aGUgc3BlY2lmaWNhdGlvbiBvbmx5IHRhbGtzIGFib3V0IHJlbGF0aXZlIHVybHMsCisgICAgICogYWJzb2x1dGUgdXJscyBhcmUgYWN0dWFsbHkgc3VwcG9ydGVkIHRvbyAoZm9yIGV4YW1wbGUsIGluIE1hdmVuIHN1cmVmaXJlIHBsdWdpbikuCisgICAgICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nIHN0YXRpYyBVUkkgZ2V0Q2xhc3NQYXRoRW50cnkoRmlsZSBqYXJGaWxlLCBTdHJpbmcgcGF0aCkKKyAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICBVUkkgdXJpID0gbmV3IFVSSShwYXRoKTsKKyAgICAgIHJldHVybiB1cmkuaXNBYnNvbHV0ZSgpCisgICAgICAgICAgPyB1cmkKKyAgICAgICAgICA6IG5ldyBGaWxlKGphckZpbGUuZ2V0UGFyZW50RmlsZSgpLCBwYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKS50b1VSSSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvTG9jYWxQb3J0LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9Mb2NhbFBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY3MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvTG9jYWxQb3J0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqIEJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHBvcnQgdG8gd2hpY2ggdGhlIHdvcmtlciBoYXMgYm91bmQuICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAVGFyZ2V0KHtGSUVMRCwgUEFSQU1FVEVSLCBNRVRIT0R9KQorQFF1YWxpZmllcgorQGludGVyZmFjZSBMb2NhbFBvcnQge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL01haW5Db21wb25lbnQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL01haW5Db21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJjZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvTWFpbkNvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuQnJpZGdlTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuQ2FsaXBlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLkNvbmZpZ01vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuanNvbi5Hc29uTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zLkNhbGlwZXJPcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zLk9wdGlvbnNNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuT3V0cHV0TW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5TZXJ2aWNlTWFuYWdlcjsKKworaW1wb3J0IGRhZ2dlci5Db21wb25lbnQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIFRoZSBtYWluIGNvbXBvbmVudCB1c2VkIHdoZW4gcnVubmluZyBjYWxpcGVyLgorICovCitAU2luZ2xldG9uCitAQ29tcG9uZW50KG1vZHVsZXMgPSB7CisgICAgQmVuY2htYXJrQ2xhc3NNb2R1bGUuY2xhc3MsCisgICAgQnJpZGdlTW9kdWxlLmNsYXNzLAorICAgIENvbmZpZ01vZHVsZS5jbGFzcywKKyAgICBFeHBlcmltZW50aW5nUnVubmVyTW9kdWxlLmNsYXNzLAorICAgIEdzb25Nb2R1bGUuY2xhc3MsCisgICAgTWFpbk1vZHVsZS5jbGFzcywKKyAgICBPcHRpb25zTW9kdWxlLmNsYXNzLAorICAgIE91dHB1dE1vZHVsZS5jbGFzcywKKyAgICBQbGF0Zm9ybU1vZHVsZS5jbGFzcywKKyAgICBSdW5uZXJNb2R1bGUuY2xhc3MsCisgICAgU2VydmljZU1vZHVsZS5jbGFzcywKK30pCitpbnRlcmZhY2UgTWFpbkNvbXBvbmVudCB7CisKKyAgQmVuY2htYXJrQ2xhc3MgZ2V0QmVuY2htYXJrQ2xhc3MoKTsKKworICBDYWxpcGVyQ29uZmlnIGdldENhbGlwZXJDb25maWcoKTsKKworICBDYWxpcGVyT3B0aW9ucyBnZXRDYWxpcGVyT3B0aW9ucygpOworCisgIENhbGlwZXJSdW4gZ2V0Q2FsaXBlclJ1bigpOworCisgIFNlcnZpY2VNYW5hZ2VyIGdldFNlcnZpY2VNYW5hZ2VyKCk7CisKKyAgVHJpYWxTY29wZUNvbXBvbmVudCBuZXdUcmlhbENvbXBvbmVudChUcmlhbE1vZHVsZSB0cmlhbE1vZHVsZSk7CisKKyAgRXhwZXJpbWVudENvbXBvbmVudCBuZXdFeHBlcmltZW50Q29tcG9uZW50KEV4cGVyaW1lbnRNb2R1bGUgZXhwZXJpbWVudE1vZHVsZSk7Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9NYWluTW9kdWxlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9NYWluTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhYjZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL01haW5Nb2R1bGUuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9ucy5DYWxpcGVyT3B0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5JbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsOworaW1wb3J0IGRhZ2dlci5Nb2R1bGU7CitpbXBvcnQgZGFnZ2VyLlByb3ZpZGVzOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogUHJvdmlkZXMgYmluZGluZ3MgdG8gaW50ZWdyYXRlIG90aGVyIG1vZHVsZXMgaW50byB0aGUge0BsaW5rIE1haW5Db21wb25lbnR9LgorICovCitATW9kdWxlCitjbGFzcyBNYWluTW9kdWxlIHsKKworICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBiZW5jaG1hcmtDbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkKKyAgICAgIHRocm93cyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiwgVXNlckNvZGVFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gVXRpbC5sZW5pZW50Q2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbW1hbmRFeGNlcHRpb24oIkJlbmNobWFyayBjbGFzcyBub3QgZm91bmQ6ICIgKyBjbGFzc05hbWUpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlKSB7CisgICAgICB0aHJvdyBuZXcgVXNlckNvZGVFeGNlcHRpb24oCisgICAgICAgICAgIkV4Y2VwdGlvbiB0aHJvd24gd2hpbGUgaW5pdGlhbGl6aW5nIGNsYXNzICciICsgY2xhc3NOYW1lICsgIiciLCBlLmdldENhdXNlKCkpOworICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKKyAgICAgIHRocm93IG5ldyBVc2VyQ29kZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgIiArIGNsYXNzTmFtZSwgZSk7CisgICAgfQorICB9CisKKyAgQFByb3ZpZGVzCisgIEBTaW5nbGV0b24KKyAgQFJ1bm5pbmcuQmVuY2htYXJrQ2xhc3MKKyAgc3RhdGljIENsYXNzPD8+IHByb3ZpZGVCZW5jaG1hcmtDbGFzcyhDYWxpcGVyT3B0aW9ucyBvcHRpb25zKSB7CisgICAgcmV0dXJuIGJlbmNobWFya0NsYXNzRm9yTmFtZShvcHRpb25zLmJlbmNobWFya0NsYXNzTmFtZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvTmFub1RpbWVHcmFudWxhcml0eS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvTmFub1RpbWVHcmFudWxhcml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczN2IwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9OYW5vVGltZUdyYW51bGFyaXR5LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqIEJpbmRpbmcgYW5ub3RhdGlvbiBmb3IgdGhlIGdyYW51bGFyaXR5IG9mIHtAbGluayBTeXN0ZW0jbmFub1RpbWUoKX0uICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAVGFyZ2V0KHtGSUVMRCwgUEFSQU1FVEVSLCBNRVRIT0R9KQorQFF1YWxpZmllcgorQGludGVyZmFjZSBOYW5vVGltZUdyYW51bGFyaXR5IHt9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9OYW5vVGltZUdyYW51bGFyaXR5VGVzdGVyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9OYW5vVGltZUdyYW51bGFyaXR5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxMzViZgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL05hbm9UaW1lR3JhbnVsYXJpdHlUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5tYXRoLlJvdW5kaW5nTW9kZS5DRUlMSU5HOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlNob3J0RHVyYXRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaWNrZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ubWF0aC5Mb25nTWF0aDsKKworLyoqCisgKiBBIHV0aWxpdHkgdGhhdCBjYWxjdWxhdGVzIHRoZSBmaW5lc3QgZ3JhbnVsYXJpdHkgdGhhdCBjYW4gYmUgZXhwZWN0ZWQgZnJvbSBzdWJzZXF1ZW50IGNhbGxzIHRvCisgKiB7QGxpbmsgU3lzdGVtI25hbm9UaW1lKCl9LiAgTm90ZSB0aGF0IHRoaXMgdXRpbGl0eSBuZWNlc3NhcmlseSBpbnZva2VzIHtAbGluayBTeXN0ZW0jbmFub1RpbWUoKX0KKyAqIGRpcmVjdGx5IHJhdGhlciB0aGFuIHVzaW5nIHtAbGluayBUaWNrZXJ9IGJlY2F1c2UgdGhlIGV4dHJhIGluZGlyZWN0aW9uIG1pZ2h0IGNhdXNlIGFkZGl0aW9uYWwKKyAqIG92ZXJoZWFkLgorICovCitmaW5hbCBjbGFzcyBOYW5vVGltZUdyYW51bGFyaXR5VGVzdGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSSUFMUyA9IDEwMDA7CisKKyAgU2hvcnREdXJhdGlvbiB0ZXN0TmFub1RpbWVHcmFudWxhcml0eSgpIHsKKyAgICBsb25nIHRvdGFsID0gMEw7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUUklBTFM7IGkrKykgeworICAgICAgbG9uZyBmaXJzdCA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgbG9uZyBzZWNvbmQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgIGxvbmcgdGhpcmQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgIGxvbmcgZm91cnRoID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICBsb25nIGZpZnRoID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICBsb25nIHNpeHRoID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICBsb25nIHNldmVudGggPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgIGxvbmcgZWlnaHRoID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICBsb25nIG5pbnRoID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICB0b3RhbCArPSBzZWNvbmQgLSBmaXJzdDsKKyAgICAgIHRvdGFsICs9IHRoaXJkIC0gc2Vjb25kOworICAgICAgdG90YWwgKz0gZm91cnRoIC0gdGhpcmQ7CisgICAgICB0b3RhbCArPSBmaWZ0aCAtIGZvdXJ0aDsKKyAgICAgIHRvdGFsICs9IHNpeHRoIC0gZmlmdGg7CisgICAgICB0b3RhbCArPSBzZXZlbnRoIC0gc2l4dGg7CisgICAgICB0b3RhbCArPSBlaWdodGggLSBzZXZlbnRoOworICAgICAgdG90YWwgKz0gbmludGggLSBlaWdodGg7CisgICAgfQorICAgIHJldHVybiBTaG9ydER1cmF0aW9uLm9mKExvbmdNYXRoLmRpdmlkZSh0b3RhbCwgVFJJQUxTICogOCwgQ0VJTElORyksIE5BTk9TRUNPTkRTKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvT3V0cHV0RmlsZUR1bXBlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvT3V0cHV0RmlsZUR1bXBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOWU4OTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9PdXRwdXRGaWxlRHVtcGVyLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYXBpLlJlc3VsdFByb2Nlc3NvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLkNhbGlwZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZy5JbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLlJlc3VsdFByb2Nlc3NvckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuUnVuOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5UcmlhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9ucy5DYWxpcGVyRGlyZWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25Xcml0ZXI7CisKK2ltcG9ydCBvcmcuam9kYS50aW1lLmZvcm1hdC5JU09EYXRlVGltZUZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIHtAbGluayBSZXN1bHRQcm9jZXNzb3J9IHRoYXQgZHVtcHMgdGhlIG91dHB1dCBkYXRhIHRvIGEgZmlsZSBpbiBKU09OIGZvcm1hdC4gQnkgZGVmYXVsdCwgdGhlCisgKiBvdXRwdXQgd2lsbCBiZSBkdW1wZWQgdG8gYSBmaWxlIGNhbGxlZAorICoge0Bjb2RlIH4vLmNhbGlwZXIvcmVzdWx0cy9bYmVuY2htYXJrIGNsYXNzbmFtZV0uW3RpbWVzdGFtcF0uanNvbn07IGlmIGl0IGV4aXN0cyBhbmQgaXMgYSBmaWxlLAorICogdGhlIGZpbGUgd2lsbCBiZSBvdmVyd3JpdHRlbi4gIFRoZSBsb2NhdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBhcyBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5CisgKiB1c2luZyBlaXRoZXIgdGhlIHtAY29kZSBmaWxlfSBvciB7QGNvZGUgZGlyfSBvcHRpb25zIHJlc3BlY3RpdmVseS4KKyAqLworZmluYWwgY2xhc3MgT3V0cHV0RmlsZUR1bXBlciBpbXBsZW1lbnRzIFJlc3VsdFByb2Nlc3NvciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE91dHB1dEZpbGVEdW1wZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIGZpbmFsIFJ1biBydW47CisgIHByaXZhdGUgZmluYWwgR3NvbiBnc29uOworICBwcml2YXRlIGZpbmFsIEZpbGUgcmVzdWx0RmlsZTsKKyAgcHJpdmF0ZSBmaW5hbCBGaWxlIHdvcmtGaWxlOworCisgIHByaXZhdGUgT3B0aW9uYWw8SnNvbldyaXRlcj4gd3JpdGVyID0gT3B0aW9uYWwuYWJzZW50KCk7CisKKyAgQEluamVjdCBPdXRwdXRGaWxlRHVtcGVyKFJ1biBydW4sCisgICAgICBCZW5jaG1hcmtDbGFzcyBiZW5jaG1hcmtDbGFzcywKKyAgICAgIEdzb24gZ3NvbiwKKyAgICAgIENhbGlwZXJDb25maWcgY2FsaXBlckNvbmZpZywKKyAgICAgIEBDYWxpcGVyRGlyZWN0b3J5IEZpbGUgY2FsaXBlckRpcmVjdG9yeSkgdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICB0aGlzLnJ1biA9IHJ1bjsKKyAgICBSZXN1bHRQcm9jZXNzb3JDb25maWcgY29uZmlnID0gY2FsaXBlckNvbmZpZy5nZXRSZXN1bHRQcm9jZXNzb3JDb25maWcoT3V0cHV0RmlsZUR1bXBlci5jbGFzcyk7CisgICAgaWYgKGNvbmZpZy5vcHRpb25zKCkuY29udGFpbnNLZXkoImZpbGUiKSkgeworICAgICAgdGhpcy5yZXN1bHRGaWxlID0gbmV3IEZpbGUoY29uZmlnLm9wdGlvbnMoKS5nZXQoImZpbGUiKSk7CisgICAgICBsb2dnZXIuZmluZXIoImZvdW5kIGFuIG91dHB1dCBmaWxlIGluIHRoZSBjb25maWd1cmF0aW9uIik7CisgICAgfSBlbHNlIGlmIChjb25maWcub3B0aW9ucygpLmNvbnRhaW5zS2V5KCJkaXIiKSkgeworICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShjb25maWcub3B0aW9ucygpLmdldCgiZGlyIikpOworICAgICAgaWYgKGRpci5pc0ZpbGUoKSkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24oInNwZWNpZmllZCBhIGRpcmVjdG9yeSwgYnV0IGl0J3MgYSBmaWxlIik7CisgICAgICB9CisgICAgICB0aGlzLnJlc3VsdEZpbGUgPSBuZXcgRmlsZShkaXIsIGNyZWF0ZUZpbGVOYW1lKGJlbmNobWFya0NsYXNzLm5hbWUoKSkpOworICAgICAgbG9nZ2VyLmZpbmVyKCJmb3VuZCBhbiBvdXRwdXQgZGlyZWN0b3J5IGluIHRoZSBjb25maWd1cmF0aW9uIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMucmVzdWx0RmlsZSA9CisgICAgICAgICAgbmV3IEZpbGUobmV3IEZpbGUoY2FsaXBlckRpcmVjdG9yeSwgInJlc3VsdHMiKSwgY3JlYXRlRmlsZU5hbWUoYmVuY2htYXJrQ2xhc3MubmFtZSgpKSk7CisgICAgICBsb2dnZXIuZmluZSgiZm91bmQgbm8gY29uZmlndXJhdGlvbiIpOworICAgIH0KKyAgICBsb2dnZXIuZmluZShTdHJpbmcuZm9ybWF0KCJ1c2luZyAlcyBmb3IgcmVzdWx0cyIsIHJlc3VsdEZpbGUpKTsKKyAgICB0aGlzLmdzb24gPSBnc29uOworICAgIHRoaXMud29ya0ZpbGUgPSBuZXcgRmlsZShyZXN1bHRGaWxlLmdldFBhdGgoKSArICIudG1wIik7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBjcmVhdGVGaWxlTmFtZShTdHJpbmcgYmVuY2htYXJrTmFtZSkgeworICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy4lcy5qc29uIiwgYmVuY2htYXJrTmFtZSwgY3JlYXRlVGltZXN0YW1wKCkpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlVGltZXN0YW1wKCkgeworICAgIHJldHVybiBJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZU5vTWlsbGlzKCkucHJpbnQocnVuLnN0YXJ0VGltZSgpKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBwcm9jZXNzVHJpYWwoVHJpYWwgdHJpYWwpIHsKKyAgICBpZiAoIXdyaXRlci5pc1ByZXNlbnQoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgRmlsZXMuY3JlYXRlUGFyZW50RGlycyh3b3JrRmlsZSk7CisgICAgICAgIEpzb25Xcml0ZXIgd3JpdGVyID0KKyAgICAgICAgICAgIG5ldyBKc29uV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0od29ya0ZpbGUpLCBDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICB3cml0ZXIuc2V0SW5kZW50KCIgICIpOyAgLy8gYWx3YXlzIHByZXR0eSBwcmludAorICAgICAgICB3cml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0aGlzLndyaXRlciA9IE9wdGlvbmFsLm9mKHdyaXRlcik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ2dlci5sb2coU0VWRVJFLCBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkFuIGVycm9yIG9jY3VyZWQgd3JpdGluZyB0cmlhbCAlcy4gUmVzdWx0cyBpbiAlcyB3aWxsIGJlIGluY29tcGxldGUuIiwgdHJpYWwuaWQoKSwKKyAgICAgICAgICAgIHJlc3VsdEZpbGUpLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHdyaXRlci5pc1ByZXNlbnQoKSkgeworICAgICAgZ3Nvbi50b0pzb24odHJpYWwsIFRyaWFsLmNsYXNzLCB3cml0ZXIuZ2V0KCkpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHdyaXRlci5pc1ByZXNlbnQoKSkgeworICAgICAgd3JpdGVyLmdldCgpLmVuZEFycmF5KCkuY2xvc2UoKTsKKyAgICB9CisgICAgaWYgKHdvcmtGaWxlLmV4aXN0cygpKSB7CisgICAgICBGaWxlcy5tb3ZlKHdvcmtGaWxlLCByZXN1bHRGaWxlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1BhcmFtZXRlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkOTQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1BhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuUGFyc2VyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlBhcnNlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUNvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuUHJpbWl0aXZlczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGluamVjdGFibGUgcGFyYW1ldGVyLCBtYXJrZWQgd2l0aCBvbmUgb2YgQFBhcmFtLCBAVm1QYXJhbS4gSGFzIG5vdGhpbmcgdG8gZG8gd2l0aAorICogcGFydGljdWxhciBjaG9pY2VzIG9mIDxpPnZhbHVlczwvaT4gZm9yIHRoaXMgcGFyYW1ldGVyIChleGNlcHQgdGhhdCBpdCBrbm93cyBob3cgdG8gZmluZCB0aGUKKyAqIDxpPmRlZmF1bHQ8L2k+IHZhbHVlcykuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXIgeworICBwdWJsaWMgc3RhdGljIFBhcmFtZXRlciBjcmVhdGUoRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihmaWVsZCk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIEZpZWxkIGZpZWxkOworICBwcml2YXRlIGZpbmFsIFBhcnNlcjw/PiBwYXJzZXI7CisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IGRlZmF1bHRzOworCisgIHB1YmxpYyBQYXJhbWV0ZXIoRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIHsKKyAgICBpZiAoVXRpbC5pc1N0YXRpYyhmaWVsZCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKCJQYXJhbWV0ZXIgZmllbGQgJyVzJyBtdXN0IG5vdCBiZSBzdGF0aWMiLAorICAgICAgICAgIGZpZWxkLmdldE5hbWUoKSk7CisgICAgfQorICAgIGlmIChSRVNFUlZFRF9OQU1FUy5jb250YWlucyhmaWVsZC5nZXROYW1lKCkpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbigiQ2xhc3MgJyVzJyB1c2VzIHJlc2VydmVkIHBhcmFtZXRlciBuYW1lICclcyciLAorICAgICAgICAgIGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCksIGZpZWxkLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgdGhpcy5maWVsZCA9IGZpZWxkOworICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisKKyAgICBDbGFzczw/PiB0eXBlID0gUHJpbWl0aXZlcy53cmFwKGZpZWxkLmdldFR5cGUoKSk7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMucGFyc2VyID0gUGFyc2Vycy5jb252ZW50aW9uYWxQYXJzZXIodHlwZSk7CisgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKCJUeXBlICclcycgb2YgcGFyYW1ldGVyIGZpZWxkICclcycgaGFzIG5vIHJlY29nbml6ZWQgIgorICAgICAgICAgICsgIlN0cmluZy1jb252ZXJ0aW5nIG1ldGhvZDsgc2VlIDxUT0RPPiBmb3IgZGV0YWlscyIsIHR5cGUsIGZpZWxkLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgdGhpcy5kZWZhdWx0cyA9IGZpbmREZWZhdWx0cyhmaWVsZCk7CisgICAgdmFsaWRhdGUoZGVmYXVsdHMpOworICB9CisKKyAgdm9pZCB2YWxpZGF0ZShJbW11dGFibGVDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB0aHJvd3MgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbiB7CisgICAgZm9yIChTdHJpbmcgdmFsdWVBc1N0cmluZyA6IHZhbHVlcykgeworICAgICAgdHJ5IHsKKyAgICAgICAgcGFyc2VyLnBhcnNlKHZhbHVlQXNTdHJpbmcpOworICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbigKKyAgICAgICAgICAgICJDYW5ub3QgY29udmVydCB2YWx1ZSAnJXMnIHRvIHR5cGUgJyVzJzogJXMiLAorICAgICAgICAgICAgdmFsdWVBc1N0cmluZywgZmllbGQuZ2V0VHlwZSgpLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGZpbmFsIEltbXV0YWJsZVNldDxTdHJpbmc+IFJFU0VSVkVEX05BTUVTID0gSW1tdXRhYmxlU2V0Lm9mKAorICAgICAgImJlbmNobWFyayIsCisgICAgICAiZW52aXJvbm1lbnQiLAorICAgICAgImluc3RydW1lbnQiLAorICAgICAgIm1lYXN1cmVtZW50IiwgLy8gZS5nLiBydW50aW1lLCBhbGxvY2F0aW9uLCBldGMuCisgICAgICAicnVuIiwKKyAgICAgICJ0cmlhbCIsIC8vIGN1cnJlbnRseSB1bnVzZWQsIGJ1dCB3ZSBtaWdodCBuZWVkIGl0CisgICAgICAidm0iKTsKKworICBTdHJpbmcgbmFtZSgpIHsKKyAgICByZXR1cm4gZmllbGQuZ2V0TmFtZSgpOworICB9CisKKyAgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IGRlZmF1bHRzKCkgeworICAgIHJldHVybiBkZWZhdWx0czsKKyAgfQorCisgIHZvaWQgaW5qZWN0KE9iamVjdCBiZW5jaG1hcmssIFN0cmluZyB2YWx1ZSkgeworICAgIHRyeSB7CisgICAgICBPYmplY3QgbyA9IHBhcnNlci5wYXJzZSh2YWx1ZSk7CisgICAgICBmaWVsZC5zZXQoYmVuY2htYXJrLCBvKTsKKyAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBpbXBvc3NpYmxlKSB7CisgICAgICAvLyBhbHJlYWR5IHZhbGlkYXRlZCBib3RoIGRlZmF1bHRzIGFuZCBjb21tYW5kLWxpbmUKKyAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihpbXBvc3NpYmxlKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGltcG9zc2libGUpIHsKKyAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihpbXBvc3NpYmxlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBJbW11dGFibGVMaXN0PFN0cmluZz4gZmluZERlZmF1bHRzKEZpZWxkIGZpZWxkKSB7CisgICAgU3RyaW5nW10gZGVmYXVsdHNBc1N0cmluZ3MgPSBmaWVsZC5nZXRBbm5vdGF0aW9uKFBhcmFtLmNsYXNzKS52YWx1ZSgpOworICAgIGlmIChkZWZhdWx0c0FzU3RyaW5ncy5sZW5ndGggPiAwKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5jb3B5T2YoZGVmYXVsdHNBc1N0cmluZ3MpOworICAgIH0KKworICAgIENsYXNzPD8+IHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7CisgICAgaWYgKHR5cGUgPT0gYm9vbGVhbi5jbGFzcykgeworICAgICAgcmV0dXJuIEFMTF9CT09MRUFOUzsKKyAgICB9CisKKyAgICBpZiAodHlwZS5pc0VudW0oKSkgeworICAgICAgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPFN0cmluZz4gYnVpbGRlciA9IEltbXV0YWJsZUxpc3QuYnVpbGRlcigpOworICAgICAgZm9yIChPYmplY3QgZW51bUNvbnN0YW50IDogdHlwZS5nZXRFbnVtQ29uc3RhbnRzKCkpIHsKKyAgICAgICAgYnVpbGRlci5hZGQoZW51bUNvbnN0YW50LnRvU3RyaW5nKCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBBTExfQk9PTEVBTlMgPSBJbW11dGFibGVMaXN0Lm9mKCJ0cnVlIiwgImZhbHNlIik7Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9QYXJhbWV0ZXJTZXQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1BhcmFtZXRlclNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MGU1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9QYXJhbWV0ZXJTZXQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUNvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXRNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNvcnRlZE1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9yZGVyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFJlcHJlc2VudHMgYWxsIHRoZSBpbmplY3RhYmxlIHBhcmFtZXRlciBmaWVsZHMgb2YgYSBzaW5nbGUga2luZCAoQFBhcmFtIG9yIEBWbVBhcmFtKSBmb3VuZCBpbiBhCisgKiBiZW5jaG1hcmsgY2xhc3MuIEhhcyBub3RoaW5nIHRvIGRvIHdpdGggcGFydGljdWxhciBjaG9pY2VzIG9mIDxpPnZhbHVlczwvaT4gZm9yIHRoZXNlIHBhcmFtZXRlcnMKKyAqIChleGNlcHQgdGhhdCBpdCBrbm93cyBob3cgdG8gZmluZCB0aGUgPGk+ZGVmYXVsdDwvaT4gdmFsdWVzKS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhcmFtZXRlclNldCB7CisgIHB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyU2V0IGNyZWF0ZShDbGFzczw/PiB0aGVDbGFzcywgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykKKyAgICAgIHRocm93cyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIHsKKyAgICAvLyBkZXRlcm1pbmlzdGljIG9yZGVyLCBub3QgcmVmbGVjdGlvbiBvcmRlcgorICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFN0cmluZywgUGFyYW1ldGVyPiBwYXJhbWV0ZXJzQnVpbGRlciA9CisgICAgICAgIEltbXV0YWJsZVNvcnRlZE1hcC5uYXR1cmFsT3JkZXIoKTsKKworICAgIGZvciAoRmllbGQgZmllbGQgOiB0aGVDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICBpZiAoZmllbGQuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uQ2xhc3MpKSB7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBQYXJhbWV0ZXIuY3JlYXRlKGZpZWxkKTsKKyAgICAgICAgcGFyYW1ldGVyc0J1aWxkZXIucHV0KGZpZWxkLmdldE5hbWUoKSwgcGFyYW1ldGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJTZXQocGFyYW1ldGVyc0J1aWxkZXIuYnVpbGQoKSk7CisgIH0KKworICBmaW5hbCBJbW11dGFibGVNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+IG1hcDsKKworICBwcml2YXRlIFBhcmFtZXRlclNldChJbW11dGFibGVNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+IG1hcCkgeworICAgIHRoaXMubWFwID0gbWFwOworICB9CisKKyAgcHVibGljIFNldDxTdHJpbmc+IG5hbWVzKCkgeworICAgIHJldHVybiBtYXAua2V5U2V0KCk7CisgIH0KKworICBwdWJsaWMgUGFyYW1ldGVyIGdldChTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBtYXAuZ2V0KG5hbWUpOworICB9CisKKyAgcHVibGljIEltbXV0YWJsZVNldE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBmaWxsSW5EZWZhdWx0c0ZvcigKKyAgICAgIEltbXV0YWJsZVNldE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBleHBsaWNpdFZhbHVlcykgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24geworICAgIEltbXV0YWJsZVNldE11bHRpbWFwLkJ1aWxkZXI8U3RyaW5nLCBTdHJpbmc+IGNvbWJpbmVkID0gSW1tdXRhYmxlU2V0TXVsdGltYXAuYnVpbGRlcigpOworCisgICAgLy8gRm9yIHVzZXIgcGFyYW1ldGVycywgdGhpcydsbCBhY3R1YWxseSBiZSB0aGUgc2FtZSBhcyBmcm9tQ2xhc3Mua2V5U2V0KCksIHNpbmNlIGFueSBleHRyYXMKKyAgICAvLyBnaXZlbiBhdCB0aGUgY29tbWFuZCBsaW5lIGFyZSB0cmVhdGVkIGFzIGVycm9yczsgZm9yIFZNIHBhcmFtZXRlcnMgdGhpcyBpcyBub3QgdGhlIGNhc2UuCisgICAgZm9yIChTdHJpbmcgbmFtZSA6IFNldHMudW5pb24obWFwLmtleVNldCgpLCBleHBsaWNpdFZhbHVlcy5rZXlTZXQoKSkpIHsKKyAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBtYXAuZ2V0KG5hbWUpOworICAgICAgSW1tdXRhYmxlQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcyA9IGV4cGxpY2l0VmFsdWVzLmNvbnRhaW5zS2V5KG5hbWUpCisgICAgICAgICAgPyBleHBsaWNpdFZhbHVlcy5nZXQobmFtZSkKKyAgICAgICAgICA6IHBhcmFtZXRlci5kZWZhdWx0cygpOworCisgICAgICBjb21iaW5lZC5wdXRBbGwobmFtZSwgdmFsdWVzKTsKKyAgICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKCJFUlJPUjogTm8gZGVmYXVsdCB2YWx1ZSBwcm92aWRlZCBmb3IgIiArIG5hbWUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY29tYmluZWQub3JkZXJLZXlzQnkoT3JkZXJpbmcubmF0dXJhbCgpKS5idWlsZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgaW5qZWN0QWxsKE9iamVjdCBiZW5jaG1hcmssIE1hcDxTdHJpbmcsIFN0cmluZz4gYWN0dWFsVmFsdWVzKSB7CisgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW1ldGVyIDogbWFwLnZhbHVlcygpKSB7CisgICAgICBTdHJpbmcgdmFsdWUgPSBhY3R1YWxWYWx1ZXMuZ2V0KHBhcmFtZXRlci5uYW1lKCkpOworICAgICAgcGFyYW1ldGVyLmluamVjdChiZW5jaG1hcmssIHZhbHVlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1BsYXRmb3JtTW9kdWxlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9QbGF0Zm9ybU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjE5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9QbGF0Zm9ybU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5QbGF0Zm9ybTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uZGFsdmlrLkRhbHZpa01vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uZGFsdmlrLkRhbHZpa1BsYXRmb3JtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5qdm0uSnZtTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5qdm0uSnZtUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PcHRpb25hbDsKKworaW1wb3J0IGRhZ2dlci5Nb2R1bGU7CitpbXBvcnQgZGFnZ2VyLlByb3ZpZGVzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCisvKioKKyAqIFByb3ZpZGVyIG9mIGEge0BsaW5rIFBsYXRmb3JtfSBpbnN0YW5jZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCisgKi8KK0BNb2R1bGUoaW5jbHVkZXMgPSB7SnZtTW9kdWxlLmNsYXNzLCBEYWx2aWtNb2R1bGUuY2xhc3N9KQorcHVibGljIGZpbmFsIGNsYXNzIFBsYXRmb3JtTW9kdWxlIHsKKworICAvKioKKyAgICogQ2hvb3NlcyB0aGUge0BsaW5rIERhbHZpa1BsYXRmb3JtfSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2VzIHRoZSBkZWZhdWx0CisgICAqIHtAbGluayBKdm1QbGF0Zm9ybX0uCisgICAqLworICBAUHJvdmlkZXMKKyAgc3RhdGljIFBsYXRmb3JtIHByb3ZpZGVQbGF0Zm9ybSgKKyAgICAgIE9wdGlvbmFsPERhbHZpa1BsYXRmb3JtPiBvcHRpb25hbERhbHZpa1BsYXRmb3JtLAorICAgICAgUHJvdmlkZXI8SnZtUGxhdGZvcm0+IGp2bVBsYXRmb3JtUHJvdmlkZXIpIHsKKyAgICBpZiAob3B0aW9uYWxEYWx2aWtQbGF0Zm9ybS5pc1ByZXNlbnQoKSkgeworICAgICAgcmV0dXJuIG9wdGlvbmFsRGFsdmlrUGxhdGZvcm0uZ2V0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBqdm1QbGF0Zm9ybVByb3ZpZGVyLmdldCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUHJveHlXb3JrZXJFeGNlcHRpb24uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1Byb3h5V29ya2VyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4MTRkMAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1Byb3h5V29ya2VyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKKworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiBjcmVhdGVkIG9uIHRoZSBydW5uZXIgd2l0aCB0aGUgc2FtZSBzdGFjayB0cmFjZSBhcyBvbmUgdGhyb3duIG9uIHRoZSB3b3JrZXIgdGhhdAorICogcmVwb3J0cyB0aGUgYWN0dWFsIGV4Y2VwdGlvbiBjbGFzcyBhbmQgbWVzc2FnZSBpbiBpdHMgbWVzc2FnZS4KKyAqLworZmluYWwgY2xhc3MgUHJveHlXb3JrZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgUHJveHlXb3JrZXJFeGNlcHRpb24oU3RyaW5nIHN0YWNrVHJhY2UpIHsKKyAgICBzdXBlcihmb3JtYXRNZXNzc2FnZShzdGFja1RyYWNlKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0TWVzc3NhZ2UoU3RyaW5nIHN0YWNrVHJhY2UpIHsKKyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihzdGFja1RyYWNlLmxlbmd0aCgpICsgNTEyKQorICAgICAgICAuYXBwZW5kKCJBbiBleGNlcHRpb24gb2NjdXJyZWQgaW4gYSB3b3JrZXIgcHJvY2Vzcy4gIFRoZSBzdGFjayB0cmFjZSBpcyBhcyBmb2xsb3dzOlxuXHQiKTsKKyAgICBKb2luZXIub24oIlxuXHQiKS5hcHBlbmRUbyhidWlsZGVyLCBTcGxpdHRlci5vbignXG4nKS5zcGxpdChzdGFja1RyYWNlKSk7CisgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUmVzdWx0UHJvY2Vzc29yQ3JlYXRvci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUmVzdWx0UHJvY2Vzc29yQ3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjc4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9SZXN1bHRQcm9jZXNzb3JDcmVhdG9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5SZXN1bHRQcm9jZXNzb3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGNvbmZpZ3VyZWQge0BsaW5rIFJlc3VsdFByb2Nlc3Nvcn0uCisgKi8KK2ZpbmFsIGNsYXNzIFJlc3VsdFByb2Nlc3NvckNyZWF0b3IgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1BVQkxJQ19ERUZBVUxUX0NPTlNUUlVDVE9SID0KKyAgICAgICJSZXN1bHRQcm9jZXNzb3IgJXMgbm90IHN1cHBvcnRlZCBhcyBpdCBkb2VzIG5vdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IiOworCisgIHByaXZhdGUgUmVzdWx0UHJvY2Vzc29yQ3JlYXRvcigpIHsKKyAgfQorCisgIHN0YXRpYyBSZXN1bHRQcm9jZXNzb3IgY3JlYXRlUmVzdWx0UHJvY2Vzc29yKENsYXNzPD8gZXh0ZW5kcyBSZXN1bHRQcm9jZXNzb3I+IHByb2Nlc3NvckNsYXNzKSB7CisgICAgUmVzdWx0UHJvY2Vzc29yIHJlc3VsdFByb2Nlc3NvcjsKKworICAgIHRyeSB7CisgICAgICBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgUmVzdWx0UHJvY2Vzc29yPiBjb25zdHJ1Y3RvciA9IHByb2Nlc3NvckNsYXNzLmdldENvbnN0cnVjdG9yKCk7CisgICAgICByZXN1bHRQcm9jZXNzb3IgPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgpOworICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVXNlckNvZGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdChOT19QVUJMSUNfREVGQVVMVF9DT05TVFJVQ1RPUiwgcHJvY2Vzc29yQ2xhc3MpLCBlKTsKKyAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBVc2VyQ29kZUV4Y2VwdGlvbigiUmVzdWx0UHJvY2Vzc29yICVzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQiLCBlLmdldENhdXNlKCkpOworICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFVzZXJDb2RlRXhjZXB0aW9uKCJSZXN1bHRQcm9jZXNzb3IgJXMgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCIsIGUpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFVzZXJDb2RlRXhjZXB0aW9uKCJSZXN1bHRQcm9jZXNzb3IgJXMgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCIsIGUpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHRQcm9jZXNzb3I7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1Jlc3VsdHNVcGxvYWRlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUmVzdWx0c1VwbG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2NTRkNQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1Jlc3VsdHNVcGxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwuU0VWRVJFOworaW1wb3J0IHN0YXRpYyBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYXBpLlJlc3VsdFByb2Nlc3NvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLkludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuUmVzdWx0UHJvY2Vzc29yQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5UcmlhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9wdGlvbmFsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CisKK2ltcG9ydCBjb20uc3VuLmplcnNleS5hcGkuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBjb20uc3VuLmplcnNleS5hcGkuY2xpZW50LkNsaWVudEhhbmRsZXJFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi5qZXJzZXkuYXBpLmNsaWVudC5Vbmlmb3JtSW50ZXJmYWNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4uamVyc2V5LmFwaS5jbGllbnQuV2ViUmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiB7QGxpbmsgUmVzdWx0UHJvY2Vzc29yfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVwbG9hZHMgdGhlIEpTT04tc2VyaWFsaXplZCByZXN1bHRzIHRvIHRoZSBDYWxpcGVyCisgKiB3ZWJhcHAuCisgKi8KK2Fic3RyYWN0IGNsYXNzIFJlc3VsdHNVcGxvYWRlciBpbXBsZW1lbnRzIFJlc3VsdFByb2Nlc3NvciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlc3VsdHNVcGxvYWRlci5jbGFzcy5nZXROYW1lKCkpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVF9QQVRIID0gIi9kYXRhL3RyaWFscyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRTX1BBVEhfUEFUVEVSTiA9ICIvcnVucy8lcyI7CisKKyAgcHJpdmF0ZSBmaW5hbCBQcmludFdyaXRlciBzdGRvdXQ7CisgIHByaXZhdGUgZmluYWwgQ2xpZW50IGNsaWVudDsKKyAgcHJpdmF0ZSBmaW5hbCBHc29uIGdzb247CisgIHByaXZhdGUgZmluYWwgT3B0aW9uYWw8VVVJRD4gYXBpS2V5OworICBwcml2YXRlIGZpbmFsIE9wdGlvbmFsPFVSST4gdXBsb2FkVXJpOworICBwcml2YXRlIE9wdGlvbmFsPFVVSUQ+IHJ1bklkID0gT3B0aW9uYWwuYWJzZW50KCk7CisgIHByaXZhdGUgYm9vbGVhbiBmYWlsdXJlID0gZmFsc2U7CisKKyAgUmVzdWx0c1VwbG9hZGVyKFByaW50V3JpdGVyIHN0ZG91dCwgR3NvbiBnc29uLCBDbGllbnQgY2xpZW50LAorICAgICAgUmVzdWx0UHJvY2Vzc29yQ29uZmlnIHJlc3VsdFByb2Nlc3NvckNvbmZpZykgdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICB0aGlzLnN0ZG91dCA9IHN0ZG91dDsKKyAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICB0aGlzLmdzb24gPSBnc29uOworICAgIEBOdWxsYWJsZSBTdHJpbmcgYXBpS2V5U3RyaW5nID0gcmVzdWx0UHJvY2Vzc29yQ29uZmlnLm9wdGlvbnMoKS5nZXQoImtleSIpOworICAgIE9wdGlvbmFsPFVVSUQ+IGFwaUtleSA9IE9wdGlvbmFsLmFic2VudCgpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoYXBpS2V5U3RyaW5nKSkgeworICAgICAgbG9nZ2VyLmluZm8oIk5vIGFwaSBrZXkgc3BlY2lmaWVkLiBVcGxvYWRpbmcgcmVzdWx0cyBhbm9ueW1vdXNseS4iKTsKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHsKKyAgICAgICAgYXBpS2V5ID0gT3B0aW9uYWwub2YoVVVJRC5mcm9tU3RyaW5nKGFwaUtleVN0cmluZykpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiVGhlIHNwZWNpZmllZCBBUEkga2V5ICglcykgaXMgbm90IHZhbGlkLiBBUEkga2V5cyBhcmUgVVVJRHMgYW5kIHNob3VsZCBsb29rIGxpa2UgJXMuIiwKKyAgICAgICAgICAgICAgICBhcGlLZXlTdHJpbmcsIG5ldyBVVUlEKDBMLCAgMEwpKSk7CisgICAgICB9CisgICAgfQorICAgIHRoaXMuYXBpS2V5ID0gYXBpS2V5OworCisgICAgQE51bGxhYmxlIFN0cmluZyB1cmxTdHJpbmcgPSByZXN1bHRQcm9jZXNzb3JDb25maWcub3B0aW9ucygpLmdldCgidXJsIik7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eSh1cmxTdHJpbmcpKSB7CisgICAgICBsb2dnZXIuaW5mbygiTm8gdXBsb2FkIFVSTCB3YXMgc3BlY2lmaWVkLiBSZXN1bHRzIHdpbGwgbm90IGJlIHVwbG9hZGVkLiIpOworICAgICAgdGhpcy51cGxvYWRVcmkgPSBPcHRpb25hbC5hYnNlbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy51cGxvYWRVcmkgPSBPcHRpb25hbC5vZihuZXcgVVJJKHVybFN0cmluZykucmVzb2x2ZShQT1NUX1BBVEgpKTsKKyAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbih1cmxTdHJpbmcgKyAiIGlzIGFuIGludmFsaWQgdXBsb2FkIHVybCIsIGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgZmluYWwgdm9pZCBwcm9jZXNzVHJpYWwoVHJpYWwgdHJpYWwpIHsKKyAgICBpZiAodXBsb2FkVXJpLmlzUHJlc2VudCgpKSB7CisgICAgICBXZWJSZXNvdXJjZSByZXNvdXJjZSA9IGNsaWVudC5yZXNvdXJjZSh1cGxvYWRVcmkuZ2V0KCkpOworICAgICAgaWYgKGFwaUtleS5pc1ByZXNlbnQoKSkgeworICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlLnF1ZXJ5UGFyYW0oImtleSIsIGFwaUtleS5nZXQoKS50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIGJvb2xlYW4gdGhyZXcgPSB0cnVlOworICAgICAgdHJ5IHsKKyAgICAgICAgLy8gVE9ETyhnYWspOiBtYWtlIHRoZSBqc29uIHBhcnQgaGFwcGVuIGF1dG9tYWdpY2FsbHkKKyAgICAgICAgcmVzb3VyY2UudHlwZShBUFBMSUNBVElPTl9KU09OX1RZUEUpLnBvc3QoZ3Nvbi50b0pzb24oSW1tdXRhYmxlTGlzdC5vZih0cmlhbCkpKTsKKyAgICAgICAgLy8gb25seSBzZXQgdGhlIHJ1biBpZCBpZiBhIHJlc3VsdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXBsb2FkZWQKKyAgICAgICAgcnVuSWQgPSBPcHRpb25hbC5vZih0cmlhbC5ydW4oKS5pZCgpKTsKKyAgICAgICAgdGhyZXcgPSBmYWxzZTsKKyAgICAgIH0gY2F0Y2ggKENsaWVudEhhbmRsZXJFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dVcGxvYWRGYWlsdXJlKHRyaWFsLCBlKTsKKyAgICAgIH0gY2F0Y2ggKFVuaWZvcm1JbnRlcmZhY2VFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dVcGxvYWRGYWlsdXJlKHRyaWFsLCBlKTsKKyAgICAgICAgbG9nZ2VyLmZpbmUoIkZhaWxlZCB1cGxvYWQgcmVzcG9uc2U6ICIgKyBlLmdldFJlc3BvbnNlKCkuZ2V0U3RhdHVzKCkpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgZmFpbHVyZSB8PSB0aHJldzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1VwbG9hZEZhaWx1cmUoVHJpYWwgdHJpYWwsIEV4Y2VwdGlvbiBlKSB7CisgICAgbG9nZ2VyLmxvZyhTRVZFUkUsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICJDb3VsZCBub3QgdXBsb2FkIHRyaWFsICVzLiBDb25zaWRlciB1cGxvYWRpbmcgaXQgbWFudWFsbHkuIiwgdHJpYWwuaWQoKSksIGUpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBmaW5hbCB2b2lkIGNsb3NlKCkgeworICAgIGlmICh1cGxvYWRVcmkuaXNQcmVzZW50KCkpIHsKKyAgICAgIGlmIChydW5JZC5pc1ByZXNlbnQoKSkgeworICAgICAgICBzdGRvdXQucHJpbnRmKCJSZXN1bHRzIGhhdmUgYmVlbiB1cGxvYWRlZC4gVmlldyB0aGVtIGF0OiAlcyVuIiwKKyAgICAgICAgICAgIHVwbG9hZFVyaS5nZXQoKS5yZXNvbHZlKFN0cmluZy5mb3JtYXQoUkVTVUxUU19QQVRIX1BBVFRFUk4sIHJ1bklkLmdldCgpKSkpOworICAgICAgfQorICAgICAgaWYgKGZhaWx1cmUpIHsKKyAgICAgICAgLy8gVE9ETyhnYWspOiBpbXBsZW1lbnQgc29tZSByZXRyeQorICAgICAgICBzdGRvdXQucHJpbnRsbigiU29tZSB0cmlhbHMgZmFpbGVkIHRvIHVwbG9hZC4gQ29uc2lkZXIgdXBsb2FkaW5nIHRoZW0gbWFudWFsbHkuIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxvZ2dlci5maW5lKCJObyB1cGxvYWQgVVJMIHdhcyBwcm92aWRlZCwgc28gcmVzdWx0cyB3ZXJlIG5vdCB1cGxvYWRlZC4iKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bm5lck1vZHVsZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUnVubmVyTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1ZmIwMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bm5lck1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuQ2FsaXBlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLkludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuVm1Db25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlJ1bjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9ucy5DYWxpcGVyT3B0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKKworaW1wb3J0IG9yZy5qb2RhLnRpbWUuSW5zdGFudDsKKworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBBIERhZ2dlciBtb2R1bGUgdGhhdCBjb25maWd1cmVzIGJpbmRpbmdzIGNvbW1vbiB0byBhbGwge0BsaW5rIENhbGlwZXJSdW59IGltcGxlbWVudGF0aW9ucy4KKyAqLworLy8gVE9ETyhnYWspOiB0aHJvd2luZyBwcm92aWRlcnMgZm9yIGFsbCBvZiB0aGUgdGhpbmdzIHRoYXQgdGhyb3cKK0BNb2R1bGUKK2ZpbmFsIGNsYXNzIFJ1bm5lck1vZHVsZSB7CisgIEBQcm92aWRlcworICBzdGF0aWMgSW1tdXRhYmxlU2V0PFZpcnR1YWxNYWNoaW5lPiBwcm92aWRlVmlydHVhbE1hY2hpbmVzKAorICAgICAgQ2FsaXBlck9wdGlvbnMgb3B0aW9ucywKKyAgICAgIENhbGlwZXJDb25maWcgY29uZmlnLAorICAgICAgUGxhdGZvcm0gcGxhdGZvcm0pCisgICAgICB0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgIEltbXV0YWJsZVNldDxTdHJpbmc+IHZtTmFtZXMgPSBvcHRpb25zLnZtTmFtZXMoKTsKKyAgICBJbW11dGFibGVTZXQuQnVpbGRlcjxWaXJ0dWFsTWFjaGluZT4gYnVpbGRlciA9IEltbXV0YWJsZVNldC5idWlsZGVyKCk7CisgICAgaWYgKHZtTmFtZXMuaXNFbXB0eSgpKSB7CisgICAgICBidWlsZGVyLmFkZChuZXcgVmlydHVhbE1hY2hpbmUoImRlZmF1bHQiLCBjb25maWcuZ2V0RGVmYXVsdFZtQ29uZmlnKHBsYXRmb3JtKSkpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKFN0cmluZyB2bU5hbWUgOiB2bU5hbWVzKSB7CisgICAgICAgIFZtQ29uZmlnIHZtQ29uZmlnID0gY29uZmlnLmdldFZtQ29uZmlnKHBsYXRmb3JtLCB2bU5hbWUpOworICAgICAgICBidWlsZGVyLmFkZChuZXcgVmlydHVhbE1hY2hpbmUodm1OYW1lLCB2bUNvbmZpZykpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgQFByb3ZpZGVzCisgIHN0YXRpYyBJbnN0YW50IHByb3ZpZGVJbnN0YW50KCkgeworICAgIHJldHVybiBJbnN0YW50Lm5vdygpOworICB9CisKKyAgQFByb3ZpZGVzIHN0YXRpYyBDYWxpcGVyUnVuIHByb3ZpZGVDYWxpcGVyUnVuKEV4cGVyaW1lbnRpbmdDYWxpcGVyUnVuIGV4cGVyaW1lbnRpbmdDYWxpcGVyUnVuKSB7CisgICAgcmV0dXJuIGV4cGVyaW1lbnRpbmdDYWxpcGVyUnVuOworICB9CisKKyAgQFByb3ZpZGVzIEBTaW5nbGV0b24KKyAgc3RhdGljIFJ1biBwcm92aWRlUnVuKFVVSUQgdXVpZCwgQ2FsaXBlck9wdGlvbnMgY2FsaXBlck9wdGlvbnMsIEluc3RhbnQgc3RhcnRUaW1lKSB7CisgICAgcmV0dXJuIG5ldyBSdW4uQnVpbGRlcih1dWlkKS5sYWJlbChjYWxpcGVyT3B0aW9ucy5ydW5OYW1lKCkpLnN0YXJ0VGltZShzdGFydFRpbWUpLmJ1aWxkKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bm5pbmcuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bm5pbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmY0YzdlCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUnVubmluZy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIGFubm90YXRpb25zIGZvciBiaW5kaW5ncyBwZXJ0YWluaW5nIHRvIHRoZSBjdXJyZW50bHkgcnVubmluZyBleHBlcmltZW50LgorICovCitwdWJsaWMgY2xhc3MgUnVubmluZyB7CisgIHByaXZhdGUgUnVubmluZygpIHt9CisKKyAgQFJldGVudGlvbihSVU5USU1FKQorICBAVGFyZ2V0KHtGSUVMRCwgUEFSQU1FVEVSLCBNRVRIT0R9KQorICBAUXVhbGlmaWVyCisgIHB1YmxpYyBAaW50ZXJmYWNlIEJlbmNobWFyayB7fQorCisgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgQFRhcmdldCh7RklFTEQsIFBBUkFNRVRFUiwgTUVUSE9EfSkKKyAgQFF1YWxpZmllcgorICBwdWJsaWMgQGludGVyZmFjZSBCZW5jaG1hcmtNZXRob2Qge30KKworICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgIEBUYXJnZXQoe0ZJRUxELCBQQVJBTUVURVIsIE1FVEhPRH0pCisgIEBRdWFsaWZpZXIKKyAgcHVibGljIEBpbnRlcmZhY2UgQmVuY2htYXJrQ2xhc3Mge30KKworICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgIEBUYXJnZXQoe0ZJRUxELCBQQVJBTUVURVIsIE1FVEhPRH0pCisgIEBRdWFsaWZpZXIKKyAgcHVibGljIEBpbnRlcmZhY2UgQmVmb3JlRXhwZXJpbWVudE1ldGhvZHMge30KKworICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgIEBUYXJnZXQoe0ZJRUxELCBQQVJBTUVURVIsIE1FVEhPRH0pCisgIEBRdWFsaWZpZXIKKyAgcHVibGljIEBpbnRlcmZhY2UgQWZ0ZXJFeHBlcmltZW50TWV0aG9kcyB7fQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUnVudGltZUluc3RydW1lbnQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bnRpbWVJbnN0cnVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4N2RmZAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bnRpbWVJbnN0cnVtZW50LmphdmEKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5Db21tb25JbnN0cnVtZW50T3B0aW9ucy5HQ19CRUZPUkVfRUFDSF9PUFRJT047CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuQ29tbW9uSW5zdHJ1bWVudE9wdGlvbnMuTUFYX1dBUk1VUF9XQUxMX1RJTUVfT1BUSU9OOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLkNvbW1vbkluc3RydW1lbnRPcHRpb25zLk1FQVNVUkVNRU5UU19PUFRJT047CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuQ29tbW9uSW5zdHJ1bWVudE9wdGlvbnMuV0FSTVVQX09QVElPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuUmVmbGVjdGlvbi5nZXRBbm5vdGF0ZWRNZXRob2RzOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsLmlzU3RhdGljOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlcy5wcm9wYWdhdGVJZkluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTkFOT1NFQ09ORFM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuQWZ0ZXJSZXA7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5CZWZvcmVSZXA7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5NYWNyb2JlbmNobWFyazsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYXBpLlNraXBUaGlzU2NlbmFyaW9FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5BYnN0cmFjdExvZ01lc3NhZ2VWaXNpdG9yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuR2NMb2dNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuSG90c3BvdExvZ01lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5TdGFydE1lYXN1cmVtZW50TG9nTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLlN0b3BNZWFzdXJlbWVudExvZ01lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5QbGF0Zm9ybTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uU3VwcG9ydGVkUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuU2hvcnREdXJhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyLk1hY3JvYmVuY2htYXJrV29ya2VyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXIuUnVudGltZVdvcmtlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyLldvcmtlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0b3B3YXRjaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBUaGUgaW5zdHJ1bWVudCByZXNwb25zaWJsZSBmb3IgbWVhc3VyaW5nIHRoZSBydW50aW1lIG9mIHtAbGluayBCZW5jaG1hcmt9IG1ldGhvZHMuCisgKi8KK0BTdXBwb3J0ZWRQbGF0Zm9ybSh7UGxhdGZvcm0uVHlwZS5KVk0sIFBsYXRmb3JtLlR5cGUuREFMVklLfSkKK2NsYXNzIFJ1bnRpbWVJbnN0cnVtZW50IGV4dGVuZHMgSW5zdHJ1bWVudCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUdHRVNUX0dSQU5VTEFSSVRZX09QVElPTiA9ICJzdWdnZXN0R3JhbnVsYXJpdHkiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNSU5HX0lOVEVSVkFMX09QVElPTiA9ICJ0aW1pbmdJbnRlcnZhbCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUllfUlVOX1JFUFMgPSAxOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJ1bnRpbWVJbnN0cnVtZW50LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgcHJpdmF0ZSBmaW5hbCBTaG9ydER1cmF0aW9uIG5hbm9UaW1lR3JhbnVsYXJpdHk7CisKKyAgQEluamVjdAorICBSdW50aW1lSW5zdHJ1bWVudChATmFub1RpbWVHcmFudWxhcml0eSBTaG9ydER1cmF0aW9uIG5hbm9UaW1lR3JhbnVsYXJpdHkpIHsKKyAgICB0aGlzLm5hbm9UaW1lR3JhbnVsYXJpdHkgPSBuYW5vVGltZUdyYW51bGFyaXR5OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmVuY2htYXJrTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICByZXR1cm4gbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoQmVuY2htYXJrLmNsYXNzKQorICAgICAgICB8fCBCZW5jaG1hcmtNZXRob2RzLmlzVGltZU1ldGhvZChtZXRob2QpCisgICAgICAgIHx8IG1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KE1hY3JvYmVuY2htYXJrLmNsYXNzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgSW1tdXRhYmxlU2V0PFN0cmluZz4gaW5zdHJ1bWVudE9wdGlvbnMoKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZigKKyAgICAgICAgV0FSTVVQX09QVElPTiwgTUFYX1dBUk1VUF9XQUxMX1RJTUVfT1BUSU9OLCBUSU1JTkdfSU5URVJWQUxfT1BUSU9OLCBNRUFTVVJFTUVOVFNfT1BUSU9OLAorICAgICAgICBHQ19CRUZPUkVfRUFDSF9PUFRJT04sIFNVR0dFU1RfR1JBTlVMQVJJVFlfT1BUSU9OKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSW5zdHJ1bWVudGF0aW9uIGNyZWF0ZUluc3RydW1lbnRhdGlvbihNZXRob2QgYmVuY2htYXJrTWV0aG9kKQorICAgICAgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24geworICAgIGNoZWNrTm90TnVsbChiZW5jaG1hcmtNZXRob2QpOworICAgIGNoZWNrQXJndW1lbnQoaXNCZW5jaG1hcmtNZXRob2QoYmVuY2htYXJrTWV0aG9kKSk7CisgICAgaWYgKGlzU3RhdGljKGJlbmNobWFya01ldGhvZCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uKCJCZW5jaG1hcmsgbWV0aG9kcyBtdXN0IG5vdCBiZSBzdGF0aWM6ICVzIiwKKyAgICAgICAgICBiZW5jaG1hcmtNZXRob2QuZ2V0TmFtZSgpKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHN3aXRjaCAoQmVuY2htYXJrTWV0aG9kcy5UeXBlLm9mKGJlbmNobWFya01ldGhvZCkpIHsKKyAgICAgICAgY2FzZSBNQUNSTzoKKyAgICAgICAgICByZXR1cm4gbmV3IE1hY3JvYmVuY2htYXJrSW5zdHJ1bWVudGF0aW9uKGJlbmNobWFya01ldGhvZCk7CisgICAgICAgIGNhc2UgTUlDUk86CisgICAgICAgICAgcmV0dXJuIG5ldyBNaWNyb2JlbmNobWFya0luc3RydW1lbnRhdGlvbihiZW5jaG1hcmtNZXRob2QpOworICAgICAgICBjYXNlIFBJQ086CisgICAgICAgICAgcmV0dXJuIG5ldyBQaWNvYmVuY2htYXJrSW5zdHJ1bWVudGF0aW9uKGJlbmNobWFya01ldGhvZCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJ1bmtub3duIHR5cGUiKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24oIkJlbmNobWFyayBtZXRob2RzIG11c3QgaGF2ZSBubyBhcmd1bWVudHMgb3IgYWNjZXB0ICIKKyAgICAgICAgICArICJhIHNpbmdsZSBpbnQgb3IgbG9uZyBwYXJhbWV0ZXI6ICVzIiwgYmVuY2htYXJrTWV0aG9kLmdldE5hbWUoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBNYWNyb2JlbmNobWFya0luc3RydW1lbnRhdGlvbiBleHRlbmRzIEluc3RydW1lbnRhdGlvbiB7CisgICAgTWFjcm9iZW5jaG1hcmtJbnN0cnVtZW50YXRpb24oTWV0aG9kIGJlbmNobWFya01ldGhvZCkgeworICAgICAgc3VwZXIoYmVuY2htYXJrTWV0aG9kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcnlSdW4oT2JqZWN0IGJlbmNobWFyaykgdGhyb3dzIFVzZXJDb2RlRXhjZXB0aW9uIHsKKyAgICAgIEltbXV0YWJsZVNldDxNZXRob2Q+IGJlZm9yZVJlcE1ldGhvZHMgPQorICAgICAgICAgIGdldEFubm90YXRlZE1ldGhvZHMoYmVuY2htYXJrTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksIEJlZm9yZVJlcC5jbGFzcyk7CisgICAgICBJbW11dGFibGVTZXQ8TWV0aG9kPiBhZnRlclJlcE1ldGhvZHMgPQorICAgICAgICAgIGdldEFubm90YXRlZE1ldGhvZHMoYmVuY2htYXJrTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksIEFmdGVyUmVwLmNsYXNzKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoTWV0aG9kIGJlZm9yZVJlcE1ldGhvZCA6IGJlZm9yZVJlcE1ldGhvZHMpIHsKKyAgICAgICAgICBiZWZvcmVSZXBNZXRob2QuaW52b2tlKGJlbmNobWFyayk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBiZW5jaG1hcmtNZXRob2QuaW52b2tlKGJlbmNobWFyayk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgZm9yIChNZXRob2QgYWZ0ZXJSZXBNZXRob2QgOiBhZnRlclJlcE1ldGhvZHMpIHsKKyAgICAgICAgICAgIGFmdGVyUmVwTWV0aG9kLmludm9rZShiZW5jaG1hcmspOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICBUaHJvd2FibGUgdXNlckV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgcHJvcGFnYXRlSWZJbnN0YW5jZU9mKHVzZXJFeGNlcHRpb24sIFNraXBUaGlzU2NlbmFyaW9FeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvdyBuZXcgVXNlckNvZGVFeGNlcHRpb24odXNlckV4Y2VwdGlvbik7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBXb3JrZXI+IHdvcmtlckNsYXNzKCkgeworICAgICAgcmV0dXJuIE1hY3JvYmVuY2htYXJrV29ya2VyLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIE1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IgZ2V0TWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvcigpIHsKKyAgICAgIHJldHVybiBuZXcgU2luZ2xlSW52b2NhdGlvbk1lYXN1cmVtZW50Q29sbGVjdG9yKAorICAgICAgICAgIEludGVnZXIucGFyc2VJbnQob3B0aW9ucy5nZXQoTUVBU1VSRU1FTlRTX09QVElPTikpLAorICAgICAgICAgIFNob3J0RHVyYXRpb24udmFsdWVPZihvcHRpb25zLmdldChXQVJNVVBfT1BUSU9OKSksCisgICAgICAgICAgU2hvcnREdXJhdGlvbi52YWx1ZU9mKG9wdGlvbnMuZ2V0KE1BWF9XQVJNVVBfV0FMTF9USU1FX09QVElPTikpLAorICAgICAgICAgIG5hbm9UaW1lR3JhbnVsYXJpdHkpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgVHJpYWxTY2hlZHVsaW5nUG9saWN5IHNjaGVkdWxpbmdQb2xpY3koKSB7CisgICAgLy8gUnVudGltZSBtZWFzdXJlbWVudHMgYXJlIGN1cnJlbnRseSBiZWxpZXZlZCB0byBiZSB0b28gc2Vuc2l0aXZlIHRvIHN5c3RlbSBwZXJmb3JtYW5jZSB0bworICAgIC8vIGFsbG93IHBhcmFsbGVsIHJ1bm5lcnMuCisgICAgLy8gVE9ETyhsdWtlcyk6IGludmVzdGlnYXRlIHRoaXMsIG9uIGEgbXVsdGljb3JlIHN5c3RlbSBpdCBzZWVtcyBsaWtlIHdlIHNob3VsZCBiZSBhYmxlIHRvCisgICAgLy8gYWxsb3cgc29tZSBwYXJhbGxlbGlzbSB3aXRob3V0IGNvcnJ1cHRpbmcgcmVzdWx0cy4KKyAgICByZXR1cm4gVHJpYWxTY2hlZHVsaW5nUG9saWN5LlNFUklBTDsKKyAgfQorCisgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgUnVudGltZUluc3RydW1lbnRhdGlvbiBleHRlbmRzIEluc3RydW1lbnRhdGlvbiB7CisgICAgUnVudGltZUluc3RydW1lbnRhdGlvbihNZXRob2QgbWV0aG9kKSB7CisgICAgICBzdXBlcihtZXRob2QpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBkcnlSdW4oT2JqZWN0IGJlbmNobWFyaykgdGhyb3dzIFVzZXJDb2RlRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGJlbmNobWFya01ldGhvZC5pbnZva2UoYmVuY2htYXJrLCBEUllfUlVOX1JFUFMpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpbXBvc3NpYmxlKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihpbXBvc3NpYmxlKTsKKyAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICBUaHJvd2FibGUgdXNlckV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgcHJvcGFnYXRlSWZJbnN0YW5jZU9mKHVzZXJFeGNlcHRpb24sIFNraXBUaGlzU2NlbmFyaW9FeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvdyBuZXcgVXNlckNvZGVFeGNlcHRpb24odXNlckV4Y2VwdGlvbik7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IHdvcmtlck9wdGlvbnMoKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgIFRJTUlOR19JTlRFUlZBTF9PUFRJT04gKyAiTmFub3MiLCB0b05hbm9zU3RyaW5nKFRJTUlOR19JTlRFUlZBTF9PUFRJT04pLAorICAgICAgICAgIEdDX0JFRk9SRV9FQUNIX09QVElPTiwgb3B0aW9ucy5nZXQoR0NfQkVGT1JFX0VBQ0hfT1BUSU9OKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9OYW5vc1N0cmluZyhTdHJpbmcgb3B0aW9uTmFtZSkgeworICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKAorICAgICAgICAgIFNob3J0RHVyYXRpb24udmFsdWVPZihvcHRpb25zLmdldChvcHRpb25OYW1lKSkudG8oTkFOT1NFQ09ORFMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciBnZXRNZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yKCkgeworICAgICAgcmV0dXJuIG5ldyBSZXBCYXNlZE1lYXN1cmVtZW50Q29sbGVjdG9yKAorICAgICAgICAgIGdldE1lYXN1cmVtZW50c1BlclRyaWFsKCksCisgICAgICAgICAgU2hvcnREdXJhdGlvbi52YWx1ZU9mKG9wdGlvbnMuZ2V0KFdBUk1VUF9PUFRJT04pKSwKKyAgICAgICAgICBTaG9ydER1cmF0aW9uLnZhbHVlT2Yob3B0aW9ucy5nZXQoTUFYX1dBUk1VUF9XQUxMX1RJTUVfT1BUSU9OKSksCisgICAgICAgICAgQm9vbGVhbi5wYXJzZUJvb2xlYW4ob3B0aW9ucy5nZXQoU1VHR0VTVF9HUkFOVUxBUklUWV9PUFRJT04pKSwKKyAgICAgICAgICBuYW5vVGltZUdyYW51bGFyaXR5KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNsYXNzIE1pY3JvYmVuY2htYXJrSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgUnVudGltZUluc3RydW1lbnRhdGlvbiB7CisgICAgTWljcm9iZW5jaG1hcmtJbnN0cnVtZW50YXRpb24oTWV0aG9kIGJlbmNobWFya01ldGhvZCkgeworICAgICAgc3VwZXIoYmVuY2htYXJrTWV0aG9kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBXb3JrZXI+IHdvcmtlckNsYXNzKCkgeworICAgICAgcmV0dXJuIFJ1bnRpbWVXb3JrZXIuTWljcm8uY2xhc3M7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBpbnQgZ2V0TWVhc3VyZW1lbnRzUGVyVHJpYWwoKSB7CisgICAgQE51bGxhYmxlCisgICAgU3RyaW5nIG1lYXN1cmVtZW50c1N0cmluZyA9IG9wdGlvbnMuZ2V0KE1FQVNVUkVNRU5UU19PUFRJT04pOworICAgIGludCBtZWFzdXJlbWVudHNQZXJUcmlhbCA9CisgICAgICAgIChtZWFzdXJlbWVudHNTdHJpbmcgPT0gbnVsbCkgPyAxIDogSW50ZWdlci5wYXJzZUludChtZWFzdXJlbWVudHNTdHJpbmcpOworICAgIC8vIFRPRE8oZ2FrKTogZmFpbCBmYXN0ZXIKKyAgICBjaGVja1N0YXRlKG1lYXN1cmVtZW50c1BlclRyaWFsID4gMCk7CisgICAgcmV0dXJuIG1lYXN1cmVtZW50c1BlclRyaWFsOworICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBQaWNvYmVuY2htYXJrSW5zdHJ1bWVudGF0aW9uIGV4dGVuZHMgUnVudGltZUluc3RydW1lbnRhdGlvbiB7CisgICAgUGljb2JlbmNobWFya0luc3RydW1lbnRhdGlvbihNZXRob2QgYmVuY2htYXJrTWV0aG9kKSB7CisgICAgICBzdXBlcihiZW5jaG1hcmtNZXRob2QpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIFdvcmtlcj4gd29ya2VyQ2xhc3MoKSB7CisgICAgICByZXR1cm4gUnVudGltZVdvcmtlci5QaWNvLmNsYXNzOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFJ1bnRpbWVNZWFzdXJlbWVudENvbGxlY3RvciBleHRlbmRzIEFic3RyYWN0TG9nTWVzc2FnZVZpc2l0b3IKKyAgICAgIGltcGxlbWVudHMgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciB7CisgICAgZmluYWwgaW50IHRhcmdldE1lYXN1cmVtZW50czsKKyAgICBmaW5hbCBTaG9ydER1cmF0aW9uIHdhcm11cDsKKyAgICBmaW5hbCBTaG9ydER1cmF0aW9uIG1heFdhcm11cFdhbGxUaW1lOworICAgIGZpbmFsIExpc3Q8TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIFNob3J0RHVyYXRpb24gZWxhcHNlZFdhcm11cCA9IFNob3J0RHVyYXRpb24uemVybygpOworICAgIGJvb2xlYW4gbWVhc3VyaW5nID0gZmFsc2U7CisgICAgYm9vbGVhbiBpbnZhbGlkYXRlTWVhc3VyZW1lbnRzID0gZmFsc2U7CisgICAgYm9vbGVhbiBub3RpZmllZEFib3V0R2MgPSBmYWxzZTsKKyAgICBib29sZWFuIG5vdGlmaWVkQWJvdXRKaXQgPSBmYWxzZTsKKyAgICBib29sZWFuIG5vdGlmaWVkQWJvdXRNZWFzdXJpbmdKaXQgPSBmYWxzZTsKKyAgICBTdG9wd2F0Y2ggdGltZVNpbmNlU3RhcnRPZlRyaWFsID0gU3RvcHdhdGNoLmNyZWF0ZVVuc3RhcnRlZCgpOworICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBtZXNzYWdlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZpbmFsIFNob3J0RHVyYXRpb24gbmFub1RpbWVHcmFudWxhcml0eTsKKworICAgIFJ1bnRpbWVNZWFzdXJlbWVudENvbGxlY3RvcigKKyAgICAgICAgaW50IHRhcmdldE1lYXN1cmVtZW50cywKKyAgICAgICAgU2hvcnREdXJhdGlvbiB3YXJtdXAsCisgICAgICAgIFNob3J0RHVyYXRpb24gbWF4V2FybXVwV2FsbFRpbWUsCisgICAgICAgIFNob3J0RHVyYXRpb24gbmFub1RpbWVHcmFudWxhcml0eSkgeworICAgICAgdGhpcy50YXJnZXRNZWFzdXJlbWVudHMgPSB0YXJnZXRNZWFzdXJlbWVudHM7CisgICAgICB0aGlzLndhcm11cCA9IHdhcm11cDsKKyAgICAgIHRoaXMubWF4V2FybXVwV2FsbFRpbWUgPSBtYXhXYXJtdXBXYWxsVGltZTsKKyAgICAgIHRoaXMubmFub1RpbWVHcmFudWxhcml0eSA9IG5hbm9UaW1lR3JhbnVsYXJpdHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoR2NMb2dNZXNzYWdlIGxvZ01lc3NhZ2UpIHsKKyAgICAgIGlmIChtZWFzdXJpbmcgJiYgaXNXYXJtdXBDb21wbGV0ZSgpICYmICFub3RpZmllZEFib3V0R2MpIHsKKyAgICAgICAgZ2NXaGlsZU1lYXN1cmluZygpOworICAgICAgICBub3RpZmllZEFib3V0R2MgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGFic3RyYWN0IHZvaWQgZ2NXaGlsZU1lYXN1cmluZygpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoSG90c3BvdExvZ01lc3NhZ2UgbG9nTWVzc2FnZSkgeworICAgICAgaWYgKGlzV2FybXVwQ29tcGxldGUoKSkgeworICAgICAgICBpZiAobWVhc3VyaW5nICYmIG5vdGlmaWVkQWJvdXRNZWFzdXJpbmdKaXQpIHsKKyAgICAgICAgICBob3RzcG90V2hpbGVNZWFzdXJpbmcoKTsKKyAgICAgICAgICBub3RpZmllZEFib3V0TWVhc3VyaW5nSml0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChub3RpZmllZEFib3V0Sml0KSB7CisgICAgICAgICAgaG90c3BvdFdoaWxlTm90TWVhc3VyaW5nKCk7CisgICAgICAgICAgbm90aWZpZWRBYm91dEppdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBhYnN0cmFjdCB2b2lkIGhvdHNwb3RXaGlsZU1lYXN1cmluZygpOworCisgICAgYWJzdHJhY3Qgdm9pZCBob3RzcG90V2hpbGVOb3RNZWFzdXJpbmcoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KFN0YXJ0TWVhc3VyZW1lbnRMb2dNZXNzYWdlIGxvZ01lc3NhZ2UpIHsKKyAgICAgIGNoZWNrU3RhdGUoIW1lYXN1cmluZyk7CisgICAgICBtZWFzdXJpbmcgPSB0cnVlOworICAgICAgaWYgKCF0aW1lU2luY2VTdGFydE9mVHJpYWwuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgdGltZVNpbmNlU3RhcnRPZlRyaWFsLnN0YXJ0KCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoU3RvcE1lYXN1cmVtZW50TG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7CisgICAgICBjaGVja1N0YXRlKG1lYXN1cmluZyk7CisgICAgICBJbW11dGFibGVMaXN0PE1lYXN1cmVtZW50PiBuZXdNZWFzdXJlbWVudHMgPSBsb2dNZXNzYWdlLm1lYXN1cmVtZW50cygpOworICAgICAgaWYgKCFpc1dhcm11cENvbXBsZXRlKCkpIHsKKyAgICAgICAgZm9yIChNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA6IG5ld01lYXN1cmVtZW50cykgeworICAgICAgICAgIC8vIFRPRE8oZ2FrKTogZXZlbnR1YWxseSB3ZSB3aWxsIG5lZWQgdG8gcmVzb2x2ZSBkaWZmZXJlbnQgdW5pdHMKKyAgICAgICAgICBjaGVja0FyZ3VtZW50KCJucyIuZXF1YWxzKG1lYXN1cmVtZW50LnZhbHVlKCkudW5pdCgpKSk7CisgICAgICAgICAgZWxhcHNlZFdhcm11cCA9IGVsYXBzZWRXYXJtdXAucGx1cygKKyAgICAgICAgICAgICAgU2hvcnREdXJhdGlvbi5vZihCaWdEZWNpbWFsLnZhbHVlT2YobWVhc3VyZW1lbnQudmFsdWUoKS5tYWduaXR1ZGUoKSksIE5BTk9TRUNPTkRTKSk7CisgICAgICAgICAgdmFsaWRhdGVNZWFzdXJlbWVudChtZWFzdXJlbWVudCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbWVhc3VyZWRXYXJtdXBEdXJhdGlvblJlYWNoZWQoKSkgeworICAgICAgICAgIG1lc3NhZ2VzLmFkZChTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAiV0FSTklORzogV2FybXVwIHdhcyBpbnRlcnJ1cHRlZCBiZWNhdXNlIGl0IHRvb2sgbG9uZ2VyIHRoYW4gJXMgb2Ygd2FsbC1jbG9jayB0aW1lLiAiCisgICAgICAgICAgICAgICAgICArICIlcyB3YXMgc3BlbnQgaW4gdGhlIGJlbmNobWFyayBtZXRob2QgZm9yIHdhcm11cCAiCisgICAgICAgICAgICAgICAgICArICIobm9ybWFsIHdhcm11cCBkdXJhdGlvbiBzaG91bGQgYmUgJXMpLiIsCisgICAgICAgICAgICAgIG1heFdhcm11cFdhbGxUaW1lLCBlbGFwc2VkV2FybXVwLCB3YXJtdXApKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnZhbGlkYXRlTWVhc3VyZW1lbnRzKSB7CisgICAgICAgICAgbG9nZ2VyLmZpbmUoU3RyaW5nLmZvcm1hdCgiRGlzY2FyZGluZyAlcyBhcyB0aGV5IHdlcmUgbWFya2VkIGludmFsaWQuIiwgbmV3TWVhc3VyZW1lbnRzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5tZWFzdXJlbWVudHMuYWRkQWxsKG5ld01lYXN1cmVtZW50cyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGludmFsaWRhdGVNZWFzdXJlbWVudHMgPSBmYWxzZTsKKyAgICAgIG1lYXN1cmluZyA9IGZhbHNlOworICAgIH0KKworICAgIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVNZWFzdXJlbWVudChNZWFzdXJlbWVudCBtZWFzdXJlbWVudCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW1tdXRhYmxlTGlzdDxNZWFzdXJlbWVudD4gZ2V0TWVhc3VyZW1lbnRzKCkgeworICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKG1lYXN1cmVtZW50cyk7CisgICAgfQorCisgICAgYm9vbGVhbiBtZWFzdXJlZFdhcm11cER1cmF0aW9uUmVhY2hlZCgpIHsKKyAgICAgIHJldHVybiBlbGFwc2VkV2FybXVwLmNvbXBhcmVUbyh3YXJtdXApID49IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXYXJtdXBDb21wbGV0ZSgpIHsKKyAgICAgIC8vIEZhc3QgbWFjcm8tYmVuY2htYXJrcyAodXAgdG8gdGVucyBvZiBtcykgbmVlZCBsb3RzIG9mIG1lYXN1cmVtZW50cyB0byByZWFjaCAxMHMgb2YKKyAgICAgIC8vIG1lYXN1cmVkIHdhcm11cCB0aW1lLiBCZWNhdXNlIG9mIHRoZSBwZXItbWVhc3VyZW1lbnQgb3ZlcmhlYWQgb2YgcnVubmluZyBAQmVmb3JlUmVwIGFuZAorICAgICAgLy8gQEFmdGVyUmVwLCB3YXJtdXAgY2FuIHRha2UgdmVyeSBsb25nLgorICAgICAgLy8KKyAgICAgIC8vIFRvIHByZXZlbnQgdGhpcywgd2UgZW5mb3JjZSBhIGNhcCBvbiB0aGUgd2FsbC1jbG9jayB0aW1lIGhlcmUuCisgICAgICByZXR1cm4gbWVhc3VyZWRXYXJtdXBEdXJhdGlvblJlYWNoZWQoKQorICAgICAgICAgIHx8IHRpbWVTaW5jZVN0YXJ0T2ZUcmlhbC5lbGFwc2VkKE1JTExJU0VDT05EUykgPiBtYXhXYXJtdXBXYWxsVGltZS50byhNSUxMSVNFQ09ORFMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZUNvbGxlY3RpbmcoKSB7CisgICAgICByZXR1cm4gbWVhc3VyZW1lbnRzLnNpemUoKSA+PSB0YXJnZXRNZWFzdXJlbWVudHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBnZXRNZXNzYWdlcygpIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVMaXN0LmNvcHlPZihtZXNzYWdlcyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVwQmFzZWRNZWFzdXJlbWVudENvbGxlY3RvciBleHRlbmRzIFJ1bnRpbWVNZWFzdXJlbWVudENvbGxlY3RvciB7CisgICAgZmluYWwgYm9vbGVhbiBzdWdnZXN0R3JhbnVsYXJpdHk7CisgICAgYm9vbGVhbiBub3RpZmllZEFib3V0R3JhbnVsYXJpdHkgPSBmYWxzZTsKKworICAgIFJlcEJhc2VkTWVhc3VyZW1lbnRDb2xsZWN0b3IoCisgICAgICAgIGludCBtZWFzdXJlbWVudHNQZXJUcmlhbCwKKyAgICAgICAgU2hvcnREdXJhdGlvbiB3YXJtdXAsCisgICAgICAgIFNob3J0RHVyYXRpb24gbWF4V2FybXVwV2FsbFRpbWUsCisgICAgICAgIGJvb2xlYW4gc3VnZ2VzdEdyYW51bGFyaXR5LAorICAgICAgICBTaG9ydER1cmF0aW9uIG5hbm9UaW1lR3JhbnVsYXJpdHkpIHsKKyAgICAgIHN1cGVyKG1lYXN1cmVtZW50c1BlclRyaWFsLCB3YXJtdXAsIG1heFdhcm11cFdhbGxUaW1lLCBuYW5vVGltZUdyYW51bGFyaXR5KTsKKyAgICAgIHRoaXMuc3VnZ2VzdEdyYW51bGFyaXR5ID0gc3VnZ2VzdEdyYW51bGFyaXR5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgZ2NXaGlsZU1lYXN1cmluZygpIHsKKyAgICAgIGludmFsaWRhdGVNZWFzdXJlbWVudHMgPSB0cnVlOworICAgICAgbWVzc2FnZXMuYWRkKCJFUlJPUjogR0Mgb2NjdXJyZWQgZHVyaW5nIHRpbWluZy4gTWVhc3VyZW1lbnRzIHdlcmUgZGlzY2FyZGVkLiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgaG90c3BvdFdoaWxlTWVhc3VyaW5nKCkgeworICAgICAgaW52YWxpZGF0ZU1lYXN1cmVtZW50cyA9IHRydWU7CisgICAgICBtZXNzYWdlcy5hZGQoCisgICAgICAgICAgIkVSUk9SOiBIb3RzcG90IGNvbXBpbGF0aW9uIG9jY3VycmVkIGR1cmluZyB0aW1pbmc6IHdhcm11cCBpcyBsaWtlbHkgaW5zdWZmaWNlbnQuICIKKyAgICAgICAgICAgICAgKyAiTWVhc3VyZW1lbnRzIHdlcmUgZGlzY2FyZGVkLiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgaG90c3BvdFdoaWxlTm90TWVhc3VyaW5nKCkgeworICAgICAgbWVzc2FnZXMuYWRkKAorICAgICAgICAgICJXQVJOSU5HOiBIb3RzcG90IGNvbXBpbGF0aW9uIG9jY3VycmVkIGFmdGVyIHdhcm11cCwgYnV0IG91dHNpZGUgb2YgdGltaW5nLiAiCisgICAgICAgICAgICAgICAgKyAiUmVzdWx0cyBtYXkgYmUgYWZmZWN0ZWQuIFJ1biB3aXRoIC0tdmVyYm9zZSB0byBzZWUgd2hpY2ggbWV0aG9kIHdhcyBjb21waWxlZC4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHZhbGlkYXRlTWVhc3VyZW1lbnQoTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQpIHsKKyAgICAgIGlmIChzdWdnZXN0R3JhbnVsYXJpdHkpIHsKKyAgICAgICAgZG91YmxlIG5hbm9zID0gbWVhc3VyZW1lbnQudmFsdWUoKS5tYWduaXR1ZGUoKSAvIG1lYXN1cmVtZW50LndlaWdodCgpOworICAgICAgICBpZiAoIW5vdGlmaWVkQWJvdXRHcmFudWxhcml0eSAmJiAoKG5hbm9zIC8gMTAwMCkgPiBuYW5vVGltZUdyYW51bGFyaXR5LnRvKE5BTk9TRUNPTkRTKSkpIHsKKyAgICAgICAgICBub3RpZmllZEFib3V0R3JhbnVsYXJpdHkgPSB0cnVlOworICAgICAgICAgIFNob3J0RHVyYXRpb24gcmVhc29uYWJsZVVwcGVyQm91bmQgPSBuYW5vVGltZUdyYW51bGFyaXR5LnRpbWVzKDEwMDApOworICAgICAgICAgIG1lc3NhZ2VzLmFkZChTdHJpbmcuZm9ybWF0KCJJTkZPOiBUaGlzIGV4cGVyaW1lbnQgZG9lcyBub3QgcmVxdWlyZSBhIG1pY3JvYmVuY2htYXJrLiAiCisgICAgICAgICAgICAgICsgIlRoZSBncmFudWxhcml0eSBvZiB0aGUgdGltZXIgKCVzKSBpcyBsZXNzIHRoYW4gMC4xJSUgb2YgdGhlIG1lYXN1cmVkIHJ1bnRpbWUuICIKKyAgICAgICAgICAgICAgKyAiSWYgYWxsIGV4cGVyaW1lbnRzIGZvciB0aGlzIGJlbmNobWFyayBoYXZlIHJ1bnRpbWVzIGdyZWF0ZXIgdGhhbiAlcywgIgorICAgICAgICAgICAgICArICJjb25zaWRlciB0aGUgbWFjcm9iZW5jaG1hcmsgaW5zdHJ1bWVudC4iLCBuYW5vVGltZUdyYW51bGFyaXR5LAorICAgICAgICAgICAgICByZWFzb25hYmxlVXBwZXJCb3VuZCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ2xlSW52b2NhdGlvbk1lYXN1cmVtZW50Q29sbGVjdG9yCisgICAgICBleHRlbmRzIFJ1bnRpbWVNZWFzdXJlbWVudENvbGxlY3RvciB7CisKKyAgICBTaW5nbGVJbnZvY2F0aW9uTWVhc3VyZW1lbnRDb2xsZWN0b3IoCisgICAgICAgIGludCBtZWFzdXJlbWVudHNQZXJUcmlhbCwKKyAgICAgICAgU2hvcnREdXJhdGlvbiB3YXJtdXAsCisgICAgICAgIFNob3J0RHVyYXRpb24gbWF4V2FybXVwV2FsbFRpbWUsCisgICAgICAgIFNob3J0RHVyYXRpb24gbmFub1RpbWVHcmFudWxhcml0eSkgeworICAgICAgc3VwZXIobWVhc3VyZW1lbnRzUGVyVHJpYWwsIHdhcm11cCwgbWF4V2FybXVwV2FsbFRpbWUsIG5hbm9UaW1lR3JhbnVsYXJpdHkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgZ2NXaGlsZU1lYXN1cmluZygpIHsKKyAgICAgIG1lc3NhZ2VzLmFkZCgiV0FSTklORzogR0Mgb2NjdXJyZWQgZHVyaW5nIHRpbWluZy4gIgorICAgICAgICAgICsgIkRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGJlbmNobWFyaywgdGhpcyBtaWdodCBzaWduaWZpY2FudGx5IGltcGFjdCByZXN1bHRzLiAiCisgICAgICAgICAgKyAiQ29uc2lkZXIgcnVubmluZyB3aXRoIGEgbGFyZ2VyIGhlYXAgc2l6ZS4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGhvdHNwb3RXaGlsZU1lYXN1cmluZygpIHsKKyAgICAgIG1lc3NhZ2VzLmFkZCgiV0FSTklORzogSG90c3BvdCBjb21waWxhdGlvbiBvY2N1cnJlZCBkdXJpbmcgdGltaW5nLiAiCisgICAgICAgICAgKyAiRGVwZW5kaW5nIG9uIHRoZSBzY29wZSBvZiB0aGUgYmVuY2htYXJrLCB0aGlzIG1pZ2h0IHNpZ25pZmljYW50bHkgaW1wYWN0IHJlc3VsdHMuICIKKyAgICAgICAgICArICJDb25zaWRlciBydW5uaW5nIHdpdGggYSBsb25nZXIgd2FybXVwLiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgaG90c3BvdFdoaWxlTm90TWVhc3VyaW5nKCkgeworICAgICAgbWVzc2FnZXMuYWRkKAorICAgICAgICAgICJXQVJOSU5HOiBIb3RzcG90IGNvbXBpbGF0aW9uIG9jY3VycmVkIGFmdGVyIHdhcm11cCwgYnV0IG91dHNpZGUgb2YgdGltaW5nLiAiCisgICAgICAgICAgICAgICsgIkRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGJlbmNobWFyaywgdGhpcyBtaWdodCBzaWduaWZpY2FudGx5IGltcGFjdCByZXN1bHRzLiAiCisgICAgICAgICAgICAgICsgIkNvbnNpZGVyIHJ1bm5pbmcgd2l0aCBhIGxvbmdlciB3YXJtdXAuIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB2YWxpZGF0ZU1lYXN1cmVtZW50KE1lYXN1cmVtZW50IG1lYXN1cmVtZW50KSB7CisgICAgICBkb3VibGUgbmFub3MgPSBtZWFzdXJlbWVudC52YWx1ZSgpLm1hZ25pdHVkZSgpIC8gbWVhc3VyZW1lbnQud2VpZ2h0KCk7CisgICAgICBpZiAoKG5hbm9zIC8gMTAwMCkgPCBuYW5vVGltZUdyYW51bGFyaXR5LnRvKE5BTk9TRUNPTkRTKSkgeworICAgICAgICBTaG9ydER1cmF0aW9uIHJ1bnRpbWUgPSBTaG9ydER1cmF0aW9uLm9mKEJpZ0RlY2ltYWwudmFsdWVPZihuYW5vcyksIE5BTk9TRUNPTkRTKTsKKyAgICAgICAgdGhyb3cgbmV3IFRyaWFsRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIlRoaXMgZXhwZXJpbWVudCByZXF1aXJlcyBhIG1pY3JvYmVuY2htYXJrLiAiCisgICAgICAgICAgICArICJUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHRpbWVyICglcykgIgorICAgICAgICAgICAgKyAiaXMgZ3JlYXRlciB0aGFuIDAuMSUlIG9mIHRoZSBtZWFzdXJlZCBydW50aW1lICglcykuICIKKyAgICAgICAgICAgICsgIlVzZSB0aGUgbWljcm9iZW5jaG1hcmsgaW5zdHJ1bWVudCBmb3IgYWNjdXJhdGUgbWVhc3VyZW1lbnRzLiIsCisgICAgICAgICAgICBuYW5vVGltZUdyYW51bGFyaXR5LCBydW50aW1lKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bnRpbWVTaHV0ZG93bkhvb2tSZWdpc3RyYXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bnRpbWVTaHV0ZG93bkhvb2tSZWdpc3RyYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FlYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUnVudGltZVNodXRkb3duSG9va1JlZ2lzdHJhci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKKy8qKgorICogQSB7QGxpbmsgU2h1dGRvd25Ib29rUmVnaXN0cmFyfSB0aGF0IGRlbGVnYXRlcyB0byB7QGxpbmsgUnVudGltZX0uCisgKi8KK2NsYXNzIFJ1bnRpbWVTaHV0ZG93bkhvb2tSZWdpc3RyYXIgaW1wbGVtZW50cyBTaHV0ZG93bkhvb2tSZWdpc3RyYXIgeworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgYWRkU2h1dGRvd25Ib29rKFRocmVhZCBob29rKSB7CisgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKGhvb2spOworICB9CisgIAorICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gcmVtb3ZlU2h1dGRvd25Ib29rKFRocmVhZCBob29rKSB7CisgICAgcmV0dXJuIFJ1bnRpbWUuZ2V0UnVudGltZSgpLnJlbW92ZVNodXRkb3duSG9vayhob29rKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU2NoZWR1bGVkVHJpYWwuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1NjaGVkdWxlZFRyaWFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhNjk2YgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1NjaGVkdWxlZFRyaWFsLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBBIFNjaGVkdWxlZFRyaWFsIGlzIGEgc2ltcGxlIHBhaXIgb2YgYSB7QGxpbmsgVHJpYWxSdW5Mb29wfSBhbmQgYSAKKyAqIHtAbGluayBUcmlhbFNjaGVkdWxpbmdQb2xpY3l9LgorICovCitAVHJpYWxTY29wZWQgZmluYWwgY2xhc3MgU2NoZWR1bGVkVHJpYWwgeworICBwcml2YXRlIGZpbmFsIFRyaWFsUnVuTG9vcCBydW5Mb29wOworICBwcml2YXRlIGZpbmFsIEV4cGVyaW1lbnQgZXhwZXJpbWVudDsKKyAgcHJpdmF0ZSBmaW5hbCBUcmlhbFNjaGVkdWxpbmdQb2xpY3kgcG9saWN5OworCisgIEBJbmplY3QgU2NoZWR1bGVkVHJpYWwoRXhwZXJpbWVudCBleHBlcmltZW50LCBUcmlhbFJ1bkxvb3AgcnVuTG9vcCwgCisgICAgICBUcmlhbFNjaGVkdWxpbmdQb2xpY3kgcG9saWN5KSB7CisgICAgdGhpcy5ydW5Mb29wID0gcnVuTG9vcDsKKyAgICB0aGlzLmV4cGVyaW1lbnQgPSBleHBlcmltZW50OworICAgIHRoaXMucG9saWN5ID0gcG9saWN5OworICB9CisgIAorICBUcmlhbFNjaGVkdWxpbmdQb2xpY3kgcG9saWN5KCkgeworICAgIHJldHVybiBwb2xpY3k7CisgIH0KKyAgCisgIEV4cGVyaW1lbnQgZXhwZXJpbWVudCgpIHsKKyAgICByZXR1cm4gZXhwZXJpbWVudDsKKyAgfQorICAKKyAgQ2FsbGFibGU8VHJpYWxSZXN1bHQ+IHRyaWFsVGFzaygpIHsKKyAgICByZXR1cm4gcnVuTG9vcDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU2VydmVyU29ja2V0U2VydmljZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU2VydmVyU29ja2V0U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTNkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9TZXJ2ZXJTb2NrZXRTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLk9wZW5lZFNvY2tldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLlN0YXJ0dXBBbm5vdW5jZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdXBwbGllcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RXhlY3V0aW9uVGhyZWFkU2VydmljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuU2VydmljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuU2V0dGFibGVGdXR1cmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuR3VhcmRlZEJ5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBBIHtAbGluayBTZXJ2aWNlfSB0aGF0IG1hbmFnZXMgYSB7QGxpbmsgU2VydmVyU29ja2V0fS4KKyAqCisgKiA8cD4gVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIHR3byBwaWVjZXMgb2YgZnVuY3Rpb25hbGl0eToKKyAqIDxvbD4KKyAqICAgPGxpPkl0IGFkYXB0cyB7QGxpbmsgU2VydmVyU29ja2V0I2FjY2VwdCgpfSB0byBhIHtAbGluayBMaXN0ZW5hYmxlRnV0dXJlfSBvZiBhbiBvcGVuZWQgc29ja2V0LgorICogICA8bGk+SXQgZGVtdWx0aXBsZXhlcyBpbmNvbWluZyBjb25uZWN0aW9ucyBiYXNlZCBvbiBhIHtAbGluayBTdGFydHVwQW5ub3VuY2VNZXNzYWdlfSB0aGF0IGlzCisgKiAgICAgICBzZW50IG92ZXIgdGhlIHNvY2tldC4KKyAqIDwvb2w+CisgKgorICogPHA+VGhlIHtAbGlua3BsYWluIFN0YXRlIHN0YXRlc30gb2YgdGhpcyBzZXJ2aWNlIGFyZSBhcyBmb2xsb3dzOgorICogPHVsPgorICogICA8bGk+e0BsaW5rcGxhaW4gU3RhdGUjTkVXIE5FV30gOiBJZGxlIHN0YXRlLCB0aGUge0BsaW5rIFNlcnZlclNvY2tldH0gaXMgbm90IG9wZW4geWV0LgorICogICA8bGk+e0BsaW5rcGxhaW4gU3RhdGUjU1RBUlRJTkcgU1RBUlRJTkd9IDoge0BsaW5rIFNlcnZlclNvY2tldH0gaXMgb3BlbmVkCisgKiAgIDxsaT57QGxpbmtwbGFpbiBTdGF0ZSNSVU5OSU5HIFJVTk5JTkd9IDogV2UgYXJlIGNvbnRpbnVvdXNseSBhY2NlcHRpbmcgYW5kIHBhcnNpbmcgY29ubmVjdGlvbnMKKyAqICAgICAgIGZyb20gdGhlIHNvY2tldC4KKyAqICAgPGxpPntAbGlua3BsYWluIFN0YXRlI1NUT1BQSU5HIFNUT1BQSU5HfSA6IFRoZSBzZXJ2ZXIgc29ja2V0IGlzIGNsb3NpbmcgYW5kIGFsbCBwZW5kaW5nCisgKiAgICAgICBjb25uZWN0aW9uIHJlcXVlc3RzIGFyZSB0ZXJtaW5hdGVkLCBjb25uZWN0aW9uIHJlcXVlc3RzIHdpbGwgZmFpbCBpbW1lZGlhdGVseS4KKyAqICAgPGxpPntAbGlua3BsYWluIFN0YXRlI1RFUk1JTkFURUQgVEVSTUlOQVRFRH0gOiBJZGxlIHN0YXRlLCB0aGUgc29ja2V0IGlzIGNsb3NlZC4KKyAqICAgPGxpPntAbGlua3BsYWluIFN0YXRlI0ZBSUxFRCBGQUlMRUR9IDogVGhlIHNlcnZpY2Ugd2lsbCB0cmFuc2l0aW9uIHRvIGZhaWxlZCBpZiBpdCBlbmNvdW50ZXJzCisgKiAgICAgICBhbnkgZXJyb3JzIHdoaWxlIGFjY2VwdGluZyBjb25uZWN0aW9ucyBvciByZWFkaW5nIGZyb20gY29ubmVjdGlvbnMuCisgKiA8L3VsPgorICogCisgKiA8cD5Ob3RlIHRvIGZ1dHVyZSBzZWxmLiAgVGhlcmUgaGF2ZSBiZWVuIGEgZmV3IGF0dGVtcHRzIHRvIG1ha2UgaXQgc28gdGhhdCBpdCBpcyBubyBsb25nZXIgCisgKiBuZWNlc3NhcnkgdG8gZGVkaWNhdGUgYSB0aHJlYWQgdG8gdGhpcyBzZXJ2aWNlIChiYXNpY2FsbHkgdHVybiBpdCBpbnRvIGFuIEFic3RyYWN0SWRsZVNlcnZpY2UpLgorICogVGhlIGdlbmVyYWwgaWRlYSBoYXMgYmVlbiB0byBtYWtlIGNhbGxlcnMgdG8gZ2V0Q29ubmVjdGlvbiBpbnZva2UgYWNjZXB0LCBoZXJlIGlzIHdoeSBpdCBkaWRuJ3QKKyAqIHdvcmsuCisgKiA8dWw+CisgKiAgICAgPGxpPklmIHlvdSBtYWtlIGdldENvbm5lY3Rpb24gYSBibG9ja2luZyBtZXRob2QgdGhhdCBjYWxscyBhY2NlcHQgdW50aWwgaXQgZmluZHMgdGhlIAorICogICAgICAgICBjb25uZWN0aW9uIHdpdGggaXRzIGlkLCB0aGVuIHRoZXJlIGlzIG5vIHdheSB0byBkZWFsIHdpdGggY29ubmVjdGlvbnMgdGhhdCBuZXZlciBhcnJpdmUuCisgKiAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgd29ya2VyIGNyYXNoZXMgYmVmb3JlIGNvbm5lY3RpbmcgdGhlbiB0aGUgdGhyZWFkIGNhbGxpbmcgYWNjZXB0IHdpbGwKKyAqICAgICAgICAgYmxvY2sgZm9yZXZlciB3YWl0aW5nIGZvciBpdC4gIFRoZSBvbmx5IHdheSB0byB1bmJsb2NrIGEgdGhyZWFkIHN0dWNrIG9uIGFjY2VwdCgpIGlzIHRvCisgKiAgICAgICAgIGNsb3NlIHRoZSBzb2NrZXQgKHRoaXMgaG9sZHMgZm9yIFNlcnZlclNvY2tldENoYW5uZWxzIGFuZCBub3JtYWwgU2VydmVyU29ja2V0cyksIGJ1dCB3ZQorICogICAgICAgICBjYW5ub3QgZG8gdGhhdCBpbiB0aGlzIGNhc2UgYmVjYXVzZSB0aGUgc29ja2V0IGlzIGEgc2hhcmVkIHJlc291cmNlLgorICogICAgIDxsaT5JZiB5b3UgbWFrZSBnZXRDb25uZWN0aW9uIGEgbm9uLWJsb2NraW5nLCBwb2xsaW5nIGJhc2VkIG1ldGhvZCB0aGVuIHlvdSBleHBvc2UgeW91cnNlbGYKKyAqICAgICAgICAgdG8gcG90ZW50aWFsIGRlYWRsb2NrcyAoZHVlIHRvIG1pc3NlZCBzaWduYWxzKSBkZXBlbmRpbmcgb24gd2hhdCB0aHJlYWQgeW91IHBvbGwgZnJvbS4KKyAqICAgICAgICAgSWYgdGhlIHBvbGxpbmcgdGhyZWFkIGlzIGFueSBvZiB0aGUgdGhyZWFkcyB0aGF0IGFyZSBpbnZvbHZlZCB3aXRoIHByb2Nlc3NpbmcgbWVzc2FnZXMKKyAqICAgICAgICAgZnJvbSB0aGUgd29ya2VyIEkgYmVsaWV2ZSB0aGVyZSB0byBiZSBhIGRlYWRsb2NrIHJpc2suICBCYXNpY2FsbHksIGlmIHRoZSB3b3JrZXIgc2VuZHMKKyAqICAgICAgICAgbWVzc2FnZXMgb3ZlciBpdHMgb3V0cHV0IHN0cmVhbXMgYW5kIHRoZW4gY2FsbHMgU29ja2V0LmNvbm5lY3QsIGFuZCBubyBwcmludGluZyB0byBzdGRvdXQKKyAqICAgICAgICAgb3Igc3RkZXJyIG9jY3VycyB3aGlsZSBjb25uZWN0aW5nLiBUaGVuIGlmIHRoZSBydW5uZXIgcG9sbHMsIGJ1dCBtaXNzZXMgdGhlIGNvbm5lY3Rpb24KKyAqICAgICAgICAgYW5kIHRoZW4gdHJpZXMgdG8gcmVhZCBhZ2FpbiwgaXQgd2lsbCBkZWFkbG9jay4KKyAqIDwvdWw+CisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIFNlcnZlclNvY2tldFNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdEV4ZWN1dGlvblRocmVhZFNlcnZpY2UgeworICBwcml2YXRlIGVudW0gU291cmNlIHsgUkVRVUVTVCwgQUNDRVBUfQorICAKKyAgcHJpdmF0ZSBmaW5hbCBMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAKKyAgLyoqCisgICAqIENvbnRhaW5zIGZ1dHVyZXMgdGhhdCBoYXZlIGVpdGhlciBvbmx5IGJlZW4gYWNjZXB0ZWQgb3IgcmVxdWVzdGVkLiAgT25jZSBib3RoIG9jY3VyIHRoZXkgYXJlCisgICAqIHJlbW92ZWQgZnJvbSB0aGlzIG1hcC4KKyAgICovCisgIEBHdWFyZGVkQnkoImxvY2siKQorICBwcml2YXRlIGZpbmFsIE1hcDxVVUlELCBTZXR0YWJsZUZ1dHVyZTxPcGVuZWRTb2NrZXQ+PiBoYWxmRmluaXNoZWRDb25uZWN0aW9ucyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAKKyAgLyoqCisgICAqIENvbnRhaW5zIHRoZSBoaXN0b3J5IG9mIGNvbm5lY3Rpb25zIHNvIHdlIGNhbiBlbnN1cmUgdGhhdCBlYWNoIGlkIGlzIG9ubHkgYWNjZXB0ZWQgb25jZSBhbmQKKyAgICogcmVxdWVzdGVkIG9uY2UuCisgICAqLworICBAR3VhcmRlZEJ5KCJsb2NrIikKKyAgcHJpdmF0ZSBmaW5hbCBTZXRNdWx0aW1hcDxTb3VyY2UsIFVVSUQ+IGNvbm5lY3Rpb25TdGF0ZSA9IE11bHRpbWFwcy5uZXdTZXRNdWx0aW1hcCgKKyAgICAgIE1hcHMuPFNvdXJjZSwgQ29sbGVjdGlvbjxVVUlEPj5uZXdFbnVtTWFwKFNvdXJjZS5jbGFzcyksIAorICAgICAgbmV3IFN1cHBsaWVyPFNldDxVVUlEPj4oKXsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTZXQ8VVVJRD4gZ2V0KCkgeworICAgICAgICAgIHJldHVybiBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgIAorICBwcml2YXRlIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQ7CisKKyAgQEluamVjdCBTZXJ2ZXJTb2NrZXRTZXJ2aWNlKCkge30KKworICBpbnQgZ2V0UG9ydCgpIHsKKyAgICBhd2FpdFJ1bm5pbmcoKTsKKyAgICBjaGVja1N0YXRlKHNlcnZlclNvY2tldCAhPSBudWxsLCAiU29ja2V0IGhhcyBub3QgYmVlbiBvcGVuZWQgeWV0Iik7CisgICAgcmV0dXJuIHNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEge0BsaW5rIExpc3RlbmFibGVGdXR1cmV9IGZvciBhbiBvcGVuIGNvbm5lY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaWQuCisgICAqCisgICAqIDxwPk4uQi4gY2FsbGluZyB0aGlzIG1ldGhvZCAnY29uc3VtZXMnIHRoZSBjb25uZWN0aW9uIGFuZCBhcyBzdWNoIGNhbGxpbmcgaXQgdHdpY2Ugd2l0aCB0aGUKKyAgICogc2FtZSBpZCB3aWxsIG5vdCB3b3JrLCB0aGUgc2Vjb25kIGZ1dHVyZSByZXR1cm5lZCB3aWxsIG5ldmVyIGNvbXBsZXRlLiAgU2ltaWxhcmx5IGNhbGxpbmcgaXQKKyAgICogd2l0aCBhbiBpZCB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSB3b3JrZXIgdHJ5aW5nIHRvIGNvbm5lY3Qgd2lsbCBhbHNvIGZhaWwuCisgICAqLworICBwdWJsaWMgTGlzdGVuYWJsZUZ1dHVyZTxPcGVuZWRTb2NrZXQ+IGdldENvbm5lY3Rpb24oVVVJRCBpZCkgeworICAgIGNoZWNrU3RhdGUoaXNSdW5uaW5nKCksICJZb3UgY2FuIG9ubHkgZ2V0IGNvbm5lY3Rpb25zIGZyb20gYSBydW5uaW5nIHNlcnZpY2U6ICVzIiwgdGhpcyk7CisgICAgcmV0dXJuIGdldENvbm5lY3Rpb25JbXBsKGlkLCBTb3VyY2UuUkVRVUVTVCk7CisgIH0KKworICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc3RhcnRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCAvKiBiaW5kIHRvIGFueSBhdmFpbGFibGUgcG9ydCAqLyk7CisgIH0KKworICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgd2hpbGUgKGlzUnVubmluZygpKSB7CisgICAgICBTb2NrZXQgc29ja2V0OworICAgICAgdHJ5IHsKKyAgICAgICAgc29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gd2Ugd2VyZSBjbG9zZWQKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgT3BlbmVkU29ja2V0IG9wZW5lZFNvY2tldCA9IE9wZW5lZFNvY2tldC5mcm9tU29ja2V0KHNvY2tldCk7CisKKyAgICAgIFVVSUQgaWQgPSAoKFN0YXJ0dXBBbm5vdW5jZU1lc3NhZ2UpIG9wZW5lZFNvY2tldC5yZWFkZXIoKS5yZWFkKCkpLnRyaWFsSWQoKTsKKyAgICAgIC8vIE4uQi4geW91IHNob3VsZCBub3QgY2FsbCBzZXQgd2l0aCB0aGUgbG9jayBoZWxkLCB0byBwcmV2ZW50IHNhbWUgdGhyZWFkIGV4ZWN1dG9ycyBmcm9tCisgICAgICAvLyBydW5uaW5nIHdpdGggdGhlIGxvY2suCisgICAgICBnZXRDb25uZWN0aW9uSW1wbChpZCwgU291cmNlLkFDQ0VQVCkuc2V0KG9wZW5lZFNvY2tldCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSB7QGxpbmsgU2V0dGFibGVGdXR1cmV9IGZyb20gdGhlIG1hcCBvZiBjb25uZWN0aW9ucy4KKyAgICogCisgICAqIDxwPlRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAqIDx1bD4KKyAgICogICAgPGxpPklmIHRoZSBpZCBpcyBwcmVzZW50IGluIHtAbGluayAjY29ubmVjdGlvblN0YXRlfSwgdGhpcyB3aWxsIHRocm93IGFuIAorICAgKiAgICAgICAge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uCisgICAqICAgIDxsaT5UaGUgaWQgYW5kIHNvdXJjZSBhcmUgcmVjb3JkZWQgaW4ge0BsaW5rICNjb25uZWN0aW9uU3RhdGV9CisgICAqICAgIDxsaT5JZiB0aGUgZnV0dXJlIGlzIGFscmVhZHkgaW4ge0BsaW5rICNoYWxmRmluaXNoZWRDb25uZWN0aW9uc30sIGl0IGlzIHJlbW92ZWQgYW5kIAorICAgKiAgICAgICAgcmV0dXJuZWQuCisgICAqICAgIDxsaT5JZiB0aGUgZnV0dXJlIGlzIG5vdCBpbiB7QGxpbmsgI2hhbGZGaW5pc2hlZENvbm5lY3Rpb25zfSwgYSBuZXcge0BsaW5rIFNldHRhYmxlRnV0dXJlfSAKKyAgICogICAgICAgIGlzIGFkZGVkIGFuZCB0aGVuIHJldHVybmVkLgorICAgKiAKKyAgICogPHA+VGhlc2UgZmVhdHVyZXMgdG9nZXRoZXIgZW5zdXJlIHRoYXQgZWFjaCBjb25uZWN0aW9uIGNhbiBvbmx5IGJlIGFjY2VwdGVkIG9uY2UsIG9ubHkgCisgICAqIHJlcXVlc3RlZCBvbmNlIGFuZCBvbmNlIGJvdGggaGF2ZSBoYXBwZW5lZCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSAKKyAgICoge0BsaW5rICNoYWxmRmluaXNoZWRDb25uZWN0aW9uc30uCisgICAqLworICBwcml2YXRlIFNldHRhYmxlRnV0dXJlPE9wZW5lZFNvY2tldD4gZ2V0Q29ubmVjdGlvbkltcGwoVVVJRCBpZCwgU291cmNlIHNvdXJjZSkgeworICAgIGxvY2subG9jaygpOworICAgIHRyeSB7CisgICAgICBjaGVja1N0YXRlKGNvbm5lY3Rpb25TdGF0ZS5wdXQoc291cmNlLCBpZCksICJDb25uZWN0aW9uIGZvciAlcyBoYXMgYWxyZWFkeSBiZWVuICVzIiwKKyAgICAgICAgICBpZCwgc291cmNlKTsKKyAgICAgIFNldHRhYmxlRnV0dXJlPE9wZW5lZFNvY2tldD4gZnV0dXJlID0gaGFsZkZpbmlzaGVkQ29ubmVjdGlvbnMuZ2V0KGlkKTsKKyAgICAgIGlmIChmdXR1cmUgPT0gbnVsbCkgeworICAgICAgICBmdXR1cmUgPSBTZXR0YWJsZUZ1dHVyZS5jcmVhdGUoKTsKKyAgICAgICAgaGFsZkZpbmlzaGVkQ29ubmVjdGlvbnMucHV0KGlkLCBmdXR1cmUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaGFsZkZpbmlzaGVkQ29ubmVjdGlvbnMucmVtb3ZlKGlkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmdXR1cmU7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIHRyaWdnZXJTaHV0ZG93bigpIHsKKyAgICB0cnkgeworICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgLy8gYmVzdCBlZmZvcnQuLi4KKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2h1dERvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAvLyBOb3cgd2UgaGF2ZSBlaXRoZXIgYmVlbiBhc2tlZCB0byBzdG9wIG9yIGhhdmUgZmFpbGVkIHdpdGggc29tZSBraW5kIG9mIGV4Y2VwdGlvbiwgd2Ugd2FudCB0bworICAgIC8vIG5vdGlmeSBhbGwgcGVuZGluZyByZXF1ZXN0cywgc28gaWYgdGhlcmUgYXJlIGFueSByZWZlcmVuY2VzIG91dHNpZGUgb2YgdGhpcyBjbGFzcyB0aGV5IHdpbGwKKyAgICAvLyBub3RpY2UuCisgICAgbG9jay5sb2NrKCk7CisgICAgdHJ5IHsKKyAgICAgIGZvciAoU2V0dGFibGVGdXR1cmU8T3BlbmVkU29ja2V0PiBmdXR1cmUgOiBoYWxmRmluaXNoZWRDb25uZWN0aW9ucy52YWx1ZXMoKSkgeworICAgICAgICBmdXR1cmUuc2V0RXhjZXB0aW9uKG5ldyBFeGNlcHRpb24oIlRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkIikpOworICAgICAgfQorICAgICAgaGFsZkZpbmlzaGVkQ29ubmVjdGlvbnMuY2xlYXIoKTsKKyAgICAgIGNvbm5lY3Rpb25TdGF0ZS5jbGVhcigpOworICAgIH0gZmluYWxseSB7CisgICAgICBsb2NrLnVubG9jaygpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU2VydmljZU1vZHVsZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU2VydmljZU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjE3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9TZXJ2aWNlTW9kdWxlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlNlcnZpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGRhZ2dlci5Nb2R1bGU7CitpbXBvcnQgZGFnZ2VyLlByb3ZpZGVzOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKiogQ29uZmlndXJlcyB0aGUge0BsaW5rIFNlcnZpY2VNYW5hZ2VyfS4gKi8KK0BNb2R1bGUKK2ZpbmFsIGNsYXNzIFNlcnZpY2VNb2R1bGUgeworICBAUHJvdmlkZXMKKyAgQFNpbmdsZXRvbgorICBzdGF0aWMgU2VydmljZU1hbmFnZXIgcHJvdmlkZVNlcnZpY2VNYW5hZ2VyKFNldDxTZXJ2aWNlPiBzZXJ2aWNlcykgeworICAgIHJldHVybiBuZXcgU2VydmljZU1hbmFnZXIoc2VydmljZXMpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9TaHV0ZG93bkhvb2tSZWdpc3RyYXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1NodXRkb3duSG9va1JlZ2lzdHJhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjhhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9TaHV0ZG93bkhvb2tSZWdpc3RyYXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCisvKioKKyAqIEEgc2ltcGxlIGludGVyZmFjZSBmb3IgcmVnaXN0ZXJpbmcgYW5kIGRlcmVnaXN0ZXJpbmcgc2h1dGRvd24gaG9va3MuCisgKi8KK2ludGVyZmFjZSBTaHV0ZG93bkhvb2tSZWdpc3RyYXIgeworICAvKioKKyAgICogQWRkcyBhIGhvb2sgdG8gcnVuIGF0IHByb2Nlc3Mgc2h1dGRvd24uCisgICAqIAorICAgKiA8cD5TZWUge0BsaW5rIFJ1bnRpbWUjYWRkU2h1dGRvd25Ib29rKFRocmVhZCl9LgorICAgKi8KKyAgdm9pZCBhZGRTaHV0ZG93bkhvb2soVGhyZWFkIGhvb2spOworICAvKioKKyAgICogUmVtb3ZlcyBhIHNodXRkb3duIGhvb2sgdGhhdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkIHZpYSB7QGxpbmsgI2FkZFNodXRkb3duSG9vayhUaHJlYWQpfS4KKyAgICogCisgICAqIDxwPlNlZSB7QGxpbmsgUnVudGltZSNyZW1vdmVTaHV0ZG93bkhvb2soVGhyZWFkKX0uCisgICAqLworICBib29sZWFuIHJlbW92ZVNodXRkb3duSG9vayhUaHJlYWQgaG9vayk7Cit9CisKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1N0cmVhbVNlcnZpY2UuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1N0cmVhbVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg1MmQwCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU3RyZWFtU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5Mb2dNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuT3BlbmVkU29ja2V0OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuU3RvcE1lYXN1cmVtZW50TG9nTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5TdHJlYW1TZXJ2aWNlLlN0cmVhbUl0ZW0uS2luZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5QYXJzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk1vcmVPYmplY3RzLlRvU3RyaW5nSGVscGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuUXVldWVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkNsb3NlYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uTGluZVJlYWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RTZXJ2aWNlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5hYmxlRnV0dXJlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50Lk1vcmVFeGVjdXRvcnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlNlcnZpY2U7IC8vIGZvciBqYXZhZG9jCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlNlcnZpY2UuU3RhdGU7IC8vIGZvciBqYXZhZG9jCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBBIHtAbGluayBTZXJ2aWNlfSB0aGF0IGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiBvdmVyIGEgc29ja2V0IHRvIGEgcHJvY2VzcyBhbmQgdGhlbiBhbGxvd3MgCisgKiBtdWx0aXBsZXhlZCBhY2Nlc3MgdG8gdGhlIHByb2Nlc3NlcycgbGluZSBvcmllbnRlZCBvdXRwdXQgb3ZlciB0aGUgc29ja2V0IGFuZCB0aGUgc3RhbmRhcmQgCisgKiBwcm9jZXNzIHN0cmVhbXMgKHN0ZG91dCBhbmQgc3RkZXJyKSBhcyB3ZWxsIGFzIGFsbG93aW5nIGRhdGEgdG8gYmUgd3JpdHRlbiBvdmVyIHRoZSBzb2NrZXQuCisgKiAKKyAqIDxwPlRoZSB7QGxpbmtwbGFpbiBTdGF0ZSBzdGF0ZXN9IG9mIHRoaXMgc2VydmljZSBhcmUgYXMgZm9sbG93czoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGlua3BsYWluIFN0YXRlI05FVyBORVd9IDogSWRsZSBzdGF0ZSwgbm8gcmVhZGluZyBvciB3cml0aW5nIGlzIGFsbG93ZWQuCisgKiAgIDxsaT57QGxpbmtwbGFpbiBTdGF0ZSNTVEFSVElORyBTVEFSVElOR30gOiBTdHJlYW1zIGFyZSBiZWluZyBvcGVuZWQKKyAqICAgPGxpPntAbGlua3BsYWluIFN0YXRlI1JVTk5JTkcgUlVOTklOR30gOiBBdCBsZWFzdCBvbmUgc3RyZWFtIGlzIHN0aWxsIG9wZW4gb3IgdGhlIHdyaXRlciBoYXMgCisgKiAgICAgICBub3QgYmVlbiBjbG9zZWQgeWV0LgorICogICA8bGk+e0BsaW5rcGxhaW4gU3RhdGUjU1RPUFBJTkcgU1RPUFBJTkd9IDogQWxsIHN0cmVhbXMgaGF2ZSBjbG9zZWQgYnV0IHNvbWUgdGhyZWFkcyBtYXkgc3RpbGwgCisgKiAgICAgICBiZSBydW5uaW5nLgorICogICA8bGk+e0BsaW5rcGxhaW4gU3RhdGUjVEVSTUlOQVRFRCBURVJNSU5BVEVEfSA6IElkbGUgc3RhdGUsIGFsbCBzdHJlYW1zIGFyZSBjbG9zZWQKKyAqICAgPGxpPntAbGlua3BsYWluIFN0YXRlI0ZBSUxFRCBGQUlMRUR9IDogVGhlIHNlcnZpY2Ugd2lsbCB0cmFuc2l0aW9uIHRvIGZhaWxlZCBpZiBpdCBlbmNvdW50ZXJzCisgKiAgICAgICBhbnkgZXJyb3JzIHdoaWxlIHJlYWRpbmcgZnJvbSBvciB3cml0aW5nIHRvIHRoZSBzdHJlYW1zLCBzZXJ2aWNlIGZhaWx1cmUgd2lsbCBhbHNvIGNhdXNlIAorICogICAgICAgdGhlIHdvcmtlciBwcm9jZXNzIHRvIGJlIGZvcmNpYmx5IHNodXRkb3duIGFuZCB7QGxpbmsgI3JlYWRJdGVtKGxvbmcsIFRpbWVVbml0KX0sIAorICogICAgICAge0BsaW5rICNjbG9zZVdyaXRlcigpfSBhbmQge0BsaW5rICNzZW5kTWVzc2FnZShTZXJpYWxpemFibGUpfSB3aWxsIHN0YXJ0IHRocm93aW5nIAorICogICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9ucy4gCisgKiA8L3VsPgorICovCitAVHJpYWxTY29wZWQgZmluYWwgY2xhc3MgU3RyZWFtU2VydmljZSBleHRlbmRzIEFic3RyYWN0U2VydmljZSB7CisgIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciBhIHByb2Nlc3MgdGhhdCBzaG91bGQgYmUgZXhpdGluZyB0byBhY3R1YWxseSBleGl0LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hVVERPV05fV0FJVF9NSUxMSVMgPSAxMDsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihTdHJlYW1TZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmVhbUl0ZW0gVElNRU9VVF9JVEVNID0gbmV3IFN0cmVhbUl0ZW0oS2luZC5USU1FT1VULCBudWxsKTsKKworICAvKiogVGhlIGZpbmFsIGl0ZW0gdGhhdCB3aWxsIGJlIHNlbnQgZG93biB0aGUgc3RyZWFtLiAqLworICBzdGF0aWMgZmluYWwgU3RyZWFtSXRlbSBFT0ZfSVRFTSA9IG5ldyBTdHJlYW1JdGVtKEtpbmQuRU9GLCBudWxsKTsKKworICBwcml2YXRlIGZpbmFsIExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZSBzdHJlYW1FeGVjdXRvciA9IE1vcmVFeGVjdXRvcnMubGlzdGVuaW5nRGVjb3JhdG9yKAorICAgICAgRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkuc2V0RGFlbW9uKHRydWUpLmJ1aWxkKCkpKTsKKyAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFN0cmVhbUl0ZW0+IG91dHB1dFF1ZXVlID0gUXVldWVzLm5ld0xpbmtlZEJsb2NraW5nUXVldWUoKTsKKyAgcHJpdmF0ZSBmaW5hbCBXb3JrZXJQcm9jZXNzIHdvcmtlcjsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBQcm9jZXNzIHByb2Nlc3M7CisgIHByaXZhdGUgZmluYWwgUGFyc2VyPExvZ01lc3NhZ2U+IGxvZ01lc3NhZ2VQYXJzZXI7CisgIHByaXZhdGUgZmluYWwgVHJpYWxPdXRwdXRMb2dnZXIgdHJpYWxPdXRwdXQ7CisgIAorICAvKiogCisgICAqIFRoaXMgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG9wZW4gc3RyZWFtcyBmcm9tIHRoZSB1c2VycyBwZXJzcGVjdGl2ZS4gIGkuZS4gY2FuIHlvdSBzdGlsbAorICAgKiB3cml0ZSB0byB0aGUgc29ja2V0IGFuZCByZWFkIGl0ZW1zLgorICAgKiAKKyAgICogPHA+VGhpcyBpcyBkZWNyZW1lbnRlZCB3aGVuIGVpdGhlciB0aGUgc29ja2V0IGlzIGNsb3NlZCBmb3Igd3JpdGluZyBvciB0aGUgRU9GX0lURU0gaGFzIGJlZW4KKyAgICogcmVhZCBieSB0aGUgdXNlci4KKyAgICovCisgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBvcGVuU3RyZWFtcyA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgLyoqIAorICAgKiBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IHJlYWQgc3RyZWFtcyBhcmUgb3BlbiBzbyB3ZSBjYW4gY29ycmVjdGx5IHNldCB0aGUgRU9GX0lURU0gb250byB0aGUgCisgICAqIHF1ZXVlLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIHJ1bm5pbmdSZWFkU3RyZWFtcyA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgIHByaXZhdGUgT3BlbmVkU29ja2V0LldyaXRlciBzb2NrZXRXcml0ZXI7CisKKyAgQEluamVjdCBTdHJlYW1TZXJ2aWNlKFdvcmtlclByb2Nlc3Mgd29ya2VyLAorICAgICAgUGFyc2VyPExvZ01lc3NhZ2U+IGxvZ01lc3NhZ2VQYXJzZXIsIAorICAgICAgVHJpYWxPdXRwdXRMb2dnZXIgdHJpYWxPdXRwdXQpIHsKKyAgICB0aGlzLndvcmtlciA9IHdvcmtlcjsKKyAgICB0aGlzLmxvZ01lc3NhZ2VQYXJzZXIgPSBsb2dNZXNzYWdlUGFyc2VyOworICAgIHRoaXMudHJpYWxPdXRwdXQgPSB0cmlhbE91dHB1dDsKKyAgfQorCisgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBkb1N0YXJ0KCkgeworICAgIHRyeSB7CisgICAgICAvLyBUT0RPKGx1a2VzKTogd3JpdGUgdGhlIGNvbW1hbmRsaW5lIHRvIHRoZSB0cmlhbCBvdXRwdXQgZmlsZT8KKyAgICAgIHByb2Nlc3MgPSB3b3JrZXIuc3RhcnRXb3JrZXIoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBub3RpZnlGYWlsZWQoZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEZhaWxzYWZlIGtpbGwgdGhlIHByb2Nlc3MgYW5kIHRoZSBleGVjdXRvciBzZXJ2aWNlLgorICAgIC8vIElmIHRoZSBwcm9jZXNzIGhhcyBhbHJlYWR5IGV4aXRlZCBjbGVhbmx5LCB0aGlzIHdpbGwgYmUgYSBuby1vcC4KKyAgICBhZGRMaXN0ZW5lcihuZXcgTGlzdGVuZXIoKSB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgc3RhcnRpbmcoKSB7fQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bm5pbmcoKSB7fQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHN0b3BwaW5nKFN0YXRlIGZyb20pIHt9CisgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgdGVybWluYXRlZChTdGF0ZSBmcm9tKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBmYWlsZWQoU3RhdGUgZnJvbSwgVGhyb3dhYmxlIGZhaWx1cmUpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgfQorCisgICAgICB2b2lkIGNsZWFudXAoKSB7CisgICAgICAgIHN0cmVhbUV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgIHByb2Nlc3MuZGVzdHJveSgpOworICAgICAgICB0cnkgeworICAgICAgICAgIHN0cmVhbUV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMTAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICB9CisgICAgICAgIHN0cmVhbUV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICB9CisgICAgfSwgTW9yZUV4ZWN1dG9ycy5kaXJlY3RFeGVjdXRvcigpKTsKKyAgICAvLyBZb3UgbWF5IGJlIHRoaW5raW5nIGFzIHlvdSByZWFkIHRoaXMgIllvIGRhd2csIHdoYXQgaWYgSU9FeGNlcHRpb25zIHJhaW4gZnJvbSB0aGUgc2t5PyIgCisgICAgLy8gSWYgYSBzdHJlYW0gd2UgYXJlIHJlYWRpbmcgZnJvbSB0aHJvd3MgYW4gSU9FeGNlcHRpb24gdGhlbiB3ZSBmYWlsIHRoZSBlbnRpcmUgU2VydmljZS4gVGhpcworICAgIC8vIHdpbGwgY2F1c2UgdGhlIHdvcmtlciB0byBiZSBraWxsZWQgKGlmIGl0cyBub3QgZGVhZCBhbHJlYWR5KSBhbmQgdGhlIHZhcmlvdXMgU3RyZWFtUmVhZGVycyB0bworICAgIC8vIGJlIGludGVycnVwdGVkIChldmVudHVhbGx5KS4KKworICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBjaGFyc2V0IGJlY2F1c2Ugd29ya2VyIHN0cmVhbXMgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZm9yIG91dHB1dAorICAgIENoYXJzZXQgcHJvY2Vzc0NoYXJzZXQgPSBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCk7CisgICAgcnVubmluZ1JlYWRTdHJlYW1zLmFkZEFuZEdldCgyKTsKKyAgICBvcGVuU3RyZWFtcy5hZGRBbmRHZXQoMSk7CisgICAgc3RyZWFtRXhlY3V0b3Iuc3VibWl0KAorICAgICAgICB0aHJlYWRSZW5hbWluZygid29ya2VyLXN0ZGVyciIsIAorICAgICAgICAgICAgbmV3IFN0cmVhbVJlYWRlcigic3RkZXJyIiwgCisgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSwgcHJvY2Vzc0NoYXJzZXQpKSkpOworICAgIHN0cmVhbUV4ZWN1dG9yLnN1Ym1pdCgKKyAgICAgICAgdGhyZWFkUmVuYW1pbmcoIndvcmtlci1zdGRvdXQiLAorICAgICAgICAgICAgbmV3IFN0cmVhbVJlYWRlcigic3Rkb3V0IiwgCisgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwgcHJvY2Vzc0NoYXJzZXQpKSkpOworICAgIHdvcmtlci5zb2NrZXRGdXR1cmUoKS5hZGRMaXN0ZW5lcigKKyAgICAgICAgbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBPcGVuZWRTb2NrZXQgb3BlbmVkU29ja2V0ID0KKyAgICAgICAgICAgICAgICAgIFVuaW50ZXJydXB0aWJsZXMuZ2V0VW5pbnRlcnJ1cHRpYmx5KHdvcmtlci5zb2NrZXRGdXR1cmUoKSk7CisgICAgICAgICAgICAgIGxvZ2dlci5maW5lKCJzdWNjZXNzZnVsbHkgb3BlbmVkIHRoZSBwaXBlIGZyb20gdGhlIHdvcmtlciIpOworICAgICAgICAgICAgICBzb2NrZXRXcml0ZXIgPSBvcGVuZWRTb2NrZXQud3JpdGVyKCk7CisgICAgICAgICAgICAgIHJ1bm5pbmdSZWFkU3RyZWFtcy5hZGRBbmRHZXQoMSk7CisgICAgICAgICAgICAgIG9wZW5TdHJlYW1zLmFkZEFuZEdldCgxKTsKKyAgICAgICAgICAgICAgc3RyZWFtRXhlY3V0b3Iuc3VibWl0KHRocmVhZFJlbmFtaW5nKCJ3b3JrZXItc29ja2V0IiwKKyAgICAgICAgICAgICAgICAgIG5ldyBTb2NrZXRTdHJlYW1SZWFkZXIob3BlbmVkU29ja2V0LnJlYWRlcigpKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgbm90aWZ5RmFpbGVkKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBNb3JlRXhlY3V0b3JzLmRpcmVjdEV4ZWN1dG9yKCkpOworICAgIG5vdGlmeVN0YXJ0ZWQoKTsKKyAgfQorICAKKyAgLyoqCisgICAqIFJlYWRzIGEge0BsaW5rIFN0cmVhbUl0ZW19IGZyb20gb25lIG9mIHRoZSBzdHJlYW1zIHdhaXRpbmcgZm9yIG9uZSB0byBiZWNvbWUgYXZhaWxhYmxlIGlmIAorICAgKiBuZWNlc3NhcnkuCisgICAqLworICBTdHJlYW1JdGVtIHJlYWRJdGVtKGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBjaGVja1N0YXRlKGlzUnVubmluZygpLCAiQ2Fubm90IHJlYWQgaXRlbXMgZnJvbSBhICVzIFN0cmVhbVNlcnZpY2UiLCBzdGF0ZSgpKTsKKyAgICBTdHJlYW1JdGVtIGxpbmUgPSBvdXRwdXRRdWV1ZS5wb2xsKHRpbWVvdXQsIHVuaXQpOworICAgIGlmIChsaW5lID09IEVPRl9JVEVNKSB7CisgICAgICBjbG9zZVN0cmVhbSgpOworICAgIH0KKyAgICByZXR1cm4gKGxpbmUgPT0gbnVsbCkgPyBUSU1FT1VUX0lURU0gOiBsaW5lOworICB9CisgIAorICAvKioKKyAgICogV3JpdGUgYSBsaW5lIG9mIGRhdGEgdG8gdGhlIHdvcmtlciBwcm9jZXNzIG92ZXIgdGhlIHNvY2tldC4KKyAgICoKKyAgICogPHA+Ti5CLiBXcml0aW5nIGRhdGEgdmlhIHtAbGluayAjc2VuZE1lc3NhZ2UoU2VyaWFsaXphYmxlKX0gaXMgb25seSB2YWxpZCBvbmNlIHRoZSB1bmRlcmx5aW5nCisgICAqIHNvY2tldCBoYXMgYmVlbiBvcGVuZWQuICBUaGlzIHNob3VsZCBiZSBmaW5lIGFzc3VtaW5nIHRoYXQgc29ja2V0IHdyaXRlcyBhcmUgb25seSBpbiByZXNwb25zZQorICAgKiB0byBzb2NrZXQgcmVhZHMgKHdoaWNoIGlzIGN1cnJlbnRseSB0aGUgY2FzZSksIHNvIHRoZXJlIGlzIG5vIHdheSB0aGF0IGEgd3JpdGUgY291bGQgaGFwcGVuCisgICAqIHByaW9yIHRvIHRoZSBzb2NrZXQgYmVpbmcgb3BlbmVkLgorICAqLworICB2b2lkIHNlbmRNZXNzYWdlKFNlcmlhbGl6YWJsZSBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU3RhdGUoaXNSdW5uaW5nKCksICJDYW5ub3QgcmVhZCBpdGVtcyBmcm9tIGEgJXMgU3RyZWFtU2VydmljZSIsIHN0YXRlKCkpOworICAgIGNoZWNrU3RhdGUoc29ja2V0V3JpdGVyICE9IG51bGwsICJBdHRlbXB0ZWQgdG8gd3JpdGUgdG8gdGhlIHNvY2tldCBiZWZvcmUgaXQgd2FzIG9wZW5lZC4iKTsKKyAgICB0cnkgeworICAgICAgc29ja2V0V3JpdGVyLndyaXRlKG1lc3NhZ2UpOworICAgICAgLy8gV2UgbmVlZCB0byBmbHVzaCBzaW5jZSB0aGlzIGlzIGEgYmFjayBhbmQgZm9ydGggbG9ja3N0ZXAgcHJvdG9jb2wsIGJ1ZmZlcmluZyBjYW4gY2F1c2UgCisgICAgICAvLyBkZWFkbG9jayEgCisgICAgICBzb2NrZXRXcml0ZXIuZmx1c2goKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBDbG9zZWFibGVzLmNsb3NlKHNvY2tldFdyaXRlciwgdHJ1ZSk7CisgICAgICBub3RpZnlGYWlsZWQoZSk7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorICAKKyAgLyoqIENsb3NlcyB0aGUgc29ja2V0IHdyaXRlci4gKi8KKyAgdm9pZCBjbG9zZVdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY2hlY2tTdGF0ZShpc1J1bm5pbmcoKSwgIkNhbm5vdCByZWFkIGl0ZW1zIGZyb20gYSAlcyBTdHJlYW1TZXJ2aWNlIiwgc3RhdGUoKSk7CisgICAgY2hlY2tTdGF0ZShzb2NrZXRXcml0ZXIgIT0gbnVsbCwgIkF0dGVtcHRlZCB0byBjbG9zZSB0aGUgc29ja2V0IGJlZm9yZSBpdCB3YXMgb3BlbmVkLiIpOworICAgIHRyeSB7CisgICAgICBzb2NrZXRXcml0ZXIuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBub3RpZnlGYWlsZWQoZSk7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgICBjbG9zZVN0cmVhbSgpOworICB9CisgIAorICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgZG9TdG9wKCkgeworICAgIGlmIChvcGVuU3RyZWFtcy5nZXQoKSA+IDApIHsKKyAgICAgIC8vIFRoaXMgbWVhbnMgc3RvcCB3YXMgY2FsbGVkIG9uIHVzIGV4dGVybmFsbHkgYW5kIHdlIGFyZSBzdGlsbCByZWFkaW5nL3dyaXRpbmcsIGp1c3QgbG9nIGEKKyAgICAgIC8vIHdhcm5pbmcgYW5kIGRvIG5vdGhpbmcKKyAgICAgIGxvZ2dlci53YXJuaW5nKCJBdHRlbXB0aW5nIHRvIHN0b3AgdGhlIHN0cmVhbSBzZXJ2aWNlIHdpdGggc3RyZWFtcyBzdGlsbCBvcGVuIik7CisgICAgfQorICAgIGZpbmFsIExpc3RlbmFibGVGdXR1cmU8SW50ZWdlcj4gcHJvY2Vzc0Z1dHVyZSA9IHN0cmVhbUV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8SW50ZWdlcj4oKSB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIEludGVnZXIgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJvY2Vzcy53YWl0Rm9yKCk7CisgICAgICB9CisgICAgfSk7CisgICAgLy8gRXhwZXJpbWVudGFsbHksIGV2ZW4gd2l0aCB3ZWxsIGJlaGF2ZWQgcHJvY2Vzc2VzIHRoZXJlIGlzIHNvbWUgdGltZSBiZXR3ZWVuIHdoZW4gYWxsIHN0cmVhbXMKKyAgICAvLyBhcmUgY2xvc2VkIGFzIHBhcnQgb2YgcHJvY2VzcyBzaHV0ZG93biBhbmQgd2hlbiB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkLiBTbyB0byBub3QgZmFpbCAKKyAgICAvLyBmbGFraWx5IHdoZW4gc2h1dHRpbmcgZG93biBub3JtYWxseSB3ZSBuZWVkIHRvIGRvIGEgdGltZWQgd2FpdAorICAgIHN0cmVhbUV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7CisgICAgICBAT3ZlcnJpZGUgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIHRocmV3ID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAocHJvY2Vzc0Z1dHVyZS5nZXQoU0hVVERPV05fV0FJVF9NSUxMSVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykgPT0gMCkgeworICAgICAgICAgICAgbm90aWZ5U3RvcHBlZCgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZnlGYWlsZWQoCisgICAgICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigiUHJvY2VzcyBmYWlsZWQgdG8gc3RvcCBjbGVhbmx5LiBFeGl0IGNvZGU6ICIgKyBwcm9jZXNzLndhaXRGb3IoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJldyA9IGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHByb2Nlc3NGdXR1cmUuY2FuY2VsKHRydWUpOyAgLy8gd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlCisgICAgICAgICAgaWYgKHRocmV3KSB7CisgICAgICAgICAgICBwcm9jZXNzLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIG5vdGlmeUZhaWxlZCgKKyAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCJQcm9jZXNzIGZhaWxlZCB0byBzdG9wIGNsZWFubHkgYW5kIHdhcyBmb3JjaWJseSBraWxsZWQuIEV4aXQgY29kZTogIiAKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9jZXNzLndhaXRGb3IoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGNsb3NlU3RyZWFtKCkgeworICAgIGlmIChvcGVuU3RyZWFtcy5kZWNyZW1lbnRBbmRHZXQoKSA9PSAwKSB7CisgICAgICBzdG9wQXN5bmMoKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBjbG9zZVJlYWRTdHJlYW0oKSB7CisgICAgaWYgKHJ1bm5pbmdSZWFkU3RyZWFtcy5kZWNyZW1lbnRBbmRHZXQoKSA9PSAwKSB7CisgICAgICBvdXRwdXRRdWV1ZS5hZGQoRU9GX0lURU0pOworICAgIH0KKyAgfQorCisgIC8qKiBBbiBpdGVtIHJlYWQgZnJvbSBvbmUgb2YgdGhlIHN0cmVhbXMuICovCisgIHN0YXRpYyBjbGFzcyBTdHJlYW1JdGVtIHsKKyAgICBlbnVtIEtpbmQgeworICAgICAgLyoqIFRoaXMgaW5kaWNhdGVzIHRoYXQgaXQgaXMgdGhlIGxhc3QgaXRlbS4gKi8KKyAgICAgIEVPRiwKKyAgICAgIC8qKiBUaGlzIGluZGljYXRlcyB0aGF0IHJlYWRpbmcgdGhlIGl0ZW0gdGltZWQgb3V0LiAqLworICAgICAgVElNRU9VVCwKKyAgICAgIC8qKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoaXMgaXRlbSBoYXMgY29udGVudC4gKi8KKyAgICAgIERBVEE7CisgICAgfQorICAgIAorICAgIEBOdWxsYWJsZSBwcml2YXRlIGZpbmFsIExvZ01lc3NhZ2UgbG9nTWVzc2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIEtpbmQga2luZDsKKyAgICAKKyAgICBwcml2YXRlIFN0cmVhbUl0ZW0oTG9nTWVzc2FnZSBsaW5lKSB7CisgICAgICB0aGlzKEtpbmQuREFUQSwgY2hlY2tOb3ROdWxsKGxpbmUpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBTdHJlYW1JdGVtKEtpbmQgc3RhdGUsIEBOdWxsYWJsZSBMb2dNZXNzYWdlIGxvZ01lc3NhZ2UpIHsKKyAgICAgIHRoaXMubG9nTWVzc2FnZSA9IGxvZ01lc3NhZ2U7CisgICAgICB0aGlzLmtpbmQgPSBzdGF0ZTsKKyAgICB9CisgICAgCisgICAgLyoqIFJldHVybnMgdGhlIGNvbnRlbnQuICBUaGlzIGlzIG9ubHkgdmFsaWQgaWYge0BsaW5rICNraW5kKCl9IHJldHVybiB7QGxpbmsgS2luZCNEQVRBfS4gKi8KKyAgICBMb2dNZXNzYWdlIGNvbnRlbnQoKSB7CisgICAgICBjaGVja1N0YXRlKGtpbmQgPT0gS2luZC5EQVRBLCAiT25seSBkYXRhIGxpbmVzIGhhdmUgY29udGVudDogJXMiLCB0aGlzKTsKKyAgICAgIHJldHVybiBsb2dNZXNzYWdlOworICAgIH0KKyAgICAKKyAgICBLaW5kIGtpbmQoKSB7CisgICAgICByZXR1cm4ga2luZDsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBUb1N0cmluZ0hlbHBlciBoZWxwZXIgPSBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcihTdHJlYW1JdGVtLmNsYXNzKTsKKyAgICAgIGlmIChraW5kID09IEtpbmQuREFUQSkgeworICAgICAgICBoZWxwZXIuYWRkVmFsdWUobG9nTWVzc2FnZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBoZWxwZXIuYWRkVmFsdWUoa2luZCk7CisgICAgICB9CisgICAgICByZXR1cm4gaGVscGVyLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisgIAorICAvKiogUmV0dXJucyBhIGNhbGxhYmxlIHRoYXQgcmVuYW1lcyB0aGUgdGhlIHRocmVhZCB0aGF0IHRoZSBnaXZlbiBjYWxsYWJsZSBydW5zIGluLiAqLworICBwcml2YXRlIHN0YXRpYyA8VD4gQ2FsbGFibGU8VD4gdGhyZWFkUmVuYW1pbmcoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENhbGxhYmxlPFQ+IGNhbGxhYmxlKSB7CisgICAgY2hlY2tOb3ROdWxsKG5hbWUpOworICAgIGNoZWNrTm90TnVsbChjYWxsYWJsZSk7CisgICAgcmV0dXJuIG5ldyBDYWxsYWJsZTxUPigpIHsKKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgVCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRocmVhZCBjdXJyZW50VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBjdXJyZW50VGhyZWFkLmdldE5hbWUoKTsKKyAgICAgICAgY3VycmVudFRocmVhZC5zZXROYW1lKG5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgIHJldHVybiBjYWxsYWJsZS5jYWxsKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgY3VycmVudFRocmVhZC5zZXROYW1lKG9sZE5hbWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgKiBBIGJhY2tncm91bmQgdGFzayB0aGF0IHJlYWRzIGxpbmVzIG9mIHRleHQgZnJvbSBhIHtAbGluayBSZWFkZXJ9IGFuZCBwdXRzIHRoZW0gb250byBhIAorICAgKiB7QGxpbmsgQmxvY2tpbmdRdWV1ZX0uCisgICAqLworICBwcml2YXRlIGZpbmFsIGNsYXNzIFN0cmVhbVJlYWRlciBpbXBsZW1lbnRzIENhbGxhYmxlPFZvaWQ+IHsKKyAgICBmaW5hbCBSZWFkZXIgcmVhZGVyOworICAgIGZpbmFsIFN0cmluZyBzdHJlYW1OYW1lOworCisgICAgU3RyZWFtUmVhZGVyKFN0cmluZyBzdHJlYW1OYW1lLCBSZWFkZXIgcmVhZGVyKSB7CisgICAgICB0aGlzLnN0cmVhbU5hbWUgPSBzdHJlYW1OYW1lOworICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZSBwdWJsaWMgVm9pZCBjYWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgTGluZVJlYWRlciBsaW5lUmVhZGVyID0gbmV3IExpbmVSZWFkZXIocmVhZGVyKTsKKyAgICAgIGJvb2xlYW4gdGhyZXcgPSB0cnVlOworICAgICAgdHJ5IHsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlICgobGluZSA9IGxpbmVSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgIHRyaWFsT3V0cHV0LmxvZyhzdHJlYW1OYW1lLCBsaW5lKTsKKyAgICAgICAgICBMb2dNZXNzYWdlIGxvZ01lc3NhZ2UgPSBsb2dNZXNzYWdlUGFyc2VyLnBhcnNlKGxpbmUpOworICAgICAgICAgIGlmIChsb2dNZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dHB1dFF1ZXVlLnB1dChuZXcgU3RyZWFtSXRlbShsb2dNZXNzYWdlKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocmV3ID0gZmFsc2U7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBub3RpZnlGYWlsZWQoZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBjbG9zZVJlYWRTdHJlYW0oKTsKKyAgICAgICAgQ2xvc2VhYmxlcy5jbG9zZShyZWFkZXIsIHRocmV3KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorICAKKyAgLyoqCisgICAqIEEgYmFja2dyb3VuZCB0YXNrIHRoYXQgcmVhZHMgbGluZXMgb2YgdGV4dCBmcm9tIGEge0BsaW5rIE9wZW5lZFNvY2tldC5SZWFkZXJ9IGFuZCBwdXRzIHRoZW0KKyAgICogb250byBhIHtAbGluayBCbG9ja2luZ1F1ZXVlfS4KKyAgICovCisgIHByaXZhdGUgZmluYWwgY2xhc3MgU29ja2V0U3RyZWFtUmVhZGVyIGltcGxlbWVudHMgQ2FsbGFibGU8Vm9pZD4geworICAgIGZpbmFsIE9wZW5lZFNvY2tldC5SZWFkZXIgcmVhZGVyOworCisgICAgU29ja2V0U3RyZWFtUmVhZGVyKE9wZW5lZFNvY2tldC5SZWFkZXIgcmVhZGVyKSB7CisgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlIHB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICBib29sZWFuIHRocmV3ID0gdHJ1ZTsKKyAgICAgIHRyeSB7CisgICAgICAgIE9iamVjdCBvYmo7CisgICAgICAgIHdoaWxlICgob2JqID0gcmVhZGVyLnJlYWQoKSkgIT0gbnVsbCkgeworICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGxvZyhvYmoudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9IAorICAgICAgICAgIExvZ01lc3NhZ2UgbWVzc2FnZSA9IChMb2dNZXNzYWdlKSBvYmo7CisgICAgICAgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlKSB7CisgICAgICAgICAgICAvLyBUT0RPKGx1a2VzKTogaG93IHVzZWZ1bCBhcmUgdGhlc2UgbWVzc2FnZXM/ICBUaGV5IHNlZW0gbGlrZSBsZWZ0b3ZlciBkZWJ1Z2dpbmcgaW5mbworICAgICAgICAgICAgZm9yIChNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA6ICgoU3RvcE1lYXN1cmVtZW50TG9nTWVzc2FnZSkgbWVzc2FnZSkubWVhc3VyZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgbG9nKFN0cmluZy5mb3JtYXQoIkkgZ290IGEgcmVzdWx0ISAlczogJWYlcyVuIiwKKyAgICAgICAgICAgICAgICAgIG1lYXN1cmVtZW50LmRlc2NyaXB0aW9uKCksCisgICAgICAgICAgICAgICAgICBtZWFzdXJlbWVudC52YWx1ZSgpLm1hZ25pdHVkZSgpIC8gbWVhc3VyZW1lbnQud2VpZ2h0KCksIAorICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnQudmFsdWUoKS51bml0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgb3V0cHV0UXVldWUucHV0KG5ldyBTdHJlYW1JdGVtKG1lc3NhZ2UpKTsKKyAgICAgICAgfQorICAgICAgICB0aHJldyA9IGZhbHNlOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbm90aWZ5RmFpbGVkKGUpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgY2xvc2VSZWFkU3RyZWFtKCk7CisgICAgICAgIENsb3NlYWJsZXMuY2xvc2UocmVhZGVyLCB0aHJldyk7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyB0ZXh0KSB7CisgICAgICB0cmlhbE91dHB1dC5sb2coInNvY2tldCIsIHRleHQpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxGYWlsdXJlRXhjZXB0aW9uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbEZhaWx1cmVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM3NTBiCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxGYWlsdXJlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiByZXByZXNlbnRpbmcgdGhlIGZhaWx1cmUgb2YgYW4gaW5kaXZpZHVhbCB0cmlhbC4gVGhyb3dpbmcgdGhpcyBleGNlcHRpb24gd2lsbAorICogaW52YWxpZGF0ZSB0aGUgdHJpYWwsIGJ1dCBhbGxvdyB0aGUgcnVuIHRvIGNvbnRpbnVlLiBCb3RoIHRoZSBydW5uZXIgYW5kIGluZGl2aWR1YWwgaW5zdHJ1bWVudHMKKyAqIGFyZSBmcmVlIHRvIHRocm93IHRoaXMgZXhjZXB0aW9uLgorICoKKyAqIDxwPlRoZSBleGNlcHRpb24gbWVzc2FnZSBpcyB1c2VkIHRvIGNvbnZleSB0aGUgbmF0dXJlIG9mIHRoZSBmYWlsdXJlIHRvIHRoZSB1c2VyLgorICovCitmaW5hbCBjbGFzcyBUcmlhbEZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgcHVibGljIFRyaWFsRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbElkLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbElkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3YzZmZQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsSWQuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKiogQmluZGluZyBhbm5vdGF0aW9uIGZvciB0aGUgY3VycmVudCB0cmlhbCBpZC4gKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoe0ZJRUxELCBQQVJBTUVURVIsIE1FVEhPRH0pCitAUXVhbGlmaWVyCitAaW50ZXJmYWNlIFRyaWFsSWQge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsTW9kdWxlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbE1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDAwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbE1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLkxvZ01lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5PcGVuZWRTb2NrZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkJlbmNobWFya1NwZWM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkhvc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlJ1bjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuU2NlbmFyaW87CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlRyaWFsOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuSW5zdHJ1bWVudC5NZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZTsKK2ltcG9ydCBkYWdnZXIuTW9kdWxlOworaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKKworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCisvKioKKyAqIENvbmZpZ3VyYXRpb24gZm9yIGEge0BsaW5rIFRyaWFsUnVuTG9vcH0uCisgKi8KK0BNb2R1bGUKK2ZpbmFsIGNsYXNzIFRyaWFsTW9kdWxlIHsKKworICBwcml2YXRlIGZpbmFsIFVVSUQgdHJpYWxJZDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdHJpYWxOdW1iZXI7CisgIHByaXZhdGUgZmluYWwgRXhwZXJpbWVudCBleHBlcmltZW50OworCisgIFRyaWFsTW9kdWxlKFVVSUQgdHJpYWxJZCwgaW50IHRyaWFsTnVtYmVyLCBFeHBlcmltZW50IGV4cGVyaW1lbnQpIHsKKyAgICB0aGlzLnRyaWFsSWQgPSB0cmlhbElkOworICAgIHRoaXMudHJpYWxOdW1iZXIgPSB0cmlhbE51bWJlcjsKKyAgICB0aGlzLmV4cGVyaW1lbnQgPSBleHBlcmltZW50OworICB9CisKKyAgQFRyaWFsU2NvcGVkCisgIEBQcm92aWRlcworICBAVHJpYWxJZAorICBVVUlEIHByb3ZpZGVUcmlhbElkKCkgeworICAgIHJldHVybiB0cmlhbElkOworICB9CisKKyAgQFRyaWFsU2NvcGVkCisgIEBQcm92aWRlcworICBAVHJpYWxOdW1iZXIKKyAgaW50IHByb3ZpZGVUcmlhbE51bWJlcigpIHsKKyAgICByZXR1cm4gdHJpYWxOdW1iZXI7CisgIH0KKworICBAVHJpYWxTY29wZWQKKyAgQFByb3ZpZGVzCisgIEV4cGVyaW1lbnQgcHJvdmlkZUV4cGVyaW1lbnQoKSB7CisgICAgcmV0dXJuIGV4cGVyaW1lbnQ7CisgIH0KKworICBAVHJpYWxTY29wZWQKKyAgQFByb3ZpZGVzCisgIHN0YXRpYyBCZW5jaG1hcmtTcGVjIHByb3ZpZGVCZW5jaG1hcmtTcGVjKEV4cGVyaW1lbnQgZXhwZXJpbWVudCkgeworICAgIHJldHVybiBuZXcgQmVuY2htYXJrU3BlYy5CdWlsZGVyKCkKKyAgICAgICAgLmNsYXNzTmFtZShleHBlcmltZW50Lmluc3RydW1lbnRhdGlvbigpLmJlbmNobWFya01ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKQorICAgICAgICAubWV0aG9kTmFtZShleHBlcmltZW50Lmluc3RydW1lbnRhdGlvbigpLmJlbmNobWFya01ldGhvZCgpLmdldE5hbWUoKSkKKyAgICAgICAgLmFkZEFsbFBhcmFtZXRlcnMoZXhwZXJpbWVudC51c2VyUGFyYW1ldGVycygpKQorICAgICAgICAuYnVpbGQoKTsKKyAgfQorCisgIEBQcm92aWRlcworICBAVHJpYWxTY29wZWQKKyAgc3RhdGljIExpc3RlbmFibGVGdXR1cmU8T3BlbmVkU29ja2V0PiBwcm92aWRlVHJpYWxTb2NrZXQoCisgICAgICBAVHJpYWxJZCBVVUlEIHRyaWFsSWQsCisgICAgICBTZXJ2ZXJTb2NrZXRTZXJ2aWNlIHNlcnZlclNvY2tldFNlcnZpY2UpIHsKKyAgICByZXR1cm4gc2VydmVyU29ja2V0U2VydmljZS5nZXRDb25uZWN0aW9uKHRyaWFsSWQpOworICB9CisKKyAgQFByb3ZpZGVzCisgIHN0YXRpYyBNZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yIHByb3ZpZGVNZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yKEV4cGVyaW1lbnQgZXhwZXJpbWVudCkgeworICAgIHJldHVybiBleHBlcmltZW50Lmluc3RydW1lbnRhdGlvbigpLmdldE1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IoKTsKKyAgfQorCisgIEBQcm92aWRlcworICBAVHJpYWxTY29wZWQKKyAgc3RhdGljIFRyaWFsU2NoZWR1bGluZ1BvbGljeSBwcm92aWRlVHJpYWxTY2hlZHVsaW5nUG9saWN5KEV4cGVyaW1lbnQgZXhwZXJpbWVudCkgeworICAgIHJldHVybiBleHBlcmltZW50Lmluc3RydW1lbnRhdGlvbigpLmluc3RydW1lbnQoKS5zY2hlZHVsaW5nUG9saWN5KCk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgQFRyaWFsU2NvcGVkCisgIHN0YXRpYyBTdHJlYW1TZXJ2aWNlIHByb3ZpZGVTdHJlYW1TZXJ2aWNlKAorICAgICAgV29ya2VyUHJvY2VzcyB3b3JrZXIsCisgICAgICBQYXJzZXI8TG9nTWVzc2FnZT4gbG9nTWVzc2FnZVBhcnNlciwKKyAgICAgIFRyaWFsT3V0cHV0TG9nZ2VyIHRyaWFsT3V0cHV0KSB7CisgICAgcmV0dXJuIG5ldyBTdHJlYW1TZXJ2aWNlKHdvcmtlciwgbG9nTWVzc2FnZVBhcnNlciwgdHJpYWxPdXRwdXQpOworICB9CisKKyAgLy8gVE9ETyh1c2VyKTogbWFrZSB0aGlzIGEgc2luZ2xldG9uIGluIGEgaGlnaGVyIGxldmVsIG1vZHVsZS4KKyAgQFByb3ZpZGVzCisgIEBUcmlhbFNjb3BlZAorICBzdGF0aWMgU2h1dGRvd25Ib29rUmVnaXN0cmFyIHByb3ZpZGVTaHV0ZG93bkhvb2soKSB7CisgICAgcmV0dXJuIG5ldyBSdW50aW1lU2h1dGRvd25Ib29rUmVnaXN0cmFyKCk7CisgIH0KKworICBAUHJvdmlkZXMgc3RhdGljIFRyaWFsUmVzdWx0RmFjdG9yeSBwcm92aWRlVHJpYWxGYWN0b3J5KAorICAgICAgQFRyaWFsSWQgZmluYWwgVVVJRCB0cmlhbElkLAorICAgICAgZmluYWwgUnVuIHJ1biwKKyAgICAgIGZpbmFsIEhvc3QgaG9zdCwKKyAgICAgIGZpbmFsIEV4cGVyaW1lbnQgZXhwZXJpbWVudCwKKyAgICAgIGZpbmFsIEJlbmNobWFya1NwZWMgYmVuY2htYXJrU3BlYykgeworICAgIHJldHVybiBuZXcgVHJpYWxSZXN1bHRGYWN0b3J5KCkgeworICAgICAgQE92ZXJyaWRlIHB1YmxpYyBUcmlhbFJlc3VsdCBuZXdUcmlhbFJlc3VsdCgKKyAgICAgICAgICBWbURhdGFDb2xsZWN0aW5nVmlzaXRvciBkYXRhQ29sbGVjdGluZ1Zpc2l0b3IsCisgICAgICAgICAgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciBtZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yKSB7CisgICAgICAgIGNoZWNrU3RhdGUobWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvci5pc0RvbmVDb2xsZWN0aW5nKCkpOworICAgICAgICAvLyBUT0RPKGx1a2VzKTogc2hvdWxkIHRoZSB0cmlhbCBtZXNzYWdlcyBiZSBwYXJ0IG9mIHRoZSBUcmlhbCBkYXRhc3RydWN0dXJlPyAgSXQgc2VlbXMgbGlrZQorICAgICAgICAvLyB0aGUgd2ViIFVJIGNvdWxkIG1ha2UgdXNlIG9mIHRoZW0uCisgICAgICAgIHJldHVybiBuZXcgVHJpYWxSZXN1bHQoCisgICAgICAgICAgICBuZXcgVHJpYWwuQnVpbGRlcih0cmlhbElkKQorICAgICAgICAgICAgICAgIC5ydW4ocnVuKQorICAgICAgICAgICAgICAgIC5pbnN0cnVtZW50U3BlYyhleHBlcmltZW50Lmluc3RydW1lbnRhdGlvbigpLmluc3RydW1lbnQoKS5nZXRTcGVjKCkpCisgICAgICAgICAgICAgICAgLnNjZW5hcmlvKG5ldyBTY2VuYXJpby5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLmhvc3QoaG9zdCkKKyAgICAgICAgICAgICAgICAgICAgLnZtU3BlYyhkYXRhQ29sbGVjdGluZ1Zpc2l0b3Iudm1TcGVjKCkpCisgICAgICAgICAgICAgICAgICAgIC5iZW5jaG1hcmtTcGVjKGJlbmNobWFya1NwZWMpKQorICAgICAgICAgICAgICAgIC5hZGRBbGxNZWFzdXJlbWVudHMobWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvci5nZXRNZWFzdXJlbWVudHMoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgICAgIGV4cGVyaW1lbnQsCisgICAgICAgICAgICBtZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yLmdldE1lc3NhZ2VzKCkpOworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsTnVtYmVyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbE51bWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Mzc3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbE51bWJlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKiBCaW5kaW5nIGFubm90YXRpb24gdGhlIHRyaWFsIG51bWJlciwgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldCh7RklFTEQsIFBBUkFNRVRFUiwgTUVUSE9EfSkKK0BRdWFsaWZpZXIKK0BpbnRlcmZhY2UgVHJpYWxOdW1iZXIge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsT3V0cHV0RmFjdG9yeS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxPdXRwdXRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4YTMzMAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsT3V0cHV0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCisvKiogCisgKiBBIGZhY3RvcnkgZm9yIHRyaWFsIGxvZyBmaWxlcy4KKyAqIAorICogPHA+VGhlIGxvZyBmaWxlcyBtYXkgYmUgY29uZmlndXJlZCB0byBiZSBkZWxldGVkIG9uIGV4aXQgb2YgdGhlIHJ1bm5lciBwcm9jZXNzLiAgSWYgdGhlIGZpbGVzCisgKiBzaG91bGQgbm90IGJlIGRlbGV0ZWQgdGhlbiBjYWxsIHtAbGluayAjcGVyc2lzdEZpbGUoRmlsZSl9IHRvIGVuc3VyZSB0aGF0IHRoZXkgc3Vydml2ZS4KKyAqLworaW50ZXJmYWNlIFRyaWFsT3V0cHV0RmFjdG9yeSB7CisgIAorICAvKiogQSBzaW1wbGUgdHVwbGUgb2YgYSB7QGxpbmsgRmlsZX0gYW5kIGEge0BsaW5rIFByaW50V3JpdGVyfSBmb3Igd3JpdGluZyB0byB0aGF0IGZpbGUuICovCisgIGZpbmFsIGNsYXNzIEZpbGVBbmRXcml0ZXIgeworICAgIGZpbmFsIEZpbGUgZmlsZTsKKyAgICBmaW5hbCBQcmludFdyaXRlciB3cml0ZXI7CisKKyAgICBGaWxlQW5kV3JpdGVyKEZpbGUgZmlsZSwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgfQorICB9CisKKyAgLyoqIFJldHVybnMgdGhlIGZpbGUgdG8gd3JpdGUgdHJpYWwgb3V0cHV0IHRvLiAqLworICBGaWxlQW5kV3JpdGVyIGdldFRyaWFsT3V0cHV0RmlsZShpbnQgdHJpYWxOdW1iZXIpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247CisKKyAgLyoqIAorICAgKiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGZpbGUgd2lsbCBub3QgYmUgZGVsZXRlZCBhZnRlciB0aGUgcnVuLiAgVGhlIGZpbGUgcHJvdmlkZWQgbXVzdCBiZSBlcXVhbAorICAgKiB0byBhIGZpbGUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUcmlhbE91dHB1dEZpbGUoaW50KX0uCisgICAqLworICB2b2lkIHBlcnNpc3RGaWxlKEZpbGUgZik7Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbE91dHB1dEZhY3RvcnlTZXJ2aWNlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbE91dHB1dEZhY3RvcnlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExNzVkZAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsT3V0cHV0RmFjdG9yeVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlJ1bjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9ucy5DYWxpcGVyT3B0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdElkbGVTZXJ2aWNlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5HdWFyZGVkQnk7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIEEge0BsaW5rIFRyaWFsT3V0cHV0RmFjdG9yeX0gaW1wbGVtZW50ZWQgYXMgYSBzZXJ2aWNlIHRoYXQgbWFuYWdlcyBhIGRpcmVjdG9yeSBlaXRoZXIgdW5kZXIgCisgKiB7QGNvZGUgL3RtcH0gb3IgaW4gYSB1c2VyIGNvbmZpZ3VyZWQgZGlyZWN0b3J5LgorICogCisgKiA8cD5JZiB0aGVyZSBpcyBhIHVzZXIgY29uZmlndXJlZCBkaXJlY3RvcnksIHRoZW4gbm8gZmlsZXMgd2lsbCBiZSBkZWxldGVkIG9uIHNlcnZpY2Ugc2h1dGRvd24uCisgKiBPdGhlcndpc2UgdGhlIG9ubHkgd2F5IHRvIGVuc3VyZSB0aGF0IHRoZSBsb2cgZmlsZXMgc3Vydml2ZSBzZXJ2aWNlIHNodXRkb3duIGlzIHRvIGV4cGxpY2l0bHkKKyAqIGNhbGwge0BsaW5rICNwZXJzaXN0RmlsZShGaWxlKX0gd2l0aCBlYWNoIGZpbGUgdGhhdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQuCisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIFRyaWFsT3V0cHV0RmFjdG9yeVNlcnZpY2UKKyAgICBleHRlbmRzIEFic3RyYWN0SWRsZVNlcnZpY2UgaW1wbGVtZW50cyBUcmlhbE91dHB1dEZhY3RvcnkgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0RJUkVDVE9SWV9QUk9QRVJUWSA9ICJ3b3JrZXIub3V0cHV0IjsKKworICBwcml2YXRlIGZpbmFsIENhbGlwZXJPcHRpb25zIG9wdGlvbnM7CisgIHByaXZhdGUgZmluYWwgUnVuIHJ1bjsKKworICBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiB0b0RlbGV0ZSA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKKworICBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgcHJpdmF0ZSBGaWxlIGRpcmVjdG9yeTsKKworICBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgcHJpdmF0ZSBib29sZWFuIHBlcnNpc3RGaWxlczsKKworICBASW5qZWN0IFRyaWFsT3V0cHV0RmFjdG9yeVNlcnZpY2UoUnVuIHJ1biwgQ2FsaXBlck9wdGlvbnMgb3B0aW9ucykgeworICAgIHRoaXMucnVuID0gcnVuOworICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgIH0KKworICAvKiogUmV0dXJucyB0aGUgZmlsZSB0byB3cml0ZSB0cmlhbCBvdXRwdXQgdG8uICovCisgIEBPdmVycmlkZSBwdWJsaWMgRmlsZUFuZFdyaXRlciBnZXRUcmlhbE91dHB1dEZpbGUoaW50IHRyaWFsTnVtYmVyKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBGaWxlIGRpcjsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgIGlmIChkaXJlY3RvcnkgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlRoZSBvdXRwdXQgbWFuYWdlciAlcyBoYXMgbm90IGJlZW4gc3RhcnRlZCB5ZXQiLCB0aGlzKSk7CisgICAgICB9CisgICAgICBkaXIgPSBkaXJlY3Rvcnk7CisgICAgfQorICAgIEZpbGUgdHJpYWxGaWxlID0gbmV3IEZpbGUoZGlyLCBTdHJpbmcuZm9ybWF0KCJ0cmlhbC0lZC5sb2ciLCB0cmlhbE51bWJlcikpOworICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgaWYgKCFwZXJzaXN0RmlsZXMpIHsKKyAgICAgICAgICB0b0RlbGV0ZS5hZGQodHJpYWxGaWxlLmdldFBhdGgoKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgRmlsZUFuZFdyaXRlcih0cmlhbEZpbGUsCisgICAgICAgIG5ldyBQcmludFdyaXRlcigKKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFdyaXRlcigKKyAgICAgICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbSh0cmlhbEZpbGUpLCAKKyAgICAgICAgICAgICAgICBDaGFyc2V0cy5VVEZfOCkpKSk7CisgIH0KKworICAvKiogCisgICAqIEVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gZmlsZSB3aWxsIG5vdCBiZSBkZWxldGVkIG9uIGV4aXQgb2YgdGhlIEpWTSwgcG9zc2libHkgYnkgY29weWluZyB0byBhIAorICAgKiBuZXcgZmlsZS4KKyAgICovCisgIEBPdmVycmlkZSBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcGVyc2lzdEZpbGUoRmlsZSBmKSB7CisgICAgaWYgKCFwZXJzaXN0RmlsZXMpIHsKKyAgICAgIGNoZWNrQXJndW1lbnQodG9EZWxldGUucmVtb3ZlKGYuZ2V0UGF0aCgpKSwgIiVzIHdhcyBub3QgY3JlYXRlZCBieSB0aGUgb3V0cHV0IG1hbmFnZXIiLCBmKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGaWxlIGRpcmVjdG9yeTsKKyAgICBTdHJpbmcgZGlyTmFtZSA9IG9wdGlvbnMuY29uZmlnUHJvcGVydGllcygpLmdldChMT0dfRElSRUNUT1JZX1BST1BFUlRZKTsKKyAgICBib29sZWFuIHBlcnNpc3RGaWxlcyA9IHRydWU7CisgICAgaWYgKGRpck5hbWUgIT0gbnVsbCkgeworICAgICAgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyTmFtZSk7CisgICAgICBpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgeworICAgICAgICBpZiAoIWRpcmVjdG9yeS5ta2RpcnMoKSkgeworICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5ICVzIGluZGljYXRlZCBieSBwcm9wZXJ0eSAlcyIsCisgICAgICAgICAgICAgICAgICBkaXJOYW1lLCBMT0dfRElSRUNUT1JZX1BST1BFUlRZKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoIWRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDb25maWd1cmVkIGRpcmVjdG9yeSAlcyBpbmRpY2F0ZWQgYnkgcHJvcGVydHkgJXMgaXMgbm90IGEgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICBkaXJOYW1lLCBMT0dfRElSRUNUT1JZX1BST1BFUlRZKSk7CisgICAgICB9CisgICAgICAvLyBUaGUgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkKKyAgICAgIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgU3RyaW5nLmZvcm1hdCgicnVuLSVzIiwgcnVuLmlkKCkpKTsKKyAgICAgIGlmICghZGlyZWN0b3J5Lm1rZGlyKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBhIHJ1biBkaXJlY3RvcnkgIiArIGRpcmVjdG9yeSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIG5vbmUgaXMgY29uZmlndXJlZCB0aGVuIHdlIGRvbid0IGNhcmUsIGp1c3QgbWFrZSBhIHRlbXAgZGlyCisgICAgICAvLyBUT0RPKGx1a2VzKTogaXQgd291bGQgYmUgbmljZSB0byB1c2UgamRrNyBqYXZhLm5pby5maWxlLkZpbGVzLmNyZWF0ZVRlbXBEaXIoKSB3aGljaCBhbGxvd3MKKyAgICAgIC8vIHVzIHRvIHNwZWNpZnkgYSBuYW1lLCBidXQgY2FsaXBlciBpcyBzdGlsbCBvbiBqZGs2LgorICAgICAgZGlyZWN0b3J5ID0gRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgICAgcGVyc2lzdEZpbGVzID0gZmFsc2U7CisgICAgfQorICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgIHRoaXMucGVyc2lzdEZpbGVzID0gcGVyc2lzdEZpbGVzOworICB9CisKKyAgQE92ZXJyaWRlIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzaHV0RG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIGlmICghcGVyc2lzdEZpbGVzKSB7CisgICAgICAvLyBUaGlzIGlzIGJlc3QgZWZmb3J0LCBmaWxlcyB0byBiZSBkZWxldGVkIGFyZSBhbHJlYWR5IGluIGEgdG1wIGRpcmVjdG9yeS4KKyAgICAgIGZvciAoU3RyaW5nIGYgOiB0b0RlbGV0ZSkgeworICAgICAgICBuZXcgRmlsZShmKS5kZWxldGUoKTsKKyAgICAgIH0KKyAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHN1Y2NlZWQgaWYgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eSB3aGljaCBpcyB3aGF0IHdlIHdhbnQuCisgICAgICBkaXJlY3RvcnkuZGVsZXRlKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbE91dHB1dExvZ2dlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxPdXRwdXRMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAzZmFiCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxPdXRwdXRMb2dnZXIuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5UcmlhbE91dHB1dEZhY3RvcnkuRmlsZUFuZFdyaXRlcjsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuR3VhcmRlZEJ5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogQSBsb2dnZXIgdG8gd3JpdGUgdHJpYWwgb3V0cHV0IHRvIGEgZmlsZS4KKyAqLworQFRyaWFsU2NvcGVkIGZpbmFsIGNsYXNzIFRyaWFsT3V0cHV0TG9nZ2VyIGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKyAgQEd1YXJkZWRCeSgidGhpcyIpCisgIHByaXZhdGUgRmlsZSBmaWxlOworCisgIEBHdWFyZGVkQnkoInRoaXMiKQorICBwcml2YXRlIFByaW50V3JpdGVyIHdyaXRlcjsKKworICBwcml2YXRlIGZpbmFsIGludCB0cmlhbE51bWJlcjsKKyAgcHJpdmF0ZSBmaW5hbCBFeHBlcmltZW50IGV4cGVyaW1lbnQ7CisgIHByaXZhdGUgZmluYWwgVVVJRCB0cmlhbElkOworICBwcml2YXRlIGZpbmFsIFRyaWFsT3V0cHV0RmFjdG9yeSBvdXRwdXRNYW5hZ2VyOworCisgIEBJbmplY3QgVHJpYWxPdXRwdXRMb2dnZXIoVHJpYWxPdXRwdXRGYWN0b3J5IG91dHB1dE1hbmFnZXIsIEBUcmlhbE51bWJlciBpbnQgdHJpYWxOdW1iZXIsCisgICAgICBAVHJpYWxJZCBVVUlEIHRyaWFsSWQsIEV4cGVyaW1lbnQgZXhwZXJpbWVudCkgeworICAgIHRoaXMub3V0cHV0TWFuYWdlciA9IG91dHB1dE1hbmFnZXI7CisgICAgdGhpcy50cmlhbE51bWJlciA9IHRyaWFsTnVtYmVyOworICAgIHRoaXMudHJpYWxJZCA9IHRyaWFsSWQ7CisgICAgdGhpcy5leHBlcmltZW50ID0gZXhwZXJpbWVudDsKKyAgfQorICAKKyAgLyoqIE9wZW5zIHRoZSB0cmlhbCBvdXRwdXQgZmlsZS4gKi8KKyAgc3luY2hyb25pemVkIHZvaWQgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7CisgICAgICBGaWxlQW5kV3JpdGVyIGZpbGVBbmRXcml0ZXIgPSBvdXRwdXRNYW5hZ2VyLmdldFRyaWFsT3V0cHV0RmlsZSh0cmlhbE51bWJlcik7CisgICAgICBmaWxlID0gZmlsZUFuZFdyaXRlci5maWxlOworICAgICAgd3JpdGVyID0gZmlsZUFuZFdyaXRlci53cml0ZXI7CisgICAgfQorICB9CisgIAorICAvKiogCisgICAqIEVuc3VyZXMgdGhhdCB0aGUgd3JpdGVyIGhhcyBiZWVuIG9wZW5lZC4gYWxzbyBjcmVhdGVzIGEgaGFwcGVucy1iZWZvcmUgZWRnZSB0aGF0IGVuc3VyZXMgdGhhdAorICAgKiB3cml0ZXIgaXMgdmlzaWJsZSAoYW5kIG5vbi1udWxsKSBhZnRlciBhIG5vbi1leGNlcHRpb25hbCByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZC4KKyAgICovCisgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tPcGVuZWQoKSB7CisgICAgY2hlY2tTdGF0ZSh3cml0ZXIgIT0gbnVsbCwgIlRoZSBsb2dnZXIgaXMgbm90IG9wZW4iKTsKKyAgfQorCisgIC8qKiBQcmludHMgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHRoZSBmaWxlLiAqLworICBzeW5jaHJvbml6ZWQgdm9pZCBwcmludEhlYWRlcigpIHsKKyAgICBjaGVja09wZW5lZCgpOworICAgIC8vIG1ha2UgdGhlIGZpbGUgc2VsZiBkZXNjcmliaW5nCisgICAgLy8gVE9ETyhsdWtlcyk6IHdlIGNvdWxkIHByaW50IHRoZSBjb21tYW5kIGxpbmUgaGVyZS4gIFRoZSB1c2VyIHdvdWxkbid0IGJlIGFibGUgdG8gcnVuIGl0IGFnYWluCisgICAgLy8gc2luY2UgdGhlcmUgd291bGQgYmUgbm8gcnVubmVyIHNlbmRpbmcgY29udGludWUgbWVzc2FnZXMsIGJ1dCBpdCBtaWdodCBiZSB1c2VmdWwgdG8gZGVidWcKKyAgICAvLyBjbGFzc3BhdGggaXNzdWVzLgorICAgIHdyaXRlci5wcmludGxuKCJUcmlhbCBOdW1iZXI6ICIgKyB0cmlhbE51bWJlcik7CisgICAgd3JpdGVyLnByaW50bG4oIlRyaWFsIElkOiAiICsgdHJpYWxJZCk7CisgICAgd3JpdGVyLnByaW50bG4oIkV4cGVyaW1lbnQ6ICIgKyBleHBlcmltZW50KTsKKyAgICB3cml0ZXIucHJpbnRsbigpOworICB9CisgIAorICAvKiogCisgICAqIExvZ3MgYSBsaW5lIG9mIG91dHB1dCB0byB0aGUgbG9nZ2VyLgorICAgKiAKKyAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9mIHRoZSBsaW5lIChlLmcuICdzdGRlcnInKQorICAgKiBAcGFyYW0gbGluZSBUaGUgb3V0cHV0CisgICAqLworICBzeW5jaHJvbml6ZWQgdm9pZCBsb2coU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGxpbmUpIHsKKyAgICBjaGVja09wZW5lZCgpOworICAgIHdyaXRlci5wcmludGYoIlslc10gJXMlbiIsIHNvdXJjZSwgbGluZSk7CisgIH0KKyAgCisgIEBPdmVycmlkZSBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICAvKiogTWFya3MgdGhlIGxvZyBmaWxlIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgZGVsZXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBiZW5jaG1hcmsuICovCisgIHN5bmNocm9uaXplZCB2b2lkIGVuc3VyZUZpbGVJc1NhdmVkKCkgeworICAgIGNoZWNrT3BlbmVkKCk7CisgICAgb3V0cHV0TWFuYWdlci5wZXJzaXN0RmlsZShmaWxlKTsKKyAgfQorICAKKyAgLyoqIFJldHVybnMgdGhlIGxvZyBmaWxlIHBhdGguICovCisgIHN5bmNocm9uaXplZCBGaWxlIHRyaWFsT3V0cHV0RmlsZSgpIHsKKyAgICBjaGVja09wZW5lZCgpOworICAgIHJldHVybiBmaWxlOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbFJlc3VsdC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODcwYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxSZXN1bHQuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlRyaWFsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworLyoqCisgKiBBIHNpbXBsZSB0dXBsZSBvZiB0aGUgZGF0YQorICovCitmaW5hbCBjbGFzcyBUcmlhbFJlc3VsdCB7CisgIHByaXZhdGUgZmluYWwgVHJpYWwgdHJpYWw7CisgIHByaXZhdGUgZmluYWwgRXhwZXJpbWVudCBleHBlcmltZW50OworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiB0cmlhbE1lc3NhZ2VzOworCisgIFRyaWFsUmVzdWx0KFRyaWFsIHRyaWFsLCBFeHBlcmltZW50IGV4cGVyaW1lbnQsIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiB0cmlhbE1lc3NhZ2VzKSB7CisgICAgdGhpcy50cmlhbCA9IHRyaWFsOworICAgIHRoaXMuZXhwZXJpbWVudCA9IGV4cGVyaW1lbnQ7CisgICAgdGhpcy50cmlhbE1lc3NhZ2VzID0gdHJpYWxNZXNzYWdlczsKKyAgfQorICAKKyAgRXhwZXJpbWVudCBnZXRFeHBlcmltZW50KCkgeworICAgIHJldHVybiBleHBlcmltZW50OworICB9CisKKyAgVHJpYWwgZ2V0VHJpYWwoKSB7CisgICAgcmV0dXJuIHRyaWFsOworICB9CisKKyAgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IGdldFRyaWFsTWVzc2FnZXMoKSB7CisgICAgcmV0dXJuIHRyaWFsTWVzc2FnZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsUmVzdWx0RmFjdG9yeS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxSZXN1bHRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4ZTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsUmVzdWx0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuVHJpYWw7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5JbnN0cnVtZW50Lk1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3I7CisKKy8qKiAKKyAqIEEgZmFjdG9yeSBmb3IgcHJvZHVjaW5nIHtAbGluayBUcmlhbFJlc3VsdCBUcmlhbFJlc3VsdHN9IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb20gdmlzaXRvcnMuCisgKi8KK2ludGVyZmFjZSBUcmlhbFJlc3VsdEZhY3RvcnkgeworICAvKiogUmV0dXJucyBhIG5ldyB7QGxpbmsgVHJpYWx9LiAqLworICBUcmlhbFJlc3VsdCBuZXdUcmlhbFJlc3VsdChWbURhdGFDb2xsZWN0aW5nVmlzaXRvciB2bURhdGEsIAorICAgICAgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciBtZWFzdXJlbWVudERhdGEpOworfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxSdW5Mb29wLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbFJ1bkxvb3AuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODdmM2QyCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxSdW5Mb29wLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuTG9nTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLlNob3VsZENvbnRpbnVlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLlN0b3BNZWFzdXJlbWVudExvZ01lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlRyaWFsOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5vcHRpb25zLkNhbGlwZXJPcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuSW5zdHJ1bWVudC5NZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuU3RyZWFtU2VydmljZS5TdHJlYW1JdGVtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlNob3J0RHVyYXRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdG9wd2F0Y2g7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5TZXJ2aWNlLlN0YXRlOworCitpbXBvcnQgb3JnLmpvZGEudGltZS5EdXJhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBUaGUgbWFpbiBkYXRhIGdhdGhlciBjb250cm9sIGxvb3AgZm9yIGEgVHJpYWwuCisgKgorICogPHA+VGhpcyBjbGFzcyBzdGFydHMgdGhlIHdvcmtlciBwcm9jZXNzLCByZWFkcyBhbGwgdGhlIGRhdGEgZnJvbSBpdCBhbmQgY29uc3RydWN0cyB0aGUKKyAqIHtAbGluayBUcmlhbH0gd2hpbGUgZW5mb3JjaW5nIHRoZSB0cmlhbCB0aW1lb3V0LgorICovCitAVHJpYWxTY29wZWQgY2xhc3MgVHJpYWxSdW5Mb29wIGltcGxlbWVudHMgQ2FsbGFibGU8VHJpYWxSZXN1bHQ+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoVHJpYWxSdW5Mb29wLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgLyoqIFRoZSB0aW1lIHRoYXQgdGhlIHdvcmtlciBoYXMgdG8gY2xlYW4gdXAgYWZ0ZXIgYW4gZXhwZXJpbWVudC4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRHVyYXRpb24gV09SS0VSX0NMRUFOVVBfRFVSQVRJT04gPSBEdXJhdGlvbi5zdGFuZGFyZFNlY29uZHMoMik7CisKKyAgcHJpdmF0ZSBmaW5hbCBDYWxpcGVyT3B0aW9ucyBvcHRpb25zOworICBwcml2YXRlIGZpbmFsIFN0cmVhbVNlcnZpY2Ugc3RyZWFtU2VydmljZTsKKyAgcHJpdmF0ZSBmaW5hbCBUcmlhbFJlc3VsdEZhY3RvcnkgdHJpYWxGYWN0b3J5OworCisgIC8vIFRPRE8obHVrZXMpOiBUaGUgVm1EYXRhQ29sbGVjdGluZ1Zpc2l0b3Igc2hvdWxkIGJlIGFibGUgdG8gdGVsbCB1cyB3aGVuIGl0IGhhcyBjb2xsZWN0ZWQgYWxsCisgIC8vIGl0cyBkYXRhLgorICBwcml2YXRlIGZpbmFsIFZtRGF0YUNvbGxlY3RpbmdWaXNpdG9yIGRhdGFDb2xsZWN0aW5nVmlzaXRvcjsKKyAgcHJpdmF0ZSBmaW5hbCBTdG9wd2F0Y2ggdHJpYWxTdG9wd2F0Y2ggPSBTdG9wd2F0Y2guY3JlYXRlVW5zdGFydGVkKCk7CisgIHByaXZhdGUgZmluYWwgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciBtZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yOworICBwcml2YXRlIGZpbmFsIFRyaWFsT3V0cHV0TG9nZ2VyIHRyaWFsT3V0cHV0OworCisgIEBJbmplY3QgVHJpYWxSdW5Mb29wKAorICAgICAgTWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvciBtZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yLAorICAgICAgQ2FsaXBlck9wdGlvbnMgb3B0aW9ucywKKyAgICAgIFRyaWFsUmVzdWx0RmFjdG9yeSB0cmlhbEZhY3RvcnksCisgICAgICBUcmlhbE91dHB1dExvZ2dlciB0cmlhbE91dHB1dCwKKyAgICAgIFN0cmVhbVNlcnZpY2Ugc3RyZWFtU2VydmljZSwKKyAgICAgIFZtRGF0YUNvbGxlY3RpbmdWaXNpdG9yIGRhdGFDb2xsZWN0aW5nVmlzaXRvcikgeworICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgdGhpcy50cmlhbEZhY3RvcnkgPSB0cmlhbEZhY3Rvcnk7CisgICAgdGhpcy5zdHJlYW1TZXJ2aWNlID0gc3RyZWFtU2VydmljZTsKKyAgICB0aGlzLm1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IgPSBtZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yOyAKKyAgICB0aGlzLnRyaWFsT3V0cHV0ID0gdHJpYWxPdXRwdXQ7CisgICAgdGhpcy5kYXRhQ29sbGVjdGluZ1Zpc2l0b3IgPSBkYXRhQ29sbGVjdGluZ1Zpc2l0b3I7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFRyaWFsUmVzdWx0IGNhbGwoKSB0aHJvd3MgVHJpYWxGYWlsdXJlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHN0cmVhbVNlcnZpY2Uuc3RhdGUoKSAhPSBTdGF0ZS5ORVcpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIllvdSBjYW4gb25seSBpbnZva2UgdGhlIHJ1biBsb29wIG9uY2UiKTsKKyAgICB9CisgICAgdHJpYWxPdXRwdXQub3BlbigpOworICAgIHRyaWFsT3V0cHV0LnByaW50SGVhZGVyKCk7CisgICAgc3RyZWFtU2VydmljZS5zdGFydEFzeW5jKCkuYXdhaXRSdW5uaW5nKCk7CisgICAgdHJ5IHsKKyAgICAgIGxvbmcgdGltZUxpbWl0TmFub3MgPSBnZXRUcmlhbFRpbWVMaW1pdFRyaWFsTmFub3MoKTsKKyAgICAgIGJvb2xlYW4gZG9uZUNvbGxlY3RpbmcgPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworICAgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIFN0cmVhbUl0ZW0gaXRlbTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpdGVtID0gc3RyZWFtU2VydmljZS5yZWFkSXRlbSgKKyAgICAgICAgICAgICAgdGltZUxpbWl0TmFub3MgLSB0cmlhbFN0b3B3YXRjaC5lbGFwc2VkKE5BTk9TRUNPTkRTKSwgCisgICAgICAgICAgICAgIE5BTk9TRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRyaWFsT3V0cHV0LmVuc3VyZUZpbGVJc1NhdmVkKCk7CisgICAgICAgICAgLy8gU29tZW9uZSBoYXMgYXNrZWQgdXMgdG8gc3RvcCAodmlhIEZ1dHVyZXMuY2FuY2VsPykuCisgICAgICAgICAgaWYgKGRvbmVDb2xsZWN0aW5nKSB7CisgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLldBUk5JTkcsICJUcmlhbCBjYW5jZWxsZWQgYmVmb3JlIGNvbXBsZXRpbmcgbm9ybWFsbHkgKGJ1dCBhZnRlciAiCisgICAgICAgICAgICAgICAgKyAiY29sbGVjdGluZyBzdWZmaWNpZW50IGRhdGEpLiBJbnNwZWN0IHswfSB0byBzZWUgYW55IHdvcmtlciBvdXRwdXQiLCAKKyAgICAgICAgICAgICAgICB0cmlhbE91dHB1dC50cmlhbE91dHB1dEZpbGUoKSk7CisgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBXZSB3ZXJlIGFza2VkIHRvIHN0b3AgYnV0IHdlIGRpZG4ndCBhY3R1YWxseSBmaW5pc2ggKHRoZSBub3JtYWwgY2FzZSkuICBGYWlsIHRoZSB0cmlhbC4KKyAgICAgICAgICB0aHJvdyBuZXcgVHJpYWxGYWlsdXJlRXhjZXB0aW9uKAorICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJUcmlhbCBjYW5jZWxsZWQuICBJbnNwZWN0ICVzIHRvIHNlZSBhbnkgd29ya2VyIG91dHB1dC4iLAorICAgICAgICAgICAgICAgIHRyaWFsT3V0cHV0LnRyaWFsT3V0cHV0RmlsZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChpdGVtLmtpbmQoKSkgeworICAgICAgICAgIGNhc2UgREFUQToKKyAgICAgICAgICAgIExvZ01lc3NhZ2UgbG9nTWVzc2FnZSA9IGl0ZW0uY29udGVudCgpOworICAgICAgICAgICAgbG9nTWVzc2FnZS5hY2NlcHQobWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvcik7CisgICAgICAgICAgICBsb2dNZXNzYWdlLmFjY2VwdChkYXRhQ29sbGVjdGluZ1Zpc2l0b3IpOworICAgICAgICAgICAgaWYgKCFkb25lQ29sbGVjdGluZyAmJiBtZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yLmlzRG9uZUNvbGxlY3RpbmcoKSkgeworICAgICAgICAgICAgICBkb25lQ29sbGVjdGluZyA9IHRydWU7CisgICAgICAgICAgICAgIC8vIFdlIGhhdmUgcmVjZWl2ZWQgYWxsIHRoZSBtZWFzdXJlbWVudHMgd2UgbmVlZCBhbmQgYXJlIGFib3V0IHRvIHRlbGwgdGhlIHdvcmtlciB0bworICAgICAgICAgICAgICAvLyBzaHV0IGRvd24uICBBdCB0aGlzIHBvaW50IHRoZSB3b3JrZXIgc2hvdWxkIHNodXRkb3duIHNvb24sIGJ1dCB3ZSBkb24ndCB3YW50IHRvIAorICAgICAgICAgICAgICAvLyB3YWl0IHRvbyBsb25nLCBzbyBkZWNyZWFzZSB0aGUgdGltZSBsaW1pdCBzbyB0aGF0IHdlIHdhaXQgbm8gbW9yZSB0aGFuIAorICAgICAgICAgICAgICAvLyBXT1JLRVJfQ0xFQU5VUF9EVVJBVElPTi4KKyAgICAgICAgICAgICAgbG9uZyBjbGVhbnVwVGltZU5hbm9zID0gTUlMTElTRUNPTkRTLnRvTmFub3MoV09SS0VSX0NMRUFOVVBfRFVSQVRJT04uZ2V0TWlsbGlzKCkpOworICAgICAgICAgICAgICAvLyBUT0RPKGx1a2VzKTogRG9lcyB0aGUgbWluIG9wZXJhdGlvbiBtYWtlIHNlbnNlIGhlcmU/IHNob3VsZCB3ZSBqdXN0IHVzZSB0aGUgCisgICAgICAgICAgICAgIC8vIGNsZWFudXBUaW1lTmFub3M/CisgICAgICAgICAgICAgIHRpbWVMaW1pdE5hbm9zID0gdHJpYWxTdG9wd2F0Y2guZWxhcHNlZChOQU5PU0VDT05EUykgKyBjbGVhbnVwVGltZU5hbm9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBzdG9wIG1lYXN1cmVtZW50IG1lc3NhZ2Ugd2UgbmVlZCB0byB0ZWxsIHRoZSB3b3JrZXIgdG8gZWl0aGVyIHN0b3Agb3Iga2VlcAorICAgICAgICAgICAgLy8gZ29pbmcgd2l0aCBhIFdvcmtlckNvbnRpbnVlTWVzc2FnZS4gIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciB0aGUgCisgICAgICAgICAgICAvLyBtZWFzdXJlbWVudENvbGxlY3RpbmcgdmlzaXRvciBzZWVzIHRoZSBtZXNzYWdlIHNvIHRoYXQgaXNEb25lQ29sbGVjdGlvbiB3aWxsIGJlIHVwIHRvCisgICAgICAgICAgICAvLyBkYXRlLgorICAgICAgICAgICAgaWYgKGxvZ01lc3NhZ2UgaW5zdGFuY2VvZiBTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlKSB7CisgICAgICAgICAgICAgIC8vIFRPRE8obHVrZXMpOiB0aGlzIGlzIGEgYmxvY2tpbmcgd3JpdGUsIHBlcmhhcHMgd2Ugc2hvdWxkIHBlcmZvcm0gaXQgaW4gYSBub24gCisgICAgICAgICAgICAgIC8vIGJsb2NraW5nIG1hbm5lciB0byBrZWVwIHRoaXMgdGhyZWFkIG9ubHkgYmxvY2tpbmcgaW4gb25lIHBsYWNlLiAgVGhpcyB3b3VsZCAKKyAgICAgICAgICAgICAgLy8gY29tcGxpY2F0ZSBlcnJvciBoYW5kbGluZywgYnV0IG1heSBpbmNyZWFzZSBwZXJmb3JtYW5jZSBzaW5jZSBpdCB3b3VsZCBmcmVlIHRoaXMKKyAgICAgICAgICAgICAgLy8gdGhyZWFkIHVwIHRvIGhhbmRsZSBvdGhlciBtZXNzYWdlcworICAgICAgICAgICAgICBzdHJlYW1TZXJ2aWNlLnNlbmRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgbmV3IFNob3VsZENvbnRpbnVlTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAhZG9uZUNvbGxlY3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZW1lbnRDb2xsZWN0aW5nVmlzaXRvci5pc1dhcm11cENvbXBsZXRlKCkpKTsKKyAgICAgICAgICAgICAgaWYgKGRvbmVDb2xsZWN0aW5nKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtU2VydmljZS5jbG9zZVdyaXRlcigpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEVPRjoKKyAgICAgICAgICAgIC8vIFdlIGNvbnNpZGVyIEVPRiB0byBiZSBzeW5vbnltb3VzIHdpdGggd29ya2VyIHNodXRkb3duCisgICAgICAgICAgICBpZiAoIWRvbmVDb2xsZWN0aW5nKSB7CisgICAgICAgICAgICAgIHRyaWFsT3V0cHV0LmVuc3VyZUZpbGVJc1NhdmVkKCk7CisgICAgICAgICAgICAgIHRocm93IG5ldyBUcmlhbEZhaWx1cmVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVGhlIHdvcmtlciBleGl0ZWQgd2l0aG91dCBwcm9kdWNpbmcgIgorICAgICAgICAgICAgICAgICAgKyAiZGF0YS4gSXQgaGFzIGxpa2VseSBjcmFzaGVkLiBJbnNwZWN0ICVzIHRvIHNlZSBhbnkgd29ya2VyIG91dHB1dC4iLCAKKyAgICAgICAgICAgICAgICAgIHRyaWFsT3V0cHV0LnRyaWFsT3V0cHV0RmlsZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVElNRU9VVDoKKyAgICAgICAgICAgIHRyaWFsT3V0cHV0LmVuc3VyZUZpbGVJc1NhdmVkKCk7CisgICAgICAgICAgICBpZiAoZG9uZUNvbGxlY3RpbmcpIHsKKyAgICAgICAgICAgICAgLy8gU2hvdWxkIHRoaXMgYmUgYW4gZXJyb3I/CisgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuV0FSTklORywgIldvcmtlciBmYWlsZWQgdG8gZXhpdCBjbGVhbmx5IHdpdGhpbiB0aGUgYWxsb3RlZCB0aW1lLiAiCisgICAgICAgICAgICAgICAgICArICJJbnNwZWN0IHswfSB0byBzZWUgYW55IHdvcmtlciBvdXRwdXQiLCB0cmlhbE91dHB1dC50cmlhbE91dHB1dEZpbGUoKSk7CisgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyaWFsRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgIlRyaWFsIGV4Y2VlZGVkIHRoZSB0b3RhbCBhbGxvd2FibGUgcnVudGltZSAoJXMpLiAiCisgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIGxpbWl0IG1heSBiZSBhZGp1c3RlZCB1c2luZyB0aGUgLS10aW1lLWxpbWl0IGZsYWcuICBJbnNwZWN0ICVzIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICArICJzZWUgYW55IHdvcmtlciBvdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudGltZUxpbWl0KCksIHRyaWFsT3V0cHV0LnRyaWFsT3V0cHV0RmlsZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJJbXBvc3NpYmxlIGl0ZW06ICIgKyBpdGVtKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRyaWFsRmFjdG9yeS5uZXdUcmlhbFJlc3VsdChkYXRhQ29sbGVjdGluZ1Zpc2l0b3IsIG1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZUlmSW5zdGFuY2VPZihlLCBUcmlhbEZhaWx1cmVFeGNlcHRpb24uY2xhc3MpOworICAgICAgLy8gVGhpcyBpcyBzb21lIGZhaWx1cmUgdGhhdCBpcyBub3QgYSBUcmlhbEZhaWx1cmVFeGNlcHRpb24sIGxldCB0aGUgZXhjZXB0aW9uIHByb3BhZ2F0ZSBidXQKKyAgICAgIC8vIGxvZyB0aGUgZmlsZW5hbWUgZm9yIHRoZSB1c2VyLiAKKyAgICAgIHRyaWFsT3V0cHV0LmVuc3VyZUZpbGVJc1NhdmVkKCk7CisgICAgICBsb2dnZXIuc2V2ZXJlKAorICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIGV4ZWN1dGluZyB0cmlhbC4gSW5zcGVjdCAlcyB0byBzZWUgYW55IHdvcmtlciBvdXRwdXQuIiwgCisgICAgICAgICAgICAgIHRyaWFsT3V0cHV0LnRyaWFsT3V0cHV0RmlsZSgpKSk7CisgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgdHJpYWxTdG9wd2F0Y2gucmVzZXQoKTsKKyAgICAgIHN0cmVhbVNlcnZpY2Uuc3RvcEFzeW5jKCk7CisgICAgICB0cmlhbE91dHB1dC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgbG9uZyBnZXRUcmlhbFRpbWVMaW1pdFRyaWFsTmFub3MoKSB7CisgICAgU2hvcnREdXJhdGlvbiB0aW1lTGltaXQgPSBvcHRpb25zLnRpbWVMaW1pdCgpOworICAgIGlmIChTaG9ydER1cmF0aW9uLnplcm8oKS5lcXVhbHModGltZUxpbWl0KSkgeworICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gdGltZUxpbWl0LnRvKE5BTk9TRUNPTkRTKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxTY2hlZHVsaW5nUG9saWN5LmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbFNjaGVkdWxpbmdQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDRjYTljCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxTY2hlZHVsaW5nUG9saWN5LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworLyoqCisgKiBUaGUgc2NoZWR1bGluZyBwb2xpY3kgZm9yIGEgcGFydGljdWxhciB0cmlhbC4KKyAqCisgKiA8cD5UT0RPKGx1a2VzKTogQ3VycmVudGx5IHRoaXMgaXMgZXh0cmVtZWx5IHNpbXBsZS4gIFRyaWFscyBjYW4gYmUgc2NoZWR1bGVkIGluIHBhcmFsbGVsIHdpdGgKKyAqIG90aGVyIHRyaWFscyBvciBub3QuICBJbiB0aGUgZnV0dXJlLCB0aGlzIHNob3VsZCB1c2Ugc29tZSBraW5kIG9mIGNvc3QgbW9kZWxpbmcuCisgKi8KK2VudW0gVHJpYWxTY2hlZHVsaW5nUG9saWN5IHsKKyAgUEFSQUxMRUwsCisgIFNFUklBTDsKK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvVXBsb2FkUmVzdWx0cy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxTY29wZUNvbXBvbmVudC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjUlCmNvcHkgZnJvbSBjYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YQpjb3B5IHRvIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsU2NvcGVDb21wb25lbnQuamF2YQppbmRleCA3ZGFlN2FmLi41ZjIzNTQ5IDEwMDY0NAotLS0gYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1VwbG9hZFJlc3VsdHMuamF2YQorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9UcmlhbFNjb3BlQ29tcG9uZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE1ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7CitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgZGFnZ2VyLlN1YmNvbXBvbmVudDsKIAogLyoqCi0gKiBVc2FnZTogVXBsb2FkUmVzdWx0cyA8ZmlsZV9vcl9kaXI+CisgKiBDb21wb25lbnQgZm9yIGNyZWF0aW5nIHtAbGluayBTY2hlZHVsZWRUcmlhbH0gaW4gdGhlIHtAbGluayBUcmlhbFNjb3BlZH0uCiAgKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRSZXN1bHRzIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIG5ldyBSdW5uZXIoKS51cGxvYWRSZXN1bHRzRmlsZU9yRGlyKG5ldyBGaWxlKGFyZ3NbMF0pKTsKLSAgfQorQFRyaWFsU2NvcGVkCitAU3ViY29tcG9uZW50KG1vZHVsZXMgPSB7VHJpYWxNb2R1bGUuY2xhc3N9KQoraW50ZXJmYWNlIFRyaWFsU2NvcGVDb21wb25lbnQgeworICBTY2hlZHVsZWRUcmlhbCBnZXRTY2hlZHVsZWRUcmlhbCgpOwogfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVHJpYWxTY29wZWQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsU2NvcGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhNDY1YQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1RyaWFsU2NvcGVkLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNjb3BlOworCisvKioKKyAqIFNjb3BlIGFubm90YXRpb24gZm9yIHRoZSBUcmlhbFNjb3BlLgorICoKKyAqIDxwPkFwcGx5IHRoaXMgdG8gYmluZGluZyBmb3Igd2hpY2ggdGhlcmUgY2FuIG9ubHkgYmUgb25lIHBlciB0cmlhbC4KKyAqLworQFRhcmdldCh7IFRZUEUsIE1FVEhPRCB9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BTY29wZQorQGludGVyZmFjZSBUcmlhbFNjb3BlZCB7fQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVXNlckNvZGVFeGNlcHRpb24uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1VzZXJDb2RlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFhNjMzNwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1VzZXJDb2RlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKKy8qKgorICogU2lnbmlmaWVzIHRoYXQgdGhlIHVzZXIncyBiZW5jaG1hcmsgY29kZSB0aHJldyBhbiBleGNlcHRpb24uCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIFVzZXJDb2RlRXhjZXB0aW9uIGV4dGVuZHMgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBVc2VyQ29kZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgICAgaW5pdENhdXNlKGNhdXNlKTsKKyAgfQorCisgIHB1YmxpYyBVc2VyQ29kZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICB0aGlzKCJBbiBleGNlcHRpb24gd2FzIHRocm93biBmcm9tIHRoZSBiZW5jaG1hcmsgY29kZSIsIGNhdXNlKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBkaXNwbGF5KFByaW50V3JpdGVyIHdyaXRlcikgeworICAgIHByaW50U3RhY2tUcmFjZSh3cml0ZXIpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9WaXJ0dWFsTWFjaGluZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVmlydHVhbE1hY2hpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDgwMjBiCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvVmlydHVhbE1hY2hpbmUuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLlZtQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuTW9yZU9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworCisvKioKKyAqIEEgbmFtZWQgdmlydHVhbCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KK2ZpbmFsIGNsYXNzIFZpcnR1YWxNYWNoaW5lIHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIFZtQ29uZmlnIGNvbmZpZzsKKworICBWaXJ0dWFsTWFjaGluZShTdHJpbmcgbmFtZSwgVm1Db25maWcgY29uZmlnKSB7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBWaXJ0dWFsTWFjaGluZSkgeworICAgICAgVmlydHVhbE1hY2hpbmUgdGhhdCA9IChWaXJ0dWFsTWFjaGluZSkgb2JqZWN0OworICAgICAgcmV0dXJuIHRoaXMubmFtZS5lcXVhbHModGhhdC5uYW1lKQorICAgICAgICAgICYmIHRoaXMuY29uZmlnLmVxdWFscyh0aGF0LmNvbmZpZyk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUsIGNvbmZpZyk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gTW9yZU9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgICAgLmFkZCgibmFtZSIsIG5hbWUpCisgICAgICAgIC5hZGQoImNvbmZpZyIsIGNvbmZpZykKKyAgICAgICAgLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1ZtRGF0YUNvbGxlY3RpbmdWaXNpdG9yLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9WbURhdGFDb2xsZWN0aW5nVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTZkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9WbURhdGFDb2xsZWN0aW5nVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuQWJzdHJhY3RMb2dNZXNzYWdlVmlzaXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLkZhaWx1cmVMb2dNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuVm1PcHRpb25Mb2dNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuVm1Qcm9wZXJ0aWVzTG9nTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuVm1TcGVjOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5QbGF0Zm9ybTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9wdGlvbmFsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKiBBbiB7QGxpbmsgQWJzdHJhY3RMb2dNZXNzYWdlVmlzaXRvcn0gdGhhdCBjb2xsZWN0cyBkYXRhIGFib3V0IEpWTSBwcm9wZXJ0aWVzIGFuZCBvcHRpb25zLiAqLworQFRyaWFsU2NvcGVkCitmaW5hbCBjbGFzcyBWbURhdGFDb2xsZWN0aW5nVmlzaXRvciBleHRlbmRzIEFic3RyYWN0TG9nTWVzc2FnZVZpc2l0b3IgeworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU1hcC5CdWlsZGVyPFN0cmluZywgU3RyaW5nPiB2bU9wdGlvbnNCdWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgcHJpdmF0ZSBmaW5hbCBQbGF0Zm9ybSBwbGF0Zm9ybTsKKyAgcHJpdmF0ZSBPcHRpb25hbDxJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+PiB2bVByb3BlcnRpZXMgPSBPcHRpb25hbC5hYnNlbnQoKTsKKworICBASW5qZWN0IFZtRGF0YUNvbGxlY3RpbmdWaXNpdG9yKFBsYXRmb3JtIHBsYXRmb3JtKSB7CisgICAgdGhpcy5wbGF0Zm9ybSA9IHBsYXRmb3JtOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSB7QGxpbmsgVm1TcGVjfSBiYXNlZCBvbiB0aGUgZGF0YSBnYXRoZXJlZCBieSB0aGlzIHZpc2l0b3IuCisgICAqCisgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIG5vdCBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gZ2F0aGVyZWQuCisgICAqLworICBWbVNwZWMgdm1TcGVjKCkgeworICAgIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IHZtT3B0aW9uc0J1aWxkZXIuYnVpbGQoKTsKKyAgICBwbGF0Zm9ybS5jaGVja1ZtUHJvcGVydGllcyhvcHRpb25zKTsKKyAgICByZXR1cm4gbmV3IFZtU3BlYy5CdWlsZGVyKCkKKyAgICAgICAgLmFkZEFsbFByb3BlcnRpZXModm1Qcm9wZXJ0aWVzLmdldCgpKQorICAgICAgICAuYWRkQWxsT3B0aW9ucyhvcHRpb25zKQorICAgICAgICAuYnVpbGQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB2aXNpdChGYWlsdXJlTG9nTWVzc2FnZSBsb2dNZXNzYWdlKSB7CisgICAgdGhyb3cgbmV3IFByb3h5V29ya2VyRXhjZXB0aW9uKGxvZ01lc3NhZ2Uuc3RhY2tUcmFjZSgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB2aXNpdChWbU9wdGlvbkxvZ01lc3NhZ2UgbG9nTWVzc2FnZSkgeworICAgIHZtT3B0aW9uc0J1aWxkZXIucHV0KGxvZ01lc3NhZ2UubmFtZSgpLCBsb2dNZXNzYWdlLnZhbHVlKCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHZpc2l0KFZtUHJvcGVydGllc0xvZ01lc3NhZ2UgbG9nTWVzc2FnZSkgeworICAgIHZtUHJvcGVydGllcyA9IE9wdGlvbmFsLm9mKEltbXV0YWJsZU1hcC5jb3B5T2YoCisgICAgICAgIE1hcHMuZmlsdGVyS2V5cyhsb2dNZXNzYWdlLnByb3BlcnRpZXMoKSwgcGxhdGZvcm0udm1Qcm9wZXJ0aWVzVG9SZXRhaW4oKSkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvV29ya2VyUHJvY2Vzcy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvV29ya2VyUHJvY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGEyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9Xb3JrZXJQcm9jZXNzLmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuQ29tbWFuZExpbmVTZXJpYWxpemVyOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuT3BlbmVkU29ja2V0OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuV29ya2VyU3BlYzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLlZtQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5CZW5jaG1hcmtTcGVjOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuSW5zdHJ1bWVudC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlci5Xb3JrZXJNYWluOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5hYmxlRnV0dXJlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuR3VhcmRlZEJ5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiB1bnN0YXJ0ZWQgd29ya2VyLgorICoKKyAqIDxwPkEgd29ya2VyIGlzIGEgc3ViIHByb2Nlc3MgdGhhdCBydW5zIGEgYmVuY2htYXJrIHRyaWFsLiAgU3BlY2lmaWNhbGx5IGl0IGlzIGEgSlZNIHJ1bm5pbmcKKyAqIHtAbGluayBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyLldvcmtlck1haW59LiAgQmVjYXVzZSBvZiB0aGlzIHdlIGNhbiBtYWtlIGNlcnRhaW4gYXNzdW1wdGlvbnMKKyAqIGFib3V0IGl0cyBiZWhhdmlvciwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bzoKKyAqCisgKiA8dWw+CisgKiAgIDxsaT5UaGUgd29ya2VyIHdpbGwgY29ubmVjdCBiYWNrIHRvIHVzIG92ZXIgYSBzb2NrZXQgY29ubmVjdGlvbiBhbmQgc2VuZCB1cyBVVEYtOCBqc29uCisgKiAgICAgICBtZXNzYWdlcyBpbiBhIGxpbmUgb3JpZW50ZWQgcHJvdG9jb2wuCisgKiAgIDxsaT5UT0RPKGx1a2VzLGdhayk6IFRoaXMgaXMgcHJvYmFibHkgYXMgZ29vZCBhIHBsYWNlIGFzIGFueSB0byBzcGVjaWZ5IHRoZSBlbnRpcmUgcHJvdG9jb2wuCisgKiA8L3VsPgorICovCitAVHJpYWxTY29wZWQgZmluYWwgY2xhc3MgV29ya2VyUHJvY2VzcyB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFdvcmtlclByb2Nlc3MuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgcHJpdmF0ZSBQcm9jZXNzIHdvcmtlcjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm9jZXNzQnVpbGRlciB3b3JrZXJCdWlsZGVyOworICBwcml2YXRlIGZpbmFsIFNodXRkb3duSG9va1JlZ2lzdHJhciBzaHV0ZG93bkhvb2tSZWdpc3RyYXI7CisgIHByaXZhdGUgZmluYWwgTGlzdGVuYWJsZUZ1dHVyZTxPcGVuZWRTb2NrZXQ+IG9wZW5lZFNvY2tldDsKKyAgcHJpdmF0ZSBmaW5hbCBVVUlEIHRyaWFsSWQ7CisKKyAgQFZpc2libGVGb3JUZXN0aW5nIFdvcmtlclByb2Nlc3MoUHJvY2Vzc0J1aWxkZXIgd29ya2VyQnVpbGRlciwKKyAgICAgIFVVSUQgdHJpYWxJZCwKKyAgICAgIExpc3RlbmFibGVGdXR1cmU8T3BlbmVkU29ja2V0PiBvcGVuZWRTb2NrZXQsCisgICAgICBTaHV0ZG93bkhvb2tSZWdpc3RyYXIgc2h1dGRvd25Ib29rUmVnaXN0cmFyKSB7CisgICAgdGhpcy50cmlhbElkID0gdHJpYWxJZDsKKyAgICB0aGlzLndvcmtlckJ1aWxkZXIgPSB3b3JrZXJCdWlsZGVyOworICAgIHRoaXMub3BlbmVkU29ja2V0ID0gb3BlbmVkU29ja2V0OworICAgIHRoaXMuc2h1dGRvd25Ib29rUmVnaXN0cmFyID0gc2h1dGRvd25Ib29rUmVnaXN0cmFyOworICB9CisKKyAgQEluamVjdCBXb3JrZXJQcm9jZXNzKEBUcmlhbElkIFVVSUQgdHJpYWxJZCwKKyAgICAgIExpc3RlbmFibGVGdXR1cmU8T3BlbmVkU29ja2V0PiBvcGVuZWRTb2NrZXQsCisgICAgICBFeHBlcmltZW50IGV4cGVyaW1lbnQsCisgICAgICBCZW5jaG1hcmtTcGVjIGJlbmNobWFya1NwZWMsCisgICAgICBATG9jYWxQb3J0IGludCBsb2NhbFBvcnQsCisgICAgICBCZW5jaG1hcmtDbGFzcyBiZW5jaG1hcmtDbGFzcywKKyAgICAgIFNodXRkb3duSG9va1JlZ2lzdHJhciBzaHV0ZG93bkhvb2tSZWdpc3RyYXIpIHsKKyAgICB0aGlzLnRyaWFsSWQgPSB0cmlhbElkOworICAgIHRoaXMud29ya2VyQnVpbGRlciA9CisgICAgICAgIGJ1aWxkUHJvY2Vzcyh0cmlhbElkLCBleHBlcmltZW50LCBiZW5jaG1hcmtTcGVjLCBsb2NhbFBvcnQsIGJlbmNobWFya0NsYXNzKTsKKyAgICB0aGlzLm9wZW5lZFNvY2tldCA9IG9wZW5lZFNvY2tldDsKKyAgICB0aGlzLnNodXRkb3duSG9va1JlZ2lzdHJhciA9IHNodXRkb3duSG9va1JlZ2lzdHJhcjsKKyAgfQorCisgIExpc3RlbmFibGVGdXR1cmU8T3BlbmVkU29ja2V0PiBzb2NrZXRGdXR1cmUoKSB7CisgICAgcmV0dXJuIG9wZW5lZFNvY2tldDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEge0BsaW5rIFByb2Nlc3N9IHJlcHJlc2VudGluZyB0aGlzIHdvcmtlci4gIFRoZSBwcm9jZXNzIHdpbGwgYmUgc3RhcnRlZCBpZiBpdCBoYXNuJ3QKKyAgICogYWxyZWFkeS4KKyAgICovCisgIHN5bmNocm9uaXplZCBQcm9jZXNzIHN0YXJ0V29ya2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAod29ya2VyID09IG51bGwpIHsKKyAgICAgIGZpbmFsIFByb2Nlc3MgZGVsZWdhdGUgPSB3b3JrZXJCdWlsZGVyLnN0YXJ0KCk7CisgICAgICBmaW5hbCBUaHJlYWQgc2h1dGRvd25Ib29rID0gbmV3IFRocmVhZCgid29ya2VyLXNodXRkb3duLWhvb2stIiArIHRyaWFsSWQpIHsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICBkZWxlZ2F0ZS5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBzaHV0ZG93bkhvb2tSZWdpc3RyYXIuYWRkU2h1dGRvd25Ib29rKHNodXRkb3duSG9vayk7CisgICAgICB3b3JrZXIgPSBuZXcgUHJvY2VzcygpIHsKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgeworICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIElucHV0U3RyZWFtIGdldEVycm9yU3RyZWFtKCkgeworICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRFcnJvclN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgd2FpdEZvcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgaW50IHdhaXRGb3IgPSBkZWxlZ2F0ZS53YWl0Rm9yKCk7CisgICAgICAgICAgc2h1dGRvd25Ib29rUmVnaXN0cmFyLnJlbW92ZVNodXRkb3duSG9vayhzaHV0ZG93bkhvb2spOworICAgICAgICAgIHJldHVybiB3YWl0Rm9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgZXhpdFZhbHVlKCkgeworICAgICAgICAgIGludCBleGl0VmFsdWUgPSBkZWxlZ2F0ZS5leGl0VmFsdWUoKTsKKyAgICAgICAgICAvLyBpZiBpdCBoYXNuJ3QgdGhyb3duLCB0aGUgcHJvY2VzcyBpcyBkb25lCisgICAgICAgICAgc2h1dGRvd25Ib29rUmVnaXN0cmFyLnJlbW92ZVNodXRkb3duSG9vayhzaHV0ZG93bkhvb2spOworICAgICAgICAgIHJldHVybiBleGl0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgICBkZWxlZ2F0ZS5kZXN0cm95KCk7CisgICAgICAgICAgc2h1dGRvd25Ib29rUmVnaXN0cmFyLnJlbW92ZVNodXRkb3duSG9vayhzaHV0ZG93bkhvb2spOworICAgICAgICB9CisgICAgICB9OworICAgIH0KKyAgICByZXR1cm4gd29ya2VyOworICB9CisgIAorICBAVmlzaWJsZUZvclRlc3Rpbmcgc3RhdGljIFByb2Nlc3NCdWlsZGVyIGJ1aWxkUHJvY2VzcygKKyAgICAgIFVVSUQgdHJpYWxJZCwKKyAgICAgIEV4cGVyaW1lbnQgZXhwZXJpbWVudCwKKyAgICAgIEJlbmNobWFya1NwZWMgYmVuY2htYXJrU3BlYywKKyAgICAgIGludCBsb2NhbFBvcnQsCisgICAgICBCZW5jaG1hcmtDbGFzcyBiZW5jaG1hcmtDbGFzcykgeworICAgIC8vIFRPRE8obHVrZXMpOiBpdCB3b3VsZCBiZSBuaWNlIHRvIHNwbGl0IHRoaXMgbWV0aG9kIGludG8gYSBmZXcgc21hbGxlciBtb3JlIHRhcmdldGVkIG1ldGhvZHMKKyAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gZXhwZXJpbWVudC5pbnN0cnVtZW50YXRpb24oKTsKKyAgICBJbnN0cnVtZW50IGluc3RydW1lbnQgPSBpbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudCgpOworICAgIFdvcmtlclNwZWMgcmVxdWVzdCA9IG5ldyBXb3JrZXJTcGVjKAorICAgICAgICB0cmlhbElkLAorICAgICAgICBpbnN0cnVtZW50YXRpb24ud29ya2VyQ2xhc3MoKSwKKyAgICAgICAgaW5zdHJ1bWVudGF0aW9uLndvcmtlck9wdGlvbnMoKSwKKyAgICAgICAgYmVuY2htYXJrU3BlYywKKyAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YoaW5zdHJ1bWVudGF0aW9uLmJlbmNobWFya01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKSwKKyAgICAgICAgbG9jYWxQb3J0KTsKKworICAgIFByb2Nlc3NCdWlsZGVyIHByb2Nlc3NCdWlsZGVyID0gbmV3IFByb2Nlc3NCdWlsZGVyKCkucmVkaXJlY3RFcnJvclN0cmVhbShmYWxzZSk7CisKKyAgICBMaXN0PFN0cmluZz4gYXJncyA9IHByb2Nlc3NCdWlsZGVyLmNvbW1hbmQoKTsKKworICAgIFZpcnR1YWxNYWNoaW5lIHZtID0gZXhwZXJpbWVudC52bSgpOworICAgIFZtQ29uZmlnIHZtQ29uZmlnID0gdm0uY29uZmlnOworICAgIGFyZ3MuYWRkQWxsKGdldEp2bUFyZ3Modm0sIGJlbmNobWFya0NsYXNzKSk7CisKKyAgICBJdGVyYWJsZTxTdHJpbmc+IGluc3RydW1lbnRKdm1PcHRpb25zID0gaW5zdHJ1bWVudC5nZXRFeHRyYUNvbW1hbmRMaW5lQXJncyh2bUNvbmZpZyk7CisgICAgbG9nZ2VyLmZpbmUoU3RyaW5nLmZvcm1hdCgiSW5zdHJ1bWVudCglcykgSmF2YSBhcmdzOiAlcyIsIGluc3RydW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisgICAgICAgIGluc3RydW1lbnRKdm1PcHRpb25zKSk7CisgICAgSXRlcmFibGVzLmFkZEFsbChhcmdzLCBpbnN0cnVtZW50SnZtT3B0aW9ucyk7CisKKyAgICAvLyBsYXN0IHRvIGVuc3VyZSB0aGF0IHRoZXkncmUgYWx3YXlzIGFwcGxpZWQKKyAgICBhcmdzLmFkZEFsbCh2bUNvbmZpZy53b3JrZXJQcm9jZXNzQXJncygpKTsKKworICAgIGFyZ3MuYWRkKFdvcmtlck1haW4uY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBhcmdzLmFkZChDb21tYW5kTGluZVNlcmlhbGl6ZXIucmVuZGVyKHJlcXVlc3QpKTsKKworICAgIGxvZ2dlci5maW5lc3QoU3RyaW5nLmZvcm1hdCgiRnVsbCBKVk0gKCVzKSBhcmdzOiAlcyIsIHZtLm5hbWUsIGFyZ3MpKTsKKyAgICByZXR1cm4gcHJvY2Vzc0J1aWxkZXI7CisgIH0KKyAgCisgIEBWaXNpYmxlRm9yVGVzdGluZyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEp2bUFyZ3MoCisgICAgICBWaXJ0dWFsTWFjaGluZSB2bSwKKyAgICAgIEJlbmNobWFya0NsYXNzIGJlbmNobWFya0NsYXNzKSB7CisKKyAgICBWbUNvbmZpZyB2bUNvbmZpZyA9IHZtLmNvbmZpZzsKKyAgICBTdHJpbmcgcGxhdGZvcm1OYW1lID0gdm1Db25maWcucGxhdGZvcm1OYW1lKCk7CisKKyAgICBMaXN0PFN0cmluZz4gYXJncyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIFN0cmluZyBqZGtQYXRoID0gdm1Db25maWcudm1FeGVjdXRhYmxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgYXJncy5hZGQoamRrUGF0aCk7CisgICAgbG9nZ2VyLmZpbmUoU3RyaW5nLmZvcm1hdCgiJXMoJXMpIFBhdGg6ICVzIiwgcGxhdGZvcm1OYW1lLCB2bS5uYW1lLCBqZGtQYXRoKSk7CisKKyAgICBJbW11dGFibGVMaXN0PFN0cmluZz4ganZtT3B0aW9ucyA9IHZtQ29uZmlnLm9wdGlvbnMoKTsKKyAgICBhcmdzLmFkZEFsbChqdm1PcHRpb25zKTsKKyAgICBsb2dnZXIuZmluZShTdHJpbmcuZm9ybWF0KCIlcyglcykgYXJnczogJXMiLCBwbGF0Zm9ybU5hbWUsIHZtLm5hbWUsIGp2bU9wdGlvbnMpKTsKKyAgICAKKyAgICBJbW11dGFibGVTZXQ8U3RyaW5nPiBiZW5jaG1hcmtKdm1PcHRpb25zID0gYmVuY2htYXJrQ2xhc3Mudm1PcHRpb25zKCk7CisgICAgYXJncy5hZGRBbGwoYmVuY2htYXJrSnZtT3B0aW9ucyk7CisgICAgbG9nZ2VyLmZpbmUoU3RyaW5nLmZvcm1hdCgiQmVuY2htYXJrKCVzKSAlcyBhcmdzOiAlcyIsIGJlbmNobWFya0NsYXNzLm5hbWUoKSwgcGxhdGZvcm1OYW1lLAorICAgICAgICBiZW5jaG1hcmtKdm1PcHRpb25zKSk7CisKKyAgICBTdHJpbmcgY2xhc3NQYXRoID0gdm1Db25maWcud29ya2VyQ2xhc3NQYXRoKCk7CisgICAgQ29sbGVjdGlvbnMuYWRkQWxsKGFyZ3MsICItY3AiLCBjbGFzc1BhdGgpOworICAgIGxvZ2dlci5maW5lcihTdHJpbmcuZm9ybWF0KCJDbGFzcyBwYXRoOiAlcyIsIGNsYXNzUGF0aCkpOworICAgIHJldHVybiBhcmdzOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvRGlzcGxheVVzYWdlRXhjZXB0aW9uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvRGlzcGxheVVzYWdlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxMmM1NQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9EaXNwbGF5VXNhZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKKy8qKgorICogRXhjZXB0aW9uIHVzZWQgdG8gYWJvcnQgY29tbWFuZC1saW5lIHByb2Nlc3NpbmcgYmVjYXVzZSB0aGUgdXNlciBoYXMgYXNrZWQgZm9yIGhlbHAgKHVzaW5nIGVpdGhlcgorICogLS1oZWxwIG9yIC1oKS4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpIC8vIHdobyB3b3VsZCBzZXJpYWxpemUgYSBjb21tYW5kLWxpbmUgcGFyc2luZyBlcnJvcj8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEaXNwbGF5VXNhZ2VFeGNlcHRpb24gZXh0ZW5kcyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiB7CisgIHB1YmxpYyBEaXNwbGF5VXNhZ2VFeGNlcHRpb24oKSB7CisgICAgc3VwZXIoIihVc2VyIGFza2VkIGZvciAtLWhlbHAuIFRoaXMgbWVzc2FnZSBzaG91bGQgbm90IGFwcGVhciBhbnl3aGVyZS4pIik7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZGlzcGxheShQcmludFdyaXRlciB3cml0ZXIpIHsKKyAgICBkaXNwbGF5VXNhZ2Uod3JpdGVyKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgaW50IGV4aXRDb2RlKCkgeworICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvSW50ZXJsZWF2ZWRSZWFkZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9JbnRlcmxlYXZlZFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDI5M2JmLi4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9JbnRlcmxlYXZlZFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoqCi0gKiBSZWFkcyBhIHN0cmVhbSBjb250YWluaW5nIGlubGluZSBKU09OIG9iamVjdHMuIEVhY2ggSlNPTiBvYmplY3QgaXMgcHJlZml4ZWQKLSAqIGJ5IGEgbWFya2VyIHN0cmluZyBhbmQgc3VmZml4ZWQgYnkgYSBuZXdsaW5lIGNoYXJhY3Rlci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEludGVybGVhdmVkUmVhZGVyIGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKLQotICAvKioKLSAgICogVGhlIGxlbmd0aCBvZiB0aGUgc2NyYXRjaCBidWZmZXIgdG8gc2VhcmNoIGZvciBtYXJrZXJzIGluLiBBbHNvIGFjdHMgYXMgYW4KLSAgICogdXBwZXIgYm91bmQgb24gdGhlIGxlbmd0aCBvZiByZXR1cm5lZCBzdHJpbmdzLiBOb3QgdXNlZCBhcyBhbiBJL08gYnVmZmVyLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9MRU5HVEggPSA4MDsKLQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBtYXJrZXI7Ci0gIHByaXZhdGUgZmluYWwgQnVmZmVyZWRSZWFkZXIgcmVhZGVyOwotICBwcml2YXRlIGZpbmFsIEpzb25QYXJzZXIganNvblBhcnNlciA9IG5ldyBKc29uUGFyc2VyKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NQVJLRVIgPSAiLy9aeEovIjsKLQotICBwdWJsaWMgSW50ZXJsZWF2ZWRSZWFkZXIoUmVhZGVyIHJlYWRlcikgewotICAgIHRoaXMoREVGQVVMVF9NQVJLRVIsIHJlYWRlcik7Ci0gIH0KLQotICBwdWJsaWMgSW50ZXJsZWF2ZWRSZWFkZXIoU3RyaW5nIG1hcmtlciwgUmVhZGVyIHJlYWRlcikgewotICAgIGlmIChtYXJrZXIubGVuZ3RoKCkgPiBCVUZGRVJfTEVOR1RIKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXJrZXIubGVuZ3RoKCkgPiBCVUZGRVJfTEVOR1RIIik7Ci0gICAgfQotICAgIHRoaXMubWFya2VyID0gbWFya2VyOwotICAgIHRoaXMucmVhZGVyID0gcmVhZGVyIGluc3RhbmNlb2YgQnVmZmVyZWRSZWFkZXIKLSAgICAgICAgPyAoQnVmZmVyZWRSZWFkZXIpIHJlYWRlcgotICAgICAgICA6IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHN0cmVhbTogZWl0aGVyIGEgU3RyaW5nLCBhIEpzb25FbGVtZW50LCBvcgotICAgKiBudWxsIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gQ2FsbGVycyBzaG91bGQgdXNlIGluc3RhbmNlb2YgdG8KLSAgICogaW5zcGVjdCB0aGUgcmV0dXJuIHR5cGUuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltCVUZGRVJfTEVOR1RIXTsKLSAgICByZWFkZXIubWFyayhCVUZGRVJfTEVOR1RIKTsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGludCB0ZXh0RW5kOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCByID0gcmVhZGVyLnJlYWQoYnVmZmVyLCBjb3VudCwgYnVmZmVyLmxlbmd0aCAtIGNvdW50KTsKLQotICAgICAgaWYgKHIgPT0gLTEpIHsKLSAgICAgICAgLy8gdGhlIGlucHV0IGlzIGV4aGF1c3RlZDsgcmV0dXJuIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycwotICAgICAgICB0ZXh0RW5kID0gY291bnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjb3VudCArPSByOwotICAgICAgaW50IHBvc3NpYmxlTWFya2VyID0gZmluZFBvc3NpYmxlTWFya2VyKGJ1ZmZlciwgY291bnQpOwotCi0gICAgICBpZiAocG9zc2libGVNYXJrZXIgIT0gMCkgewotICAgICAgICAvLyByZXR1cm4gdGhlIGNoYXJhY3RlcnMgdGhhdCBwcmVjZWRlIHRoZSBtYXJrZXIKLSAgICAgICAgdGV4dEVuZCA9IHBvc3NpYmxlTWFya2VyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKGNvdW50IDwgbWFya2VyLmxlbmd0aCgpKSB7Ci0gICAgICAgIC8vIHRoZSBidWZmZXIgY29udGFpbnMgb25seSB0aGUgcHJlZml4IG9mIGEgbWFya2VyIHNvIHdlIG11c3QgcmVhZCBtb3JlCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyB3ZSd2ZSByZWFkIGEgbWFya2VyIHNvIHJldHVybiB0aGUgdmFsdWUgdGhhdCBmb2xsb3dzCi0gICAgICByZWFkZXIucmVzZXQoKTsKLSAgICAgIFN0cmluZyBqc29uID0gcmVhZGVyLnJlYWRMaW5lKCkuc3Vic3RyaW5nKG1hcmtlci5sZW5ndGgoKSk7Ci0gICAgICByZXR1cm4ganNvblBhcnNlci5wYXJzZShqc29uKTsKLSAgICB9Ci0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIGNoYXJhY3RlcnMKLSAgICByZWFkZXIucmVzZXQoKTsKLSAgICBjb3VudCA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgdGV4dEVuZCk7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBjb3VudCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJlYWRlci5jbG9zZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluZGV4IG9mIG1hcmtlciBpbiB7QGNvZGUgY2hhcnN9LCBzdG9wcGluZyBhdCB7QGNvZGUgbGltaXR9LgotICAgKiBTaG91bGQgdGhlIGNoYXJzIGVuZCB3aXRoIGEgcHJlZml4IG9mIG1hcmtlciwgdGhlIG9mZnNldCBvZiB0aGF0IHByZWZpeAotICAgKiBpcyByZXR1cm5lZC4KLSAgICovCi0gIGludCBmaW5kUG9zc2libGVNYXJrZXIoY2hhcltdIGNoYXJzLCBpbnQgbGltaXQpIHsKLSAgICBzZWFyY2g6Ci0gICAgZm9yIChpbnQgaSA9IDA7IHRydWU7IGkrKykgewotICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBtYXJrZXIubGVuZ3RoKCkgJiYgaSArIG0gPCBsaW1pdDsgbSsrKSB7Ci0gICAgICAgIGlmIChjaGFyc1tpICsgbV0gIT0gbWFya2VyLmNoYXJBdChtKSkgewotICAgICAgICAgIGNvbnRpbnVlIHNlYXJjaDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvSW52YWxpZENvbW1hbmRFeGNlcHRpb24uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9JbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MGNhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvSW52YWxpZENvbW1hbmRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRXhjZXB0aW9uIHRoYXQgc2lnbmlmaWVzIHRoYXQgdGhlIDxpPnVzZXI8L2k+IGhhcyBnaXZlbiBhbiBpbnZhbGlkIGFyZ3VtZW50IHN0cmluZy4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpIC8vIHdobyB3b3VsZCBzZXJpYWxpemUgYSBjb21tYW5kLWxpbmUgcGFyc2luZyBlcnJvcj8KK3B1YmxpYyBjbGFzcyBJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICBwcml2YXRlIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiB1c2FnZTsKKworICBwdWJsaWMgSW52YWxpZENvbW1hbmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgc3VwZXIoU3RyaW5nLmZvcm1hdChtZXNzYWdlLCBhcmdzKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVc2FnZShMaXN0PFN0cmluZz4gdXNhZ2UpIHsKKyAgICB0aGlzLnVzYWdlID0gSW1tdXRhYmxlTGlzdC5jb3B5T2YodXNhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgZGlzcGxheShQcmludFdyaXRlciB3cml0ZXIpIHsKKyAgICB3cml0ZXIucHJpbnRsbihnZXRNZXNzYWdlKCkpOworICAgIGlmICh1c2FnZSAhPSBudWxsKSB7CisgICAgICB3cml0ZXIucHJpbnRsbigpOworICAgICAgZGlzcGxheVVzYWdlKHdyaXRlcik7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZGlzcGxheVVzYWdlKFByaW50V3JpdGVyIHdyaXRlcikgeworICAgIGZvciAoU3RyaW5nIGxpbmUgOiB1c2FnZSkgeworICAgICAgd3JpdGVyLnByaW50bG4obGluZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBleGl0Q29kZSgpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL091dHB1dE1vZHVsZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL091dHB1dE1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjA0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvT3V0cHV0TW9kdWxlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGRhZ2dlci5Nb2R1bGU7CitpbXBvcnQgZGFnZ2VyLlByb3ZpZGVzOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBBIG1vZHVsZSB0aGF0IGJpbmRzIHtAbGluayBQcmludFdyaXRlcn0gaW5zdGFuY2VzIGZvciB7QGxpbmsgU3Rkb3V0fSBhbmQge0BsaW5rIFN0ZGVycn0uCisgKi8KK0BNb2R1bGUKK3B1YmxpYyBmaW5hbCBjbGFzcyBPdXRwdXRNb2R1bGUgeworICBwdWJsaWMgc3RhdGljIE91dHB1dE1vZHVsZSBzeXN0ZW0oKSB7CisgICAgcmV0dXJuIG5ldyBPdXRwdXRNb2R1bGUobmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQsIHRydWUpLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVyciwgdHJ1ZSkpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQcmludFdyaXRlciBzdGRvdXQ7CisgIHByaXZhdGUgZmluYWwgUHJpbnRXcml0ZXIgc3RkZXJyOworCisgIHB1YmxpYyBPdXRwdXRNb2R1bGUoUHJpbnRXcml0ZXIgc3Rkb3V0LCBQcmludFdyaXRlciBzdGRlcnIpIHsKKyAgICB0aGlzLnN0ZG91dCA9IGNoZWNrTm90TnVsbChzdGRvdXQpOworICAgIHRoaXMuc3RkZXJyID0gY2hlY2tOb3ROdWxsKHN0ZGVycik7CisgIH0KKworICBAUHJvdmlkZXMgQFN0ZG91dCBQcmludFdyaXRlciBwcm92aWRlU3Rkb3V0V3JpdGVyKCkgeworICAgIHJldHVybiBzdGRvdXQ7CisgIH0KKworICBAUHJvdmlkZXMgQFN0ZGVyciBQcmludFdyaXRlciBwcm92aWRlU3RkZXJyKCkgeworICAgIHJldHVybiBzdGRlcnI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRUeXBlLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvUGFyc2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCA2OSUKY29weSBmcm9tIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRUeXBlLmphdmEKY29weSB0byBjYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvUGFyc2VyLmphdmEKaW5kZXggMzBkZTY5Zi4uMGFiMGQ5ZSAxMDA2NDQKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9NZWFzdXJlbWVudFR5cGUuamF2YQorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvUGFyc2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDExICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7CitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci51dGlsOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuR3d0Q29tcGF0aWJsZTsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CiAKLUBHd3RDb21wYXRpYmxlCi1wdWJsaWMgZW51bSBNZWFzdXJlbWVudFR5cGUgewotICBUSU1FLCBJTlNUQU5DRSwgTUVNT1JZLCBERUJVRworLy8gVE9ETyhrZXZpbmIpOiByZWxlYXNlIGNvbW1vbi50ZXh0LlBhcnNlciBpbiBHdWF2YSB0aGVuIG51a2UgdGhpcworcHVibGljIGludGVyZmFjZSBQYXJzZXI8VD4geworICBUIHBhcnNlKENoYXJTZXF1ZW5jZSB0ZXh0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvUGFyc2Vycy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1BhcnNlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU2ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1BhcnNlcnMuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLlByaW1pdGl2ZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBQYXJzZXJzIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJzZXI8U3RyaW5nPiBJREVOVElUWSA9IG5ldyBQYXJzZXI8U3RyaW5nPigpIHsKKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBwYXJzZShDaGFyU2VxdWVuY2UgaW4pIHsKKyAgICAgIHJldHVybiBpbi50b1N0cmluZygpOworICAgIH0KKyAgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gQ09OVkVSU0lPTl9NRVRIT0RfTkFNRVMgPQorICAgICAgSW1tdXRhYmxlTGlzdC5vZigiZnJvbVN0cmluZyIsICJkZWNvZGUiLCAidmFsdWVPZiIpOworCisgIC8qKgorICAgKiBQYXJzZXIgdGhhdCB0cmllcywgaW4gdGhpcyBvcmRlcjoKKyAgICogPHVsPgorICAgKiA8bGk+UmVzdWx0VHlwZS5mcm9tU3RyaW5nKFN0cmluZykKKyAgICogPGxpPlJlc3VsdFR5cGUuZGVjb2RlKFN0cmluZykKKyAgICogPGxpPlJlc3VsdFR5cGUudmFsdWVPZihTdHJpbmcpCisgICAqIDxsaT5uZXcgUmVzdWx0VHlwZShTdHJpbmcpCisgICAqIDwvdWw+CisgICAqLworICBwdWJsaWMgc3RhdGljIDxUPiBQYXJzZXI8VD4gY29udmVudGlvbmFsUGFyc2VyKENsYXNzPFQ+IHJlc3VsdFR5cGUpCisgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICBpZiAocmVzdWx0VHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBUID09IFN0cmluZworICAgICAgUGFyc2VyPFQ+IGlkZW50aXR5ID0gKFBhcnNlcjxUPikgSURFTlRJVFk7CisgICAgICByZXR1cm4gaWRlbnRpdHk7CisgICAgfQorCisgICAgZmluYWwgQ2xhc3M8VD4gd3JhcHBlZFJlc3VsdFR5cGUgPSBQcmltaXRpdmVzLndyYXAocmVzdWx0VHlwZSk7CisKKyAgICBmb3IgKFN0cmluZyBtZXRob2ROYW1lIDogQ09OVkVSU0lPTl9NRVRIT0RfTkFNRVMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QgPSB3cmFwcGVkUmVzdWx0VHlwZS5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGlmIChVdGlsLmlzU3RhdGljKG1ldGhvZCkgJiYgd3JhcHBlZFJlc3VsdFR5cGUuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgeworICAgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOyAvLyB0byBwZXJtaXQgaW5uZXIgZW51bXMsIGV0Yy4KKyAgICAgICAgICByZXR1cm4gbmV3IEludm9raW5nUGFyc2VyPFQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCBUIGludm9rZShTdHJpbmcgaW5wdXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFJlc3VsdFR5cGUuY2FzdChtZXRob2QuaW52b2tlKG51bGwsIGlucHV0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHRyeUFnYWluKSB7CisgICAgICB9CisgICAgfQorCisgICAgZmluYWwgQ29uc3RydWN0b3I8VD4gY29uc3RyID0gd3JhcHBlZFJlc3VsdFR5cGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihTdHJpbmcuY2xhc3MpOworICAgIGNvbnN0ci5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgIHJldHVybiBuZXcgSW52b2tpbmdQYXJzZXI8VD4oKSB7CisgICAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIFQgaW52b2tlKFN0cmluZyBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB3cmFwcGVkUmVzdWx0VHlwZS5jYXN0KGNvbnN0ci5uZXdJbnN0YW5jZShpbnB1dCkpOworICAgICAgfQorICAgIH07CisgIH0KKworICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgSW52b2tpbmdQYXJzZXI8VD4gaW1wbGVtZW50cyBQYXJzZXI8VD4geworICAgIEBPdmVycmlkZSBwdWJsaWMgVCBwYXJzZShDaGFyU2VxdWVuY2UgaW5wdXQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gaW52b2tlKGlucHV0LnRvU3RyaW5nKCkpOworICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgU3RyaW5nIGRlc2MgPSBmaXJzdE5vbk51bGwoY2F1c2UuZ2V0TWVzc2FnZSgpLCBjYXVzZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIHRocm93IG5ld1BhcnNlRXhjZXB0aW9uKGRlc2MsIGNhdXNlKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ld1BhcnNlRXhjZXB0aW9uKCJVbmtub3duIHBhcnNpbmcgcHJvYmxlbSIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUIGludm9rZShTdHJpbmcgaW5wdXQpIHRocm93cyBFeGNlcHRpb247CisgIH0KKworICBwdWJsaWMgc3RhdGljIFBhcnNlRXhjZXB0aW9uIG5ld1BhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBQYXJzZUV4Y2VwdGlvbiBwZSA9IG5ld1BhcnNlRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIHBlLmluaXRDYXVzZShjYXVzZSk7CisgICAgcmV0dXJuIHBlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBQYXJzZUV4Y2VwdGlvbiBuZXdQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24obWVzc2FnZSwgMCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyA8VD4gVCBmaXJzdE5vbk51bGwoVCBmaXJzdCwgVCBzZWNvbmQpIHsKKyAgICByZXR1cm4gKGZpcnN0ICE9IG51bGwpID8gZmlyc3QgOiBzZWNvbmQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9SZWZsZWN0aW9uLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvUmVmbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTdkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvUmVmbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyBmb3IgY29tbW9uIHJlZmxlY3Rpb24gb3BlcmF0aW9ucyBpbiBDYWxpcGVyLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVmbGVjdGlvbiB7CisgIHByaXZhdGUgUmVmbGVjdGlvbigpIHt9CisKKyAgcHVibGljIHN0YXRpYyBJbW11dGFibGVTZXQ8TWV0aG9kPiBnZXRBbm5vdGF0ZWRNZXRob2RzKENsYXNzPD8+IGNsYXp6LAorICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgeworICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICBJbW11dGFibGVTZXQuQnVpbGRlcjxNZXRob2Q+IGJ1aWxkZXIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOworICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKyAgICAgIGlmIChtZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uQ2xhc3MpKSB7CisgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICBidWlsZGVyLmFkZChtZXRob2QpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvU2hvcnREdXJhdGlvbi5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1Nob3J0RHVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQ5YTJiCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1Nob3J0RHVyYXRpb24uamF2YQpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQXNjaWk7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguTWF0aENvbnRleHQ7CitpbXBvcnQgamF2YS5tYXRoLlJvdW5kaW5nTW9kZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG5vbm5lZ2F0aXZlIGR1cmF0aW9uIGZyb20gMCB0byAxMDAgZGF5cywgd2l0aCBwaWNvc2Vjb25kIHByZWNpc2lvbi4KKyAqIENvbnRyYXN0IHdpdGggSm9kYS1UaW1lJ3MgZHVyYXRpb24gY2xhc3MsIHdoaWNoIGhhcyBvbmx5IG1pbGxpc2Vjb25kIHByZWNpc2lvbiBidXQgY2FuCisgKiByZXByZXNlbnQgZHVyYXRpb25zIG9mIG1pbGxpb25zIG9mIHllYXJzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2hvcnREdXJhdGlvbiBpbXBsZW1lbnRzIENvbXBhcmFibGU8U2hvcnREdXJhdGlvbj4geworICAvLyBGYWN0b3JpZXMKKworICBwdWJsaWMgc3RhdGljIFNob3J0RHVyYXRpb24gb2YobG9uZyBkdXJhdGlvbiwgVGltZVVuaXQgdW5pdCkgeworICAgIGlmIChkdXJhdGlvbiA9PSAwKSB7CisgICAgICByZXR1cm4gWkVSTzsKKyAgICB9CisgICAgY2hlY2tBcmd1bWVudChkdXJhdGlvbiA+PSAwLCAibmVnYXRpdmUgZHVyYXRpb246ICVzIiwgZHVyYXRpb24pOworICAgIGNoZWNrQXJndW1lbnQoZHVyYXRpb24gPD0gTUFYRVMuZ2V0KHVuaXQpLAorICAgICAgICAiU2hvcnREdXJhdGlvbiBjYW5ub3QgZXhjZWVkIDEwMCBkYXlzOiAlcyAlcyIsIGR1cmF0aW9uLCB1bml0KTsKKyAgICBsb25nIG5hbm9zID0gVGltZVVuaXQuTkFOT1NFQ09ORFMuY29udmVydChkdXJhdGlvbiwgdW5pdCk7CisgICAgcmV0dXJuIG5ldyBQb3NpdGl2ZVNob3J0RHVyYXRpb24obmFub3MgKiAxMDAwKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU2hvcnREdXJhdGlvbiBvZihCaWdEZWNpbWFsIGR1cmF0aW9uLCBUaW1lVW5pdCB1bml0KSB7CisgICAgLy8gY29udmVydCB0byBwaWNvc2Vjb25kcyBmaXJzdCwgdG8gbWluaW1pemUgcm91bmRpbmcKKyAgICBCaWdEZWNpbWFsIHBpY29zID0gZHVyYXRpb24ubXVsdGlwbHkoT05FX0lOX1BJQ09TLmdldCh1bml0KSk7CisgICAgcmV0dXJuIG9mUGljb3ModG9Mb25nKHBpY29zLCBSb3VuZGluZ01vZGUuSEFMRl9VUCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTaG9ydER1cmF0aW9uIHZhbHVlT2YoU3RyaW5nIHMpIHsKKyAgICBpZiAoIjAiLmVxdWFscyhzKSkgeworICAgICAgcmV0dXJuIFpFUk87CisgICAgfQorICAgIE1hdGNoZXIgbWF0Y2hlciA9IFBBVFRFUk4ubWF0Y2hlcihzKTsKKyAgICBjaGVja0FyZ3VtZW50KG1hdGNoZXIubWF0Y2hlcygpLCAiSW52YWxpZCBTaG9ydER1cmF0aW9uOiAlcyIsIHMpOworCisgICAgQmlnRGVjaW1hbCB2YWx1ZSA9IG5ldyBCaWdEZWNpbWFsKG1hdGNoZXIuZ3JvdXAoMSkpOworICAgIFN0cmluZyBhYmJyZXYgPSBtYXRjaGVyLmdyb3VwKDIpOworICAgIFRpbWVVbml0IHVuaXQgPSBBQkJSRVZfVE9fVU5JVC5nZXQoYWJicmV2KTsKKyAgICBjaGVja0FyZ3VtZW50KHVuaXQgIT0gbnVsbCwgIlVucmVjb2duaXplZCB0aW1lIHVuaXQ6ICVzIiwgYWJicmV2KTsKKworICAgIHJldHVybiBvZih2YWx1ZSwgdW5pdCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFNob3J0RHVyYXRpb24gemVybygpIHsKKyAgICByZXR1cm4gWkVSTzsKKyAgfQorCisgIC8vIGZvcnR1bmF0ZWx5IG5vIGFiYnJldmlhdGlvbiBzdGFydHMgd2l0aCAnZScsIHNvIHRoaXMgc2hvdWxkIHdvcmsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBQQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJeKFswLTkuZUUrLV0rKSA/KFxcUyspJCIpOworCisgIHByaXZhdGUgc3RhdGljIFNob3J0RHVyYXRpb24gb2ZQaWNvcyhsb25nIHBpY29zKSB7CisgICAgaWYgKHBpY29zID09IDApIHsKKyAgICAgIHJldHVybiBaRVJPOworICAgIH0KKyAgICBjaGVja0FyZ3VtZW50KHBpY29zID4gMCk7CisgICAgcmV0dXJuIG5ldyBQb3NpdGl2ZVNob3J0RHVyYXRpb24ocGljb3MpOworICB9CisKKyAgLy8gVE9ETyhrZXZpbmIpOiB3ZSBzdXJlIHNlZW0gdG8gY29udmVydCBiYWNrIGFuZCBmb3J0aCB3aXRoIEJpZ0RlY2ltYWwgYSBsb3QuCisgIC8vIFdoeSBub3QganVzdCAqbWFrZSogdGhpcyBhIEJpZ0RlY2ltYWw/CisgIGZpbmFsIGxvbmcgcGljb3M7CisKKyAgU2hvcnREdXJhdGlvbihsb25nIHBpY29zKSB7CisgICAgdGhpcy5waWNvcyA9IHBpY29zOworICB9CisKKyAgcHVibGljIGxvbmcgdG9QaWNvcygpIHsKKyAgICByZXR1cm4gcGljb3M7CisgIH0KKworICBwdWJsaWMgbG9uZyB0byhUaW1lVW5pdCB1bml0KSB7CisgICAgcmV0dXJuIHRvKHVuaXQsIFJvdW5kaW5nTW9kZS5IQUxGX1VQKTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCBsb25nIHRvKFRpbWVVbml0IHVuaXQsIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpOworCisgIC8qCisgICAqIEluIEd1YXZhLCB0aGlzIHdpbGwgcHJvYmFibHkgaW1wbGVtZW50IGFuIGludGVyZmFjZSBjYWxsZWQgUXVhbnRpdHksIGFuZCB0aGUgZm9sbG93aW5nIG1ldGhvZHMKKyAgICogd2lsbCBjb21lIGZyb20gdGhlcmUsIHNvIHRoZXkgd29uJ3QgaGF2ZSB0byBiZSBkZWZpbmVkIGhlcmUuCisgICAqLworCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIHN1bSBvZiB0aGlzIHZhbHVlIGFuZCB7QGNvZGUKKyAgICogYWRkZW5kfS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBTaG9ydER1cmF0aW9uIHBsdXMoU2hvcnREdXJhdGlvbiBhZGRlbmQpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhpcyB2YWx1ZSBhbmQKKyAgICoge0Bjb2RlIHN1YnRyYWhlbmR9LgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFNob3J0RHVyYXRpb24gbWludXMoU2hvcnREdXJhdGlvbiBzdWJ0cmFoZW5kKTsKKworICAvKioKKyAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm9kdWN0IG9mIHRoaXMgdmFsdWUgYW5kIHRoZQorICAgKiBpbnRlZ3JhbCB2YWx1ZSB7QGNvZGUgbXVsdGlwbGljYW5kfS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBTaG9ydER1cmF0aW9uIHRpbWVzKGxvbmcgbXVsdGlwbGljYW5kKTsKKworICAvKioKKyAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm9kdWN0IG9mIHRoaXMgdmFsdWUgYW5kIHtAY29kZQorICAgKiBtdWx0aXBsaWNhbmR9LCByb3VuZGVkIGFjY29yZGluZyB0byB7QGNvZGUgcm91bmRpbmdNb2RlfSBpZiBuZWNlc3NhcnkuCisgICAqCisgICAqIDxwPklmIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhbW91bnQgdGhhdCBpcyAiY29udGludW91cyIgcmF0aGVyIHRoYW4gZGlzY3JldGUsIHRoZQorICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBtYXkgc2ltcGx5IGlnbm9yZSB0aGUgcm91bmRpbmcgbW9kZS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBTaG9ydER1cmF0aW9uIHRpbWVzKEJpZ0RlY2ltYWwgbXVsdGlwbGljYW5kLCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKTsKKworICAvKioKKyAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoaXMgdmFsdWUgZGl2aWRlZCBieSB0aGUgaW50ZWdyYWwKKyAgICogdmFsdWUge0Bjb2RlIGRpdmlzb3J9LCByb3VuZGVkIGFjY29yZGluZyB0byB7QGNvZGUgcm91bmRpbmdNb2RlfSBpZiBuZWNlc3NhcnkuCisgICAqCisgICAqIDxwPklmIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhbW91bnQgdGhhdCBpcyAiY29udGludW91cyIgcmF0aGVyIHRoYW4gZGlzY3JldGUsIHRoZQorICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBtYXkgc2ltcGx5IGlnbm9yZSB0aGUgcm91bmRpbmcgbW9kZS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBTaG9ydER1cmF0aW9uIGRpdmlkZWRCeShsb25nIGRpdmlzb3IsIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhpcyB2YWx1ZSBkaXZpZGVkIGJ5IHtAY29kZQorICAgKiBkaXZpc29yfSwgcm91bmRlZCBhY2NvcmRpbmcgdG8ge0Bjb2RlIHJvdW5kaW5nTW9kZX0gaWYgbmVjZXNzYXJ5LgorICAgKgorICAgKiA8cD5JZiB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYW1vdW50IHRoYXQgaXMgImNvbnRpbnVvdXMiIHJhdGhlciB0aGFuIGRpc2NyZXRlLCB0aGUKKyAgICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgbWF5IHNpbXBseSBpZ25vcmUgdGhlIHJvdW5kaW5nIG1vZGUuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgU2hvcnREdXJhdGlvbiBkaXZpZGVkQnkoQmlnRGVjaW1hbCBkaXZpc29yLCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKTsKKworICAvLyBaZXJvCisKKyAgcHJpdmF0ZSBzdGF0aWMgU2hvcnREdXJhdGlvbiBaRVJPID0gbmV3IFNob3J0RHVyYXRpb24oMCkgeworICAgIEBPdmVycmlkZSBwdWJsaWMgbG9uZyB0byhUaW1lVW5pdCB1bml0LCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBTaG9ydER1cmF0aW9uIHBsdXMoU2hvcnREdXJhdGlvbiBhZGRlbmQpIHsKKyAgICAgIHJldHVybiBhZGRlbmQ7CisgICAgfQorICAgIEBPdmVycmlkZSBwdWJsaWMgU2hvcnREdXJhdGlvbiBtaW51cyhTaG9ydER1cmF0aW9uIHN1YnRyYWhlbmQpIHsKKyAgICAgIGNoZWNrQXJndW1lbnQodGhpcyA9PSBzdWJ0cmFoZW5kKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIFNob3J0RHVyYXRpb24gdGltZXMobG9uZyBtdWx0aXBsaWNhbmQpIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIFNob3J0RHVyYXRpb24gdGltZXMoQmlnRGVjaW1hbCBtdWx0aXBsaWNhbmQsIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIFNob3J0RHVyYXRpb24gZGl2aWRlZEJ5KGxvbmcgZGl2aXNvciwgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSkgeworICAgICAgcmV0dXJuIGRpdmlkZWRCeShuZXcgQmlnRGVjaW1hbChkaXZpc29yKSwgcm91bmRpbmdNb2RlKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBTaG9ydER1cmF0aW9uIGRpdmlkZWRCeShCaWdEZWNpbWFsIGRpdmlzb3IsIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpIHsKKyAgICAgIGNoZWNrQXJndW1lbnQoZGl2aXNvci5jb21wYXJlVG8oQmlnRGVjaW1hbC5aRVJPKSAhPSAwKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBjb21wYXJlVG8oU2hvcnREdXJhdGlvbiB0aGF0KSB7CisgICAgICBpZiAodGhpcyA9PSB0aGF0KSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgY2hlY2tOb3ROdWxsKHRoYXQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKEBOdWxsYWJsZSBPYmplY3QgdGhhdCkgeworICAgICAgcmV0dXJuIHRoaXMgPT0gdGhhdDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gIjBzIjsKKyAgICB9CisgIH07CisKKyAgLy8gTm9uLXplcm8KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3NpdGl2ZVNob3J0RHVyYXRpb24gZXh0ZW5kcyBTaG9ydER1cmF0aW9uIHsKKyAgICBwcml2YXRlIFBvc2l0aXZlU2hvcnREdXJhdGlvbihsb25nIHBpY29zKSB7CisgICAgICBzdXBlcihwaWNvcyk7CisgICAgICBjaGVja0FyZ3VtZW50KHBpY29zID4gMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nIHRvKFRpbWVVbml0IHVuaXQsIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpIHsKKyAgICAgIEJpZ0RlY2ltYWwgZGl2aXNvciA9IE9ORV9JTl9QSUNPUy5nZXQodW5pdCk7CisgICAgICByZXR1cm4gdG9Mb25nKG5ldyBCaWdEZWNpbWFsKHBpY29zKS5kaXZpZGUoZGl2aXNvciksIHJvdW5kaW5nTW9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTaG9ydER1cmF0aW9uIHBsdXMoU2hvcnREdXJhdGlvbiBhZGRlbmQpIHsKKyAgICAgIHJldHVybiBuZXcgUG9zaXRpdmVTaG9ydER1cmF0aW9uKHBpY29zICsgYWRkZW5kLnBpY29zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFNob3J0RHVyYXRpb24gbWludXMoU2hvcnREdXJhdGlvbiBzdWJ0cmFoZW5kKSB7CisgICAgICByZXR1cm4gb2ZQaWNvcyhwaWNvcyAtIHN1YnRyYWhlbmQucGljb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgU2hvcnREdXJhdGlvbiB0aW1lcyhsb25nIG11bHRpcGxpY2FuZCkgeworICAgICAgaWYgKG11bHRpcGxpY2FuZCA9PSAwKSB7CisgICAgICAgIHJldHVybiBaRVJPOworICAgICAgfQorICAgICAgY2hlY2tBcmd1bWVudChtdWx0aXBsaWNhbmQgPj0gMCwgIm5lZ2F0aXZlIG11bHRpcGxpY2FuZDogJXMiLCBtdWx0aXBsaWNhbmQpOworICAgICAgY2hlY2tBcmd1bWVudChtdWx0aXBsaWNhbmQgPD0gTG9uZy5NQVhfVkFMVUUgLyBwaWNvcywKKyAgICAgICAgICAicHJvZHVjdCBvZiAlcyBhbmQgJXMgd291bGQgb3ZlcmZsb3ciLCB0aGlzLCBtdWx0aXBsaWNhbmQpOworICAgICAgcmV0dXJuIG5ldyBQb3NpdGl2ZVNob3J0RHVyYXRpb24ocGljb3MgKiBtdWx0aXBsaWNhbmQpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgU2hvcnREdXJhdGlvbiB0aW1lcyhCaWdEZWNpbWFsIG11bHRpcGxpY2FuZCwgUm91bmRpbmdNb2RlIHJvdW5kaW5nTW9kZSkgeworICAgICAgQmlnRGVjaW1hbCBwcm9kdWN0ID0gQmlnRGVjaW1hbC52YWx1ZU9mKHBpY29zKS5tdWx0aXBseShtdWx0aXBsaWNhbmQpOworICAgICAgcmV0dXJuIG9mUGljb3ModG9Mb25nKHByb2R1Y3QsIHJvdW5kaW5nTW9kZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgU2hvcnREdXJhdGlvbiBkaXZpZGVkQnkobG9uZyBkaXZpc29yLCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKSB7CisgICAgICByZXR1cm4gZGl2aWRlZEJ5KG5ldyBCaWdEZWNpbWFsKGRpdmlzb3IpLCByb3VuZGluZ01vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgU2hvcnREdXJhdGlvbiBkaXZpZGVkQnkoQmlnRGVjaW1hbCBkaXZpc29yLCBSb3VuZGluZ01vZGUgcm91bmRpbmdNb2RlKSB7CisgICAgICBCaWdEZWNpbWFsIHByb2R1Y3QgPSBCaWdEZWNpbWFsLnZhbHVlT2YocGljb3MpLmRpdmlkZShkaXZpc29yLCByb3VuZGluZ01vZGUpOworICAgICAgcmV0dXJuIG9mUGljb3MocHJvZHVjdC5sb25nVmFsdWVFeGFjdCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBjb21wYXJlVG8oU2hvcnREdXJhdGlvbiB0aGF0KSB7CisgICAgICByZXR1cm4gTG9uZ3MuY29tcGFyZSh0aGlzLnBpY29zLCB0aGF0LnBpY29zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQb3NpdGl2ZVNob3J0RHVyYXRpb24pIHsKKyAgICAgICAgUG9zaXRpdmVTaG9ydER1cmF0aW9uIHRoYXQgPSAoUG9zaXRpdmVTaG9ydER1cmF0aW9uKSBvYmplY3Q7CisgICAgICAgIHJldHVybiB0aGlzLnBpY29zID09IHRoYXQucGljb3M7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gTG9uZ3MuaGFzaENvZGUocGljb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgVGltZVVuaXQgYmVzdFVuaXQgPSBUaW1lVW5pdC5OQU5PU0VDT05EUzsKKyAgICAgIGZvciAoVGltZVVuaXQgdW5pdCA6IFRpbWVVbml0LnZhbHVlcygpKSB7CisgICAgICAgIGlmIChwaWNvc0luKHVuaXQpID4gcGljb3MpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBiZXN0VW5pdCA9IHVuaXQ7CisgICAgICB9CisgICAgICBCaWdEZWNpbWFsIGRpdmlzb3IgPSBPTkVfSU5fUElDT1MuZ2V0KGJlc3RVbml0KTsKKworICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHBpY29zKS5kaXZpZGUoZGl2aXNvciwgUk9VTkRFUikgKyBwcmVmZXJyZWRBYmJyZXYoYmVzdFVuaXQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGhDb250ZXh0IFJPVU5ERVIgPSBuZXcgTWF0aENvbnRleHQoNCk7CisgIH0KKworICAvLyBQcml2YXRlIHBhcnRzCisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByZWZlcnJlZEFiYnJldihUaW1lVW5pdCBiZXN0VW5pdCkgeworICAgIHJldHVybiBBQkJSRVZJQVRJT05TLmdldChiZXN0VW5pdCkuZ2V0KDApOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1tdXRhYmxlTGlzdE11bHRpbWFwPFRpbWVVbml0LCBTdHJpbmc+IEFCQlJFVklBVElPTlMgPQorICAgICAgY3JlYXRlQWJicmV2aWF0aW9ucygpOworCisgIHByaXZhdGUgc3RhdGljIEltbXV0YWJsZUxpc3RNdWx0aW1hcDxUaW1lVW5pdCwgU3RyaW5nPiBjcmVhdGVBYmJyZXZpYXRpb25zKCkgeworICAgIEltbXV0YWJsZUxpc3RNdWx0aW1hcC5CdWlsZGVyPFRpbWVVbml0LCBTdHJpbmc+IGJ1aWxkZXIgPSBJbW11dGFibGVMaXN0TXVsdGltYXAuYnVpbGRlcigpOworICAgIGJ1aWxkZXIucHV0QWxsKFRpbWVVbml0Lk5BTk9TRUNPTkRTLCAibnMiLCAibmFub3MiKTsKKyAgICBidWlsZGVyLnB1dEFsbChUaW1lVW5pdC5NSUNST1NFQ09ORFMsICJcdTAzYmNzIiAvKs68cyovLCAidXMiLCAibWljcm9zIik7CisgICAgYnVpbGRlci5wdXRBbGwoVGltZVVuaXQuTUlMTElTRUNPTkRTLCAibXMiLCAibWlsbGlzIik7CisgICAgYnVpbGRlci5wdXRBbGwoVGltZVVuaXQuU0VDT05EUywgInMiLCAic2VjIik7CisKKyAgICAvLyBEbyB0aGUgcmVzdCBpbiBhIEpESzUtc2FmZSB3YXkKKyAgICBUaW1lVW5pdFtdIGFsbFVuaXRzID0gVGltZVVuaXQudmFsdWVzKCk7CisgICAgaWYgKGFsbFVuaXRzLmxlbmd0aCA+PSA3KSB7CisgICAgICBidWlsZGVyLnB1dEFsbChhbGxVbml0c1s0XSwgIm0iLCAibWluIik7CisgICAgICBidWlsZGVyLnB1dEFsbChhbGxVbml0c1s1XSwgImgiLCAiaHIiKTsKKyAgICAgIGJ1aWxkZXIucHV0QWxsKGFsbFVuaXRzWzZdLCAiZCIpOworICAgIH0KKworICAgIGZvciAoVGltZVVuaXQgdW5pdCA6IFRpbWVVbml0LnZhbHVlcygpKSB7CisgICAgICBidWlsZGVyLnB1dCh1bml0LCBBc2NpaS50b0xvd2VyQ2FzZSh1bml0Lm5hbWUoKSkpOworICAgIH0KKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgVGltZVVuaXQ+IEFCQlJFVl9UT19VTklUID0gY3JlYXRlQWJicmV2VG9Vbml0TWFwKCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgVGltZVVuaXQ+IGNyZWF0ZUFiYnJldlRvVW5pdE1hcCgpIHsKKyAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxTdHJpbmcsIFRpbWVVbml0PiBidWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxUaW1lVW5pdCwgU3RyaW5nPiBlbnRyeSA6IEFCQlJFVklBVElPTlMuZW50cmllcygpKSB7CisgICAgICBidWlsZGVyLnB1dChlbnRyeS5nZXRWYWx1ZSgpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgfQorICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8VGltZVVuaXQsIEJpZ0RlY2ltYWw+IE9ORV9JTl9QSUNPUyA9IGNyZWF0ZVVuaXRUb1BpY29zTWFwKCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwPFRpbWVVbml0LCBCaWdEZWNpbWFsPiBjcmVhdGVVbml0VG9QaWNvc01hcCgpIHsKKyAgICBNYXA8VGltZVVuaXQsIEJpZ0RlY2ltYWw+IG1hcCA9IE1hcHMubmV3RW51bU1hcChUaW1lVW5pdC5jbGFzcyk7CisgICAgZm9yIChUaW1lVW5pdCB1bml0IDogVGltZVVuaXQudmFsdWVzKCkpIHsKKyAgICAgIG1hcC5wdXQodW5pdCwgbmV3IEJpZ0RlY2ltYWwocGljb3NJbih1bml0KSkpOworICAgIH0KKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG1hcCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8VGltZVVuaXQsIExvbmc+IE1BWEVTID0gY3JlYXRlTWF4ZXNNYXAoKTsKKworICBwcml2YXRlIHN0YXRpYyBNYXA8VGltZVVuaXQsIExvbmc+IGNyZWF0ZU1heGVzTWFwKCkgeworICAgIE1hcDxUaW1lVW5pdCwgTG9uZz4gbWFwID0gTWFwcy5uZXdFbnVtTWFwKFRpbWVVbml0LmNsYXNzKTsKKyAgICBmb3IgKFRpbWVVbml0IHVuaXQgOiBUaW1lVW5pdC52YWx1ZXMoKSkgeworICAgICAgLy8gTWF4IGlzIDEwMCBkYXlzCisgICAgICBtYXAucHV0KHVuaXQsIHVuaXQuY29udmVydCgxMDBMICogMjQgKiA2MCAqIDYwLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgfQorICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobWFwKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGxvbmcgdG9Mb25nKEJpZ0RlY2ltYWwgYmQsIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpIHsKKyAgICAvLyBzZXRTY2FsZSBkb2VzIG5vdCByZWFsbHkgbXV0YXRlIHRoZSBCaWdEZWNpbWFsCisgICAgcmV0dXJuIGJkLnNldFNjYWxlKDAsIHJvdW5kaW5nTW9kZSkubG9uZ1ZhbHVlRXhhY3QoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGxvbmcgcGljb3NJbihUaW1lVW5pdCB1bml0KSB7CisgICAgcmV0dXJuIHVuaXQudG9OYW5vcygxMDAwKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1N0ZGVyci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1N0ZGVyci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTllMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvU3RkZXJyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKiogQSBiaW5kaW5nIGFubm90YXRpb24gZm9yIHN0YW5kYXJkIGVyci4gKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoe0ZJRUxELCBQQVJBTUVURVIsIE1FVEhPRH0pCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBTdGRlcnIge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9TdGRvdXQuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9TdGRvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFjZjZkCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1N0ZG91dC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci51dGlsOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqIEEgYmluZGluZyBhbm5vdGF0aW9uIGZvciBzdGFuZGFyZCBvdXQuICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAVGFyZ2V0KHtGSUVMRCwgUEFSQU1FVEVSLCBNRVRIT0R9KQorQFF1YWxpZmllcgorcHVibGljIEBpbnRlcmZhY2UgU3Rkb3V0IHt9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvVXRpbC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RjM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL1V0aWwuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlQmlNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5CeXRlU291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkNsb3NlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5SZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGZpbmFsIGNsYXNzIFV0aWwgeworICBwcml2YXRlIFV0aWwoKSB7fQorCisgIC8vIFVzZXJzIGhhdmUgbm8gaWRlYSB0aGF0IG5lc3RlZCBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIHdpdGggJyQnLCBub3QgJy4nLCBzbyBpZiBjbGFzcyBsb29rdXAKKyAgLy8gZmFpbHMgdHJ5IHJlcGxhY2luZyB0aGUgbGFzdCAuIHdpdGggJC4KKyAgcHVibGljIHN0YXRpYyBDbGFzczw/PiBsZW5pZW50Q2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGxvYWRDbGFzcyhjbGFzc05hbWUpOworICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgLy8gdHJ5IHJlcGxhY2luZyB0aGUgbGFzdCBkb3Qgd2l0aCBhICQsIGluIGNhc2UgdGhhdCBoZWxwcworICAgICAgLy8gZXhhbXBsZTogdHV0b3JpYWwuVHV0b3JpYWwuQmVuY2htYXJrMSBiZWNvbWVzIHR1dG9yaWFsLlR1dG9yaWFsJEJlbmNobWFyazEKKyAgICAgIC8vIGFtdXNpbmdseSwgdGhlICQgY2hhcmFjdGVyIG1lYW5zIHRocmVlIGRpZmZlcmVudCB0aGluZ3MgaW4gdGhpcyBvbmUgbGluZSBhbG9uZQorICAgICAgU3RyaW5nIG5ld05hbWUgPSBjbGFzc05hbWUucmVwbGFjZUZpcnN0KCJcXC4oW14uXSspJCIsICJcXCQkMSIpOworICAgICAgcmV0dXJuIGxvYWRDbGFzcyhuZXdOYW1lKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2VhcmNoIGZvciBhIGNsYXNzIGJ5IG5hbWUuCisgICAqCisgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICAgKiBAcmV0dXJuIHRoZSBjbGFzcy4KKyAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuCisgICAqLworICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgLy8gVXNlIHRoZSB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgaW4gc29tZSBjb25maWd1cmF0aW9ucywgZS5nLgorICAgIC8vIHdoZW4gcnVuIGZyb20gYSBzaW5nbGUgSkFSIGNvbnRhaW5pbmcgY2FsaXBlciBhbmQgYWxsIGl0cyBkZXBlbmRlbmNpZXMgdGhlIGNhbGlwZXIgSkFSCisgICAgLy8gZW5kcyB1cCBvbiB0aGUgYm9vdCBjbGFzcyBwYXRoIG9mIHRoZSBXb3JrZXIgYW5kIHNvIG5lZWRzIHRvIHRoZSB1c2UgdGhyZWFkIGNvbnRleHQgY2xhc3MKKyAgICAvLyBsb2FkZXIgdG8gbG9hZCBjbGFzc2VzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gbG9hZFByb3BlcnRpZXMoQnl0ZVNvdXJjZSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBDbG9zZXIgY2xvc2VyID0gQ2xvc2VyLmNyZWF0ZSgpOworICAgIElucHV0U3RyZWFtIGluID0gY2xvc2VyLnJlZ2lzdGVyKGlzLm9wZW5TdHJlYW0oKSk7CisgICAgdHJ5IHsKKyAgICAgIHByb3BzLmxvYWQoaW4pOworICAgIH0gZmluYWxseSB7CisgICAgICBjbG9zZXIuY2xvc2UoKTsKKyAgICB9CisgICAgcmV0dXJuIE1hcHMuZnJvbVByb3BlcnRpZXMocHJvcHMpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBCeXRlU291cmNlIHJlc291cmNlU3VwcGxpZXIoZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gUmVzb3VyY2VzLmFzQnl0ZVNvdXJjZShjLmdldFJlc291cmNlKG5hbWUpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIDxUPiBJbW11dGFibGVNYXA8U3RyaW5nLCBUPiBwcmVmaXhlZFN1Ym1hcCgKKyAgICAgIE1hcDxTdHJpbmcsIFQ+IHByb3BzLCBTdHJpbmcgcHJlZml4KSB7CisgICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U3RyaW5nLCBUPiBzdWJtYXBCdWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFQ+IGVudHJ5IDogcHJvcHMuZW50cnlTZXQoKSkgeworICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkgeworICAgICAgICBzdWJtYXBCdWlsZGVyLnB1dChuYW1lLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN1Ym1hcEJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgb25seSB0aG9zZSBlbnRyaWVzIHdob3NlIGtleSBzdGFydHMgd2l0aCB7QGNvZGUgPGdyb3VwTmFtZT4ufS4KKyAgICoKKyAgICogPHA+VGhlIGtleXMgaW4gdGhlIHJldHVybmVkIG1hcCBoYXZlIGhhZCB0aGVpciB7QGNvZGUgPGdyb3VwTmFtZT4ufSBwcmVmaXggcmVtb3ZlZC4KKyAgICoKKyAgICogPHA+ZS5nLiBJZiBnaXZlbiBhIG1hcCB0aGF0IGNvbnRhaW5lZCB7QGNvZGUgZ3JvdXAua2V5MSAtPiB2YWx1ZTEsIGtleTIgLT4gdmFsdWUyfSBhbmQgYQorICAgKiB7QGNvZGUgZ3JvdXBOYW1lfSBvZiB7QGNvZGUgZ3JvdXB9IGl0IHdvdWxkIHByb2R1Y2UgYSBtYXAgY29udGFpbmluZyB7QGNvZGUga2V5MSAtPiB2YWx1ZTF9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IHN1Ymdyb3VwTWFwKAorICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwLCBTdHJpbmcgZ3JvdXBOYW1lKSB7CisgICAgcmV0dXJuIHByZWZpeGVkU3VibWFwKG1hcCwgZ3JvdXBOYW1lICsgIi4iKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmxpYyhNZW1iZXIgbWVtYmVyKSB7CisgICAgcmV0dXJuIE1vZGlmaWVyLmlzUHVibGljKG1lbWJlci5nZXRNb2RpZmllcnMoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0aWMoTWVtYmVyIG1lbWJlcikgeworICAgIHJldHVybiBNb2RpZmllci5pc1N0YXRpYyhtZW1iZXIuZ2V0TW9kaWZpZXJzKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBGT1JDRV9HQ19USU1FT1VUX1NFQ1MgPSAyOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JjZUdjKCkgeworICAgIFN5c3RlbS5nYygpOworICAgIFN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKKyAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICBuZXcgT2JqZWN0KCkgeworICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgIH0KKyAgICB9OworICAgIFN5c3RlbS5nYygpOworICAgIFN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKKyAgICB0cnkgeworICAgICAgbGF0Y2guYXdhaXQoRk9SQ0VfR0NfVElNRU9VVF9TRUNTLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgPFQ+IEltbXV0YWJsZUJpTWFwPFQsIFN0cmluZz4gYXNzaWduTmFtZXMoU2V0PFQ+IGl0ZW1zKSB7CisgICAgSW1tdXRhYmxlTGlzdDxUPiBpdGVtTGlzdCA9IEltbXV0YWJsZUxpc3QuY29weU9mKGl0ZW1zKTsKKyAgICBJbW11dGFibGVCaU1hcC5CdWlsZGVyPFQsIFN0cmluZz4gaXRlbU5hbWVzQnVpbGRlciA9IEltbXV0YWJsZUJpTWFwLmJ1aWxkZXIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1MaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICBpdGVtTmFtZXNCdWlsZGVyLnB1dChpdGVtTGlzdC5nZXQoaSksIGdlbmVyYXRlVW5pcXVlTmFtZShpKSk7CisgICAgfQorICAgIHJldHVybiBpdGVtTmFtZXNCdWlsZGVyLmJ1aWxkKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVVbmlxdWVOYW1lKGludCBpbmRleCkgeworICAgIGlmIChpbmRleCA8IDI2KSB7CisgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoKGNoYXIpICgnQScgKyBpbmRleCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZ2VuZXJhdGVVbmlxdWVOYW1lKGluZGV4IC8gMjYgLSAxKSArIGdlbmVyYXRlVW5pcXVlTmFtZShpbmRleCAlIDI2KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FnZ3JlZ2F0ZUFsbG9jYXRpb25zUmVjb3JkZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FnZ3JlZ2F0ZUFsbG9jYXRpb25zUmVjb3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmZlNWUxCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvQWdncmVnYXRlQWxsb2NhdGlvbnNSZWNvcmRlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLm1vbml0b3JpbmcucnVudGltZS5pbnN0cnVtZW50YXRpb24uU2FtcGxlcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBBbiB7QGxpbmsgQWxsb2NhdGlvblJlY29yZGVyfSB0aGF0IHJlY29yZHMgdGhlIG51bWJlciBhbmQgY3VtdWxhdGl2ZSBzaXplIG9mIGFsbG9jYXRpb24uCisgKi8KK2ZpbmFsIGNsYXNzIEFnZ3JlZ2F0ZUFsbG9jYXRpb25zUmVjb3JkZXIgZXh0ZW5kcyBBbGxvY2F0aW9uUmVjb3JkZXIgeworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgYWxsb2NhdGlvbkNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIGFsbG9jYXRpb25TaXplID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHJlY29yZGluZyA9IGZhbHNlOworICAKKyAgcHJpdmF0ZSBmaW5hbCBTYW1wbGVyIHNhbXBsZXIgPSBuZXcgU2FtcGxlcigpIHsKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgc2FtcGxlQWxsb2NhdGlvbihpbnQgYXJyYXlDb3VudCwgU3RyaW5nIGRlc2MsIE9iamVjdCBuZXdPYmosIAorICAgICAgICBsb25nIHNpemUpIHsKKyAgICAgIGlmIChyZWNvcmRpbmcpIHsKKyAgICAgICAgYWxsb2NhdGlvbkNvdW50LmdldEFuZEluY3JlbWVudCgpOworICAgICAgICBhbGxvY2F0aW9uU2l6ZS5nZXRBbmRBZGQoc2l6ZSk7CisgICAgICB9CisgICAgfQorICB9OworICAKKyAgQEluamVjdCBBZ2dyZWdhdGVBbGxvY2F0aW9uc1JlY29yZGVyKCkgeworICAgIGNvbS5nb29nbGUubW9uaXRvcmluZy5ydW50aW1lLmluc3RydW1lbnRhdGlvbi5BbGxvY2F0aW9uUmVjb3JkZXIuYWRkU2FtcGxlcihzYW1wbGVyKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIGRvU3RhcnRSZWNvcmRpbmcoKSB7CisgICAgY2hlY2tTdGF0ZSghcmVjb3JkaW5nLCAic3RhcnRSZWNvcmRpbmcgY2FsbGVkLCBidXQgd2Ugd2VyZSBhbHJlYWR5IHJlY29yZGluZy4iKTsKKyAgICBhbGxvY2F0aW9uQ291bnQuc2V0KDApOworICAgIGFsbG9jYXRpb25TaXplLnNldCgwKTsKKyAgICByZWNvcmRpbmcgPSB0cnVlOworICB9CisgIAorICBAT3ZlcnJpZGUgcHVibGljIEFsbG9jYXRpb25TdGF0cyBzdG9wUmVjb3JkaW5nKGludCByZXBzKSB7CisgICAgY2hlY2tTdGF0ZShyZWNvcmRpbmcsICJzdG9wUmVjb3JkaW5nIGNhbGxlZCwgYnV0IHdlIHdlcmUgbm90IHJlY29yZGluZy4iKTsKKyAgICByZWNvcmRpbmcgPSBmYWxzZTsKKyAgICByZXR1cm4gbmV3IEFsbG9jYXRpb25TdGF0cyhhbGxvY2F0aW9uQ291bnQuZ2V0KCksIGFsbG9jYXRpb25TaXplLmdldCgpLCByZXBzKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FsbEFsbG9jYXRpb25zUmVjb3JkZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FsbEFsbG9jYXRpb25zUmVjb3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTliYWVmCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvQWxsQWxsb2NhdGlvbnNSZWNvcmRlci5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQ29uY3VycmVudEhhc2hNdWx0aXNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLm1vbml0b3JpbmcucnVudGltZS5pbnN0cnVtZW50YXRpb24uU2FtcGxlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogQW4ge0BsaW5rIEFsbG9jYXRpb25SZWNvcmRlcn0gdGhhdCByZWNvcmRzIGV2ZXJ5IGFsbG9jYXRpb24gYW5kIGl0cyBsb2NhdGlvbi4KKyAqIAorICogPHA+VGhpcyByZWNvcmRlciBpcyBlbmFibGVkIHZpYSB0aGUge0Bjb2RlIHRyYWNrQWxsb2NhdGlvbnN9IHdvcmtlciBvcHRpb24uCisgKi8KK2ZpbmFsIGNsYXNzIEFsbEFsbG9jYXRpb25zUmVjb3JkZXIgZXh0ZW5kcyBBbGxvY2F0aW9uUmVjb3JkZXIgeworICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGJlbmNobWFya0NsYXNzOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBiZW5jaG1hcmtNZXRob2ROYW1lOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gcmVjb3JkaW5nID0gZmFsc2U7CisgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNdWx0aXNldDxBbGxvY2F0aW9uPiBhbGxvY2F0aW9ucyA9IENvbmN1cnJlbnRIYXNoTXVsdGlzZXQuY3JlYXRlKCk7CisgIAorICBwcml2YXRlIGZpbmFsIFNhbXBsZXIgc2FtcGxlciA9IG5ldyBTYW1wbGVyKCkgeworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBzYW1wbGVBbGxvY2F0aW9uKGludCBhcnJheUNvdW50LCBTdHJpbmcgZGVzYywgT2JqZWN0IG5ld09iaiwgCisgICAgICAgIGxvbmcgc2l6ZSkgeworICAgICAgaWYgKHJlY29yZGluZykgeworICAgICAgICBpZiAoYXJyYXlDb3VudCAhPSAtMSkgeworICAgICAgICAgIGRlc2MgPSBkZXNjICsgIlsiICsgYXJyYXlDb3VudCArICJdIjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgZmlyc3QgaXRlbSBpcyB0aGlzIGxpbmUsIHRoZSBzZWNvbmQgaXMgaW4gQWxsb2NhdGlvblJlY29yZGVyIGFuZCB0aGUKKyAgICAgICAgLy8gb25lIGJlZm9yZSB0aGF0IGlzIHRoZSBhbGxvY2F0aW5nIGxpbmUsIHNvIHdlIHN0YXJ0IGF0IGluZGV4IDIuCisgICAgICAgIC8vIFdlIHdhbnQgdG8gZ3JhYiBhbGwgbGluZXMgdW50aWwgd2UgZ2V0IGludG8gdGhlIGJlbmNobWFyayBtZXRob2QuCisgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSA9IG5ldyBFeGNlcHRpb24oKS5nZXRTdGFja1RyYWNlKCk7CisgICAgICAgIGludCBzdGFydEluZGV4ID0gMjsKKyAgICAgICAgaW50IGVuZEluZGV4ID0gMjsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBzdGFja1RyYWNlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA9IHN0YWNrVHJhY2VbaV07CisgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3NOYW1lKCkuc3RhcnRzV2l0aCgKKyAgICAgICAgICAgICAgQWxsQWxsb2NhdGlvbnNSZWNvcmRlci5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgLy8gRG9uJ3QgdHJhY2sgbG9jYXRpb25zIHVwIGludG8gdGhlIHdvcmtlciBjb2RlLCBvciBvcmlnaW5hdGluZyB3aXRoaW4gdGhlIHdvcmtlciAKKyAgICAgICAgICAgIC8vIGNvZGUuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZW5kSW5kZXggPSBpOworICAgICAgICAgIGlmIChlbGVtZW50LmdldENsYXNzTmFtZSgpLmVxdWFscyhiZW5jaG1hcmtDbGFzcy5nZXROYW1lKCkpIAorICAgICAgICAgICAgICAmJiBlbGVtZW50LmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoYmVuY2htYXJrTWV0aG9kTmFtZSkpIHsKKyAgICAgICAgICAgIC8vIHN0b3AgbG9nZ2luZyBhdCB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhbGxvY2F0aW9ucy5hZGQoCisgICAgICAgICAgICBuZXcgQWxsb2NhdGlvbihkZXNjLCBzaXplLCBhc0xpc3Qoc3RhY2tUcmFjZSkuc3ViTGlzdChzdGFydEluZGV4LCBlbmRJbmRleCArIDEpKSk7CisgICAgICB9CisgICAgfQorICB9OworICAKKyAgQEluamVjdCBBbGxBbGxvY2F0aW9uc1JlY29yZGVyKEBSdW5uaW5nLkJlbmNobWFya0NsYXNzIENsYXNzPD8+IGJlbmNobWFya0NsYXNzLCAKKyAgICAgIEBSdW5uaW5nLkJlbmNobWFya01ldGhvZCBTdHJpbmcgYmVuY2htYXJrTWV0aG9kTmFtZSkgeworICAgIHRoaXMuYmVuY2htYXJrQ2xhc3MgPSBiZW5jaG1hcmtDbGFzczsKKyAgICB0aGlzLmJlbmNobWFya01ldGhvZE5hbWUgPSBiZW5jaG1hcmtNZXRob2ROYW1lOworICAgIGNvbS5nb29nbGUubW9uaXRvcmluZy5ydW50aW1lLmluc3RydW1lbnRhdGlvbi5BbGxvY2F0aW9uUmVjb3JkZXIuYWRkU2FtcGxlcihzYW1wbGVyKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIGRvU3RhcnRSZWNvcmRpbmcoKSB7CisgICAgY2hlY2tTdGF0ZSghcmVjb3JkaW5nLCAic3RhcnRSZWNvcmRpbmcgY2FsbGVkLCBidXQgd2Ugd2VyZSBhbHJlYWR5IHJlY29yZGluZy4iKTsKKyAgICBhbGxvY2F0aW9ucy5jbGVhcigpOworICAgIHJlY29yZGluZyA9IHRydWU7CisgIH0KKyAgCisgIEBPdmVycmlkZSBwdWJsaWMgQWxsb2NhdGlvblN0YXRzIHN0b3BSZWNvcmRpbmcoaW50IHJlcHMpIHsKKyAgICBjaGVja1N0YXRlKHJlY29yZGluZywgInN0b3BSZWNvcmRpbmcgY2FsbGVkLCBidXQgd2Ugd2VyZSBub3QgcmVjb3JkaW5nLiIpOworICAgIHJlY29yZGluZyA9IGZhbHNlOworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvblN0YXRzKGFsbG9jYXRpb25zLCByZXBzKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FsbG9jYXRpb24uamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FsbG9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODU1ZGMwCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvQWxsb2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW50ZXJuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbnRlcm5lcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBEYXRhIGFib3V0IGEgcGFydGljdWxhciBhbGxvY2F0aW9uIHBlcmZvcm1lZCBieSBhIGJlbmNobWFyay4gIFRoaXMgdHJhY2tzIGEgaHVtYW4gcmVhZGFibGUgCisgKiBkZXNjcmlwdGlvbiBvZiB0aGUgYWxsb2NhdGlvbiAoZS5nLiAnaW50WzIzXScsICdqYXZhLmxhbmcuSW50ZWdlcicsIG9yICdqYXZhLnV0aWwuQXJyYXlMaXN0JyksIAorICogdGhlIHRvdGFsIHNpemUgb2YgdGhlIGFsbG9jYXRpb24gaW4gYnl0ZXMgYW5kIHRoZSBsb2NhdGlvbiwgd2hpY2ggaXMgYSBzdHJpbmdpZmllZCBzdGFjayB0cmFjZSBvZgorICogdGhlIGFsbG9jYXRpb24uCisgKi8KK2ZpbmFsIGNsYXNzIEFsbG9jYXRpb24geworICAvLyBXaGlsZSBwYXJ0aWN1bGFyIGxpc3RzIG9mIFNURXMgY2FuIGhhdmUgYSBsb3Qgb2YgdmFyaWV0eSB3aXRoaW4gYSBiZW5jaG1hcmsgdGhlcmUgZG9uJ3QgdGVuZAorICAvLyB0byBiZSBtYW55IGluZGl2aWR1YWxseSB1bmlxdWUgU1RFcy4gIFRoaXMgY2FuIHNhdmUgYSBsb3Qgb2YgbWVtb3J5LgorICAvLyBXaXRoaW4gYSBiZW5jaG1hcmsgdGhlIGNvZGUgcGF0aHMgc2hvdWxkIGJlIGZhaXJseSB1bmlmb3JtIHNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIGp1c3Qgc3RvcmUKKyAgLy8gdGhlc2UgZm9yZXZlci4KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZXJuZXI8U3RhY2tUcmFjZUVsZW1lbnQ+IHN0ZUludGVybmVyID0gSW50ZXJuZXJzLm5ld1dlYWtJbnRlcm5lcigpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlcm5lcjxTdHJpbmc+IGRlc2NyaXB0aW9uSW50ZXJuZXIgPSBJbnRlcm5lcnMubmV3V2Vha0ludGVybmVyKCk7CisgIAorICAvKiogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB7QGxpbmsgI3NpemUgc2l6ZXN9IG9mIHRoZSBhbGxvY2F0aW9ucy4gKi8KKyAgc3RhdGljIGxvbmcgZ2V0VG90YWxTaXplKENvbGxlY3Rpb248QWxsb2NhdGlvbj4gYWxsb2NhdGlvbnMpIHsKKyAgICBsb25nIHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChBbGxvY2F0aW9uIGFsbG9jYXRpb24gOiBhbGxvY2F0aW9ucykgeworICAgICAgdG90YWxTaXplICs9IGFsbG9jYXRpb24uc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsU2l6ZTsKKyAgfQorICAKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CisgIHByaXZhdGUgZmluYWwgbG9uZyBzaXplOworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZUxpc3Q8U3RhY2tUcmFjZUVsZW1lbnQ+IGxvY2F0aW9uOworICAKKyAgQWxsb2NhdGlvbihTdHJpbmcgZGVzY3JpcHRpb24sIGxvbmcgc2l6ZSwgTGlzdDxTdGFja1RyYWNlRWxlbWVudD4gbG9jYXRpb24pIHsKKyAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25JbnRlcm5lci5pbnRlcm4oZGVzY3JpcHRpb24pOworICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPFN0YWNrVHJhY2VFbGVtZW50PiBsb2NhdGlvbkJ1aWxkZXIgPSBJbW11dGFibGVMaXN0LmJ1aWxkZXIoKTsKKyAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IHN0ZSA6IGxvY2F0aW9uKSB7CisgICAgICBsb2NhdGlvbkJ1aWxkZXIuYWRkKHN0ZUludGVybmVyLmludGVybihzdGUpKTsKKyAgICB9CisgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uQnVpbGRlci5idWlsZCgpOworICB9CisgIAorICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqIGluc3RhbmNlb2YgQWxsb2NhdGlvbikgeworICAgICAgQWxsb2NhdGlvbiBvdGhlciA9IChBbGxvY2F0aW9uKSBvYmo7CisgICAgICByZXR1cm4gb3RoZXIuZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0aW9uKQorICAgICAgICAgICYmIG90aGVyLnNpemUgPT0gc2l6ZQorICAgICAgICAgICYmIG90aGVyLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbik7CisgICAgICAKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgfQorICAKKyAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorICAKKyAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUoZGVzY3JpcHRpb24sIHNpemUsIGxvY2F0aW9uKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBidWlsZGVyLmFwcGVuZChkZXNjcmlwdGlvbikuYXBwZW5kKCIgKCIpLmFwcGVuZChzaXplKS5hcHBlbmQoIiBieXRlcylcblx0YXQgIik7CisgICAgSm9pbmVyLm9uKCJcblx0YXQgIikuYXBwZW5kVG8oYnVpbGRlciwgbG9jYXRpb24pOworICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9BbGxvY2F0aW9uUmVjb3JkZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FsbG9jYXRpb25SZWNvcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OTZlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9BbGxvY2F0aW9uUmVjb3JkZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyOworCisvKioKKyAqIEFuIG9iamVjdCB0aGF0IHJlY29yZHMgYWxsIGFsbG9jYXRpb25zIHRoYXQgb2NjdXIgYmV0d2VlbiB7QGxpbmsgI3N0YXJ0UmVjb3JkaW5nKCl9IAorICogYW5kIHtAbGluayAjc3RvcFJlY29yZGluZyhpbnQpfS4KKyAqIAorICogPHA+VGhpcyBvYmplY3QgY2FuIGFjY3VyYXRlbHkgdHJhY2sgYWxsb2NhdGlvbnMgbWFkZSBmcm9tIG11bHRpcGxlIHRocmVhZHMgYnV0IGlzIG9ubHkgCisgKiBleHBlY3RlZCB0byBoYXZlIHtAbGluayAjc3RhcnRSZWNvcmRpbmcoKX0gYW5kIHtAbGluayAjc3RvcFJlY29yZGluZyhpbnQpfSBjYWxsZWQgYnkgYSBzaW5nbGUgCisgKiB0aHJlYWQuCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFsbG9jYXRpb25SZWNvcmRlciB7CisgIHByaXZhdGUgYm9vbGVhbiBmaXJzdFRpbWUgPSB0cnVlOworICAKKyAgLyoqIAorICAgKiBDbGVhcnMgdGhlIHByaW9yIHN0YXRlIGFuZCBzdGFydHMgYSBuZXcgcmVjb3JkaW5nLgorICAgKiAKKyAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHJlY29yZGluZyBpbmZyYXN0cnVjdHVyZSBpcyBtaXNjb25maWd1cmVkLgorICAgKi8KKyAgZmluYWwgdm9pZCBzdGFydFJlY29yZGluZygpIHsKKyAgICBpZiAoZmlyc3RUaW1lKSB7CisgICAgICBPYmplY3Qgb2JqOworICAgICAgZG9TdGFydFJlY29yZGluZygpOworICAgICAgb2JqID0gbmV3IE9iamVjdCgpOworICAgICAgQWxsb2NhdGlvblN0YXRzIHN0YXRzID0gc3RvcFJlY29yZGluZygxKTsKKyAgICAgIGlmIChzdGF0cy5nZXRBbGxvY2F0aW9uQ291bnQoKSAhPSAxIHx8IHN0YXRzLmdldEFsbG9jYXRpb25TaXplKCkgPCAxKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJUaGUgYWxsb2NhdGlvbiByZWNvcmRpbmcgaW5mcmFzdHJ1Y3R1cmUgYXBwZWFycyB0byBiZSBicm9rZW4uICIKKyAgICAgICAgICAgICAgICArICJFeHBlY3RlZCB0byBmaW5kIGV4YWN0bHkgb25lIGFsbG9jYXRpb24gb2YgYSBqYXZhL2xhbmcvT2JqZWN0IGluc3RlYWQgZm91bmQgJXMiLAorICAgICAgICAgICAgICAgIHN0YXRzKSk7CisgICAgICB9CisgICAgICBmaXJzdFRpbWUgPSBmYWxzZTsKKyAgICB9CisgICAgZG9TdGFydFJlY29yZGluZygpOworICB9CisgIAorICAvKiogQ2xlYXJzIHRoZSBwcmlvciBzdGF0ZSBhbmQgc3RhcnRzIGEgbmV3IHJlY29yZGluZy4gKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TdGFydFJlY29yZGluZygpOworICAKKyAgLyoqCisgICAqIFN0b3BzIHJlY29yZGluZyBhbGxvY2F0aW9ucyBhbmQgc2F2ZXMgYWxsIHRoZSBhbGxvY2F0aW9uIGRhdGEgcmVjb3JkZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwKKyAgICogdG8ge0BsaW5rICNzdGFydFJlY29yZGluZygpfSB0byBhbiB7QGxpbmsgQWxsb2NhdGlvblN0YXRzfSBvYmplY3QuCisgICAqIAorICAgKiBAcGFyYW0gcmVwcyBUaGUgbnVtYmVyIG9mIHJlcHMgdGhhdCB0aGUgcHJldmlvdXMgc2V0IG9mIGFsbG9jYXRpb24gcmVwcmVzZW50cy4KKyAgICovCisgIGFic3RyYWN0IEFsbG9jYXRpb25TdGF0cyBzdG9wUmVjb3JkaW5nKGludCByZXBzKTsKK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FsbG9jYXRpb25TdGF0cy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvQWxsb2NhdGlvblN0YXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzNjM0YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FsbG9jYXRpb25TdGF0cy5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk1vcmVPYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNdWx0aXNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpc2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGlzZXQuRW50cnk7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aXNldHM7CisKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBBIHNldCBvZiBzdGF0aXN0aWNzIGFib3V0IHRoZSBhbGxvY2F0aW9ucyBwZXJmb3JtZWQgYnkgYSBiZW5jaG1hcmsgbWV0aG9kLgorICovCitmaW5hbCBjbGFzcyBBbGxvY2F0aW9uU3RhdHMgeworICBwcml2YXRlIGZpbmFsIGludCBhbGxvY2F0aW9uQ291bnQ7CisgIHByaXZhdGUgZmluYWwgbG9uZyBhbGxvY2F0aW9uU2l6ZTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgcmVwczsKKyAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVNdWx0aXNldDxBbGxvY2F0aW9uPiBhbGxvY2F0aW9uczsKKyAgCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBBbGxvY2F0aW9uU3RhdHN9IHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBhbGxvY2F0aW9ucyAKKyAgICogKHtAY29kZSBhbGxvY2F0aW9uQ291bnR9KSwgY3VtdWxhdGl2ZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9ucyAoe0Bjb2RlIGFsbG9jYXRpb25TaXplfSkgYW5kIHRoZQorICAgKiBudW1iZXIgb2Yge0Bjb2RlIHJlcHN9IHBhc3NlZCB0byB0aGUgYmVuY2htYXJrIG1ldGhvZC4KKyAgICovCisgIEFsbG9jYXRpb25TdGF0cyhpbnQgYWxsb2NhdGlvbkNvdW50LCBsb25nIGFsbG9jYXRpb25TaXplLCBpbnQgcmVwcykgeworICAgIHRoaXMoYWxsb2NhdGlvbkNvdW50LCBhbGxvY2F0aW9uU2l6ZSwgcmVwcywgSW1tdXRhYmxlTXVsdGlzZXQuPEFsbG9jYXRpb24+b2YoKSk7CisgIH0KKyAgCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBBbGxvY2F0aW9uU3RhdHN9IHdpdGggdGhlIGdpdmVuIGFsbG9jYXRpb25zIGFuZCB0aGUgbnVtYmVyIG9mIAorICAgKiB7QGNvZGUgcmVwc30gcGFzc2VkIHRvIHRoZSBiZW5jaG1hcmsgbWV0aG9kLgorICAgKi8KKyAgQWxsb2NhdGlvblN0YXRzKENvbGxlY3Rpb248QWxsb2NhdGlvbj4gYWxsb2NhdGlvbnMsIGludCByZXBzKSB7CisgICAgdGhpcyhhbGxvY2F0aW9ucy5zaXplKCksIEFsbG9jYXRpb24uZ2V0VG90YWxTaXplKGFsbG9jYXRpb25zKSwgcmVwcywgCisgICAgICAgIEltbXV0YWJsZU11bHRpc2V0LmNvcHlPZihhbGxvY2F0aW9ucykpOworICB9CisKKyAgcHJpdmF0ZSBBbGxvY2F0aW9uU3RhdHMoaW50IGFsbG9jYXRpb25Db3VudCwgbG9uZyBhbGxvY2F0aW9uU2l6ZSwgaW50IHJlcHMsIAorICAgICAgTXVsdGlzZXQ8QWxsb2NhdGlvbj4gYWxsb2NhdGlvbnMpIHsKKyAgICBjaGVja0FyZ3VtZW50KGFsbG9jYXRpb25Db3VudCA+PSAwLCAiYWxsb2NhdGlvbkNvdW50ICglcykgd2FzIG5lZ2F0aXZlIiwgYWxsb2NhdGlvbkNvdW50KTsKKyAgICB0aGlzLmFsbG9jYXRpb25Db3VudCA9IGFsbG9jYXRpb25Db3VudDsKKyAgICBjaGVja0FyZ3VtZW50KGFsbG9jYXRpb25TaXplID49IDAsICJhbGxvY2F0aW9uU2l6ZSAoJXMpIHdhcyBuZWdhdGl2ZSIsIGFsbG9jYXRpb25TaXplKTsKKyAgICB0aGlzLmFsbG9jYXRpb25TaXplID0gYWxsb2NhdGlvblNpemU7CisgICAgY2hlY2tBcmd1bWVudChyZXBzID49IDAsICJyZXBzICglcykgd2FzIG5lZ2F0aXZlIiwgcmVwcyk7CisgICAgdGhpcy5yZXBzID0gcmVwczsKKyAgICB0aGlzLmFsbG9jYXRpb25zID0gTXVsdGlzZXRzLmNvcHlIaWdoZXN0Q291bnRGaXJzdChhbGxvY2F0aW9ucyk7CisgIH0KKyAgCisgIGludCBnZXRBbGxvY2F0aW9uQ291bnQoKSB7CisgICAgcmV0dXJuIGFsbG9jYXRpb25Db3VudDsKKyAgfQorICAKKyAgbG9uZyBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKKyAgICByZXR1cm4gYWxsb2NhdGlvblNpemU7CisgIH0KKyAgCisgIC8qKgorICAgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWVhc3VyZW1lbnQgYW5kIHRoZSBnaXZlbiAKKyAgICoge0Bjb2RlIGJhc2VsaW5lfSBtZWFzdXJlbWVudC4gVGhlIHtAY29kZSBiYXNlbGluZX0gbWVhc3VyZW1lbnQgbXVzdCBoYXZlIGEgbG93ZXIgd2VpZ2h0IAorICAgKiAoZmV3ZXIgcmVwcykgdGhhbiB0aGlzIG1lYXN1cmVtZW50LgorICAgKi8KKyAgQWxsb2NhdGlvblN0YXRzIG1pbnVzKEFsbG9jYXRpb25TdGF0cyBiYXNlbGluZSkgeworICAgIGZvciAoRW50cnk8QWxsb2NhdGlvbj4gZW50cnkgOiBiYXNlbGluZS5hbGxvY2F0aW9ucy5lbnRyeVNldCgpKSB7CisgICAgICBpbnQgc3VwZXJDb3VudCA9IGFsbG9jYXRpb25zLmNvdW50KGVudHJ5LmdldEVsZW1lbnQoKSk7CisgICAgICBpZiAoc3VwZXJDb3VudCA8IGVudHJ5LmdldENvdW50KCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIllvdXIgYmVuY2htYXJrIGFwcGVhcnMgdG8gaGF2ZSBub24tZGV0ZXJtaW5pc3RpYyBhbGxvY2F0aW9uIGJlaGF2aW9yLiAiCisgICAgICAgICAgICAgICAgKyAiT2JzZXJ2ZWQgJWQgaW5zdGFuY2Uocykgb2YgJXMgaW4gdGhlIGJhc2VsaW5lIGJ1dCBvbmx5ICVkIGluIHRoZSBhY3R1YWwgIgorICAgICAgICAgICAgICAgICsgIm1lYXN1cmVtZW50IiwgCisgICAgICAgICAgICAgICAgZW50cnkuZ2V0Q291bnQoKSwKKyAgICAgICAgICAgICAgICBlbnRyeS5nZXRFbGVtZW50KCksIAorICAgICAgICAgICAgICAgIHN1cGVyQ291bnQpKTsKKyAgICAgIH0KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgQWxsb2NhdGlvblN0YXRzKGFsbG9jYXRpb25Db3VudCAtIGJhc2VsaW5lLmFsbG9jYXRpb25Db3VudCwKKyAgICAgICAgICAgIGFsbG9jYXRpb25TaXplIC0gYmFzZWxpbmUuYWxsb2NhdGlvblNpemUsCisgICAgICAgICAgICByZXBzIC0gYmFzZWxpbmUucmVwcywKKyAgICAgICAgICAgIE11bHRpc2V0cy5kaWZmZXJlbmNlKGFsbG9jYXRpb25zLCBiYXNlbGluZS5hbGxvY2F0aW9ucykpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIllvdXIgYmVuY2htYXJrIGFwcGVhcnMgdG8gaGF2ZSBub24tZGV0ZXJtaW5pc3RpYyBhbGxvY2F0aW9uIGJlaGF2aW9yLiBUaGUgZGlmZmVyZW5jZSAiCisgICAgICAgICAgKyAiYmV0d2VlbiB0aGUgYmFzZWxpbmUgJXMgYW5kIHRoZSBtZWFzdXJlbWVudCAlcyBpcyBpbnZhbGlkLiBDb25zaWRlciBlbmFibGluZyAiCisgICAgICAgICAgKyAiaW5zdHJ1bWVudC5hbGxvY2F0aW9uLm9wdGlvbnMudHJhY2tBbGxvY2F0aW9ucyB0byBnZXQgYSBtb3JlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UuIiwgCisgICAgICAgICAgYmFzZWxpbmUsIHRoaXMpLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1lYXN1cmVtZW50IGFuZCB0aGUgZ2l2ZW4KKyAgICoge0Bjb2RlIGJhc2VsaW5lfSBtZWFzdXJlbWVudC4gVW5saWtlIHtAbGluayAjbWludXMoQWxsb2NhdGlvblN0YXRzKX0gdGhpcyBkb2VzIG5vdCBoYXZlIHRvCisgICAqIGJlIGEgc3VwZXIgc2V0IG9mIHRoZSBiYXNlbGluZS4KKyAgICovCisgIHB1YmxpYyBEZWx0YSBkZWx0YShBbGxvY2F0aW9uU3RhdHMgYmFzZWxpbmUpIHsKKyAgICByZXR1cm4gbmV3IERlbHRhKAorICAgICAgICBhbGxvY2F0aW9uQ291bnQgLSBiYXNlbGluZS5hbGxvY2F0aW9uQ291bnQsCisgICAgICAgIGFsbG9jYXRpb25TaXplIC0gYmFzZWxpbmUuYWxsb2NhdGlvblNpemUsCisgICAgICAgIHJlcHMgLSBiYXNlbGluZS5yZXBzLAorICAgICAgICBNdWx0aXNldHMuZGlmZmVyZW5jZShhbGxvY2F0aW9ucywgYmFzZWxpbmUuYWxsb2NhdGlvbnMpLAorICAgICAgICBNdWx0aXNldHMuZGlmZmVyZW5jZShiYXNlbGluZS5hbGxvY2F0aW9ucywgYWxsb2NhdGlvbnMpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnRzfSBiYXNlZCBvbiB0aGlzIGNvbGxlY3Rpb24gb2Ygc3RhdHMuCisgICAqLworICBJbW11dGFibGVMaXN0PE1lYXN1cmVtZW50PiB0b01lYXN1cmVtZW50cygpIHsKKyAgICBmb3IgKEVudHJ5PEFsbG9jYXRpb24+IGVudHJ5IDogYWxsb2NhdGlvbnMuZW50cnlTZXQoKSkgeworICAgICAgZG91YmxlIGFsbG9jc1BlclJlcCA9ICgoZG91YmxlKSBlbnRyeS5nZXRDb3VudCgpKSAvIHJlcHM7CisgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiQWxsb2NhdGVkICVmIGFsbG9jcyBwZXIgcmVwIG9mICVzJW4iLCBhbGxvY3NQZXJSZXAsIGVudHJ5LmdldEVsZW1lbnQoKSk7CisgICAgfQorICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBuZXcgTWVhc3VyZW1lbnQuQnVpbGRlcigpCisgICAgICAgICAgICAudmFsdWUoVmFsdWUuY3JlYXRlKGFsbG9jYXRpb25Db3VudCwgIiIpKQorICAgICAgICAgICAgLmRlc2NyaXB0aW9uKCJvYmplY3RzIikKKyAgICAgICAgICAgIC53ZWlnaHQocmVwcykKKyAgICAgICAgICAgIC5idWlsZCgpLAorICAgICAgICBuZXcgTWVhc3VyZW1lbnQuQnVpbGRlcigpCisgICAgICAgICAgICAudmFsdWUoVmFsdWUuY3JlYXRlKGFsbG9jYXRpb25TaXplLCAiQiIpKQorICAgICAgICAgICAgLndlaWdodChyZXBzKQorICAgICAgICAgICAgLmRlc2NyaXB0aW9uKCJieXRlcyIpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqID09IHRoaXMpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWxsb2NhdGlvblN0YXRzKSB7CisgICAgICBBbGxvY2F0aW9uU3RhdHMgdGhhdCA9IChBbGxvY2F0aW9uU3RhdHMpIG9iajsKKyAgICAgIHJldHVybiBhbGxvY2F0aW9uQ291bnQgPT0gdGhhdC5hbGxvY2F0aW9uQ291bnQKKyAgICAgICAgICAmJiBhbGxvY2F0aW9uU2l6ZSA9PSB0aGF0LmFsbG9jYXRpb25TaXplCisgICAgICAgICAgJiYgcmVwcyA9PSB0aGF0LnJlcHMKKyAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKGFsbG9jYXRpb25zLCB0aGF0LmFsbG9jYXRpb25zKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKGFsbG9jYXRpb25Db3VudCwgYWxsb2NhdGlvblNpemUsIHJlcHMsIGFsbG9jYXRpb25zKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQorICAgICAgICAuYWRkKCJhbGxvY2F0aW9uQ291bnQiLCBhbGxvY2F0aW9uQ291bnQpCisgICAgICAgIC5hZGQoImFsbG9jYXRpb25TaXplIiwgYWxsb2NhdGlvblNpemUpCisgICAgICAgIC5hZGQoInJlcHMiLCByZXBzKQorICAgICAgICAuYWRkKCJhbGxvY2F0aW9ucyIsIGFsbG9jYXRpb25zKQorICAgICAgICAudG9TdHJpbmcoKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZGVsdGEgYmV0d2VlbiB0d28gZGlmZmVyZW50IHNldHMgb2Ygc3RhdGlzdGljcy4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWx0YSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY291bnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHNpemU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcmVwczsKKyAgICBwcml2YXRlIGZpbmFsIE11bHRpc2V0PEFsbG9jYXRpb24+IGFkZGl0aW9uczsKKyAgICBwcml2YXRlIGZpbmFsIE11bHRpc2V0PEFsbG9jYXRpb24+IHJlbW92YWxzOworCisgICAgRGVsdGEoCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgbG9uZyBzaXplLAorICAgICAgICBpbnQgcmVwcywKKyAgICAgICAgTXVsdGlzZXQ8QWxsb2NhdGlvbj4gYWRkaXRpb25zLAorICAgICAgICBNdWx0aXNldDxBbGxvY2F0aW9uPiByZW1vdmFscykgeworICAgICAgdGhpcy5jb3VudCA9IGNvdW50OworICAgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICAgIHRoaXMucmVwcyA9IHJlcHM7CisgICAgICB0aGlzLmFkZGl0aW9ucyA9IGFkZGl0aW9uczsKKyAgICAgIHRoaXMucmVtb3ZhbHMgPSByZW1vdmFsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb25nIGZvcm1hdHRlZCB3aXRoIGEgbGVhZGluZyArLy0gc2lnbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRXaXRoTGVhZGluZ1NpZ24obG9uZyBuKSB7CisgICAgICByZXR1cm4gbiA+IDAgPyAiKyIgKyBuIDogIiIgKyBuOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICAgICAgLmFkZCgiY291bnQiLCBmb3JtYXRXaXRoTGVhZGluZ1NpZ24oY291bnQpKQorICAgICAgICAgIC5hZGQoInNpemUiLCBmb3JtYXRXaXRoTGVhZGluZ1NpZ24oc2l6ZSkpCisgICAgICAgICAgLmFkZCgicmVwcyIsIGZvcm1hdFdpdGhMZWFkaW5nU2lnbihyZXBzKSkKKyAgICAgICAgICAuYWRkKCJhZGRpdGlvbnMiLCBhZGRpdGlvbnMpCisgICAgICAgICAgLmFkZCgicmVtb3ZhbHMiLCByZW1vdmFscykKKyAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL0FyYml0cmFyeU1lYXN1cmVtZW50V29ya2VyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9BcmJpdHJhcnlNZWFzdXJlbWVudFdvcmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDY2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9BcmJpdHJhcnlNZWFzdXJlbWVudFdvcmtlci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5BcmJpdHJhcnlNZWFzdXJlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLlZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVubmluZy5CZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkJlbmNobWFya01ldGhvZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIFdvcmtlciBmb3IgYXJiaXRyYXJ5IG1lYXN1cmVtZW50cy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFyYml0cmFyeU1lYXN1cmVtZW50V29ya2VyIGV4dGVuZHMgV29ya2VyIHsKKyAgcHJpdmF0ZSBmaW5hbCBPcHRpb25zIG9wdGlvbnM7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVuaXQ7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgIEBJbmplY3QgQXJiaXRyYXJ5TWVhc3VyZW1lbnRXb3JrZXIoCisgICAgICBAQmVuY2htYXJrIE9iamVjdCBiZW5jaG1hcmssIAorICAgICAgQEJlbmNobWFya01ldGhvZCBNZXRob2QgbWV0aG9kLAorICAgICAgQFdvcmtlck9wdGlvbnMgTWFwPFN0cmluZywgU3RyaW5nPiB3b3JrZXJPcHRpb25zKSB7CisgICAgc3VwZXIoYmVuY2htYXJrLCBtZXRob2QpOworICAgIHRoaXMub3B0aW9ucyA9IG5ldyBPcHRpb25zKHdvcmtlck9wdGlvbnMpOworICAgIEFyYml0cmFyeU1lYXN1cmVtZW50IGFubm90YXRpb24gPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihBcmJpdHJhcnlNZWFzdXJlbWVudC5jbGFzcyk7CisgICAgdGhpcy51bml0ID0gYW5ub3RhdGlvbi51bml0cygpOworICAgIHRoaXMuZGVzY3JpcHRpb24gPSBhbm5vdGF0aW9uLmRlc2NyaXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcHJlTWVhc3VyZShib29sZWFuIGluV2FybXVwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpZiAob3B0aW9ucy5nY0JlZm9yZUVhY2ggJiYgIWluV2FybXVwKSB7CisgICAgICBVdGlsLmZvcmNlR2MoKTsKKyAgICB9CisgIH0KKyAgCisgIEBPdmVycmlkZSBwdWJsaWMgSXRlcmFibGU8TWVhc3VyZW1lbnQ+IG1lYXN1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBkb3VibGUgbWVhc3VyZWQgPSAoRG91YmxlKSBiZW5jaG1hcmtNZXRob2QuaW52b2tlKGJlbmNobWFyayk7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZihuZXcgTWVhc3VyZW1lbnQuQnVpbGRlcigpCisgICAgICAgIC52YWx1ZShWYWx1ZS5jcmVhdGUobWVhc3VyZWQsIHVuaXQpKQorICAgICAgICAud2VpZ2h0KDEpCisgICAgICAgIC5kZXNjcmlwdGlvbihkZXNjcmlwdGlvbikKKyAgICAgICAgLmJ1aWxkKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT3B0aW9ucyB7CisgICAgZmluYWwgYm9vbGVhbiBnY0JlZm9yZUVhY2g7CisKKyAgICBPcHRpb25zKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykgeworICAgICAgdGhpcy5nY0JlZm9yZUVhY2ggPSBCb29sZWFuLnBhcnNlQm9vbGVhbihvcHRpb25zLmdldCgiZ2NCZWZvcmVFYWNoIikpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvTWFjcm9iZW5jaG1hcmtBbGxvY2F0aW9uV29ya2VyLmphdmEgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9NYWNyb2JlbmNobWFya0FsbG9jYXRpb25Xb3JrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWFmNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvTWFjcm9iZW5jaG1hcmtBbGxvY2F0aW9uV29ya2VyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVubmluZy5CZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkJlbmNobWFya01ldGhvZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIFRoZSB7QGxpbmsgV29ya2VyfSBmb3IgdGhlIHtAY29kZSBBbGxvY2F0aW9uSW5zdHJ1bWVudH0uICBUaGlzIGNsYXNzIGludm9rZXMgdGhlIGJlbmNobWFyayBtZXRob2QKKyAqIGEgZmV3IHRpbWVzLCB3aXRoIHZhcnlpbmcgbnVtYmVycyBvZiByZXBzLCBhbmQgY29tcHV0ZXMgdGhlIG51bWJlciBvZiBvYmplY3QgYWxsb2NhdGlvbnMgYW5kIHRoZQorICogdG90YWwgc2l6ZSBvZiB0aG9zZSBhbGxvY2F0aW9ucy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1hY3JvYmVuY2htYXJrQWxsb2NhdGlvbldvcmtlciBleHRlbmRzIFdvcmtlciB7CisgIHByaXZhdGUgZmluYWwgQWxsb2NhdGlvblJlY29yZGVyIHJlY29yZGVyOworCisgIEBJbmplY3QgTWFjcm9iZW5jaG1hcmtBbGxvY2F0aW9uV29ya2VyKEBCZW5jaG1hcmsgT2JqZWN0IGJlbmNobWFyaywgCisgICAgICBAQmVuY2htYXJrTWV0aG9kIE1ldGhvZCBtZXRob2QsIEFsbG9jYXRpb25SZWNvcmRlciByZWNvcmRlcikgeworICAgIHN1cGVyKGJlbmNobWFyaywgbWV0aG9kKTsKKyAgICB0aGlzLnJlY29yZGVyID0gcmVjb3JkZXI7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgYm9vdHN0cmFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gZG8gb25lIGluaXRpYWwgbWVhc3VyZW1lbnQgYW5kIHRocm93IGF3YXkgaXRzIHJlc3VsdHMKKyAgICBtZWFzdXJlQWxsb2NhdGlvbnMoYmVuY2htYXJrLCBiZW5jaG1hcmtNZXRob2QpOworICB9CisgIAorICBAT3ZlcnJpZGUgcHVibGljIEltbXV0YWJsZUxpc3Q8TWVhc3VyZW1lbnQ+IG1lYXN1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbWVhc3VyZUFsbG9jYXRpb25zKGJlbmNobWFyaywgYmVuY2htYXJrTWV0aG9kKS50b01lYXN1cmVtZW50cygpOworICB9CisKKyAgcHJpdmF0ZSBBbGxvY2F0aW9uU3RhdHMgbWVhc3VyZUFsbG9jYXRpb25zKE9iamVjdCBiZW5jaG1hcmssIE1ldGhvZCBtZXRob2QpIHRocm93cyBFeGNlcHRpb24geworICAgIHJlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKCk7CisgICAgbWV0aG9kLmludm9rZShiZW5jaG1hcmspOworICAgIHJldHVybiByZWNvcmRlci5zdG9wUmVjb3JkaW5nKDEpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9NYWNyb2JlbmNobWFya1dvcmtlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvTWFjcm9iZW5jaG1hcmtXb3JrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTYwMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvTWFjcm9iZW5jaG1hcmtXb3JrZXIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuUmVmbGVjdGlvbi5nZXRBbm5vdGF0ZWRNZXRob2RzOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuQWZ0ZXJSZXA7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5CZWZvcmVSZXA7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLlJ1bm5pbmcuQmVuY2htYXJrOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVubmluZy5CZW5jaG1hcmtNZXRob2Q7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0b3B3YXRjaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRpY2tlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBUaGUge0BsaW5rIFdvcmtlcn0gaW1wbGVtZW50YXRpb24gZm9yIG1hY3JvYmVuY2htYXJrcy4KKyAqLworcHVibGljIGNsYXNzIE1hY3JvYmVuY2htYXJrV29ya2VyIGV4dGVuZHMgV29ya2VyIHsKKyAgcHJpdmF0ZSBmaW5hbCBTdG9wd2F0Y2ggc3RvcHdhdGNoOworICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNldDxNZXRob2Q+IGJlZm9yZVJlcE1ldGhvZHM7CisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PE1ldGhvZD4gYWZ0ZXJSZXBNZXRob2RzOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZ2NCZWZvcmVFYWNoOworCisgIEBJbmplY3QgTWFjcm9iZW5jaG1hcmtXb3JrZXIoQEJlbmNobWFyayBPYmplY3QgYmVuY2htYXJrLCBAQmVuY2htYXJrTWV0aG9kIE1ldGhvZCBtZXRob2QsCisgICAgICBUaWNrZXIgdGlja2VyLCBAV29ya2VyT3B0aW9ucyBNYXA8U3RyaW5nLCBTdHJpbmc+IHdvcmtlck9wdGlvbnMpIHsKKyAgICBzdXBlcihiZW5jaG1hcmssIG1ldGhvZCk7CisgICAgdGhpcy5zdG9wd2F0Y2ggPSBTdG9wd2F0Y2guY3JlYXRlVW5zdGFydGVkKHRpY2tlcik7CisgICAgdGhpcy5iZWZvcmVSZXBNZXRob2RzID0KKyAgICAgICAgZ2V0QW5ub3RhdGVkTWV0aG9kcyhiZW5jaG1hcmsuZ2V0Q2xhc3MoKSwgQmVmb3JlUmVwLmNsYXNzKTsKKyAgICB0aGlzLmFmdGVyUmVwTWV0aG9kcyA9CisgICAgICAgIGdldEFubm90YXRlZE1ldGhvZHMoYmVuY2htYXJrLmdldENsYXNzKCksIEFmdGVyUmVwLmNsYXNzKTsKKyAgICB0aGlzLmdjQmVmb3JlRWFjaCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHdvcmtlck9wdGlvbnMuZ2V0KCJnY0JlZm9yZUVhY2giKSk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcHJlTWVhc3VyZShib29sZWFuIGluV2FybXVwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmb3IgKE1ldGhvZCBiZWZvcmVSZXBNZXRob2QgOiBiZWZvcmVSZXBNZXRob2RzKSB7CisgICAgICBiZWZvcmVSZXBNZXRob2QuaW52b2tlKGJlbmNobWFyayk7CisgICAgfQorICAgIGlmIChnY0JlZm9yZUVhY2ggJiYgIWluV2FybXVwKSB7CisgICAgICBVdGlsLmZvcmNlR2MoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIEl0ZXJhYmxlPE1lYXN1cmVtZW50PiBtZWFzdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc3RvcHdhdGNoLnN0YXJ0KCk7CisgICAgYmVuY2htYXJrTWV0aG9kLmludm9rZShiZW5jaG1hcmspOworICAgIGxvbmcgbmFub3MgPSBzdG9wd2F0Y2guc3RvcCgpLmVsYXBzZWQoTkFOT1NFQ09ORFMpOworICAgIHN0b3B3YXRjaC5yZXNldCgpOworICAgIHJldHVybiBJbW11dGFibGVTZXQub2YobmV3IE1lYXN1cmVtZW50LkJ1aWxkZXIoKQorICAgICAgICAuZGVzY3JpcHRpb24oInJ1bnRpbWUiKQorICAgICAgICAud2VpZ2h0KDEpCisgICAgICAgIC52YWx1ZShWYWx1ZS5jcmVhdGUobmFub3MsICJucyIpKQorICAgICAgICAuYnVpbGQoKSk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcG9zdE1lYXN1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmb3IgKE1ldGhvZCBhZnRlclJlcE1ldGhvZCA6IGFmdGVyUmVwTWV0aG9kcykgeworICAgICAgYWZ0ZXJSZXBNZXRob2QuaW52b2tlKGJlbmNobWFyayk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9NaWNyb2JlbmNobWFya0FsbG9jYXRpb25Xb3JrZXIuamF2YSBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL01pY3JvYmVuY2htYXJrQWxsb2NhdGlvbldvcmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Nzk3YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9NaWNyb2JlbmNobWFya0FsbG9jYXRpb25Xb3JrZXIuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVubmluZy5CZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkJlbmNobWFya01ldGhvZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIFRoZSB7QGxpbmsgV29ya2VyfSBmb3IgdGhlIHtAY29kZSBBbGxvY2F0aW9uSW5zdHJ1bWVudH0uICBUaGlzIGNsYXNzIGludm9rZXMgdGhlIGJlbmNobWFyayBtZXRob2QKKyAqIGEgZmV3IHRpbWVzLCB3aXRoIHZhcnlpbmcgbnVtYmVycyBvZiByZXBzLCBhbmQgY29tcHV0ZXMgdGhlIG51bWJlciBvZiBvYmplY3QgYWxsb2NhdGlvbnMgYW5kIHRoZQorICogdG90YWwgc2l6ZSBvZiB0aG9zZSBhbGxvY2F0aW9ucy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1pY3JvYmVuY2htYXJrQWxsb2NhdGlvbldvcmtlciBleHRlbmRzIFdvcmtlciB7CisgIC8vIFRPRE8oZ2FrKTogbWFrZSB0aGlzIG9yIHNvbWV0aGluZyBsaWtlIHRoaXMgYW4gb3B0aW9uCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQVJNVVBfUkVQUyA9IDEwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFUFMgPSAxMDA7CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbWVhc3VyZW1lbnQgcnVucyB0aGF0IG11c3QgaGF2ZSBtYXRjaGluZyBhbGxvY2F0aW9ucyBkdXJpbmcgdGhlIHdhcm0KKyAgICogdXAgaW4gb3JkZXIgZm9yIHRoZSBtZXRob2QgdG8gYmUgZGV0ZXJtaW5lZCB0byBiZSBkZXRlcm1pbmlzdGljLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVEVSTUlOSVNUSUNfQkVOQ0hNQVJLX1RIUkVTSE9MRCA9IDI7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB3YXJtIHVwIG1lYXN1cmVtZW50cyB0byB0YWtlIGJlZm9yZSBkZXRlcm1pbmluZyB0aGF0IHRoZSB0ZXN0IGlzCisgICAqIG5vbi1kZXRlcm1pbmlzdGljLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVEVSTUlOSVNUSUNfTUVBU1VSRU1FTlRfQ09VTlQgPSBERVRFUk1JTklTVElDX0JFTkNITUFSS19USFJFU0hPTEQgKyAzOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICBwcml2YXRlIGZpbmFsIFJhbmRvbSByYW5kb207CisgIHByaXZhdGUgZmluYWwgQWxsb2NhdGlvblJlY29yZGVyIHJlY29yZGVyOworCisgIEBJbmplY3QgTWljcm9iZW5jaG1hcmtBbGxvY2F0aW9uV29ya2VyKEBCZW5jaG1hcmsgT2JqZWN0IGJlbmNobWFyaywKKyAgICAgIEBCZW5jaG1hcmtNZXRob2QgTWV0aG9kIG1ldGhvZCwgQWxsb2NhdGlvblJlY29yZGVyIHJlY29yZGVyLCBSYW5kb20gcmFuZG9tKSB7CisgICAgc3VwZXIoYmVuY2htYXJrLCBtZXRob2QpOworICAgIHRoaXMucmFuZG9tID0gcmFuZG9tOworICAgIHRoaXMucmVjb3JkZXIgPSByZWNvcmRlcjsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBib290c3RyYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBkbyBzb21lIGluaXRpYWwgbWVhc3VyZW1lbnRzIGFuZCB0aHJvdyBhd2F5IHRoZSByZXN1bHRzLiB0aGlzIHdhcm1zIHVwIHRoZSBib290c3RyYXAgbWV0aG9kCisgICAgLy8gaXRzZWxmIGFuZCBhbHNvIHRoZSBtZXRob2QgaW52b2NhdGlvbiBwYXRoIGZvciBjYWxsaW5nIHRoYXQgbWV0aG9kLgorCisgICAgLy8gd2FybSB1cCB0aGUgbG9vcCBpbiB0aGUgYmVuY2htYXJrIG1ldGhvZC4KKyAgICBtZWFzdXJlQWxsb2NhdGlvbnMoYmVuY2htYXJrLCBiZW5jaG1hcmtNZXRob2QsIFdBUk1VUF9SRVBTKTsKKworICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBiZW5jaG1hcmsgaXMgZGV0ZXJtaW5pc3RpYyBpbiB0ZXJtcyBvZiB0aGUgbWVhc3VyZWQgYWxsb2NhdGlvbnMuCisgICAgdmVyaWZ5QmVuY2htYXJrSXNEZXRlcm1pbmlzdGljKCk7CisgIH0KKworICAvKioKKyAgICogVmVyaWZ5IHRoZSBkZXRlcm1pbmlzbSBvZiB0aGUgYmVuY2htYXJrIG1ldGhvZC4KKyAgICoKKyAgICogPHA+VGhlIG1ldGhvZCBpbnZvY2F0aW9uIHBhdGgsIGkuZS4gdGhlIGNvZGUgdGhhdCB0aGUgSlZNIGV4ZWN1dGVzIHRvIGludm9rZSB0aGUgbWV0aG9kLCBjYW4KKyAgICogdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgdGltZXMgaXQgaXMgcnVuIHdpdGggYSBjb3JyZXNwb25kaW5nIGVmZmVjdCBvbiB0aGUgYWxsb2NhdGlvbnMKKyAgICogbWVhc3VyZWQuIFRoZSBpbnZvY2F0aW9ucyBwZXJmb3JtZWQgYnkgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gY2F1c2UgdGhlIEpWTSB0bworICAgKiBzZXR0bGUgb24gYSBzaW5nbGUgcGF0aCBmb3IgaW52b2tpbmcgdGhlIGJlbmNobWFyayBtZXRob2QgYW5kIHNvIGNhdXNlIGlkZW50aWNhbCBhbGxvY2F0aW9ucworICAgKiBmb3IgZWFjaCBzdWJzZXF1ZW50IGludm9jYXRpb24uIElmIHRlc3RzIHN0YXJ0IHRvIGZhaWwgd2l0aCBsb3RzIG9mIG5vbi1kZXRlcm1pbmlzdGljCisgICAqIGFsbG9jYXRpb24gZXJyb3JzIHRoZW4gaXQncyBwb3NzaWJsZSB0aGF0IGFkZGl0aW9uYWwgaW52b2NhdGlvbnMgYXJlIHJlcXVpcmVkIGluIHdoaWNoIGNhc2UKKyAgICogdGhlIHZhbHVlIG9mIHtAbGluayAjREVURVJNSU5JU1RJQ19CRU5DSE1BUktfVEhSRVNIT0xEfSBzaG91bGQgYmUgaW5jcmVhc2VkLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHZlcmlmeUJlbmNobWFya0lzRGV0ZXJtaW5pc3RpYygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIGtlZXAgdHJhY2sgb2YgYWxsIHRoZSBzdGF0aXN0aWNzIGdlbmVyYXRlZCB3aGlsZSB3YXJtaW5nIHVwIHRoZSBtZXRob2QgaW52b2NhdGlvbiBwYXRoLgorICAgIExpc3Q8QWxsb2NhdGlvblN0YXRzPiBoaXN0b3J5ID0gbmV3IEFycmF5TGlzdDxBbGxvY2F0aW9uU3RhdHM+KCk7CisKKyAgICAvLyB3YXJtIHVwIHRoZSBtZXRob2QgaW52b2NhdGlvbiBwYXRoIGJ5IGNhbGxpbmcgdGhlIGJlbmNobWFyayBtdWx0aXBsZSB0aW1lcyB3aXRoIDAgcmVwcy4KKyAgICBBbGxvY2F0aW9uU3RhdHMgYmFzZWxpbmUgPSBudWxsOworICAgIGludCBtYXRjaGluZ1NlcXVlbmNlTGVuZ3RoID0gMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IERFVEVSTUlOSVNUSUNfTUVBU1VSRU1FTlRfQ09VTlQ7ICsraSkgeworICAgICAgQWxsb2NhdGlvblN0YXRzIHN0YXRzID0gbWVhc3VyZUFsbG9jYXRpb25zKGJlbmNobWFyaywgYmVuY2htYXJrTWV0aG9kLCAwKTsKKyAgICAgIGhpc3RvcnkuYWRkKHN0YXRzKTsKKyAgICAgIGlmIChzdGF0cy5lcXVhbHMoYmFzZWxpbmUpKSB7CisgICAgICAgIC8vIGlmIGNvbnNlY3V0aXZlIG1lYXN1cmVtZW50cyB3aXRoIHRoZSBzYW1lIGFsbG9jYXRpb24gY2hhcmFjdGVyaXN0aWNzIHJlYWNoZXMgdGhlCisgICAgICAgIC8vIHRocmVzaG9sZCB0aGVuIHRyZWF0IHRoZSBiZW5jaG1hcmsgYXMgYmVpbmcgZGV0ZXJtaW5pc3RpYy4KKyAgICAgICAgaWYgKCsrbWF0Y2hpbmdTZXF1ZW5jZUxlbmd0aCA9PSBERVRFUk1JTklTVElDX0JFTkNITUFSS19USFJFU0hPTEQpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hdGNoaW5nU2VxdWVuY2VMZW5ndGggPSAxOworICAgICAgICBiYXNlbGluZSA9IHN0YXRzOworICAgICAgfQorICAgIH0KKworICAgIC8vIHRoZSBiYXNlbGluZSBhbGxvY2F0aW9ucyBkaWQgbm90IHNldHRsZSBkb3duIGFuZCBzbyBhcmUgcHJvYmFibHkgbm9uLWRldGVybWluaXN0aWMuCisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKKyAgICBBbGxvY2F0aW9uU3RhdHMgcHJldmlvdXMgPSBudWxsOworICAgIGZvciAoQWxsb2NhdGlvblN0YXRzIGFsbG9jYXRpb25TdGF0cyA6IGhpc3RvcnkpIHsKKyAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKExJTkVfU0VQQVJBVE9SKS5hcHBlbmQoIiAgIikuYXBwZW5kKGFsbG9jYXRpb25TdGF0cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBbGxvY2F0aW9uU3RhdHMuRGVsdGEgZGVsdGEgPSBhbGxvY2F0aW9uU3RhdHMuZGVsdGEocHJldmlvdXMpOworICAgICAgICBidWlsZGVyLmFwcGVuZChMSU5FX1NFUEFSQVRPUikuYXBwZW5kKCIgICIpLmFwcGVuZChkZWx0YSk7CisgICAgICB9CisgICAgICBwcmV2aW91cyA9IGFsbG9jYXRpb25TdGF0czsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAiWW91ciBiZW5jaG1hcmsgYXBwZWFycyB0byBoYXZlIG5vbi1kZXRlcm1pbmlzdGljIGFsbG9jYXRpb24gYmVoYXZpb3IuICIKKyAgICAgICAgKyAiRHVyaW5nIHRoZSB3YXJtIHVwIHByb2Nlc3MgdGhlcmUgd2FzIG5vIGNvbnNlY3V0aXZlIHNlcXVlbmNlIG9mICVkIHJ1bnMgd2l0aCIKKyAgICAgICAgKyAiIGlkZW50aWNhbCBhbGxvY2F0aW9ucy4gVGhlIGFsbG9jYXRpb24gaGlzdG9yeSBpczolcyIsCisgICAgICAgIERFVEVSTUlOSVNUSUNfQkVOQ0hNQVJLX1RIUkVTSE9MRCwgYnVpbGRlcikpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyBJdGVyYWJsZTxNZWFzdXJlbWVudD4gbWVhc3VyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEFsbG9jYXRpb25TdGF0cyBiYXNlbGluZSA9IG1lYXN1cmVBbGxvY2F0aW9ucyhiZW5jaG1hcmssIGJlbmNobWFya01ldGhvZCwgMCk7CisgICAgLy8gWzEsIE1BWF9SRVBTXQorICAgIGludCBtZWFzdXJlbWVudFJlcHMgPSByYW5kb20ubmV4dEludChNQVhfUkVQUykgKyAxOworICAgIEFsbG9jYXRpb25TdGF0cyBtZWFzdXJlbWVudCA9IG1lYXN1cmVBbGxvY2F0aW9ucyhiZW5jaG1hcmssIGJlbmNobWFya01ldGhvZCwgbWVhc3VyZW1lbnRSZXBzKTsKKyAgICByZXR1cm4gbWVhc3VyZW1lbnQubWludXMoYmFzZWxpbmUpLnRvTWVhc3VyZW1lbnRzKCk7CisgIH0KKworICBwcml2YXRlIEFsbG9jYXRpb25TdGF0cyBtZWFzdXJlQWxsb2NhdGlvbnMoCisgICAgICBPYmplY3QgYmVuY2htYXJrLCBNZXRob2QgbWV0aG9kLCBpbnQgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gZG8gdGhlIEludGVnZXIgYm94aW5nIGFuZCB0aGUgY3JlYXRpb24gb2YgdGhlIE9iamVjdFtdIG91dHNpZGUgb2YgdGhlIHJlY29yZCBibG9jaywgc28gdGhhdAorICAgIC8vIG91ciBpbnRlcm5hbCBhbGxvY2F0aW9ucyBhcmVuJ3QgY291bnRlZCBpbiB0aGUgYmVuY2htYXJrJ3MgYWxsb2NhdGlvbnMuCisgICAgT2JqZWN0W10gYXJncyA9IHtyZXBzfTsKKyAgICByZWNvcmRlci5zdGFydFJlY29yZGluZygpOworICAgIG1ldGhvZC5pbnZva2UoYmVuY2htYXJrLCBhcmdzKTsKKyAgICByZXR1cm4gcmVjb3JkZXIuc3RvcFJlY29yZGluZyhyZXBzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvUnVudGltZVdvcmtlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvUnVudGltZVdvcmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTYyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9SdW50aW1lV29ya2VyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuVmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5JbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVubmluZy5CZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkJlbmNobWFya01ldGhvZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5TaG9ydER1cmF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci51dGlsLlV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaWNrZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBBIHtAbGluayBXb3JrZXJ9IGJhc2UgY2xhc3MgZm9yIG1pY3JvIGFuZCBwaWNvIGJlbmNobWFya3MuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSdW50aW1lV29ya2VyIGV4dGVuZHMgV29ya2VyIHsKKyAgQFZpc2libGVGb3JUZXN0aW5nIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9SRVBTID0gMTAwOworCisgIHByb3RlY3RlZCBmaW5hbCBSYW5kb20gcmFuZG9tOworICBwcm90ZWN0ZWQgZmluYWwgVGlja2VyIHRpY2tlcjsKKyAgcHJvdGVjdGVkIGZpbmFsIE9wdGlvbnMgb3B0aW9uczsKKyAgcHJpdmF0ZSBsb25nIHRvdGFsUmVwczsKKyAgcHJpdmF0ZSBsb25nIHRvdGFsTmFub3M7CisgIHByaXZhdGUgbG9uZyBuZXh0UmVwczsKKworICBSdW50aW1lV29ya2VyKE9iamVjdCBiZW5jaG1hcmssIAorICAgICAgTWV0aG9kIG1ldGhvZCwgUmFuZG9tIHJhbmRvbSwgVGlja2VyIHRpY2tlciwKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gd29ya2VyT3B0aW9ucykgeworICAgIHN1cGVyKGJlbmNobWFyaywgbWV0aG9kKTsKKyAgICB0aGlzLnJhbmRvbSA9IHJhbmRvbTsKKyAgICAvLyBUT0RPKGdhayk6IGludmVzdGlnYXRlIHdoZXRoZXIgb3Igbm90IHdlIGNhbiB1c2UgU3RvcHdhdGNoCisgICAgdGhpcy50aWNrZXIgPSB0aWNrZXI7CisgICAgdGhpcy5vcHRpb25zID0gbmV3IE9wdGlvbnMod29ya2VyT3B0aW9ucyk7CisgIH0KKyAgCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBib290c3RyYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0b3RhbFJlcHMgPSBJTklUSUFMX1JFUFM7CisgICAgdG90YWxOYW5vcyA9IGludm9rZVRpbWVNZXRob2QoSU5JVElBTF9SRVBTKTsKKyAgfQorCisgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBwcmVNZWFzdXJlKGJvb2xlYW4gaW5XYXJtdXApIHRocm93cyBFeGNlcHRpb24geworICAgIG5leHRSZXBzID0gY2FsY3VsYXRlVGFyZ2V0UmVwcyh0b3RhbFJlcHMsIHRvdGFsTmFub3MsIG9wdGlvbnMudGltaW5nSW50ZXJ2YWxOYW5vcywKKyAgICAgICAgcmFuZG9tLm5leHRHYXVzc2lhbigpKTsKKyAgICBpZiAob3B0aW9ucy5nY0JlZm9yZUVhY2ggJiYgIWluV2FybXVwKSB7CisgICAgICBVdGlsLmZvcmNlR2MoKTsKKyAgICB9CisgIH0KKyAgCisgIEBPdmVycmlkZSBwdWJsaWMgSXRlcmFibGU8TWVhc3VyZW1lbnQ+IG1lYXN1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBsb25nIG5hbm9zID0gaW52b2tlVGltZU1ldGhvZChuZXh0UmVwcyk7CisgICAgTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQgPSBuZXcgTWVhc3VyZW1lbnQuQnVpbGRlcigpCisgICAgICAgIC5kZXNjcmlwdGlvbigicnVudGltZSIpCisgICAgICAgIC52YWx1ZShWYWx1ZS5jcmVhdGUobmFub3MsICJucyIpKQorICAgICAgICAud2VpZ2h0KG5leHRSZXBzKQorICAgICAgICAuYnVpbGQoKTsKKyAgICAKKyAgICB0b3RhbFJlcHMgKz0gbmV4dFJlcHM7CisgICAgdG90YWxOYW5vcyArPSBuYW5vczsKKyAgICByZXR1cm4gSW1tdXRhYmxlU2V0Lm9mKG1lYXN1cmVtZW50KTsKKyAgfQorICAKKyAgYWJzdHJhY3QgbG9uZyBpbnZva2VUaW1lTWV0aG9kKGxvbmcgcmVwcykgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUmV0dXJucyBhIHJhbmRvbSBudW1iZXIgb2YgcmVwcyBiYXNlZCBvbiBhIG5vcm1hbCBkaXN0cmlidXRpb24gYXJvdW5kIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mCisgICAqIHJlcHMgZm9yIHRoZSB0aW1pbmcgaW50ZXJ2YWwuIFRoZSBkaXN0cmlidXRpb24gdXNlZCBoYXMgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2Ygb25lIGZpZnRoIG9mCisgICAqIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIHJlcHMuCisgICAqLworICBAVmlzaWJsZUZvclRlc3Rpbmcgc3RhdGljIGxvbmcgY2FsY3VsYXRlVGFyZ2V0UmVwcyhsb25nIHJlcHMsIGxvbmcgbmFub3MsIGxvbmcgdGFyZ2V0TmFub3MsCisgICAgICBkb3VibGUgZ2F1c3NpYW4pIHsKKyAgICBkb3VibGUgdGFyZ2V0UmVwcyA9ICgoKGRvdWJsZSkgcmVwcykgLyBuYW5vcykgKiB0YXJnZXROYW5vczsKKyAgICByZXR1cm4gTWF0aC5tYXgoMUwsIE1hdGgucm91bmQoKGdhdXNzaWFuICogKHRhcmdldFJlcHMgLyA1KSkgKyB0YXJnZXRSZXBzKSk7CisgIH0KKworICAvKioKKyAgICogQSB7QGxpbmsgV29ya2VyfSBmb3IgbWljcm8gYmVuY2htYXJrcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWljcm8gZXh0ZW5kcyBSdW50aW1lV29ya2VyIHsKKyAgICBASW5qZWN0IE1pY3JvKEBCZW5jaG1hcmsgT2JqZWN0IGJlbmNobWFyaywgCisgICAgICAgIEBCZW5jaG1hcmtNZXRob2QgTWV0aG9kIG1ldGhvZCwgUmFuZG9tIHJhbmRvbSwgVGlja2VyIHRpY2tlciwKKyAgICAgICAgQFdvcmtlck9wdGlvbnMgTWFwPFN0cmluZywgU3RyaW5nPiB3b3JrZXJPcHRpb25zKSB7CisgICAgICBzdXBlcihiZW5jaG1hcmssIG1ldGhvZCwgcmFuZG9tLCB0aWNrZXIsIHdvcmtlck9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZSBsb25nIGludm9rZVRpbWVNZXRob2QobG9uZyByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGludCBpbnRSZXBzID0gKGludCkgcmVwczsKKyAgICAgIGlmIChyZXBzICE9IGludFJlcHMpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24oIiVzLiVzIHRha2VzIGFuIGludCBmb3IgcmVwcywgIgorICAgICAgICAgICAgKyAiYnV0IHJlcXVpcmVzIGEgZ3JlYXRlciBudW1iZXIgdG8gZmlsbCB0aGUgZ2l2ZW4gdGltaW5nIGludGVydmFsICglcykuICIKKyAgICAgICAgICAgICsgIklmIHRoaXMgaXMgZXhwZWN0ZWQgKHRoZSBiZW5jaG1hcmtlZCBjb2RlIGlzIHZlcnkgZmFzdCksIHVzZSBhIGxvbmcgcGFyYW1ldGVyLiIKKyAgICAgICAgICAgICsgIk90aGVyd2lzZSwgY2hlY2sgeW91ciBiZW5jaG1hcmsgZm9yIGVycm9ycy4iLAorICAgICAgICAgICAgICAgIGJlbmNobWFyay5nZXRDbGFzcygpLCBiZW5jaG1hcmtNZXRob2QuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBTaG9ydER1cmF0aW9uLm9mKG9wdGlvbnMudGltaW5nSW50ZXJ2YWxOYW5vcywgTkFOT1NFQ09ORFMpKTsKKyAgICAgIH0KKyAgICAgIGxvbmcgYmVmb3JlID0gdGlja2VyLnJlYWQoKTsKKyAgICAgIGJlbmNobWFya01ldGhvZC5pbnZva2UoYmVuY2htYXJrLCBpbnRSZXBzKTsKKyAgICAgIHJldHVybiB0aWNrZXIucmVhZCgpIC0gYmVmb3JlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBIHtAbGluayBXb3JrZXJ9IGZvciBwaWNvIGJlbmNobWFya3MuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBpY28gZXh0ZW5kcyBSdW50aW1lV29ya2VyIHsKKyAgICBASW5qZWN0IFBpY28oQEJlbmNobWFyayBPYmplY3QgYmVuY2htYXJrLCAKKyAgICAgICAgQEJlbmNobWFya01ldGhvZCBNZXRob2QgbWV0aG9kLCBSYW5kb20gcmFuZG9tLCBUaWNrZXIgdGlja2VyLAorICAgICAgICBAV29ya2VyT3B0aW9ucyBNYXA8U3RyaW5nLCBTdHJpbmc+IHdvcmtlck9wdGlvbnMpIHsKKyAgICAgIHN1cGVyKGJlbmNobWFyaywgbWV0aG9kLCByYW5kb20sIHRpY2tlciwgd29ya2VyT3B0aW9ucyk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZSBsb25nIGludm9rZVRpbWVNZXRob2QobG9uZyByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGxvbmcgYmVmb3JlID0gdGlja2VyLnJlYWQoKTsKKyAgICAgIGJlbmNobWFya01ldGhvZC5pbnZva2UoYmVuY2htYXJrLCByZXBzKTsKKyAgICAgIHJldHVybiB0aWNrZXIucmVhZCgpIC0gYmVmb3JlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE9wdGlvbnMgeworICAgIGxvbmcgdGltaW5nSW50ZXJ2YWxOYW5vczsKKyAgICBib29sZWFuIGdjQmVmb3JlRWFjaDsKKworICAgIE9wdGlvbnMoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25NYXApIHsKKyAgICAgIHRoaXMudGltaW5nSW50ZXJ2YWxOYW5vcyA9IExvbmcucGFyc2VMb25nKG9wdGlvbk1hcC5nZXQoInRpbWluZ0ludGVydmFsTmFub3MiKSk7CisgICAgICB0aGlzLmdjQmVmb3JlRWFjaCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKG9wdGlvbk1hcC5nZXQoImdjQmVmb3JlRWFjaCIpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL1dvcmtlci5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmNWMwOAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL1dvcmtlci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkFmdGVyRXhwZXJpbWVudE1ldGhvZHM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5SdW5uaW5nLkJlZm9yZUV4cGVyaW1lbnRNZXRob2RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBBIHtAbGluayBXb3JrZXJ9IGNvbGxlY3RzIG1lYXN1cmVtZW50cyBvbiBiZWhhbGYgb2YgYSBwYXJ0aWN1bGFyIEluc3RydW1lbnQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrZXIgeworICBASW5qZWN0CisgIEBCZWZvcmVFeHBlcmltZW50TWV0aG9kcworICBJbW11dGFibGVTZXQ8TWV0aG9kPiBiZWZvcmVFeHBlcmltZW50TWV0aG9kczsKKyAgCisgIEBJbmplY3QKKyAgQEFmdGVyRXhwZXJpbWVudE1ldGhvZHMKKyAgSW1tdXRhYmxlU2V0PE1ldGhvZD4gYWZ0ZXJFeHBlcmltZW50TWV0aG9kczsKKyAgCisgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgYmVuY2htYXJrTWV0aG9kOworICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGJlbmNobWFyazsKKyAgCisgIHByb3RlY3RlZCBXb3JrZXIoT2JqZWN0IGJlbmNobWFyaywgTWV0aG9kIG1ldGhvZCkgeworICAgIHRoaXMuYmVuY2htYXJrID0gYmVuY2htYXJrOworICAgIHRoaXMuYmVuY2htYXJrTWV0aG9kID0gbWV0aG9kOworICB9CisKKyAgLyoqIEluaXRpYWxpemVzIHRoZSBiZW5jaG1hcmsgb2JqZWN0LiAqLworICBmaW5hbCB2b2lkIHNldFVwQmVuY2htYXJrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChNZXRob2QgbWV0aG9kIDogYmVmb3JlRXhwZXJpbWVudE1ldGhvZHMpIHsKKyAgICAgIG1ldGhvZC5pbnZva2UoYmVuY2htYXJrKTsKKyAgICB9CisgIH0KKworICAvKiogQ2FsbGVkIG9uY2UgYmVmb3JlIGFsbCBtZWFzdXJlbWVudHMgYnV0IGFmdGVyIGJlbmNobWFyayBzZXR1cC4gKi8KKyAgcHVibGljIHZvaWQgYm9vdHN0cmFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7fQorCisgIC8qKgorICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHtAbGluayAjbWVhc3VyZSgpfS4KKyAgICoKKyAgICogQHBhcmFtIGluV2FybXVwIHdoZXRoZXIgd2UgYXJlIGluIHdhcm11cCwgb3IgdGFraW5nIHJlYWwgbWVhc3VyZW1lbnRzLiBVc2VkIGJ5CisgICAqICAgICAgICAgICAgICAgICBzb21lIGltcGxlbWVudGF0aW9ucyB0byBza2lwIGZvcmNpbmcgR0MgdG8gbWFrZSB3YXJtdXAgZmFzdGVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgcHJlTWVhc3VyZShib29sZWFuIGluV2FybXVwKSB0aHJvd3MgRXhjZXB0aW9uIHt9CisKKyAgLyoqIENhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB7QGxpbmsgI21lYXN1cmUoKX0uICovCisgIHB1YmxpYyB2b2lkIHBvc3RNZWFzdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7fQorCisgIC8qKiBUZW1wbGF0ZSBtZXRob2QgZm9yIHdvcmtlcnMgdGhhdCBwcm9kdWNlIG11bHRpcGxlIG1lYXN1cmVtZW50cy4gKi8KKyAgcHVibGljIGFic3RyYWN0IEl0ZXJhYmxlPE1lYXN1cmVtZW50PiBtZWFzdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAvKiogVGVhcnMgZG93biB0aGUgYmVuY2htYXJrIG9iamVjdC4gKi8KKyAgZmluYWwgdm9pZCB0ZWFyRG93bkJlbmNobWFyaygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGFmdGVyRXhwZXJpbWVudE1ldGhvZHMpIHsKKyAgICAgIG1ldGhvZC5pbnZva2UoYmVuY2htYXJrKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL1dvcmtlckNvbXBvbmVudC5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiMTFkYQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL1dvcmtlckNvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuQnJpZGdlTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuQmVuY2htYXJrQ2xhc3NNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5FeHBlcmltZW50TW9kdWxlOworaW1wb3J0IGRhZ2dlci5Db21wb25lbnQ7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBDcmVhdGVzIHtAbGluayBXb3JrZXJ9IGZvciBhbiB7QGxpbmsgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5FeHBlcmltZW50fS4KKyAqLworQFNpbmdsZXRvbgorQENvbXBvbmVudChtb2R1bGVzID0geworICAgIEJlbmNobWFya0NsYXNzTW9kdWxlLmNsYXNzLAorICAgIEJyaWRnZU1vZHVsZS5jbGFzcywKKyAgICBFeHBlcmltZW50TW9kdWxlLmNsYXNzLAorICAgIFdvcmtlck1vZHVsZS5jbGFzcworfSkKK2ludGVyZmFjZSBXb3JrZXJDb21wb25lbnQgeworICBXb3JrZXIgZ2V0V29ya2VyKCk7Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9Xb3JrZXJFdmVudExvZy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyRXZlbnRMb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjkwM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyRXZlbnRMb2cuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLkZhaWx1cmVMb2dNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuT3BlbmVkU29ja2V0OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuU2hvdWxkQ29udGludWVNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuU3RhcnRNZWFzdXJlbWVudExvZ01lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5TdGFydHVwQW5ub3VuY2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuU3RvcE1lYXN1cmVtZW50TG9nTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLlZtUHJvcGVydGllc0xvZ01lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLk1lYXN1cmVtZW50OworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworLyoqIFRoZSB3b3JrZXIncyBpbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgcnVubmVyLiAqLworZmluYWwgY2xhc3MgV29ya2VyRXZlbnRMb2cgaW1wbGVtZW50cyBDbG9zZWFibGUgeworICBwcml2YXRlIGZpbmFsIE9wZW5lZFNvY2tldC5Xcml0ZXIgd3JpdGVyOworICBwcml2YXRlIGZpbmFsIE9wZW5lZFNvY2tldC5SZWFkZXIgcmVhZGVyOworCisgIFdvcmtlckV2ZW50TG9nKE9wZW5lZFNvY2tldCBzb2NrZXQpIHsKKyAgICB0aGlzLndyaXRlciA9IHNvY2tldC53cml0ZXIoKTsKKyAgICB0aGlzLnJlYWRlciA9IHNvY2tldC5yZWFkZXIoKTsKKyAgfQorCisgIHZvaWQgbm90aWZ5V29ya2VyU3RhcnRlZChVVUlEIHRyaWFsSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVyLndyaXRlKG5ldyBTdGFydHVwQW5ub3VuY2VNZXNzYWdlKHRyaWFsSWQpKTsKKyAgICB3cml0ZXIud3JpdGUobmV3IFZtUHJvcGVydGllc0xvZ01lc3NhZ2UoKSk7CisgICAgd3JpdGVyLmZsdXNoKCk7CisgIH0KKworICB2b2lkIG5vdGlmeUJvb3RzdHJhcFBoYXNlU3RhcnRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlci53cml0ZSgiQm9vdHN0cmFwIHBoYXNlIHN0YXJ0aW5nLiIpOworICAgIHdyaXRlci5mbHVzaCgpOworICB9CisKKyAgdm9pZCBub3RpZnlNZWFzdXJlbWVudFBoYXNlU3RhcnRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlci53cml0ZSgiTWVhc3VyZW1lbnQgcGhhc2Ugc3RhcnRpbmcgKGluY2x1ZGVzIHdhcm11cCBhbmQgYWN0dWFsIG1lYXN1cmVtZW50KS4iKTsKKyAgICB3cml0ZXIuZmx1c2goKTsKKyAgfQorCisgIHZvaWQgbm90aWZ5TWVhc3VyZW1lbnRTdGFydGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVyLndyaXRlKCJBYm91dCB0byBtZWFzdXJlLiIpOworICAgIHdyaXRlci53cml0ZShuZXcgU3RhcnRNZWFzdXJlbWVudExvZ01lc3NhZ2UoKSk7CisgICAgd3JpdGVyLmZsdXNoKCk7CisgIH0KKworICAvKioKKyAgICogUmVwb3J0IHRoZSBtZWFzdXJlbWVudHMgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGFjaydkIGJ5IHRoZSBydW5uZXIuIFJldHVybnMgYSBtZXNzYWdlIHJlY2VpdmVkCisgICAqIGZyb20gdGhlIHJ1bm5lciwgd2hpY2ggbGV0cyB1cyBrbm93IHdoZXRoZXIgdG8gY29udGludWUgbWVhc3VyaW5nIGFuZCB3aGV0aGVyIHdlJ3JlIGluIHRoZQorICAgKiB3YXJtdXAgb3IgbWVhc3VyZW1lbnQgcGhhc2UuCisgICAqLworICBTaG91bGRDb250aW51ZU1lc3NhZ2Ugbm90aWZ5TWVhc3VyZW1lbnRFbmRpbmcoSXRlcmFibGU8TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50cykgdGhyb3dzCisgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVyLndyaXRlKG5ldyBTdG9wTWVhc3VyZW1lbnRMb2dNZXNzYWdlKG1lYXN1cmVtZW50cykpOworICAgIHdyaXRlci5mbHVzaCgpOworICAgIHJldHVybiAoU2hvdWxkQ29udGludWVNZXNzYWdlKSByZWFkZXIucmVhZCgpOworICB9CisKKyAgdm9pZCBub3RpZnlGYWlsdXJlKEV4Y2VwdGlvbiBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlci53cml0ZShuZXcgRmFpbHVyZUxvZ01lc3NhZ2UoZSkpOworICAgIHdyaXRlci5mbHVzaCgpOworICB9CisKKyAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyTWFpbi5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWM2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9Xb3JrZXJNYWluLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5Db21tYW5kTGluZVNlcmlhbGl6ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5PcGVuZWRTb2NrZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5TaG91bGRDb250aW51ZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5Xb3JrZXJTcGVjOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuRXhwZXJpbWVudE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSW5ldEFkZHJlc3NlczsKKworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBpbnZva2VkIGFzIGEgc3VicHJvY2VzcyBieSB0aGUgQ2FsaXBlciBydW5uZXIgcGFyZW50IHByb2Nlc3M7IGl0IHJlLXN0YWdlcworICogdGhlIGJlbmNobWFyayBhbmQgaGFuZHMgaXQgb2ZmIHRvIHRoZSBpbnN0cnVtZW50J3Mgd29ya2VyLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV29ya2VyTWFpbiB7CisgIHByaXZhdGUgV29ya2VyTWFpbigpIHt9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVE9ETyhsdWtlcyk6IGluc3RlYWQgb2YgcGFyc2luZyB0aGUgc3BlYyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgcGFzcyB0aGUgcG9ydCBudW1iZXIgb24gdGhlCisgICAgLy8gY29tbWFuZCBsaW5lIGFuZCB0aGVuIHJlY2VpdmUgdGhlIHNwZWMgZnJvbSB0aGUgc29ja2V0LiAgVGhpcyB3YXkgd2UgY2FuIHN0YXJ0IEpWTXMgcHJpb3IKKyAgICAvLyB0byBzdGFydGluZyBleHBlcmltZW50cyBhbmQgdGh1cyBnZXQgYmV0dGVyIGV4cGVyaW1lbnQgbGF0ZW5jeS4KKyAgICBXb3JrZXJTcGVjIHJlcXVlc3QgPSBDb21tYW5kTGluZVNlcmlhbGl6ZXIucGFyc2UoYXJnc1swXSk7CisgICAgLy8gbm9uYmxvY2tpbmcgY29ubmVjdCBzbyB3ZSBjYW4gaW50ZXJsZWF2ZSB0aGUgc3lzdGVtIGNhbGwgd2l0aCBpbmplY3RvciBjcmVhdGlvbi4KKyAgICBTb2NrZXRDaGFubmVsIGNoYW5uZWwgPSBTb2NrZXRDaGFubmVsLm9wZW4oKTsKKyAgICBjaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICBjaGFubmVsLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzZXMuZm9yU3RyaW5nKCIxMjcuMC4wLjEiKSwgcmVxdWVzdC5wb3J0KSk7CisKKyAgICBXb3JrZXJDb21wb25lbnQgd29ya2VyQ29tcG9uZW50ID0gRGFnZ2VyV29ya2VyQ29tcG9uZW50LmJ1aWxkZXIoKQorICAgICAgICAuZXhwZXJpbWVudE1vZHVsZShFeHBlcmltZW50TW9kdWxlLmZvcldvcmtlclNwZWMocmVxdWVzdCkpCisgICAgICAgIC53b3JrZXJNb2R1bGUobmV3IFdvcmtlck1vZHVsZShyZXF1ZXN0KSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgV29ya2VyIHdvcmtlciA9IHdvcmtlckNvbXBvbmVudC5nZXRXb3JrZXIoKTsKKyAgICBXb3JrZXJFdmVudExvZyBsb2cgPSBuZXcgV29ya2VyRXZlbnRMb2coT3BlbmVkU29ja2V0LmZyb21Tb2NrZXQoY2hhbm5lbCkpOworCisgICAgbG9nLm5vdGlmeVdvcmtlclN0YXJ0ZWQocmVxdWVzdC50cmlhbElkKTsKKyAgICB0cnkgeworICAgICAgd29ya2VyLnNldFVwQmVuY2htYXJrKCk7CisgICAgICBsb2cubm90aWZ5Qm9vdHN0cmFwUGhhc2VTdGFydGluZygpOworICAgICAgd29ya2VyLmJvb3RzdHJhcCgpOworICAgICAgbG9nLm5vdGlmeU1lYXN1cmVtZW50UGhhc2VTdGFydGluZygpOworICAgICAgYm9vbGVhbiBrZWVwTWVhc3VyaW5nID0gdHJ1ZTsKKyAgICAgIGJvb2xlYW4gaXNJbldhcm11cCA9IHRydWU7CisgICAgICB3aGlsZSAoa2VlcE1lYXN1cmluZykgeworICAgICAgICB3b3JrZXIucHJlTWVhc3VyZShpc0luV2FybXVwKTsKKyAgICAgICAgbG9nLm5vdGlmeU1lYXN1cmVtZW50U3RhcnRpbmcoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTaG91bGRDb250aW51ZU1lc3NhZ2UgbWVzc2FnZSA9IGxvZy5ub3RpZnlNZWFzdXJlbWVudEVuZGluZyh3b3JrZXIubWVhc3VyZSgpKTsKKyAgICAgICAgICBrZWVwTWVhc3VyaW5nID0gbWVzc2FnZS5zaG91bGRDb250aW51ZSgpOworICAgICAgICAgIGlzSW5XYXJtdXAgPSAhbWVzc2FnZS5pc1dhcm11cENvbXBsZXRlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgd29ya2VyLnBvc3RNZWFzdXJlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nLm5vdGlmeUZhaWx1cmUoZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsgLy8gPworICAgICAgd29ya2VyLnRlYXJEb3duQmVuY2htYXJrKCk7CisgICAgICBsb2cuY2xvc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL1dvcmtlck1vZHVsZS5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3ZTIwMQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvd29ya2VyL1dvcmtlck1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5Xb3JrZXJTcGVjOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVubmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5JbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGlja2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGRhZ2dlci5NYXBLZXk7CitpbXBvcnQgZGFnZ2VyLk1vZHVsZTsKK2ltcG9ydCBkYWdnZXIuUHJvdmlkZXM7CitpbXBvcnQgZGFnZ2VyLlByb3ZpZGVzLlR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKKy8qKgorICogQmluZHMgY2xhc3NlcyBuZWNlc3NhcnkgZm9yIHRoZSB3b3JrZXIuIEFsc28gbWFuYWdlcyB0aGUgaW5qZWN0aW9uIG9mIHtAbGluayBQYXJhbSBwYXJhbWV0ZXJzfQorICogZnJvbSB0aGUge0BsaW5rIFdvcmtlclNwZWN9IGludG8gdGhlIGJlbmNobWFyay4KKyAqCisgKiA8cD5UT0RPKGdhayk6IEVuc3VyZSB0aGF0IGVhY2ggd29ya2VyIG9ubHkgaGFzIGJpbmRpbmdzIGZvciB0aGUgb2JqZWN0cyBpdCBuZWVkcyBhbmQgbm90IHRoZQorICogb2JqZWN0cyByZXF1aXJlZCBieSBkaWZmZXJlbnQgd29ya2Vycy4gKGkuZS4gZG9uJ3QgYmluZCBhIFRpY2tlciBpZiB0aGUgd29ya2VyIGlzIGFuIGFsbG9jYXRpb24KKyAqIHdvcmtlcikuCisgKi8KK0BNb2R1bGUKK2ZpbmFsIGNsYXNzIFdvcmtlck1vZHVsZSB7CisgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdvcmtlcj4gd29ya2VyQ2xhc3M7CisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlTWFwPFN0cmluZywgU3RyaW5nPiB3b3JrZXJPcHRpb25zOworCisgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gYmVuY2htYXJrQ2xhc3NPYmplY3Q7CisKKyAgV29ya2VyTW9kdWxlKFdvcmtlclNwZWMgd29ya2VyU3BlYykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRoaXMud29ya2VyQ2xhc3MgPSB3b3JrZXJTcGVjLndvcmtlckNsYXNzLmFzU3ViY2xhc3MoV29ya2VyLmNsYXNzKTsKKyAgICB0aGlzLndvcmtlck9wdGlvbnMgPSB3b3JrZXJTcGVjLndvcmtlck9wdGlvbnM7CisKKyAgICBiZW5jaG1hcmtDbGFzc09iamVjdCA9IFV0aWwubG9hZENsYXNzKHdvcmtlclNwZWMuYmVuY2htYXJrU3BlYy5jbGFzc05hbWUoKSk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgQFJ1bm5pbmcuQmVuY2htYXJrQ2xhc3MKKyAgQ2xhc3M8Pz4gcHJvdmlkZUJlbmNobWFya0NsYXNzT2JqZWN0KCkgeworICAgIHJldHVybiBiZW5jaG1hcmtDbGFzc09iamVjdDsKKyAgfQorCisgIEBQcm92aWRlcworICBXb3JrZXIgcHJvdmlkZVdvcmtlcihNYXA8Q2xhc3M8PyBleHRlbmRzIFdvcmtlcj4sIFByb3ZpZGVyPFdvcmtlcj4+IGF2YWlsYWJsZVdvcmtlcnMpIHsKKyAgICBQcm92aWRlcjxXb3JrZXI+IHdvcmtlclByb3ZpZGVyID0gYXZhaWxhYmxlV29ya2Vycy5nZXQod29ya2VyQ2xhc3MpOworICAgIGlmICh3b3JrZXJQcm92aWRlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbW1hbmRFeGNlcHRpb24oIiVzIGlzIG5vdCBhIHN1cHBvcnRlZCB3b3JrZXIgKCVzKS4iLAorICAgICAgICAgIHdvcmtlckNsYXNzLCBhdmFpbGFibGVXb3JrZXJzKTsKKyAgICB9CisgICAgcmV0dXJuIHdvcmtlclByb3ZpZGVyLmdldCgpOworICB9CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGUge0BsaW5rIENsYXNzfSBvYmplY3QgdG8gdXNlIGFzIGEga2V5IGluIHRoZSBtYXAgb2YgYXZhaWxhYmxlCisgICAqIHtAbGluayBXb3JrZXIgd29ya2Vyc30gcGFzc2VkIHRvIHtAbGluayAjcHJvdmlkZVdvcmtlcihNYXApfS4KKyAgICovCisgIEBNYXBLZXkodW53cmFwVmFsdWUgPSB0cnVlKQorICBwdWJsaWMgQGludGVyZmFjZSBXb3JrZXJDbGFzc0tleSB7CisgICAgQ2xhc3M8PyBleHRlbmRzIFdvcmtlcj4gdmFsdWUoKTsKKyAgfQorCisgIEBQcm92aWRlcyh0eXBlID0gVHlwZS5NQVApCisgIEBXb3JrZXJDbGFzc0tleShBcmJpdHJhcnlNZWFzdXJlbWVudFdvcmtlci5jbGFzcykKKyAgc3RhdGljIFdvcmtlciBwcm92aWRlQXJiaXRyYXJ5TWVhc3VyZW1lbnRXb3JrZXIoQXJiaXRyYXJ5TWVhc3VyZW1lbnRXb3JrZXIgaW1wbCkgeworICAgIHJldHVybiBpbXBsOworICB9CisKKyAgQFByb3ZpZGVzKHR5cGUgPSBUeXBlLk1BUCkKKyAgQFdvcmtlckNsYXNzS2V5KE1pY3JvYmVuY2htYXJrQWxsb2NhdGlvbldvcmtlci5jbGFzcykKKyAgc3RhdGljIFdvcmtlciBwcm92aWRlTWljcm9iZW5jaG1hcmtBbGxvY2F0aW9uV29ya2VyKE1pY3JvYmVuY2htYXJrQWxsb2NhdGlvbldvcmtlciBpbXBsKSB7CisgICAgcmV0dXJuIGltcGw7CisgIH0KKworICBAUHJvdmlkZXModHlwZSA9IFR5cGUuTUFQKQorICBAV29ya2VyQ2xhc3NLZXkoTWFjcm9iZW5jaG1hcmtXb3JrZXIuY2xhc3MpCisgIHN0YXRpYyBXb3JrZXIgcHJvdmlkZU1hY3JvYmVuY2htYXJrV29ya2VyKE1hY3JvYmVuY2htYXJrV29ya2VyIGltcGwpIHsKKyAgICByZXR1cm4gaW1wbDsKKyAgfQorCisgIEBQcm92aWRlcyh0eXBlID0gVHlwZS5NQVApCisgIEBXb3JrZXJDbGFzc0tleShNYWNyb2JlbmNobWFya0FsbG9jYXRpb25Xb3JrZXIuY2xhc3MpCisgIHN0YXRpYyBXb3JrZXIgcHJvdmlkZU1hY3JvYmVuY2htYXJrQWxsb2NhdGlvbldvcmtlcihNYWNyb2JlbmNobWFya0FsbG9jYXRpb25Xb3JrZXIgaW1wbCkgeworICAgIHJldHVybiBpbXBsOworICB9CisKKyAgQFByb3ZpZGVzKHR5cGUgPSBUeXBlLk1BUCkKKyAgQFdvcmtlckNsYXNzS2V5KFJ1bnRpbWVXb3JrZXIuTWljcm8uY2xhc3MpCisgIHN0YXRpYyBXb3JrZXIgcHJvdmlkZVJ1bnRpbWVXb3JrZXJNaWNybyhSdW50aW1lV29ya2VyLk1pY3JvIGltcGwpIHsKKyAgICByZXR1cm4gaW1wbDsKKyAgfQorCisgIEBQcm92aWRlcyh0eXBlID0gVHlwZS5NQVApCisgIEBXb3JrZXJDbGFzc0tleShSdW50aW1lV29ya2VyLlBpY28uY2xhc3MpCisgIHN0YXRpYyBXb3JrZXIgcHJvdmlkZVJ1bnRpbWVXb3JrZXJQaWNvKFJ1bnRpbWVXb3JrZXIuUGljbyBpbXBsKSB7CisgICAgcmV0dXJuIGltcGw7CisgIH0KKworICBAUHJvdmlkZXMKKyAgc3RhdGljIFRpY2tlciBwcm92aWRlVGlja2VyKCkgeworICAgIHJldHVybiBUaWNrZXIuc3lzdGVtVGlja2VyKCk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgQWxsb2NhdGlvblJlY29yZGVyIHByb3ZpZGVBbGxvY2F0aW9uUmVjb3JkZXIoCisgICAgICBQcm92aWRlcjxBbGxBbGxvY2F0aW9uc1JlY29yZGVyPiBhbGxBbGxvY2F0aW9uc1JlY29yZGVyUHJvdmlkZXIsCisgICAgICBQcm92aWRlcjxBZ2dyZWdhdGVBbGxvY2F0aW9uc1JlY29yZGVyPiBhZ2dyZWdhdGVBbGxvY2F0aW9uc1JlY29yZGVyUHJvdmlkZXIpIHsKKworICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2Yod29ya2VyT3B0aW9ucy5nZXQoInRyYWNrQWxsb2NhdGlvbnMiKSkKKyAgICAgICAgPyBhbGxBbGxvY2F0aW9uc1JlY29yZGVyUHJvdmlkZXIuZ2V0KCkKKyAgICAgICAgOiBhZ2dyZWdhdGVBbGxvY2F0aW9uc1JlY29yZGVyUHJvdmlkZXIuZ2V0KCk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgc3RhdGljIFJhbmRvbSBwcm92aWRlUmFuZG9tKCkgeworICAgIHJldHVybiBuZXcgUmFuZG9tKCk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgQFdvcmtlck9wdGlvbnMKKyAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm92aWRlV29ya2VyT3B0aW9ucygpIHsKKyAgICByZXR1cm4gd29ya2VyT3B0aW9uczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyT3B0aW9ucy5qYXZhIGIvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvV29ya2VyT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTNiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9Xb3JrZXJPcHRpb25zLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoe0ZJRUxELCBQQVJBTUVURVIsIE1FVEhPRH0pCitAUXVhbGlmaWVyCitAaW50ZXJmYWNlIFdvcmtlck9wdGlvbnMge30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvZGVmYXVsdC1jb25maWcucHJvcGVydGllcyBiL2NhbGlwZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvZGVmYXVsdC1jb25maWcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTViM2VlCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9kZWZhdWx0LWNvbmZpZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKyMgQ2FsaXBlciBjb25maWcgZmlsZQorIyBSdW4gd2l0aCAtLXByaW50LWNvbmZpZyB0byBzZWUgYWxsIG9mIHRoZSBvcHRpb25zIGJlaW5nIGFwcGxpZWQKKworIyBJTlNUUlVNRU5UIENPTkZJRworIyBpbnN0cnVtZW50Lm1pY3JvLm9wdGlvbnMud2FybXVwPTEwcworIyBpbnN0cnVtZW50Lm1pY3JvLm9wdGlvbnMudGltaW5nSW50ZXJ2YWw9NTAwbXMKKyMgaW5zdHJ1bWVudC5taWNyby5vcHRpb25zLnJlcG9ydGVkSW50ZXJ2YWxzPTcKKyMgaW5zdHJ1bWVudC5taWNyby5vcHRpb25zLm1heFJ1bnRpbWU9MTBzCisKKyMgVk0gQ09ORklHCit2bS5hcmdzPS1YbXgzZyAtWG1zM2cKKworIyBTZWUgdGhlIENhbGlwZXIgd2ViYXBwIHRvIGdldCBhIGtleSBzbyB5b3UgY2FuIGFzc29jaWF0ZSByZXN1bHRzIHdpdGggeW91ciBhY2NvdW50CityZXN1bHRzLnVwbG9hZC5vcHRpb25zLmtleT0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvZ2xvYmFsLWNvbmZpZy5wcm9wZXJ0aWVzIGIvY2FsaXBlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9nbG9iYWwtY29uZmlnLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3NDFmMAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvZ2xvYmFsLWNvbmZpZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOTAgQEAKKyMgQ2FsaXBlciBnbG9iYWwgY29uZmlnIGZpbGUKKyMgVXNlcnMnIH4vLmNhbGlwZXIvY29uZmlnIHNldHRpbmdzIG1heSBvdmVycmlkZSB0aGVzZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFZNIENPTkZJR1VSQVRJT04KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgYXV0b21hdGljYWxseSBwcmVwZW5kZWQgdG8gbm9uLWFic29sdXRlIFZNIHBhdGhzCit2bS5iYXNlRGlyZWN0b3J5PS91c3IvbG9jYWwvYnVpbGR0b29scy9qYXZhCisKKyMgU3RhbmRhcmQgdm0gcGFyYW1ldGVyIG9wdGlvbnMuCit2bS5hcmdzPQorCisjIENvbW1vbiBjb25maWd1cmF0aW9ucworCit2bS5qZGstMzItY2xpZW50LmhvbWU9amRrLTMyCit2bS5qZGstMzItY2xpZW50LmFyZ3M9LWQzMiAtY2xpZW50CisKK3ZtLmpkay0zMi1zZXJ2ZXIuaG9tZT1qZGstMzIKK3ZtLmpkay0zMi1zZXJ2ZXIuYXJncz0tZDMyIC1zZXJ2ZXIKKwordm0uamRrLTY0LWNvbXByZXNzZWQuaG9tZT1qZGstNjQKK3ZtLmpkay02NC1jb21wcmVzc2VkLmFyZ3M9LWQ2NCAtWFg6K1VzZUNvbXByZXNzZWRPb3BzCisKK3ZtLmpkay02NC11bmNvbXByZXNzZWQuaG9tZT1qZGstNjQKK3ZtLmpkay02NC11bmNvbXByZXNzZWQuYXJncz0tZDY0IC1YWDotVXNlQ29tcHJlc3NlZE9vcHMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIElOU1RSVU1FTlQgQ09ORklHCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVG8gZGVmaW5lIG5ldyBpbnN0cnVtZW50IGNvbmZpZ3VyYXRpb25zLCBwcm92aWRlIGFuICJpbnN0cnVtZW50LjxuYW1lPi5jbGFzcyIgcHJvcGVydHkKKyMgcG9pbnRpbmcgdG8gYSBjb25jcmV0ZSBjbGFzcyB0aGF0IGV4dGVuZHMgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5JbnN0cnVtZW50LCBhbmQgYWRkCisjIHdoaWNoZXZlciBvdGhlciBvcHRpb25zIGl0IHN1cHBvcnRzIHVzaW5nICJpbnN0cnVtZW50LjxuYW1lPi48b3B0aW9uTmFtZT49PHZhbHVlPiIuCisKKyMgSW5zdHJ1bWVudCAicnVudGltZSIKK2luc3RydW1lbnQucnVudGltZS5jbGFzcz1jb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLlJ1bnRpbWVJbnN0cnVtZW50CisKKyMgRG8gbm90IHJlcG9ydCBhbnkgbWVhc3VyZW1lbnRzIGZyb20gYmVmb3JlIHRoaXMgbWluaW11bSB0aW1lIGhhcyBlbGFwc2VkCitpbnN0cnVtZW50LnJ1bnRpbWUub3B0aW9ucy53YXJtdXA9MTBzCisjIEludGVycnVwdCB3YXJtdXAgd2hlbiBpdCBoYXMgYmVlbiBydW5uaW5nIGZvciB0aGlzIG11Y2ggd2FsbC1jbG9jayB0aW1lLAorIyBldmVuIGlmIHRoZSBtZWFzdXJlZCB3YXJtdXAgdGltZSAoYWJvdmUpIGhhc24ndCBiZWVuIHJlYWNoZWQuIFRoaXMgcHJldmVudHMgZmFzdCBiZW5jaG1hcmtzCisjIHdpdGggaGlnaCBwZXItbWVhc3VyZW1lbnQgb3ZlcmhlYWQgKGUuZy4gbG9uZyBAQmVmb3JlUmVwIGFuZCBAQWZ0ZXJSZXAgbWV0aG9kcykKKyMgZnJvbSB0YWtpbmcgdG9vIGxvbmcgdG8gd2FybSB1cC4KK2luc3RydW1lbnQucnVudGltZS5vcHRpb25zLm1heFdhcm11cFdhbGxUaW1lPTEwbQorCisjIENhbGlwZXIgY2hvb3NlcyByZXAgY291bnRzIHN1Y2ggdGhhdCB0aGUgdG90YWwgdGltaW5nIGludGVydmFsIGNvbWVzIG91dCBuZWFyIHRoaXMgdmFsdWUuCisjIEhpZ2hlciB2YWx1ZXMgdGFrZSBsb25nZXIsIGJ1dCBhcmUgbW9yZSBwcmVjaXNlIChsZXNzIHZ1bG5lcmFibGUgdG8gZml4ZWQgY29zdHMpCitpbnN0cnVtZW50LnJ1bnRpbWUub3B0aW9ucy50aW1pbmdJbnRlcnZhbD01MDBtcworCisjIENhbGlwZXIgdWx0aW1hdGVseSByZWNvcmRzIG9ubHkgdGhlIGZpbmFsIE4gbWVhc3VyZW1lbnRzLCB3aGVyZSBOIGlzIHRoaXMgdmFsdWUuCitpbnN0cnVtZW50LnJ1bnRpbWUub3B0aW9ucy5tZWFzdXJlbWVudHM9OQorCisjIFJ1biBHQyBiZWZvcmUgZXZlcnkgbWVhc3VyZW1lbnQ/CitpbnN0cnVtZW50LnJ1bnRpbWUub3B0aW9ucy5nY0JlZm9yZUVhY2g9dHJ1ZQorCisjIFdoZXRoZXIgb3Igbm90IHRvIG1ha2Ugc3VnZ2VzdGlvbnMgYWJvdXQgd2hldGhlciBhIGJlbmNobWFyayBzaG91bGQgYmUgYSBwaWNvL21pY3JvL21hY3JvCisjIGJlbmNobWFyay4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IGVmZmVjdCBlcnJvcnMgdGhhdCByZXN1bHQgZnJvbSBiZW5jaG1hcmtzIHRoYXQgYXJlIHVuYWJsZSB0bworIyB0YWtlIHByb3BlciBtZWFzdXJlbWVudHMgZHVlIHRvIGdyYW51bGFyaXR5IGlzc3Vlcy4KK2luc3RydW1lbnQucnVudGltZS5vcHRpb25zLnN1Z2dlc3RHcmFudWxhcml0eT10cnVlCisKKyMgSW5zdHJ1bWVudCAiYXJiaXRyYXJ5IgoraW5zdHJ1bWVudC5hcmJpdHJhcnkuY2xhc3M9Y29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5BcmJpdHJhcnlNZWFzdXJlbWVudEluc3RydW1lbnQKKworIyBSdW4gR0MgYmVmb3JlIGV2ZXJ5IG1lYXN1cmVtZW50PworaW5zdHJ1bWVudC5hcmJpdHJhcnkub3B0aW9ucy5nY0JlZm9yZUVhY2g9ZmFsc2UKKworIyBJbnN0cnVtZW50ICJhbGxvY2F0aW9uIgoraW5zdHJ1bWVudC5hbGxvY2F0aW9uLmNsYXNzPWNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuQWxsb2NhdGlvbkluc3RydW1lbnQKKworIyBUcmFjayBhbmQgbG9nIGEgc3VtbWFyeSBvZiBldmVyeSBpbmRpdmlkdWFsIGFsbG9jYXRpb24uICBUaGlzIGVuYWJsZXMgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvcgorIyBidWdneSBiZW5jaG1hcmtzIGFuZCBwcmludHMgZGV0YWlsZWQgcmVwb3J0cyBvZiBhbGxvY2F0aW9uIGJlaGF2aW9yIGluIHZlcmJvc2UgbW9kZS4gIE4uQi4gVGhpcworIyBjYW4gaW5jcmVhc2UgdGhlIG1lbW9yeSB1c2FnZSBvZiB0aGUgYWxsb2NhdGlvbiB3b3JrZXIgc2lnbmlmaWNhbnRseSwgc28gaXQgaXMgbm90IHJlY29tbWVuZGVkCisjIGZvciBiZW5jaG1hcmtzIHRoYXQgZG8gYSBsb3Qgb2YgYWxsb2NhdGlvbi4KK2luc3RydW1lbnQuYWxsb2NhdGlvbi5vcHRpb25zLnRyYWNrQWxsb2NhdGlvbnM9ZmFsc2UKKworCisjIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRyaWFscyB0aGF0IGNhbiBydW4gaW4gcGFyYWxsZWwuCitydW5uZXIubWF4UGFyYWxsZWxpc209MgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJFU1VMVFMgUFJPQ0VTU09SUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCityZXN1bHRzLmZpbGUuY2xhc3M9Y29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5PdXRwdXRGaWxlRHVtcGVyCisKK3Jlc3VsdHMudXBsb2FkLmNsYXNzPWNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuSHR0cFVwbG9hZGVyCisKK3Jlc3VsdHMudXBsb2FkLm9wdGlvbnMudXJsPWh0dHBzOi8vbWljcm9iZW5jaG1hcmtzLmFwcHNwb3QuY29tLwpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BbGxUZXN0cy5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTNkMWNjLi4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FsaXBlclRlc3QuY2xhc3MpOwotICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShKc29uVGVzdC5jbGFzcyk7Ci0gICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1lYXN1cmVtZW50U2V0VGVzdC5jbGFzcyk7Ci0gICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBhcmFtZXRlclRlc3QuY2xhc3MpOwotICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShXYXJtdXBPdmVyZmxvd1Rlc3QuY2xhc3MpOwotCi0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0NhbGlwZXJUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0NhbGlwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ODU3YmEuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9DYWxpcGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN1cHBsaWVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYWxpcGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAvKioKLSAgICogVGVzdCB3ZSBkZXRlY3QgYW5kIGZhaWwgd2hlbiBiZW5jaG1hcmtzIGRvbid0IHNjYWxlIHByb3Blcmx5LgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEJlbmNobWFya1NjYWxlc05vbkxpbmVhcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGltZU1lYXN1cmVyIHRpbWVNZWFzdXJlciA9IG5ldyBUaW1lTWVhc3VyZXIoMTAwMCwgMTAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHRpbWVNZWFzdXJlci5ydW4obmV3IE5vbkxpbmVhclRpbWVkUnVubmFibGUoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVXNlckV4Y2VwdGlvbi5Eb2VzTm90U2NhbGVMaW5lYXJseUV4Y2VwdGlvbiBlKSB7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uTGluZWFyVGltZWRSdW5uYWJsZSBleHRlbmRzIENvbmZpZ3VyZWRCZW5jaG1hcmsKLSAgICAgIGltcGxlbWVudHMgU3VwcGxpZXI8Q29uZmlndXJlZEJlbmNobWFyaz4gewotICAgIHByaXZhdGUgTm9uTGluZWFyVGltZWRSdW5uYWJsZSgpIHsKLSAgICAgIHN1cGVyKG5ldyBOb09wQmVuY2htYXJrKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwdWJsaWMgQ29uZmlndXJlZEJlbmNobWFyayBnZXQoKSB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIE9iamVjdCBydW4oaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgcmV0dXJuIG51bGw7IC8vIGJyb2tlbiEgZG9lc24ndCBsb29wIHJlcHMgdGltZXMuCi0gICAgfQotCi0gICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7fQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9PcEJlbmNobWFyayBpbXBsZW1lbnRzIEJlbmNobWFyayB7Ci0gICAgQE92ZXJyaWRlIHB1YmxpYyBTZXQ8U3RyaW5nPiBwYXJhbWV0ZXJOYW1lcygpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwdWJsaWMgU2V0PFN0cmluZz4gcGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIENvbmZpZ3VyZWRCZW5jaG1hcmsgY3JlYXRlQmVuY2htYXJrKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyVmFsdWVzKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldFRpbWVVbml0TmFtZXMoKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldEluc3RhbmNlVW5pdE5hbWVzKCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHB1YmxpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRNZW1vcnlVbml0TmFtZXMoKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZSBuYW5vc1RvVW5pdHMoZG91YmxlIG5hbm9zKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZSBpbnN0YW5jZXNUb1VuaXRzKGxvbmcgaW5zdGFuY2VzKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZSBieXRlc1RvVW5pdHMobG9uZyBieXRlcykgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0pzb25UZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL0pzb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZTAyYjAuLjAwMDAwMDAKLS0tIGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9Kc29uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSnNvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHVibGljIHZvaWQgdGVzdEpzb25TZXJpYWxpemF0aW9uKCkgewotICAgIFJlc3VsdCBvcmlnaW5hbCA9IG5ld1NhbXBsZVJlc3VsdCgpOwotICAgIFN0cmluZyBqc29uID0gSnNvbi5nZXRHc29uSW5zdGFuY2UoKS50b0pzb24ob3JpZ2luYWwsIFJlc3VsdC5jbGFzcyk7Ci0gICAgUmVzdWx0IHJlc2VyaWFsaXplZCA9IEpzb24uZ2V0R3Nvbkluc3RhbmNlKCkuZnJvbUpzb24oanNvbiwgUmVzdWx0LmNsYXNzKTsKLSAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwsIHJlc2VyaWFsaXplZCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsaXBlcidzIEpTT04gZmlsZXMgdXNlZCB0byBpbmNsdWRlIGRhdGVzIHNwZWNpZmljIHRvIHRoZSBob3N0IG1hY2hpbmUncwotICAgKiBsb2NhbGUuIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jYWxpcGVyL2lzc3Vlcy9kZXRhaWw/aWQ9MTEzCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SnNvblNlcmlhbGl6YXRpb25XaXRoRmFuY3lMb2NhbGUoKSB7Ci0gICAgUmVzdWx0IG9yaWdpbmFsID0gbmV3U2FtcGxlUmVzdWx0KCk7Ci0KLSAgICAvLyBzZXJpYWxpemUgaW4gb25lIGxvY2FsZS4uLgotICAgIExvY2FsZSBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLSAgICBMb2NhbGUuc2V0RGVmYXVsdChMb2NhbGUuSVRBTFkpOwotICAgIFN0cmluZyBqc29uOwotICAgIHRyeSB7Ci0gICAgICBqc29uID0gSnNvbi5nZXRHc29uSW5zdGFuY2UoKS50b0pzb24ob3JpZ2luYWwsIFJlc3VsdC5jbGFzcyk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIExvY2FsZS5zZXREZWZhdWx0KGRlZmF1bHRMb2NhbGUpOwotICAgIH0KLQotICAgIC8vIGRlc2VyaWFsaXplIGluIGFub3RoZXIKLSAgICBSZXN1bHQgcmVzZXJpYWxpemVkID0gSnNvbi5nZXRHc29uSW5zdGFuY2UoKS5mcm9tSnNvbihqc29uLCBSZXN1bHQuY2xhc3MpOwotICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbCwgcmVzZXJpYWxpemVkKTsKLSAgfQotCi0gIHByaXZhdGUgUmVzdWx0IG5ld1NhbXBsZVJlc3VsdCgpIHsKLSAgICBNYXA8U3RyaW5nLEludGVnZXI+IHVuaXRzID0gSW1tdXRhYmxlTWFwLm9mKCJucyIsIDEpOwotICAgIE1lYXN1cmVtZW50U2V0IHRpbWVNZWFzdXJlbWVudHMgPSBuZXcgTWVhc3VyZW1lbnRTZXQobmV3IE1lYXN1cmVtZW50KHVuaXRzLCAyLjAsIDIuMCkpOwotICAgIERhdGUgZXhlY3V0ZWREYXRlID0gbmV3IERhdGUoMCk7Ci0gICAgU2NlbmFyaW8gc2NlbmFyaW8gPSBuZXcgU2NlbmFyaW8oSW1tdXRhYmxlTWFwLm9mKCJiZW5jaG1hcmsiLCAiRm9vIikpOwotICAgIFNjZW5hcmlvUmVzdWx0IHNjZW5hcmlvUmVzdWx0ID0gbmV3IFNjZW5hcmlvUmVzdWx0KAotICAgICAgICB0aW1lTWVhc3VyZW1lbnRzLCAibG9nIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgUnVuIHJ1biA9IG5ldyBSdW4oSW1tdXRhYmxlTWFwLm9mKHNjZW5hcmlvLCBzY2VuYXJpb1Jlc3VsdCksICJmb28uRm9vQmVuY2htYXJrIiwgZXhlY3V0ZWREYXRlKTsKLSAgICBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IG5ldyBFbnZpcm9ubWVudChJbW11dGFibGVNYXAub2YoIm9zLm5hbWUiLCAiTGludXgiKSk7Ci0gICAgcmV0dXJuIG5ldyBSZXN1bHQocnVuLCBlbnZpcm9ubWVudCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRTZXRUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL01lYXN1cmVtZW50U2V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmY3Y2JiLi4wMDAwMDAwCi0tLSBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvTWVhc3VyZW1lbnRTZXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9yZGVyaW5nOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE1lYXN1cmVtZW50U2V0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBPcmRlcmluZzxNZWFzdXJlbWVudD4gTUVBU1VSRU1FTlRfQllfTkFOT1MgPSBuZXcgT3JkZXJpbmc8TWVhc3VyZW1lbnQ+KCkgewotICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IGNvbXBhcmUoTWVhc3VyZW1lbnQgYSwgTWVhc3VyZW1lbnQgYikgewotICAgICAgcmV0dXJuIERvdWJsZS5jb21wYXJlKGEuZ2V0UmF3KCksIGIuZ2V0UmF3KCkpOwotICAgIH0KLSAgfTsKLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RJbmNvbXBhdGlibGVNZWFzdXJlbWVudHMoKSB7Ci0gICAgTWVhc3VyZW1lbnRbXSBtZWFzdXJlbWVudHMgPSBuZXcgTWVhc3VyZW1lbnRbMl07Ci0gICAgbWVhc3VyZW1lbnRzWzBdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMS4xLCAyLjIpOwotICAgIG1lYXN1cmVtZW50c1sxXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoInRyaXBsZW5zIiwgMSksIDMuOCwgNy42KTsKLSAgICB0cnkgewotICAgICAgbmV3IE1lYXN1cmVtZW50U2V0KG1lYXN1cmVtZW50cyk7Ci0gICAgICBmYWlsKCJpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SW5jb21wYXRpYmxlQWRkZWRNZWFzdXJlbWVudHMoKSB7Ci0gICAgTWVhc3VyZW1lbnRbXSBtZWFzdXJlbWVudHMgPSBuZXcgTWVhc3VyZW1lbnRbMV07Ci0gICAgbWVhc3VyZW1lbnRzWzBdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMS4xLCAyLjIpOwotICAgIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0ID0gbmV3IE1lYXN1cmVtZW50U2V0KG1lYXN1cmVtZW50cyk7Ci0gICAgdHJ5IHsKLSAgICAgIG1lYXN1cmVtZW50U2V0LnBsdXNNZWFzdXJlbWVudChuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJ0cmlwbGVucyIsIDEpLCAzLjgsIDcuNikpOwotICAgICAgZmFpbCgiaWxsZWdhbCBhcmd1bWVudCBleGNlcHRpb24gbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0gICAgTWVhc3VyZW1lbnRbXSBtZWFzdXJlbWVudHMgPSBuZXcgTWVhc3VyZW1lbnRbM107Ci0gICAgbWVhc3VyZW1lbnRzWzBdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMS4xLCAyLjIpOwotICAgIG1lYXN1cmVtZW50c1sxXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDMuOCwgNy42KTsKLSAgICBtZWFzdXJlbWVudHNbMl0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAyLjMsIDQuNik7Ci0gICAgTWVhc3VyZW1lbnRTZXQgbWVhc3VyZW1lbnRTZXQgPSBuZXcgTWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRzKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbWVhc3VyZW1lbnRTZXQuc2l6ZSgpKTsKLQotICAgIE1lYXN1cmVtZW50W10gbWVhc3VyZW1lbnRzMiA9IG5ldyBNZWFzdXJlbWVudFs0XTsKLSAgICBtZWFzdXJlbWVudHMyWzBdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMS4xLCAyLjIpOwotICAgIG1lYXN1cmVtZW50czJbMV0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAzLjgsIDcuNik7Ci0gICAgbWVhc3VyZW1lbnRzMlsyXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDIuMywgNC42KTsKLSAgICBtZWFzdXJlbWVudHMyWzNdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgNy4yLCAxNC40KTsKLSAgICBNZWFzdXJlbWVudFNldCBtZWFzdXJlbWVudFNldDIgPQotICAgICAgICBuZXcgTWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRzMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG1lYXN1cmVtZW50U2V0Mi5zaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBsdXNNZWFzdXJlbWVudCgpIHsKLSAgICBNZWFzdXJlbWVudFtdIG1lYXN1cmVtZW50cyA9IG5ldyBNZWFzdXJlbWVudFszXTsKLSAgICBtZWFzdXJlbWVudHNbMF0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAxLjEsIDIuMik7Ci0gICAgbWVhc3VyZW1lbnRzWzFdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMy44LCA3LjYpOwotICAgIG1lYXN1cmVtZW50c1syXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDIuMywgNC42KTsKLSAgICBNZWFzdXJlbWVudFNldCBtZWFzdXJlbWVudFNldCA9IG5ldyBNZWFzdXJlbWVudFNldChtZWFzdXJlbWVudHMpOwotCi0gICAgTWVhc3VyZW1lbnRbXSBtZWFzdXJlbWVudHMyID0gbmV3IE1lYXN1cmVtZW50WzRdOwotICAgIG1lYXN1cmVtZW50czJbMF0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAxLjEsIDIuMik7Ci0gICAgbWVhc3VyZW1lbnRzMlsxXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDMuOCwgNy42KTsKLSAgICBtZWFzdXJlbWVudHMyWzJdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMi4zLCA0LjYpOwotICAgIG1lYXN1cmVtZW50czJbM10gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCA3LjIsIDE0LjQpOwotICAgIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0MiA9Ci0gICAgICAgIG5ldyBNZWFzdXJlbWVudFNldChtZWFzdXJlbWVudHMyKTsKLQotICAgIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0MyA9IG1lYXN1cmVtZW50U2V0LnBsdXNNZWFzdXJlbWVudChtZWFzdXJlbWVudHMyWzNdKTsKLQotICAgIGFzc2VydERvdWJsZUxpc3RzRXF1YWxzKG1lYXN1cmVtZW50U2V0Mi5nZXRNZWFzdXJlbWVudHNSYXcoKSwKLSAgICAgICAgbWVhc3VyZW1lbnRTZXQzLmdldE1lYXN1cmVtZW50c1JhdygpLCAwLjAwMDAwMDEpOwotICAgIGFzc2VydERvdWJsZUxpc3RzRXF1YWxzKG1lYXN1cmVtZW50U2V0Mi5nZXRNZWFzdXJlbWVudFVuaXRzKCksCi0gICAgICAgIG1lYXN1cmVtZW50U2V0My5nZXRNZWFzdXJlbWVudFVuaXRzKCksIDAuMDAwMDAwMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lYXN1cmVtZW50U2V0Mi5nZXRVbml0TmFtZXMoKSwgbWVhc3VyZW1lbnRTZXQzLmdldFVuaXROYW1lcygpKTsKLQotICAgIExpc3Q8TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50TGlzdDEgPQotICAgICAgICBNRUFTVVJFTUVOVF9CWV9OQU5PUy5zb3J0ZWRDb3B5KG1lYXN1cmVtZW50U2V0Mi5nZXRNZWFzdXJlbWVudHMoKSk7Ci0gICAgTGlzdDxNZWFzdXJlbWVudD4gbWVhc3VyZW1lbnRMaXN0MiA9Ci0gICAgICAgIE1FQVNVUkVNRU5UX0JZX05BTk9TLnNvcnRlZENvcHkobWVhc3VyZW1lbnRTZXQzLmdldE1lYXN1cmVtZW50cygpKTsKLSAgICBhc3NlcnRFcXVhbHMobWVhc3VyZW1lbnRMaXN0MS5zaXplKCksIG1lYXN1cmVtZW50TGlzdDIuc2l6ZSgpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lYXN1cmVtZW50TGlzdDEuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhtZWFzdXJlbWVudExpc3QxLmdldChpKS5nZXRSYXcoKSwKLSAgICAgICAgICBtZWFzdXJlbWVudExpc3QyLmdldChpKS5nZXRSYXcoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVhc3VyZW1lbnRMaXN0MS5nZXQoaSkuZ2V0UHJvY2Vzc2VkKCksCi0gICAgICAgICAgbWVhc3VyZW1lbnRMaXN0Mi5nZXQoaSkuZ2V0UHJvY2Vzc2VkKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZWRpYW4oKSB7Ci0gICAgTWVhc3VyZW1lbnRbXSBtZWFzdXJlbWVudHMgPSBuZXcgTWVhc3VyZW1lbnRbM107Ci0gICAgbWVhc3VyZW1lbnRzWzBdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMS4xLCAyLjIpOwotICAgIG1lYXN1cmVtZW50c1sxXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDMuOCwgNy42KTsKLSAgICBtZWFzdXJlbWVudHNbMl0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAyLjMsIDQuNik7Ci0gICAgTWVhc3VyZW1lbnRTZXQgbWVhc3VyZW1lbnRTZXQgPSBuZXcgTWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRzKTsKLSAgICBhc3NlcnRFcXVhbHMoMi4zLCBtZWFzdXJlbWVudFNldC5tZWRpYW5SYXcoKSwgMC4wMDAwMDAwMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQuNiwgbWVhc3VyZW1lbnRTZXQubWVkaWFuVW5pdHMoKSwgMC4wMDAwMDAwMSk7Ci0KLSAgICBNZWFzdXJlbWVudFtdIG1lYXN1cmVtZW50czIgPSBuZXcgTWVhc3VyZW1lbnRbNF07Ci0gICAgbWVhc3VyZW1lbnRzMlswXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDEuMSwgMi4yKTsKLSAgICBtZWFzdXJlbWVudHMyWzFdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMy44LCA3LjYpOwotICAgIG1lYXN1cmVtZW50czJbMl0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAyLjMsIDQuNik7Ci0gICAgbWVhc3VyZW1lbnRzMlszXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDcuMiwgMTQuNCk7Ci0gICAgTWVhc3VyZW1lbnRTZXQgbWVhc3VyZW1lbnRTZXQyID0KLSAgICAgICAgbmV3IE1lYXN1cmVtZW50U2V0KG1lYXN1cmVtZW50czIpOwotICAgIGFzc2VydEVxdWFscygoMi4zICsgMy44KSAvIDIsIG1lYXN1cmVtZW50U2V0Mi5tZWRpYW5SYXcoKSwgMC4wMDAwMDAwMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCg0LjYgKyA3LjYpIC8gMiwgbWVhc3VyZW1lbnRTZXQyLm1lZGlhblVuaXRzKCksIDAuMDAwMDAwMDEpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lYW4oKSB7Ci0gICAgTWVhc3VyZW1lbnRbXSBtZWFzdXJlbWVudHMgPSBuZXcgTWVhc3VyZW1lbnRbM107Ci0gICAgbWVhc3VyZW1lbnRzWzBdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMS4xLCAyLjIpOwotICAgIG1lYXN1cmVtZW50c1sxXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDMuOCwgNy42KTsKLSAgICBtZWFzdXJlbWVudHNbMl0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAyLjMsIDQuNik7Ci0gICAgTWVhc3VyZW1lbnRTZXQgbWVhc3VyZW1lbnRTZXQgPSBuZXcgTWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRzKTsKLSAgICBhc3NlcnRFcXVhbHMoKDEuMSArIDMuOCArIDIuMykgLyAzLCBtZWFzdXJlbWVudFNldC5tZWFuUmF3KCksIDAuMDAwMDAwMDEpOwotICAgIGFzc2VydEVxdWFscygoMi4yICsgNy42ICsgNC42KSAvIDMsIG1lYXN1cmVtZW50U2V0Lm1lYW5Vbml0cygpLCAwLjAwMDAwMDAxKTsKLQotICAgIE1lYXN1cmVtZW50W10gbWVhc3VyZW1lbnRzMiA9IG5ldyBNZWFzdXJlbWVudFs0XTsKLSAgICBtZWFzdXJlbWVudHMyWzBdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMS4xLCAyLjIpOwotICAgIG1lYXN1cmVtZW50czJbMV0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAzLjgsIDcuNik7Ci0gICAgbWVhc3VyZW1lbnRzMlsyXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDIuMywgNC42KTsKLSAgICBtZWFzdXJlbWVudHMyWzNdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgNy4yLCAxNC40KTsKLSAgICBNZWFzdXJlbWVudFNldCBtZWFzdXJlbWVudFNldDIgPQotICAgICAgICBuZXcgTWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRzMik7Ci0gICAgYXNzZXJ0RXF1YWxzKCgxLjEgKyAyLjMgKyAzLjggKyA3LjIpIC8gNCwgbWVhc3VyZW1lbnRTZXQyLm1lYW5SYXcoKSwgMC4wMDAwMDAwMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCgyLjIgKyA0LjYgKyA3LjYgKyAxNC40KSAvIDQsIG1lYXN1cmVtZW50U2V0Mi5tZWFuVW5pdHMoKSwgMC4wMDAwMDAwMSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmREZXZpYXRpb24oKSB7Ci0gICAgTWVhc3VyZW1lbnRbXSBtZWFzdXJlbWVudHMgPSBuZXcgTWVhc3VyZW1lbnRbM107Ci0gICAgbWVhc3VyZW1lbnRzWzBdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMS4xLCAyLjIpOwotICAgIG1lYXN1cmVtZW50c1sxXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDMuOCwgNy42KTsKLSAgICBtZWFzdXJlbWVudHNbMl0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAyLjMsIDQuNik7Ci0gICAgTWVhc3VyZW1lbnRTZXQgbWVhc3VyZW1lbnRTZXQgPSBuZXcgTWVhc3VyZW1lbnRTZXQobWVhc3VyZW1lbnRzKTsKLSAgICBhc3NlcnRFcXVhbHMoMS4zNTI3NywgbWVhc3VyZW1lbnRTZXQuc3RhbmRhcmREZXZpYXRpb25SYXcoKSwgMC4wMDAwMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIuNzA1NTUsIG1lYXN1cmVtZW50U2V0LnN0YW5kYXJkRGV2aWF0aW9uVW5pdHMoKSwgMC4wMDAwMSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWF4KCkgewotICAgIE1lYXN1cmVtZW50W10gbWVhc3VyZW1lbnRzID0gbmV3IE1lYXN1cmVtZW50WzNdOwotICAgIG1lYXN1cmVtZW50c1swXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDEuMSwgMi4yKTsKLSAgICBtZWFzdXJlbWVudHNbMV0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAzLjgsIDcuNik7Ci0gICAgbWVhc3VyZW1lbnRzWzJdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMi4zLCA0LjYpOwotICAgIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0ID0gbmV3IE1lYXN1cmVtZW50U2V0KG1lYXN1cmVtZW50cyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMuOCwgbWVhc3VyZW1lbnRTZXQubWF4UmF3KCksIDAuMDAwMDAwMDEpOwotICAgIGFzc2VydEVxdWFscyg3LjYsIG1lYXN1cmVtZW50U2V0Lm1heFVuaXRzKCksIDAuMDAwMDAwMDEpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1pbigpIHsKLSAgICBNZWFzdXJlbWVudFtdIG1lYXN1cmVtZW50cyA9IG5ldyBNZWFzdXJlbWVudFszXTsKLSAgICBtZWFzdXJlbWVudHNbMF0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAxLjEsIDIuMik7Ci0gICAgbWVhc3VyZW1lbnRzWzFdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMy44LCA3LjYpOwotICAgIG1lYXN1cmVtZW50c1syXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDIuMywgNC42KTsKLSAgICBNZWFzdXJlbWVudFNldCBtZWFzdXJlbWVudFNldCA9IG5ldyBNZWFzdXJlbWVudFNldChtZWFzdXJlbWVudHMpOwotICAgIGFzc2VydEVxdWFscygxLjEsIG1lYXN1cmVtZW50U2V0Lm1pblJhdygpLCAwLjAwMDAwMDAxKTsKLSAgICBhc3NlcnRFcXVhbHMoMi4yLCBtZWFzdXJlbWVudFNldC5taW5Vbml0cygpLCAwLjAwMDAwMDAxKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RKc29uUm91bmR0cmlwKCkgewotICAgIE1lYXN1cmVtZW50W10gbWVhc3VyZW1lbnRzID0gbmV3IE1lYXN1cmVtZW50WzNdOwotICAgIG1lYXN1cmVtZW50c1swXSA9IG5ldyBNZWFzdXJlbWVudChJbW11dGFibGVNYXAub2YoImRvdWJsZW5zIiwgMSksIDEuMSwgMi4yKTsKLSAgICBtZWFzdXJlbWVudHNbMV0gPSBuZXcgTWVhc3VyZW1lbnQoSW1tdXRhYmxlTWFwLm9mKCJkb3VibGVucyIsIDEpLCAzLjgsIDcuNik7Ci0gICAgbWVhc3VyZW1lbnRzWzJdID0gbmV3IE1lYXN1cmVtZW50KEltbXV0YWJsZU1hcC5vZigiZG91YmxlbnMiLCAxKSwgMi4zLCA0LjYpOwotICAgIE1lYXN1cmVtZW50U2V0IG1lYXN1cmVtZW50U2V0ID0gbmV3IE1lYXN1cmVtZW50U2V0KG1lYXN1cmVtZW50cyk7Ci0gICAgTWVhc3VyZW1lbnRTZXQgcm91bmRUcmlwcGVkID0KLSAgICAgICAgSnNvbi5tZWFzdXJlbWVudFNldEZyb21Kc29uKEpzb24ubWVhc3VyZW1lbnRTZXRUb0pzb24obWVhc3VyZW1lbnRTZXQpKTsKLSAgICBhc3NlcnREb3VibGVMaXN0c0VxdWFscyhtZWFzdXJlbWVudFNldC5nZXRNZWFzdXJlbWVudHNSYXcoKSwKLSAgICAgICAgcm91bmRUcmlwcGVkLmdldE1lYXN1cmVtZW50c1JhdygpLCAwLjAwMDAwMDAxKTsKLSAgICBhc3NlcnREb3VibGVMaXN0c0VxdWFscyhtZWFzdXJlbWVudFNldC5nZXRNZWFzdXJlbWVudFVuaXRzKCksCi0gICAgICAgIHJvdW5kVHJpcHBlZC5nZXRNZWFzdXJlbWVudFVuaXRzKCksIDAuMDAwMDAwMDEpOwotICAgIGFzc2VydEVxdWFscyhtZWFzdXJlbWVudFNldC5nZXRVbml0TmFtZXMoKSwgcm91bmRUcmlwcGVkLmdldFVuaXROYW1lcygpKTsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKHsiQXNzZXJ0RXF1YWxzQmV0d2VlbkluY29udmVydGlibGVUeXBlcyJ9KQotICBwdWJsaWMgdm9pZCB0ZXN0RnJvbUxlZ2FjeVN0cmluZygpIHsKLSAgICBNZWFzdXJlbWVudFNldCBtZWFzdXJlbWVudFNldCA9IEpzb24ubWVhc3VyZW1lbnRTZXRGcm9tSnNvbigiMTIyLjAgMTMzLjAgMTQ0LjAiKTsKLSAgICBhc3NlcnREb3VibGVMaXN0c0VxdWFscyhBcnJheXMuYXNMaXN0KDEyMi4wLCAxMzMuMCwgMTQ0LjApLAotICAgICAgICBtZWFzdXJlbWVudFNldC5nZXRNZWFzdXJlbWVudHNSYXcoKSwgMC4wMDAwMDAwMSk7Ci0gICAgYXNzZXJ0RG91YmxlTGlzdHNFcXVhbHMoQXJyYXlzLmFzTGlzdCgxMjIuMCwgMTMzLjAsIDE0NC4wKSwKLSAgICAgICAgbWVhc3VyZW1lbnRTZXQuZ2V0TWVhc3VyZW1lbnRVbml0cygpLCAwLjAwMDAwMDAxKTsKLSAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTWFwLm9mKCJucyIsIDEsICJ1cyIsIDEwMDAsICJtcyIsIDEwMDAwMDAsICJzIiwgMTAwMDAwMDAwMCksCi0gICAgICAgIG1lYXN1cmVtZW50U2V0LmdldFVuaXROYW1lcygpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnREb3VibGVMaXN0c0VxdWFscyhMaXN0PERvdWJsZT4gZXhwZWN0ZWQsIExpc3Q8RG91YmxlPiBhY3R1YWwsIGRvdWJsZSBlcHNpbG9uKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNpemUoKSwgYWN0dWFsLnNpemUoKSk7Ci0gICAgQ29sbGVjdGlvbnMuc29ydChleHBlY3RlZCk7Ci0gICAgQ29sbGVjdGlvbnMuc29ydChhY3R1YWwpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQoaSksIGFjdHVhbC5nZXQoaSksIGVwc2lsb24pOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9QYXJhbWV0ZXJUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1BhcmFtZXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MzI2MS4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1BhcmFtZXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFBhcmFtZXRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBBIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKLSAgICBAUGFyYW0oeyJ2YWx1ZTEiLCAidmFsdWUyIn0pIFN0cmluZyBwYXJhbTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGcm9tQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1hcDxTdHJpbmcsUGFyYW1ldGVyPD8+PiBtYXAgPSBQYXJhbWV0ZXIuZm9yQ2xhc3MoQS5jbGFzcyk7Ci0gICAgUGFyYW1ldGVyPD8+IHAgPSBtYXAuZ2V0KCJwYXJhbSIpOwotICAgIGFzc2VydEVxdWFscygicGFyYW0iLCBwLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgcC5nZXRUeXBlKCkpOwotCi0gICAgY2hlY2tQYXJhbWV0ZXJWYWx1ZXMoQS5jbGFzcywgInZhbHVlMSIsICJ2YWx1ZTIiKTsKLSAgfQotCi0gIHB1YmxpYyBlbnVtIEZvbyB7IFZBTFVFMSwgVkFMVUUyIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIEggZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgewotICAgIEBQYXJhbSBGb28gcGFyYW07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0QWxsRW51bXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBjaGVja1BhcmFtZXRlclZhbHVlcyhILmNsYXNzLCBGb28uVkFMVUUxLCBGb28uVkFMVUUyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSSBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7Ci0gICAgQFBhcmFtIGJvb2xlYW4gcGFyYW07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIGNoZWNrUGFyYW1ldGVyVmFsdWVzKEkuY2xhc3MsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQYXJhbWV0ZXJWYWx1ZXMoQ2xhc3M8PyBleHRlbmRzIFNpbXBsZUJlbmNobWFyaz4gYkNsYXNzLAotICAgICAgT2JqZWN0Li4uIGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNYXA8U3RyaW5nLFBhcmFtZXRlcjw/Pj4gbWFwID0gUGFyYW1ldGVyLmZvckNsYXNzKGJDbGFzcyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5zaXplKCkpOwotICAgIFBhcmFtZXRlcjw/PiBwID0gbWFwLmdldCgicGFyYW0iKTsKLSAgICBMaXN0PE9iamVjdD4gdmFsdWVzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2YocC52YWx1ZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoZXhwZWN0ZWQpLCB2YWx1ZXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1dhcm11cE92ZXJmbG93VGVzdC5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9XYXJtdXBPdmVyZmxvd1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlNTlhZi4uMDAwMDAwMAotLS0gYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL1dhcm11cE92ZXJmbG93VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuVXNlckV4Y2VwdGlvbi5Eb2VzTm90U2NhbGVMaW5lYXJseUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuU2ltcGxlVGltZUxpbWl0ZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlRpbWVMaW1pdGVyOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBleHBvc2luZyBhbiBpc3N1ZSB3aGVyZSBhbnkgd2FybXVwIHRoYXQgY29tcGxldGVzIGVub3VnaCBleGVjdXRpb25zIHRvIHJlYWNoCi0gKiBJbnRlZ2VyLk1BWF9WQUxVRSByZXBzIChlaXRoZXIgYmVjYXVzZSB0aGUgYmVuY2htYXJrIGNvZGUgaXMgb3B0aW1pemVkIGF3YXkgb3IgYmVjYXVzZSB0aGUKLSAqIHdhcm11cE1pbGxpcyBhcmUgbG9uZyBlbm91Z2ggY29tcGFyZWQgdG8gdGhlIGJlbmNobWFyayBleGVjdXRpb24gdGltZSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXJtdXBPdmVyZmxvd1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHByaXZhdGUgVGltZUxpbWl0ZXIgdGltZUxpbWl0ZXI7Ci0KLSAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgIHRpbWVMaW1pdGVyID0gbmV3IFNpbXBsZVRpbWVMaW1pdGVyKEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcHRpbWl6ZWRBd2F5QmVuY2htYXJrRG9lc05vdFRha2VUb29Mb25nVG9SdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgdGltZUxpbWl0ZXIuY2FsbFdpdGhUaW1lb3V0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICBJblByb2Nlc3NSdW5uZXIgcnVubmVyID0gbmV3IEluUHJvY2Vzc1J1bm5lcigpOwotICAgICAgICAgIHJ1bm5lci5ydW4oT3B0aW1pemVkQXdheUJlbmNobWFyay5jbGFzcy5nZXROYW1lKCksICItLXdhcm11cE1pbGxpcyIsICIzMDAwIiwKLSAgICAgICAgICAgICAgIi0tbWVhc3VyZW1lbnRUeXBlIiwgIlRJTUUiKTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgfSwgOTAsIFRpbWVVbml0LlNFQ09ORFMsIGZhbHNlKTsKLSAgICB9IGNhdGNoIChEb2VzTm90U2NhbGVMaW5lYXJseUV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RMb25nV2FybXVwTWlsbGlzRG9lc05vdFRha2VUb29Mb25nVG9SdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0aW1lTGltaXRlci5jYWxsV2l0aFRpbWVvdXQobmV3IENhbGxhYmxlPFZvaWQ+KCkgewotICAgICAgQE92ZXJyaWRlIHB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSW5Qcm9jZXNzUnVubmVyIHJ1bm5lciA9IG5ldyBJblByb2Nlc3NSdW5uZXIoKTsKLSAgICAgICAgcnVubmVyLnJ1bihSZWxhdGl2ZWx5RmFzdEJlbmNobWFyay5jbGFzcy5nZXROYW1lKCksICItLXdhcm11cE1pbGxpcyIsICI4MDAwIiwKLSAgICAgICAgICAgICItLXJ1bk1pbGxpcyIsICI1MSIsICItLW1lYXN1cmVtZW50VHlwZSIsICJUSU1FIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0sIDkwLCBUaW1lVW5pdC5TRUNPTkRTLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE9wdGltaXplZEF3YXlCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgewotICAgIHB1YmxpYyB2b2lkIHRpbWVJc051bGxPckVtcHR5KGludCByZXBzKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewotICAgICAgICAvLyBkbyBub3RoaW5nIQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVsYXRpdmVseUZhc3RCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgewotICAgIHB1YmxpYyBsb25nIHRpbWVTcXJ0KGludCByZXBzKSB7Ci0gICAgICBsb25nIHJlc3VsdCA9IDA7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSBNYXRoLnNxcnQoODEpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0djTG9nTWVzc2FnZUdlbmVyYXRvci5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvR2NMb2dNZXNzYWdlR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyYmM5NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0djTG9nTWVzc2FnZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZTsKKworaW1wb3J0IGNvbS5zdW4ubWFuYWdlbWVudC5Ib3RTcG90RGlhZ25vc3RpY01YQmVhbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworCisvKioKKyAqIEEgc2ltcGxlIGNsYXNzIHRoYXQgaW52b2tlcyB7QGxpbmsgU3lzdGVtI2djKCl9IG92ZXIgYW5kIG92ZXIgdG8gZ2VuZXJhdGUgc29tZSBHQyBsb2cgbWVzc2FnZXMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHY0xvZ01lc3NhZ2VHZW5lcmF0b3IgeworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrR2NMb2dnaW5nKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgU3lzdGVtLmdjKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVFNQT1RfQkVBTl9OQU1FID0gImNvbS5zdW4ubWFuYWdlbWVudDp0eXBlPUhvdFNwb3REaWFnbm9zdGljIjsKKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrR2NMb2dnaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNQmVhblNlcnZlciBzZXJ2ZXIgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisgICAgSG90U3BvdERpYWdub3N0aWNNWEJlYW4gYmVhbiA9IE1hbmFnZW1lbnRGYWN0b3J5Lm5ld1BsYXRmb3JtTVhCZWFuUHJveHkoCisgICAgICAgIHNlcnZlciwgSE9UU1BPVF9CRUFOX05BTUUsIEhvdFNwb3REaWFnbm9zdGljTVhCZWFuLmNsYXNzKTsKKyAgICBpZiAoIWJlYW4uZ2V0Vk1PcHRpb24oIlByaW50R0MiKS5nZXRWYWx1ZSgpLmVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSkpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgcnVuIHdpdGggLVhYOitQcmludEdDIik7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL0xvZ01lc3NhZ2VQYXJzZXJUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9Mb2dNZXNzYWdlUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzcwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9Mb2dNZXNzYWdlUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5HY0xvZ01lc3NhZ2UuVHlwZS5GVUxMOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLkdjTG9nTWVzc2FnZS5UeXBlLklOQ1JFTUVOVEFMOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUNST1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5TaG9ydER1cmF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLlJlc291cmNlczsKKworaW1wb3J0IGRhZ2dlci5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIFRlc3RzIHtAbGluayBMb2dNZXNzYWdlUGFyc2VyfS4KKyAqLworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorCitwdWJsaWMgY2xhc3MgTG9nTWVzc2FnZVBhcnNlclRlc3QgeworICBASW5qZWN0IExvZ01lc3NhZ2VQYXJzZXIgcGFyc2VyOworCisgIEBDb21wb25lbnQobW9kdWxlcyA9IEJyaWRnZU1vZHVsZS5jbGFzcykKKyAgaW50ZXJmYWNlIExvZ01lc3NhZ2VQYXJzZXJDb21wb25lbnQgeworICAgIHZvaWQgaW5qZWN0KExvZ01lc3NhZ2VQYXJzZXJUZXN0IHRlc3QpOworICB9CisKKyAgQEJlZm9yZSBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBEYWdnZXJMb2dNZXNzYWdlUGFyc2VyVGVzdF9Mb2dNZXNzYWdlUGFyc2VyQ29tcG9uZW50LmNyZWF0ZSgpLmluamVjdCh0aGlzKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdjUGF0dGVuX2pkazYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFN0cmluZz4gbGluZXMgPSBSZXNvdXJjZXMucmVhZExpbmVzKAorICAgICAgICBSZXNvdXJjZXMuZ2V0UmVzb3VyY2UoTG9nTWVzc2FnZVBhcnNlclRlc3QuY2xhc3MsICJqZGs2LWdjLnR4dCIpLCBVVEZfOCk7CisgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CisgICAgICBhc3NlcnRUcnVlKHBhcnNlci5wYXJzZShsaW5lKSBpbnN0YW5jZW9mIEdjTG9nTWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgZ2NQYXR0ZW5famRrNygpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8U3RyaW5nPiBsaW5lcyA9IFJlc291cmNlcy5yZWFkTGluZXMoCisgICAgICAgIFJlc291cmNlcy5nZXRSZXNvdXJjZShMb2dNZXNzYWdlUGFyc2VyVGVzdC5jbGFzcywgImpkazctZ2MudHh0IiksIFVURl84KTsKKyAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKKyAgICAgIGFzc2VydFRydWUocGFyc2VyLnBhcnNlKGxpbmUpIGluc3RhbmNlb2YgR2NMb2dNZXNzYWdlKTsKKyAgICB9CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBnY01lc3NhZ2VEYXRhKCkgeworICAgIGFzc2VydEVxdWFscyhuZXcgR2NMb2dNZXNzYWdlKElOQ1JFTUVOVEFMLCBTaG9ydER1cmF0aW9uLm9mKDEyMzIsIE1JQ1JPU0VDT05EUykpLAorICAgICAgICBwYXJzZXIucGFyc2UoIltHQyA5ODdLLT4zODRLKDYyODQ4SyksIDAuMDAxMjMyMCBzZWNzXSIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IEdjTG9nTWVzc2FnZShGVUxMLCBTaG9ydER1cmF0aW9uLm9mKDU0NTUsIE1JQ1JPU0VDT05EUykpLAorICAgICAgICBwYXJzZXIucGFyc2UoIltGdWxsIEdDIDM4NEstPjI4OEsoNjI4NDhLKSwgMC4wMDU0NTUwIHNlY3NdIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgR2NMb2dNZXNzYWdlKElOQ1JFTUVOVEFMLCBTaG9ydER1cmF0aW9uLm9mKDE0MjQsIE1JQ1JPU0VDT05EUykpLAorICAgICAgICBwYXJzZXIucGFyc2UoCisgICAgICAgICAgICAiMjAxMy0wMi0xMVQyMDoxNToyNi43MDYtMDYwMDogMC4wOTg6IFtHQyAxMzE2Sy0+NTc2Syg2Mjg0OEspLCAwLjAwMTQyNDAgc2Vjc10iKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBHY0xvZ01lc3NhZ2UoRlVMTCwgU2hvcnREdXJhdGlvbi5vZig0NDg2LCBNSUNST1NFQ09ORFMpKSwKKyAgICAgICAgcGFyc2VyLnBhcnNlKAorICAgICAgICAgICAgIjIwMTMtMDItMTFUMjA6MTU6MjYuNzA4LTA2MDA6IDAuMDk5OiBbRnVsbCBHQyA1NzZLLT40ODZLKDYyODQ4SyksIDAuMDA0NDg2MCBzZWNzXSIpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGppdFBhdHRlcm5famRrNigpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8U3RyaW5nPiBsaW5lcyA9IFJlc291cmNlcy5yZWFkTGluZXMoCisgICAgICAgIFJlc291cmNlcy5nZXRSZXNvdXJjZShMb2dNZXNzYWdlUGFyc2VyVGVzdC5jbGFzcywgImpkazYtY29tcGlsYXRpb24udHh0IiksIFVURl84KTsKKyAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKKyAgICAgIGFzc2VydFRydWUocGFyc2VyLnBhcnNlKGxpbmUpIGluc3RhbmNlb2YgSG90c3BvdExvZ01lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGppdFBhdHRlcm5famRrNygpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8U3RyaW5nPiBsaW5lcyA9IFJlc291cmNlcy5yZWFkTGluZXMoCisgICAgICAgIFJlc291cmNlcy5nZXRSZXNvdXJjZShMb2dNZXNzYWdlUGFyc2VyVGVzdC5jbGFzcywgImpkazctY29tcGlsYXRpb24udHh0IiksIFVURl84KTsKKyAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKKyAgICAgIGFzc2VydFRydWUocGFyc2VyLnBhcnNlKGxpbmUpIGluc3RhbmNlb2YgSG90c3BvdExvZ01lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHZtT3B0aW9uUGF0dGVybl9qZGs2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxTdHJpbmc+IGxpbmVzID0gUmVzb3VyY2VzLnJlYWRMaW5lcygKKyAgICAgICAgUmVzb3VyY2VzLmdldFJlc291cmNlKExvZ01lc3NhZ2VQYXJzZXJUZXN0LmNsYXNzLCAiamRrNi1mbGFncy50eHQiKSwgVVRGXzgpOworICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgICAgYXNzZXJ0VHJ1ZShwYXJzZXIucGFyc2UobGluZSkgaW5zdGFuY2VvZiBWbU9wdGlvbkxvZ01lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHZtT3B0aW9uUGF0dGVybl9qZGs3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxTdHJpbmc+IGxpbmVzID0gUmVzb3VyY2VzLnJlYWRMaW5lcygKKyAgICAgICAgUmVzb3VyY2VzLmdldFJlc291cmNlKExvZ01lc3NhZ2VQYXJzZXJUZXN0LmNsYXNzLCAiamRrNy1mbGFncy50eHQiKSwgVVRGXzgpOworICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgICAgYXNzZXJ0VHJ1ZShwYXJzZXIucGFyc2UobGluZSkgaW5zdGFuY2VvZiBWbU9wdGlvbkxvZ01lc3NhZ2UpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvQ2FsaXBlckNvbmZpZ0xvYWRlclRlc3QuamF2YSBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0NhbGlwZXJDb25maWdMb2FkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3ZDFlNQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0NhbGlwZXJDb25maWdMb2FkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9ucy5DYWxpcGVyT3B0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLnJ1bm5lcnMuTW9ja2l0b0pVbml0UnVubmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIFRlc3RzIHtAbGluayBDYWxpcGVyQ29uZmlnTG9hZGVyfS4KKyAqLworQFJ1bldpdGgoTW9ja2l0b0pVbml0UnVubmVyLmNsYXNzKQorCitwdWJsaWMgY2xhc3MgQ2FsaXBlckNvbmZpZ0xvYWRlclRlc3QgeworICBATW9jayBDYWxpcGVyT3B0aW9ucyBvcHRpb25zTW9jazsKKworICBwcml2YXRlIEZpbGUgdGVtcENvbmZpZ0ZpbGU7CisKKyAgQEJlZm9yZSBwdWJsaWMgdm9pZCBjcmVhdGVUZW1wVXNlclByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRlbXBDb25maWdGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiY2FsaXBlci1jb25maWctdGVzdCIsICJwcm9wZXJ0aWVzIik7CisgICAgdGVtcENvbmZpZ0ZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgUHJvcGVydGllcyB1c2VyUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgdXNlclByb3BlcnRpZXMucHV0KCJzb21lLnByb3BlcnR5IiwgImZyYW5rbGluIik7CisgICAgRmlsZU91dHB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBDb25maWdGaWxlKTsKKyAgICB1c2VyUHJvcGVydGllcy5zdG9yZShmcywgbnVsbCk7CisgICAgZnMuY2xvc2UoKTsKKyAgfQorCisgIEBBZnRlciBwdWJsaWMgdm9pZCBkZWxldGVUZW1wVXNlclByb3BlcnRpZXMoKSB7CisgICAgdGVtcENvbmZpZ0ZpbGUuZGVsZXRlKCk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBsb2FkT3JDcmVhdGVfY29uZmlnRmlsZUV4aXN0c05vT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB3aGVuKG9wdGlvbnNNb2NrLmNhbGlwZXJDb25maWdGaWxlKCkpLnRoZW5SZXR1cm4odGVtcENvbmZpZ0ZpbGUpOworICAgIHdoZW4ob3B0aW9uc01vY2suY29uZmlnUHJvcGVydGllcygpKS50aGVuUmV0dXJuKEltbXV0YWJsZU1hcC48U3RyaW5nLCBTdHJpbmc+b2YoKSk7CisgICAgQ2FsaXBlckNvbmZpZ0xvYWRlciBsb2FkZXIgPSBuZXcgQ2FsaXBlckNvbmZpZ0xvYWRlcihvcHRpb25zTW9jayk7CisgICAgQ2FsaXBlckNvbmZpZyBjb25maWcgPSBsb2FkZXIubG9hZE9yQ3JlYXRlKCk7CisgICAgYXNzZXJ0RXF1YWxzKCJmcmFua2xpbiIsIGNvbmZpZy5wcm9wZXJ0aWVzLmdldCgic29tZS5wcm9wZXJ0eSIpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGxvYWRPckNyZWF0ZV9jb25maWdGaWxlRXhpc3RzV2l0aE92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgd2hlbihvcHRpb25zTW9jay5jYWxpcGVyQ29uZmlnRmlsZSgpKS50aGVuUmV0dXJuKHRlbXBDb25maWdGaWxlKTsKKyAgICB3aGVuKG9wdGlvbnNNb2NrLmNvbmZpZ1Byb3BlcnRpZXMoKSkudGhlblJldHVybihJbW11dGFibGVNYXAub2YoCisgICAgICAgICJzb21lLnByb3BlcnR5IiwgInRhY29zIikpOworICAgIENhbGlwZXJDb25maWdMb2FkZXIgbG9hZGVyID0gbmV3IENhbGlwZXJDb25maWdMb2FkZXIob3B0aW9uc01vY2spOworICAgIENhbGlwZXJDb25maWcgY29uZmlnID0gbG9hZGVyLmxvYWRPckNyZWF0ZSgpOworICAgIGFzc2VydEVxdWFscygidGFjb3MiLCBjb25maWcucHJvcGVydGllcy5nZXQoInNvbWUucHJvcGVydHkiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL0NhbGlwZXJDb25maWdUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9DYWxpcGVyQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YmJlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9DYWxpcGVyQ29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5jb25maWc7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuUmVzdWx0UHJvY2Vzc29yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5UcmlhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLmp2bS5Kdm1QbGF0Zm9ybTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CisKKy8qKgorICogVGVzdHMge0BsaW5rIENhbGlwZXJDb25maWd9LgorICoKKyAqIEBhdXRob3IgZ2FrQGdvb2dsZS5jb20gKEdyZWdvcnkgS2ljaykKKyAqLworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIENhbGlwZXJDb25maWdUZXN0IHsKKyAgQFJ1bGUgcHVibGljIFRlbXBvcmFyeUZvbGRlciBmb2xkZXIgPSBuZXcgVGVtcG9yYXJ5Rm9sZGVyKCk7CisKKyAgcHJpdmF0ZSBQbGF0Zm9ybSBwbGF0Zm9ybSA9IG5ldyBKdm1QbGF0Zm9ybSgpOworCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdldERlZmF1bHRWbUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworICAgIENhbGlwZXJDb25maWcgY29uZmlndXJhdGlvbiA9IG5ldyBDYWxpcGVyQ29uZmlnKAorICAgICAgICBJbW11dGFibGVNYXAub2YoInZtLmFyZ3MiLCAiLXZlcnkgLXNwZWNpYWw9YXJncyIpKTsKKyAgICBWbUNvbmZpZyBkZWZhdWx0Vm1Db25maWcgPSBjb25maWd1cmF0aW9uLmdldERlZmF1bHRWbUNvbmZpZyhwbGF0Zm9ybSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikpLCBkZWZhdWx0Vm1Db25maWcudm1Ib21lKCkpOworICAgIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBleHBlY3RlZEFyZ3MgPSBuZXcgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPFN0cmluZz4oKQorICAgICAgICAuYWRkQWxsKE1hbmFnZW1lbnRGYWN0b3J5LmdldFJ1bnRpbWVNWEJlYW4oKS5nZXRJbnB1dEFyZ3VtZW50cygpKQorICAgICAgICAuYWRkKCItdmVyeSIpCisgICAgICAgIC5hZGQoIi1zcGVjaWFsPWFyZ3MiKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBcmdzLCBkZWZhdWx0Vm1Db25maWcub3B0aW9ucygpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdldFZtQ29uZmlnX2Jhc2VEaXJlY3RvcnlBbmROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZSB0ZW1wQmFzZURpciA9IGZvbGRlci5uZXdGb2xkZXIoKTsKKyAgICBGaWxlIGpka0hvbWUgPSBuZXcgRmlsZSh0ZW1wQmFzZURpciwgInRlc3QiKTsKKyAgICBqZGtIb21lLm1rZGlyKCk7CisgICAgQ2FsaXBlckNvbmZpZyBjb25maWd1cmF0aW9uID0gbmV3IENhbGlwZXJDb25maWcoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAidm0uYmFzZURpcmVjdG9yeSIsIHRlbXBCYXNlRGlyLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBWbUNvbmZpZy5CdWlsZGVyKHBsYXRmb3JtLCBqZGtIb21lKS5idWlsZCgpLAorICAgICAgICBjb25maWd1cmF0aW9uLmdldFZtQ29uZmlnKHBsYXRmb3JtLCAidGVzdCIpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdldFZtQ29uZmlnX2Jhc2VEaXJlY3RvcnlBbmRIb21lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZSB0ZW1wQmFzZURpciA9IGZvbGRlci5uZXdGb2xkZXIoKTsKKyAgICBGaWxlIGpka0hvbWUgPSBuZXcgRmlsZSh0ZW1wQmFzZURpciwgInRlc3QtaG9tZSIpOworICAgIGpka0hvbWUubWtkaXIoKTsKKyAgICBDYWxpcGVyQ29uZmlnIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ2FsaXBlckNvbmZpZyhJbW11dGFibGVNYXAub2YoCisgICAgICAgICJ2bS5iYXNlRGlyZWN0b3J5IiwgdGVtcEJhc2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICJ2bS50ZXN0LmhvbWUiLCAidGVzdC1ob21lIikpOworICAgIGFzc2VydEVxdWFscyhuZXcgVm1Db25maWcuQnVpbGRlcihwbGF0Zm9ybSwgamRrSG9tZSkuYnVpbGQoKSwKKyAgICAgICAgY29uZmlndXJhdGlvbi5nZXRWbUNvbmZpZyhwbGF0Zm9ybSwgInRlc3QiKSk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBnZXRWbUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworICAgIEZpbGUgamRrSG9tZSA9IGZvbGRlci5uZXdGb2xkZXIoKTsKKyAgICBDYWxpcGVyQ29uZmlnIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ2FsaXBlckNvbmZpZyhJbW11dGFibGVNYXAub2YoCisgICAgICAgICJ2bS5hcmdzIiwgIi1hIC1iICAgLWMiLAorICAgICAgICAidm0udGVzdC5ob21lIiwgamRrSG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgInZtLnRlc3QuYXJncyIsICIgLWQgICAgIC1lICAgICAiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgVm1Db25maWcuQnVpbGRlcihwbGF0Zm9ybSwgamRrSG9tZSkKKyAgICAgICAgICAgIC5hZGRPcHRpb24oIi1hIikKKyAgICAgICAgICAgIC5hZGRPcHRpb24oIi1iIikKKyAgICAgICAgICAgIC5hZGRPcHRpb24oIi1jIikKKyAgICAgICAgICAgIC5hZGRPcHRpb24oIi1kIikKKyAgICAgICAgICAgIC5hZGRPcHRpb24oIi1lIikKKyAgICAgICAgICAgIC5idWlsZCgpLAorICAgICAgICBjb25maWd1cmF0aW9uLmdldFZtQ29uZmlnKHBsYXRmb3JtLCAidGVzdCIpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdldFZtQ29uZmlnX2VzY2FwZWRTcGFjZXNJbkFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGaWxlIGpka0hvbWUgPSBmb2xkZXIubmV3Rm9sZGVyKCk7CisgICAgQ2FsaXBlckNvbmZpZyBjb25maWd1cmF0aW9uID0gbmV3IENhbGlwZXJDb25maWcoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAidm0uYXJncyIsICItYT1zdHJpbmdcXCB3aXRoXFwgc3BhXFxjZXMgLWIgLWMiLAorICAgICAgICAidm0udGVzdC5ob21lIiwgamRrSG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IFZtQ29uZmlnLkJ1aWxkZXIocGxhdGZvcm0sIGpka0hvbWUpCisgICAgICAgIC5hZGRPcHRpb24oIi1hPXN0cmluZyB3aXRoIHNwYWNlcyIpCisgICAgICAgIC5hZGRPcHRpb24oIi1iIikKKyAgICAgICAgLmFkZE9wdGlvbigiLWMiKQorICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgY29uZmlndXJhdGlvbi5nZXRWbUNvbmZpZyhwbGF0Zm9ybSwgInRlc3QiKSk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBnZXRJbnN0cnVtZW50Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ2FsaXBlckNvbmZpZyBjb25maWd1cmF0aW9uID0gbmV3IENhbGlwZXJDb25maWcoSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAiaW5zdHJ1bWVudC50ZXN0LmNsYXNzIiwgInRlc3QuQ2xhc3NOYW1lIiwKKyAgICAgICAgImluc3RydW1lbnQudGVzdC5vcHRpb25zLmEiLCAiMSIsCisgICAgICAgICJpbnN0cnVtZW50LnRlc3Qub3B0aW9ucy5iIiwgImV4Y2l0ZWQgYiBiIGV4Y2l0ZWQiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgSW5zdHJ1bWVudENvbmZpZy5CdWlsZGVyKCkKKyAgICAgICAgICAgIC5jbGFzc05hbWUoInRlc3QuQ2xhc3NOYW1lIikKKyAgICAgICAgICAgIC5hZGRPcHRpb24oImEiLCAiMSIpCisgICAgICAgICAgICAuYWRkT3B0aW9uKCJiIiwgImV4Y2l0ZWQgYiBiIGV4Y2l0ZWQiKQorICAgICAgICAgICAgLmJ1aWxkKCksCisgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0SW5zdHJ1bWVudENvbmZpZygidGVzdCIpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdldEluc3RydW1lbnRDb25maWdfbm90Q29uZmlndXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIENhbGlwZXJDb25maWcgY29uZmlndXJhdGlvbiA9IG5ldyBDYWxpcGVyQ29uZmlnKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgImluc3RydW1lbnQudGVzdC5vcHRpb25zLmEiLCAiMSIsCisgICAgICAgICJpbnN0cnVtZW50LnRlc3Qub3B0aW9ucy5iIiwgImV4Y2l0ZWQgYiBiIGV4Y2l0ZWQiKSk7CisgICAgdHJ5IHsKKyAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0SW5zdHJ1bWVudENvbmZpZygidGVzdCIpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkge30KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdldENvbmZpZ3VyZWRJbnN0cnVtZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgIENhbGlwZXJDb25maWcgY29uZmlndXJhdGlvbiA9IG5ldyBDYWxpcGVyQ29uZmlnKEltbXV0YWJsZU1hcC5vZigKKyAgICAgICAgImluc3RydW1lbnQudGVzdC5jbGFzcyIsICJ0ZXN0LkNsYXNzTmFtZSIsCisgICAgICAgICJpbnN0cnVtZW50LnRlc3QyLmNsYXNzIiwgInRlc3QuQ2xhc3NOYW1lIiwKKyAgICAgICAgImluc3RydW1lbnQudGVzdDMub3B0aW9ucy5hIiwgIjEiLAorICAgICAgICAiaW5zdHJ1bWVudC50ZXN0NC5jbGFzcyIsICJ0ZXN0LkNsYXNzTmFtZSIsCisgICAgICAgICJpbnN0cnVtZW50LnRlc3Q0Lm9wdGlvbnMuYiIsICJleGNpdGVkIGIgYiBleGNpdGVkIikpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoInRlc3QiLCAidGVzdDIiLCAidGVzdDQiKSwKKyAgICAgICAgY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkSW5zdHJ1bWVudHMoKSk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBnZXRDb25maWd1cmVkUmVzdWx0UHJvY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoKSwKKyAgICAgICAgbmV3IENhbGlwZXJDb25maWcoSW1tdXRhYmxlTWFwLjxTdHJpbmcsIFN0cmluZz5vZigpKS5nZXRDb25maWd1cmVkUmVzdWx0UHJvY2Vzc29ycygpKTsKKyAgICBDYWxpcGVyQ29uZmlnIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ2FsaXBlckNvbmZpZyhJbW11dGFibGVNYXAub2YoCisgICAgICAgICJyZXN1bHRzLnRlc3QuY2xhc3MiLCBUZXN0UmVzdWx0UHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSkpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoVGVzdFJlc3VsdFByb2Nlc3Nvci5jbGFzcyksCisgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZFJlc3VsdFByb2Nlc3NvcnMoKSk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBnZXRSZXN1bHRQcm9jZXNzb3JDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDYWxpcGVyQ29uZmlnIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ2FsaXBlckNvbmZpZyhJbW11dGFibGVNYXAub2YoCisgICAgICAgICJyZXN1bHRzLnRlc3QuY2xhc3MiLCBUZXN0UmVzdWx0UHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgInJlc3VsdHMudGVzdC5vcHRpb25zLmciLCAiYWsiLAorICAgICAgICAicmVzdWx0cy50ZXN0Lm9wdGlvbnMuYyIsICJhbGlwZXIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgUmVzdWx0UHJvY2Vzc29yQ29uZmlnLkJ1aWxkZXIoKQorICAgICAgICAgICAgLmNsYXNzTmFtZShUZXN0UmVzdWx0UHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSkKKyAgICAgICAgICAgIC5hZGRPcHRpb24oImciLCAiYWsiKQorICAgICAgICAgICAgLmFkZE9wdGlvbigiYyIsICJhbGlwZXIiKQorICAgICAgICAgICAgLmJ1aWxkKCksCisgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0UmVzdWx0UHJvY2Vzc29yQ29uZmlnKFRlc3RSZXN1bHRQcm9jZXNzb3IuY2xhc3MpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RSZXN1bHRQcm9jZXNzb3IgaW1wbGVtZW50cyBSZXN1bHRQcm9jZXNzb3IgeworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcHJvY2Vzc1RyaWFsKFRyaWFsIHRyaWFsKSB7fQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9Mb2dnaW5nQ29uZmlnTG9hZGVyVGVzdC5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvTG9nZ2luZ0NvbmZpZ0xvYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDMyMGVmCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9jb25maWcvTG9nZ2luZ0NvbmZpZ0xvYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5sb2dnaW5nLkxldmVsLklORk87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuUnVuOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworCitpbXBvcnQgb3JnLmpvZGEudGltZS5JbnN0YW50OworaW1wb3J0IG9yZy5qb2RhLnRpbWUuZm9ybWF0LklTT0RhdGVUaW1lRm9ybWF0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlbXBvcmFyeUZvbGRlcjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRDYXB0b3I7CitpbXBvcnQgb3JnLm1vY2tpdG8uQ2FwdG9yOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8ucnVubmVycy5Nb2NraXRvSlVuaXRSdW5uZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXI7CisKKy8qKgorICogVGVzdHMge0BsaW5rIExvZ2dpbmdDb25maWdMb2FkZXJ9LgorICovCisKK0BSdW5XaXRoKE1vY2tpdG9KVW5pdFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBMb2dnaW5nQ29uZmlnTG9hZGVyVGVzdCB7CisgIEBSdWxlIHB1YmxpYyBUZW1wb3JhcnlGb2xkZXIgZm9sZGVyID0gbmV3IFRlbXBvcmFyeUZvbGRlcigpOworCisgIEBNb2NrIExvZ01hbmFnZXIgbG9nTWFuYWdlcjsKKyAgQE1vY2sgTG9nZ2VyIGxvZ2dlcjsKKyAgQENhcHRvciBBcmd1bWVudENhcHRvcjxIYW5kbGVyPiBoYW5kbGVyQ2FwdG9yOworCisgIHByaXZhdGUgTG9nZ2luZ0NvbmZpZ0xvYWRlciBsb2FkZXI7CisgIHByaXZhdGUgVVVJRCBydW5JZCA9IFVVSUQucmFuZG9tVVVJRCgpOworICBwcml2YXRlIEluc3RhbnQgc3RhcnRUaW1lID0gbmV3IEluc3RhbnQoKTsKKyAgcHJpdmF0ZSBGaWxlIGNhbGlwZXJEaXJlY3Rvcnk7CisKKyAgQEJlZm9yZSBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5jYWxpcGVyRGlyZWN0b3J5ID0gZm9sZGVyLm5ld0ZvbGRlcigpOworICAgIHRoaXMubG9hZGVyID0gbmV3IExvZ2dpbmdDb25maWdMb2FkZXIoY2FsaXBlckRpcmVjdG9yeSwgbG9nTWFuYWdlciwgbmV3IFJ1bi5CdWlsZGVyKHJ1bklkKQorICAgICAgICAubGFiZWwoImZha2UgcnVuIikKKyAgICAgICAgLnN0YXJ0VGltZShzdGFydFRpbWUpCisgICAgICAgIC5idWlsZCgpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMb2FkRGVmYXVsdExvZ0NvbmZpZ3VyYXRpb24oKQorICAgICAgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgd2hlbihsb2dNYW5hZ2VyLmdldExvZ2dlcigiIikpLnRoZW5SZXR1cm4obG9nZ2VyKTsKKyAgICBsb2FkZXIubWF5YmVMb2FkRGVmYXVsdExvZ0NvbmZpZ3VyYXRpb24obG9nTWFuYWdlcik7CisgICAgdmVyaWZ5KGxvZ01hbmFnZXIpLnJlc2V0KCk7CisgICAgdmVyaWZ5KGxvZ2dlcikuYWRkSGFuZGxlcihoYW5kbGVyQ2FwdG9yLmNhcHR1cmUoKSk7CisgICAgRmlsZUhhbmRsZXIgZmlsZUhhbmRsZXIgPSAoRmlsZUhhbmRsZXIpIGhhbmRsZXJDYXB0b3IuZ2V0VmFsdWUoKTsKKyAgICBhc3NlcnRFcXVhbHMoVVRGXzgubmFtZSgpLCBmaWxlSGFuZGxlci5nZXRFbmNvZGluZygpKTsKKyAgICBhc3NlcnRUcnVlKGZpbGVIYW5kbGVyLmdldEZvcm1hdHRlcigpIGluc3RhbmNlb2YgU2ltcGxlRm9ybWF0dGVyKTsKKyAgICBmaWxlSGFuZGxlci5wdWJsaXNoKG5ldyBMb2dSZWNvcmQoSU5GTywgInNvbWUgbWVzc2FnZSIpKTsKKyAgICBGaWxlIGxvZ0ZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShjYWxpcGVyRGlyZWN0b3J5LCAibG9nIiksCisgICAgICAgIElTT0RhdGVUaW1lRm9ybWF0LmJhc2ljRGF0ZVRpbWVOb01pbGxpcygpLnByaW50KHN0YXJ0VGltZSkgKyAiLiIgKyBydW5JZCArICIubG9nIik7CisgICAgYXNzZXJ0VHJ1ZShsb2dGaWxlLmlzRmlsZSgpKTsKKyAgICBhc3NlcnRUcnVlKEZpbGVzLnRvU3RyaW5nKGxvZ0ZpbGUsIFVURl84KS5jb250YWlucygic29tZSBtZXNzYWdlIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9WbUNvbmZpZ1Rlc3QuamF2YSBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvY29uZmlnL1ZtQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTg4NjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL2NvbmZpZy9WbUNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5jb25maWc7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLmp2bS5Kdm1QbGF0Zm9ybTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogVGVzdHMge0BsaW5rIFZtQ29uZmlnfS4KKyAqCisgKiBAYXV0aG9yIGdha0Bnb29nbGUuY29tIChHcmVnb3J5IEtpY2spCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBWbUNvbmZpZ1Rlc3QgeworCisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGFibGUoKSB7CisgICAgRmlsZSBqYXZhRXhlY3V0YWJsZSA9CisgICAgICAgIG5ldyBWbUNvbmZpZy5CdWlsZGVyKG5ldyBKdm1QbGF0Zm9ybSgpLCBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpKSkKKyAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgLnZtRXhlY3V0YWJsZSgpOworICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kOiAiICsgamF2YUV4ZWN1dGFibGUsIGphdmFFeGVjdXRhYmxlLmV4aXN0cygpKTsKKyAgICBhc3NlcnRUcnVlKGphdmFFeGVjdXRhYmxlICsgIiBpcyBub3QgYSBmaWxlIiwgamF2YUV4ZWN1dGFibGUuaXNGaWxlKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL21lbW9yeS9PYmplY3RHcmFwaE1lYXN1cmVyVGVzdC5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tZW1vcnkvT2JqZWN0R3JhcGhNZWFzdXJlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODg4ZjljCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9tZW1vcnkvT2JqZWN0R3JhcGhNZWFzdXJlclRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIubWVtb3J5OworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1lbW9yeS5PYmplY3RHcmFwaE1lYXN1cmVyLkZvb3RwcmludDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU11bHRpc2V0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworLyoqCisgKiBUZXN0cyBmb3IgT2JqZWN0R3JhcGhNZWFzdXJlci4KKyAqLworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIE9iamVjdEdyYXBoTWVhc3VyZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBlbnVtIER1bW15RW51bSB7CisgICAgVkFMVUU7CisgIH0KKyAgc3RhdGljIGZpbmFsIE9iamVjdCBvbmVFbnVtRmllbGQgPSBuZXcgT2JqZWN0KCkgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEdW1teUVudW0gZW51bUZpZWxkID0gRHVtbXlFbnVtLlZBTFVFOworICB9OworCisgIC8vIGVudW1zIGFyZSB0cmVhdGVkIGFzIHN0YXRpY3MgKGFuZCBpZ25vcmVkKQorICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RW51bSgpIHsKKyAgICBPYmplY3RHcmFwaE1lYXN1cmVyLkZvb3RwcmludCBmb290cHJpbnQgPSBPYmplY3RHcmFwaE1lYXN1cmVyLm1lYXN1cmUob25lRW51bUZpZWxkKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IEZvb3RwcmludCgxLCAxLCAwLCBOT19QUklNSVRJVkVTKSwgZm9vdHByaW50KTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBPYmplY3Qgb25lQ2xhc3NGaWVsZCA9IG5ldyBPYmplY3QoKSB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENsYXNzPD8+IGNsYXp6ID0gT2JqZWN0LmNsYXNzOworICB9OworCisgIC8vIENsYXNzIGluc3RhbmNlcyBhcmUgdHJlYXRlZCBhcyBzdGF0aWNzIChhbmQgaWdub3JlZCkKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdENsYXNzKCkgeworICAgIE9iamVjdEdyYXBoTWVhc3VyZXIuRm9vdHByaW50IGZvb3RwcmludCA9IE9iamVjdEdyYXBoTWVhc3VyZXIubWVhc3VyZShvbmVDbGFzc0ZpZWxkKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IE9iamVjdEdyYXBoTWVhc3VyZXIuRm9vdHByaW50KDEsIDEsIDAsIE5PX1BSSU1JVElWRVMpLCBmb290cHJpbnQpOworICB9CisKKyAgc3RhdGljIGZpbmFsIE9iamVjdCBvbmVPYmplY3RGaWVsZCA9IG5ldyBPYmplY3QoKSB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCBvYmplY3RGaWVsZCA9IG5ldyBPYmplY3QoKTsKKyAgfTsKKworICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0KCkgeworICAgIE9iamVjdEdyYXBoTWVhc3VyZXIuRm9vdHByaW50IGZvb3RwcmludCA9IE9iamVjdEdyYXBoTWVhc3VyZXIubWVhc3VyZShvbmVPYmplY3RGaWVsZCk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBPYmplY3RHcmFwaE1lYXN1cmVyLkZvb3RwcmludCgyLCAxLCAwLCBOT19QUklNSVRJVkVTKSwgZm9vdHByaW50KTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBPYmplY3Qgd2l0aEN5Y2xlID0gbmV3IE9iamVjdCgpIHsKKyAgICBPYmplY3RbXSBhcnJheSA9IG5ldyBPYmplY3RbMV07CisgICAgeworICAgICAgYXJyYXlbMF0gPSB0aGlzOworICAgIH0KKyAgfTsKKworICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q3ljbGUoKSB7CisgICAgT2JqZWN0R3JhcGhNZWFzdXJlci5Gb290cHJpbnQgZm9vdHByaW50ID0gT2JqZWN0R3JhcGhNZWFzdXJlci5tZWFzdXJlKHdpdGhDeWNsZSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBPYmplY3RHcmFwaE1lYXN1cmVyLkZvb3RwcmludCgyLCAyLCAwLCBOT19QUklNSVRJVkVTKSwgZm9vdHByaW50KTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBPYmplY3QgbXVsdGlwbGVQYXRoc1RvT2JqZWN0ID0gbmV3IE9iamVjdCgpIHsKKyAgICBPYmplY3Qgb2JqZWN0ID0gbmV3IE9iamVjdCgpOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgcmVmMSA9IG9iamVjdDsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHJlZjIgPSBvYmplY3Q7CisgIH07CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUGF0aHNUb09iamVjdCgpIHsKKyAgICBPYmplY3RHcmFwaE1lYXN1cmVyLkZvb3RwcmludCBmb290cHJpbnQgPSBPYmplY3RHcmFwaE1lYXN1cmVyLm1lYXN1cmUobXVsdGlwbGVQYXRoc1RvT2JqZWN0KTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IE9iamVjdEdyYXBoTWVhc3VyZXIuRm9vdHByaW50KDIsIDMsIDAsIE5PX1BSSU1JVElWRVMpLCBmb290cHJpbnQpOworICB9CisKKyAgc3RhdGljIGZpbmFsIE9iamVjdCBtdWx0aXBsZVBhdGhzVG9DbGFzcyA9IG5ldyBPYmplY3QoKSB7CisgICAgT2JqZWN0IG9iamVjdCA9IE9iamVjdC5jbGFzczsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHJlZjEgPSBvYmplY3Q7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCByZWYyID0gb2JqZWN0OworICB9OworCisgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVBhdGhzVG9DbGFzcygpIHsKKyAgICBPYmplY3RHcmFwaE1lYXN1cmVyLkZvb3RwcmludCBmb290cHJpbnQgPSBPYmplY3RHcmFwaE1lYXN1cmVyLm1lYXN1cmUobXVsdGlwbGVQYXRoc1RvQ2xhc3MpOworICAgIGFzc2VydEVxdWFscyhuZXcgT2JqZWN0R3JhcGhNZWFzdXJlci5Gb290cHJpbnQoMSwgMywgMCwgTk9fUFJJTUlUSVZFUyksIGZvb3RwcmludCk7CisgIH0KKworICBzdGF0aWMgY2xhc3MgV2l0aFN0YXRpY0ZpZWxkIHsKKyAgICBzdGF0aWMgV2l0aFN0YXRpY0ZpZWxkIElOU1RBTkNFID0gbmV3IFdpdGhTdGF0aWNGaWVsZCgpOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFN0YXRpY0ZpZWxkcygpIHsKKyAgICBPYmplY3RHcmFwaE1lYXN1cmVyLkZvb3RwcmludCBmb290cHJpbnQgPSBPYmplY3RHcmFwaE1lYXN1cmVyLm1lYXN1cmUobmV3IFdpdGhTdGF0aWNGaWVsZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IE9iamVjdEdyYXBoTWVhc3VyZXIuRm9vdHByaW50KDEsIDAsIDAsIE5PX1BSSU1JVElWRVMpLCBmb290cHJpbnQpOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIC8vIHVudXNlZCB0ZXN0IGZpZWxkcworICBzdGF0aWMgZmluYWwgT2JqZWN0IG9uZU51bGxPbmVOb25OdWxsID0gbmV3IE9iamVjdCgpIHsKKyAgICBPYmplY3Qgbm9uTnVsbDEgPSBuZXcgT2JqZWN0KCk7CisgICAgT2JqZWN0IG5vbk51bGwyID0gbm9uTnVsbDE7CisgICAgT2JqZWN0IG51bGwxID0gbnVsbDsKKyAgICBPYmplY3QgbnVsbDIgPSBudWxsOworICAgIE9iamVjdCBudWxsMyA9IG51bGw7CisgIH07CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdE51bGxGaWVsZCgpIHsKKyAgICBPYmplY3RHcmFwaE1lYXN1cmVyLkZvb3RwcmludCBmb290cHJpbnQgPSBPYmplY3RHcmFwaE1lYXN1cmVyLm1lYXN1cmUob25lTnVsbE9uZU5vbk51bGwpOworICAgIGFzc2VydEVxdWFscyhuZXcgT2JqZWN0R3JhcGhNZWFzdXJlci5Gb290cHJpbnQoMiwgMiwgMywgTk9fUFJJTUlUSVZFUyksIGZvb3RwcmludCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVNdWx0aXNldDxDbGFzczw/Pj4gTk9fUFJJTUlUSVZFUyA9IEltbXV0YWJsZU11bHRpc2V0Lm9mKCk7Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvUGFyc2VkT3B0aW9uc1Rlc3QuamF2YSBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvb3B0aW9ucy9QYXJzZWRPcHRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDY3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL29wdGlvbnMvUGFyc2VkT3B0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5EaXNwbGF5VXNhZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuSW52YWxpZENvbW1hbmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuU2hvcnREdXJhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCisKK3B1YmxpYyBjbGFzcyBQYXJzZWRPcHRpb25zVGVzdCB7CisgIHByaXZhdGUgRmlsZSB0ZW1wRGlyOworCisgIEBCZWZvcmUgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRlbXBEaXIgPSBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgbWFrZVRlc3RWbVRyZWUodGVtcERpcik7CisgIH0KKworICBAQWZ0ZXIgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICh0ZW1wRGlyICE9IG51bGwpIHsKKyAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHsicm0iLCAiLXJmIiwgdGVtcERpci5nZXRDYW5vbmljYWxQYXRoKCl9KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIG1ha2VUZXN0Vm1UcmVlKEZpbGUgYmFzZURpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIGJpbiA9IG5ldyBGaWxlKGJhc2VEaXIsICJ0ZXN0Vm0vYmluIik7CisgICAgYmluLm1rZGlycygpOworICAgIEZpbGUgamF2YSA9IG5ldyBGaWxlKGJpbiwgImphdmEiKTsKKyAgICBGaWxlcy50b3VjaChqYXZhKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb09wdGlvbnNfUmVxdWlyZUJlbmNobWFya0NsYXNzTmFtZSgpIHsKKyAgICB0cnkgeworICAgICAgUGFyc2VkT3B0aW9ucy5mcm9tKG5ldyBTdHJpbmdbXSB7fSwgdHJ1ZSk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoSW52YWxpZENvbW1hbmRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgIGFzc2VydEVxdWFscygiTm8gYmVuY2htYXJrIGNsYXNzIHNwZWNpZmllZCIsIGV4cGVjdGVkLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFRvb01hbnlBcmd1bWVudHNfUmVxdWlyZUJlbmNobWFya0NsYXNzTmFtZSgpIHsKKyAgICB0cnkgeworICAgICAgUGFyc2VkT3B0aW9ucy5mcm9tKG5ldyBTdHJpbmdbXSB7ImEiLCAiYiJ9LCB0cnVlKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQ29tbWFuZEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJFeHRyYSBzdHVmZiwgZXhwZWN0ZWQgb25seSBjbGFzcyBuYW1lOiBbYSwgYl0iLCBleHBlY3RlZC5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb29NYW55QXJndW1lbnRzX0RvTm90UmVxdWlyZUJlbmNobWFya0NsYXNzTmFtZSgpIHsKKyAgICB0cnkgeworICAgICAgUGFyc2VkT3B0aW9ucy5mcm9tKG5ldyBTdHJpbmdbXSB7ImEiLCAiYiJ9LCBmYWxzZSk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoSW52YWxpZENvbW1hbmRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgIGFzc2VydEVxdWFscygiRXh0cmEgc3R1ZmYsIGRpZCBub3QgZXhwZWN0IG5vbi1vcHRpb24gYXJndW1lbnRzOiBbYSwgYl0iLAorICAgICAgICAgIGV4cGVjdGVkLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEhlbHAoKSB0aHJvd3MgSW52YWxpZENvbW1hbmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBQYXJzZWRPcHRpb25zLmZyb20obmV3IFN0cmluZ1tdIHsiLS1oZWxwIn0sIHRydWUpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKERpc3BsYXlVc2FnZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgIH0KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0c19SZXF1aXJlQmVuY2htYXJrQ2xhc3NOYW1lKCkgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICBDYWxpcGVyT3B0aW9ucyBvcHRpb25zID0gUGFyc2VkT3B0aW9ucy5mcm9tKG5ldyBTdHJpbmdbXSB7Q0xBU1NfTkFNRX0sIHRydWUpOworCisgICAgYXNzZXJ0RXF1YWxzKENMQVNTX05BTUUsIG9wdGlvbnMuYmVuY2htYXJrQ2xhc3NOYW1lKCkpOworICAgIGNoZWNrRGVmYXVsdHMob3B0aW9ucyk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHNfRG9Ob3RSZXF1aXJlQmVuY2htYXJrQ2xhc3NOYW1lKCkgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICBDYWxpcGVyT3B0aW9ucyBvcHRpb25zID0gUGFyc2VkT3B0aW9ucy5mcm9tKG5ldyBTdHJpbmdbXSB7fSwgZmFsc2UpOworCisgICAgYXNzZXJ0TnVsbChvcHRpb25zLmJlbmNobWFya0NsYXNzTmFtZSgpKTsKKyAgICBjaGVja0RlZmF1bHRzKG9wdGlvbnMpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrRGVmYXVsdHMoQ2FsaXBlck9wdGlvbnMgb3B0aW9ucykgeworICAgIGFzc2VydFRydWUob3B0aW9ucy5iZW5jaG1hcmtNZXRob2ROYW1lcygpLmlzRW1wdHkoKSk7CisgICAgYXNzZXJ0RmFsc2Uob3B0aW9ucy5kcnlSdW4oKSk7CisgICAgSW1tdXRhYmxlU2V0PFN0cmluZz4gZXhwZWN0ZWRJbnN0cnVtZW50cyA9IG5ldyBJbW11dGFibGVTZXQuQnVpbGRlcjxTdHJpbmc+KCkKKyAgICAgICAgLmFkZCgiYWxsb2NhdGlvbiIpCisgICAgICAgIC5hZGQoInJ1bnRpbWUiKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRJbnN0cnVtZW50cywgb3B0aW9ucy5pbnN0cnVtZW50TmFtZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG9wdGlvbnMudHJpYWxzUGVyU2NlbmFyaW8oKSk7CisgICAgYXNzZXJ0VHJ1ZShvcHRpb25zLnVzZXJQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsKKyAgICBhc3NlcnRGYWxzZShvcHRpb25zLnByaW50Q29uZmlndXJhdGlvbigpKTsKKyAgICBhc3NlcnRUcnVlKG9wdGlvbnMudm1Bcmd1bWVudHMoKS5pc0VtcHR5KCkpOworICAgIGFzc2VydEVxdWFscygwLCBvcHRpb25zLnZtTmFtZXMoKS5zaXplKCkpOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEtpdGNoZW5TaW5rKCkgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uIHsKKyAgICBTdHJpbmdbXSBhcmdzID0geworICAgICAgICAiLS1iZW5jaG1hcms9Zm9vO2JhcjtxdXgiLAorICAgICAgICAiLS1pbnN0cnVtZW50PXRlc3RJbnN0cnVtZW50IiwKKyAgICAgICAgIi0tZGlyZWN0b3J5PS9wYXRoL3RvL3NvbWUvZGlyIiwKKyAgICAgICAgIi0tdHJpYWxzPTIiLAorICAgICAgICAiLS10aW1lLWxpbWl0PTE1cyIsCisgICAgICAgICItRHg9YTtiO2MiLAorICAgICAgICAiLUR5PWI7ZCIsCisgICAgICAgICItQ3NvbWUucHJvcGVydHk9dmFsdWUiLAorICAgICAgICAiLUNzb21lLm90aGVyLnByb3BlcnR5PW90aGVyLXZhbHVlIiwKKyAgICAgICAgIi0tcHJpbnQtY29uZmlnIiwKKyAgICAgICAgIi1KbWVtb3J5TWF4PS1YbXgzMm07LVhteDY0bSIsCisgICAgICAgICItLXZtPXRlc3RWbSIsCisgICAgICAgICItLWRlbGltaXRlcj07IiwKKyAgICAgICAgQ0xBU1NfTkFNRSwKKyAgICB9OworICAgIENhbGlwZXJPcHRpb25zIG9wdGlvbnMgPSBQYXJzZWRPcHRpb25zLmZyb20oYXJncywgdHJ1ZSk7CisKKyAgICBhc3NlcnRFcXVhbHMoQ0xBU1NfTkFNRSwgb3B0aW9ucy5iZW5jaG1hcmtDbGFzc05hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiZm9vIiwgImJhciIsICJxdXgiKSwgb3B0aW9ucy5iZW5jaG1hcmtNZXRob2ROYW1lcygpKTsKKyAgICBhc3NlcnRGYWxzZShvcHRpb25zLmRyeVJ1bigpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJ0ZXN0SW5zdHJ1bWVudCIpLCBvcHRpb25zLmluc3RydW1lbnROYW1lcygpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi9wYXRoL3RvL3NvbWUvZGlyIiksIG9wdGlvbnMuY2FsaXBlckRpcmVjdG9yeSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgb3B0aW9ucy50cmlhbHNQZXJTY2VuYXJpbygpKTsKKyAgICBhc3NlcnRFcXVhbHMoU2hvcnREdXJhdGlvbi5vZigxNSwgU0VDT05EUyksIG9wdGlvbnMudGltZUxpbWl0KCkpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXRNdWx0aW1hcC5vZigieCIsICJhIiwgIngiLCAiYiIsICJ4IiwgImMiLCAieSIsICJiIiwgInkiLCAiZCIpLAorICAgICAgICBvcHRpb25zLnVzZXJQYXJhbWV0ZXJzKCkpOworICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVNYXAub2YoInNvbWUucHJvcGVydHkiLCAidmFsdWUiLCAic29tZS5vdGhlci5wcm9wZXJ0eSIsICJvdGhlci12YWx1ZSIpLAorICAgICAgICBvcHRpb25zLmNvbmZpZ1Byb3BlcnRpZXMoKSk7CisgICAgYXNzZXJ0VHJ1ZShvcHRpb25zLnByaW50Q29uZmlndXJhdGlvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0TXVsdGltYXAub2YoIm1lbW9yeU1heCIsICItWG14MzJtIiwgIm1lbW9yeU1heCIsICItWG14NjRtIiksCisgICAgICAgIG9wdGlvbnMudm1Bcmd1bWVudHMoKSk7CisKKyAgICBTdHJpbmcgdm1OYW1lID0gSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KG9wdGlvbnMudm1OYW1lcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoInRlc3RWbSIsIHZtTmFtZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEZha2VCZW5jaG1hcmsge30KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9IEZha2VCZW5jaG1hcmsuY2xhc3MuZ2V0TmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQWxsb2NhdGlvbkluc3RydW1lbnRUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9BbGxvY2F0aW9uSW5zdHJ1bWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTg2YWEwCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQWxsb2NhdGlvbkluc3RydW1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVmb3JlRXhwZXJpbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuVm1Db25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5UcmlhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLmp2bS5Kdm1QbGF0Zm9ybTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgQWxsb2NhdGlvbkluc3RydW1lbnR9LgorICovCisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBbGxvY2F0aW9uSW5zdHJ1bWVudFRlc3QgeworCisgIEBSdWxlIHB1YmxpYyBDYWxpcGVyVGVzdFdhdGNoZXIgcnVubmVyID0gbmV3IENhbGlwZXJUZXN0V2F0Y2hlcigpOworCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdldEV4dHJhQ29tbWFuZExpbmVBcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWxsb2NhdGlvbkluc3RydW1lbnQgaW5zdHJ1bWVudCA9IG5ldyBBbGxvY2F0aW9uSW5zdHJ1bWVudCgpOworICAgIEZpbGUgZmFrZUphciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImZha2UiLCAiamFyIik7CisgICAgZmFrZUphci5kZWxldGVPbkV4aXQoKTsKKyAgICBpbnN0cnVtZW50LnNldE9wdGlvbnMoSW1tdXRhYmxlTWFwLm9mKCJhbGxvY2F0aW9uQWdlbnRKYXIiLCBmYWtlSmFyLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgSW1tdXRhYmxlU2V0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8U3RyaW5nPigpCisgICAgICAgIC5hZGRBbGwoSnZtUGxhdGZvcm0uSU5TVFJVTUVOVF9KVk1fQVJHUykKKyAgICAgICAgLmFkZCgiLVhpbnQiKQorICAgICAgICAuYWRkKCItamF2YWFnZW50OiIgKyBmYWtlSmFyLmdldEFic29sdXRlUGF0aCgpKQorICAgICAgICAuYWRkKCItWGJvb3RjbGFzc3BhdGgvYToiICsgZmFrZUphci5nZXRBYnNvbHV0ZVBhdGgoKSkKKyAgICAgICAgLmFkZCgiLURzdW4ucmVmbGVjdC5pbmZsYXRpb25UaHJlc2hvbGQ9MCIpCisgICAgICAgIC5idWlsZCgpOworICAgIFBsYXRmb3JtIHBsYXRmb3JtID0gbmV3IEp2bVBsYXRmb3JtKCk7CisgICAgVm1Db25maWcgdm1Db25maWcgPSBuZXcgVm1Db25maWcuQnVpbGRlcihwbGF0Zm9ybSwgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSkpCisgICAgICAgIC5idWlsZCgpOworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgaW5zdHJ1bWVudC5nZXRFeHRyYUNvbW1hbmRMaW5lQXJncyh2bUNvbmZpZykpOworICAgIGZha2VKYXIuZGVsZXRlKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBpbnRyaW5zaWNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcnVubmVyLmZvckJlbmNobWFyayhBcnJheUxpc3RHcm93dGhCZW5jaG1hcmsuY2xhc3MpCisgICAgICAgIC5pbnN0cnVtZW50KCJhbGxvY2F0aW9uIikKKyAgICAgICAgLnJ1bigpOworICAgIFRyaWFsIHRyaWFsID0gSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KHJ1bm5lci50cmlhbHMoKSk7CisgICAgSW1tdXRhYmxlTGlzdE11bHRpbWFwPFN0cmluZywgTWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50c0J5RGVzY3JpcHRpb24gPQorICAgICAgICBNZWFzdXJlbWVudC5pbmRleEJ5RGVzY3JpcHRpb24odHJpYWwubWVhc3VyZW1lbnRzKCkpOworICAgIC8vIDE0IG9iamVjdHMgYW5kIDE5NjAgYnl0ZXMgYXJlIHRoZSBrbm93biB2YWx1ZXMgZm9yIGdyb3dpbmcgYW4gQXJyYXlMaXN0IGZyb20gMSBlbGVtZW50IHRvIDEwMAorICAgIC8vIGVsZW1lbnRzCisgICAgZm9yIChNZWFzdXJlbWVudCBvYmplY3RNZWFzdXJlbWVudCA6IG1lYXN1cmVtZW50c0J5RGVzY3JpcHRpb24uZ2V0KCJvYmplY3RzIikpIHsKKyAgICAgIGFzc2VydEVxdWFscygxNC4wLCBvYmplY3RNZWFzdXJlbWVudC52YWx1ZSgpLm1hZ25pdHVkZSgpIC8gb2JqZWN0TWVhc3VyZW1lbnQud2VpZ2h0KCksIDAuMDAxKTsKKyAgICB9CisgICAgZm9yIChNZWFzdXJlbWVudCBieXRlTWVhc3VyZW1lbnQgOiBtZWFzdXJlbWVudHNCeURlc2NyaXB0aW9uLmdldCgiYnl0ZXMiKSkgeworICAgICAgYXNzZXJ0RXF1YWxzKDE5NjAuMCwgYnl0ZU1lYXN1cmVtZW50LnZhbHVlKCkubWFnbml0dWRlKCkgLyBieXRlTWVhc3VyZW1lbnQud2VpZ2h0KCksIDAuMDAxKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RCZW5jaG1hcmsgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOworICAgIEBCZW5jaG1hcmsgcHVibGljIGludCBjb21wcmVzc2lvblNpemUoaW50IHJlcHMpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgIGxpc3QuYWRkKG5ldyBPYmplY3QoKSk7CisgICAgICB9CisgICAgICBpbnQgaGFzaENvZGUgPSBsaXN0Lmhhc2hDb2RlKCk7CisgICAgICBsaXN0LmNsZWFyKCk7CisgICAgICByZXR1cm4gaGFzaENvZGU7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBcnJheUxpc3RHcm93dGhCZW5jaG1hcmsgeworICAgIEBCZWZvcmVFeHBlcmltZW50IHZvaWQgd2FybVVwKCkgeworICAgICAgLy8gZW5zdXJlIHRoYXQgaG90c3BvdCBoYXMgY29tcGlsZWQgdGhpcyBjb2RlCisgICAgICBiZW5jaG1hcmtHcm93dGgoMTAwMDAwKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrIHZvaWQgYmVuY2htYXJrR3Jvd3RoKGludCByZXBzKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSgxKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDA7IGorKykgeworICAgICAgICAgIGxpc3QuYWRkKCIiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQXJiaXRyYXJ5TWVhc3VybWVudEluc3RydW1lbnRUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9BcmJpdHJhcnlNZWFzdXJtZW50SW5zdHJ1bWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTdmOThjCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQXJiaXRyYXJ5TWVhc3VybWVudEluc3RydW1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm1vZGVsLkFyYml0cmFyeU1lYXN1cmVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuVmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCisvKioKKyAqIEludGVncmF0aW9uIHRlc3RzIGZvciB0aGUge0BsaW5rIEFyYml0cmFyeU1lYXN1cmVtZW50SW5zdHJ1bWVudH0KKyAqLworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEFyYml0cmFyeU1lYXN1cm1lbnRJbnN0cnVtZW50VGVzdCB7CisgIEBSdWxlIHB1YmxpYyBDYWxpcGVyVGVzdFdhdGNoZXIgcnVubmVyID0gbmV3IENhbGlwZXJUZXN0V2F0Y2hlcigpOworCisgIEBUZXN0CisKKyAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBydW5uZXIuZm9yQmVuY2htYXJrKFRlc3RCZW5jaG1hcmsuY2xhc3MpCisgICAgICAgIC5pbnN0cnVtZW50KCJhcmJpdHJhcnkiKQorICAgICAgICAucnVuKCk7CisgICAgTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQgPSBJdGVyYWJsZXMuZ2V0T25seUVsZW1lbnQoCisgICAgICAgIEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChydW5uZXIudHJpYWxzKCkpLm1lYXN1cmVtZW50cygpKTsKKyAgICBNZWFzdXJlbWVudCBleHBlY3RlZCA9IG5ldyBNZWFzdXJlbWVudC5CdWlsZGVyKCkKKyAgICAgICAgLmRlc2NyaXB0aW9uKCJmYWtlIG1lYXN1cm1lbnQiKQorICAgICAgICAud2VpZ2h0KDEpCisgICAgICAgIC52YWx1ZShWYWx1ZS5jcmVhdGUoMS4wLCAiaHoiKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBtZWFzdXJlbWVudCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RCZW5jaG1hcmsgeworICAgIEBBcmJpdHJhcnlNZWFzdXJlbWVudCh1bml0cyA9ICJoeiIsIGRlc2NyaXB0aW9uID0gImZha2UgbWVhc3VybWVudCIpCisgICAgcHVibGljIGRvdWJsZSBjb21wcmVzc2lvblNpemUoKSB7CisgICAgICByZXR1cm4gMS4wOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmFkVXNlckNvZGVUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CYWRVc2VyQ29kZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzEyMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmFkVXNlckNvZGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVmb3JlRXhwZXJpbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogSW50ZWdyYXRpb24gdGVzdHMgZm9yIG1pc2JlaGF2aW5nIGJlbmNobWFya3MuCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCYWRVc2VyQ29kZVRlc3QgeworICBAUnVsZSBwdWJsaWMgQ2FsaXBlclRlc3RXYXRjaGVyIHJ1bm5lciA9IG5ldyBDYWxpcGVyVGVzdFdhdGNoZXIoKTsKKworICBAVGVzdAorCisgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25JbkluaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcnVubmVyLmZvckJlbmNobWFyayhFeGNlcHRpb25JbkluaXRCZW5jaG1hcmsuY2xhc3MpLnJ1bigpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKFVzZXJDb2RlRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0aHJvd1NvbWVVc2VyRXhjZXB0aW9uKCkgeworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgIH0KKworICBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uSW5Jbml0QmVuY2htYXJrIHsKKyAgICBzdGF0aWMgeworICAgICAgdGhyb3dTb21lVXNlckV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsgdm9pZCB0aW1lU29tZXRoaW5nKGludCByZXBzKSB7CisgICAgICBmYWlsKCIiICsgcmVwcyk7CisgICAgfQorICB9CisKKyAgQFRlc3QKKworICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uSW5Db25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBydW5uZXIuZm9yQmVuY2htYXJrKEV4Y2VwdGlvbkluQ29uc3RydWN0b3JCZW5jaG1hcmsuY2xhc3MpLnJ1bigpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKFVzZXJDb2RlRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICB9CisKKyAgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkluQ29uc3RydWN0b3JCZW5jaG1hcmsgeworICAgIEV4Y2VwdGlvbkluQ29uc3RydWN0b3JCZW5jaG1hcmsoKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsgdm9pZCB0aW1lU29tZXRoaW5nKGludCByZXBzKSB7CisgICAgICBmYWlsKCIiICsgcmVwcyk7CisgICAgfQorICB9CisKKyAgQFRlc3QKKworICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uSW5NZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcnVubmVyLmZvckJlbmNobWFyayhFeGNlcHRpb25Jbk1ldGhvZEJlbmNobWFyay5jbGFzcykucnVuKCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoVXNlckNvZGVFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisgIH0KKworICBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uSW5NZXRob2RCZW5jaG1hcmsgeworICAgIEBCZW5jaG1hcmsgdm9pZCB0aW1lU29tZXRoaW5nKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgcmVwcykgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICBAVGVzdAorCisgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25Jbk1ldGhvZF9ub3RJbkRyeVJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBydW5uZXIuZm9yQmVuY2htYXJrKEV4Y2VwdGlvbkxhdGVJbk1ldGhvZEJlbmNobWFyay5jbGFzcykucnVuKCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoUHJveHlXb3JrZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKEV4Y2VwdGlvbkxhdGVJbk1ldGhvZEJlbmNobWFyay5jbGFzcy5nZXROYW1lKCkpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTGF0ZUluTWV0aG9kQmVuY2htYXJrIHsKKyAgICBAQmVuY2htYXJrIHZvaWQgdGltZVNvbWV0aGluZyhpbnQgcmVwcykgeworICAgICAgaWYgKHJlcHMgPiAxKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQFRlc3QKKworICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uSW5TZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBydW5uZXIuZm9yQmVuY2htYXJrKEV4Y2VwdGlvbkluU2V0VXBCZW5jaG1hcmsuY2xhc3MpLnJ1bigpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKFVzZXJDb2RlRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICB9CisKKyAgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkluU2V0VXBCZW5jaG1hcmsgeworICAgIEBCZWZvcmVFeHBlcmltZW50IHZvaWQgc2V0VXAoKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsgdm9pZCB0aW1lU29tZXRoaW5nKGludCByZXBzKSB7CisgICAgICBmYWlsKCIiICsgcmVwcyk7CisgICAgfQorICB9CisKKyAgQFRlc3QKKworICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRGV0ZXJtaW5pc3RpY0FsbG9jYXRpb25fbm9UcmFja0FsbG9jYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJ1bm5lci5mb3JCZW5jaG1hcmsoTm9uRGV0ZXJtaW5pc3RpY0FsbG9jYXRpb25CZW5jaG1hcmsuY2xhc3MpCisgICAgICAgICAgLmluc3RydW1lbnQoImFsbG9jYXRpb24iKQorICAgICAgICAgIC5vcHRpb25zKCItQ2luc3RydW1lbnQuYWxsb2NhdGlvbi5vcHRpb25zLnRyYWNrQWxsb2NhdGlvbnM9IiArIGZhbHNlKQorICAgICAgICAgIC5ydW4oKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChQcm94eVdvcmtlckV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiWW91ciBiZW5jaG1hcmsgYXBwZWFycyB0byBoYXZlIG5vbi1kZXRlcm1pbmlzdGljIGFsbG9jYXRpb24gYmVoYXZpb3IiOworICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgIiArIGV4cGVjdGVkLmdldE1lc3NhZ2UoKSArICIgdG8gY29udGFpbiAiICsgbWVzc2FnZSwKKyAgICAgICAgICBleHBlY3RlZC5nZXRNZXNzYWdlKCkuY29udGFpbnMobWVzc2FnZSkpOworICAgIH0KKyAgfQorCisgIEBUZXN0CisKKyAgcHVibGljIHZvaWQgdGVzdE5vbkRldGVybWluaXN0aWNBbGxvY2F0aW9uX3RyYWNrQWxsb2NhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcnVubmVyLmZvckJlbmNobWFyayhOb25EZXRlcm1pbmlzdGljQWxsb2NhdGlvbkJlbmNobWFyay5jbGFzcykKKyAgICAgICAgICAuaW5zdHJ1bWVudCgiYWxsb2NhdGlvbiIpCisgICAgICAgICAgLm9wdGlvbnMoIi1DaW5zdHJ1bWVudC5hbGxvY2F0aW9uLm9wdGlvbnMudHJhY2tBbGxvY2F0aW9ucz0iICsgdHJ1ZSkKKyAgICAgICAgICAucnVuKCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoUHJveHlXb3JrZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgIFN0cmluZyBtZXNzYWdlID0gIllvdXIgYmVuY2htYXJrIGFwcGVhcnMgdG8gaGF2ZSBub24tZGV0ZXJtaW5pc3RpYyBhbGxvY2F0aW9uIGJlaGF2aW9yIjsKKyAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkICIgKyBleHBlY3RlZC5nZXRNZXNzYWdlKCkgKyAiIHRvIGNvbnRhaW4gIiArIG1lc3NhZ2UsCisgICAgICAgICAgZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKG1lc3NhZ2UpKTsKKyAgICB9CisgIH0KKworICAvKiogVGhlIG51bWJlciBvZiBhbGxvY2F0aW9ucyBpcyBub24gZGV0ZXJtaW5pc3RpYyBiZWNhdXNlIGl0IGRlcGVuZHMgb24gc3RhdGljIHN0YXRlLiAqLworICBzdGF0aWMgY2xhc3MgTm9uRGV0ZXJtaW5pc3RpY0FsbG9jYXRpb25CZW5jaG1hcmsgeworICAgIHN0YXRpYyBpbnQgdGltZUNvdW50ID0gMDsKKyAgICAvLyBXZSBkdW1wIGl0ZW1zIGludG8gdGhpcyBsaXN0IHNvIHRoZSBqaXQgY2Fubm90IHJlbW92ZSB0aGUgYWxsb2NhdGlvbnMKKyAgICBzdGF0aWMgTGlzdDxPYmplY3Q+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBAQmVuY2htYXJrIGludCB0aW1lU29tZXRoaW5nRkJaKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgcmVwcykgeworICAgICAgdGltZUNvdW50Kys7CisgICAgICBpZiAodGltZUNvdW50ICUgMiA9PSAwKSB7CisgICAgICAgIGxpc3QuYWRkKG5ldyBPYmplY3QoKSk7CisgICAgICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy5oYXNoQ29kZSgpOworICAgIH0KKyAgfQorCisgIEBUZXN0CisKKyAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhOb25EZXRlcm1pbmlzdGljQWxsb2NhdGlvbl9ub1RyYWNrQWxsb2NhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBXaXRob3V0IHRyYWNrQWxsb2NhdGlvbnMgZW5hYmxlZCB0aGlzIGtpbmQgb2Ygbm9uLWRldGVybWluaXNtIGNhbm5vdCBiZSBkZXRlY3RlZC4KKyAgICBydW5uZXIuZm9yQmVuY2htYXJrKENvbXBsZXhOb25EZXRlcm1pbmlzdGljQWxsb2NhdGlvbkJlbmNobWFyay5jbGFzcykKKyAgICAgICAgLmluc3RydW1lbnQoImFsbG9jYXRpb24iKQorICAgICAgICAub3B0aW9ucygiLUNpbnN0cnVtZW50LmFsbG9jYXRpb24ub3B0aW9ucy50cmFja0FsbG9jYXRpb25zPSIgKyBmYWxzZSkKKyAgICAgICAgLnJ1bigpOworICB9CisKKyAgQFRlc3QKKworICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleE5vbkRldGVybWluaXN0aWNBbGxvY2F0aW9uX3RyYWNrQWxsb2NhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcnVubmVyLmZvckJlbmNobWFyayhDb21wbGV4Tm9uRGV0ZXJtaW5pc3RpY0FsbG9jYXRpb25CZW5jaG1hcmsuY2xhc3MpCisgICAgICAgICAgLmluc3RydW1lbnQoImFsbG9jYXRpb24iKQorICAgICAgICAgIC5vcHRpb25zKCItQ2luc3RydW1lbnQuYWxsb2NhdGlvbi5vcHRpb25zLnRyYWNrQWxsb2NhdGlvbnM9IiArIHRydWUpCisgICAgICAgICAgLnJ1bigpOworICAgIH0gY2F0Y2ggKFByb3h5V29ya2VyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJZb3VyIGJlbmNobWFyayBhcHBlYXJzIHRvIGhhdmUgbm9uLWRldGVybWluaXN0aWMgYWxsb2NhdGlvbiBiZWhhdmlvciI7CisgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCAiICsgZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpICsgIiB0byBjb250YWluICIgKyBtZXNzYWdlLAorICAgICAgICAgIGV4cGVjdGVkLmdldE1lc3NhZ2UoKS5jb250YWlucyhtZXNzYWdlKSk7CisgICAgfQorICB9CisKKyAgLyoqIEJlbmNobWFyayBhbGxvY2F0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIHRoaW5ncyBlYWNoIHRpbWUgYnV0IGluIGEgZGlmZmVyZW50IHdheS4gKi8KKyAgc3RhdGljIGNsYXNzIENvbXBsZXhOb25EZXRlcm1pbmlzdGljQWxsb2NhdGlvbkJlbmNobWFyayB7CisgICAgc3RhdGljIGludCB0aW1lQ291bnQgPSAwOworICAgIEBCZW5jaG1hcmsgaW50IHRpbWVTb21ldGhpbmdGQlooQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCByZXBzKSB7CisgICAgICAvLyBXZSBkdW1wIGl0ZW1zIGludG8gdGhpcyBsaXN0IHNvIHRoZSBqaXQgY2Fubm90IHJlbW92ZSB0aGUgYWxsb2NhdGlvbnMKKyAgICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICB0aW1lQ291bnQrKzsKKyAgICAgIGlmICh0aW1lQ291bnQgJSAyID09IDApIHsKKyAgICAgICAgbGlzdC5hZGQobmV3IE9iamVjdCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxpc3QuYWRkKG5ldyBPYmplY3QoKSk7CisgICAgICB9CisgICAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ2xhc3NDaGVja2VyVGVzdC5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ2xhc3NDaGVja2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MzA1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CZW5jaG1hcmtDbGFzc0NoZWNrZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5NYWNyb2JlbmNobWFyazsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgQmVuY2htYXJrQ2xhc3NDaGVja2VyfS4KKyAqLworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQmVuY2htYXJrQ2xhc3NDaGVja2VyVGVzdCB7CisKKyAgcHJpdmF0ZSBCZW5jaG1hcmtDbGFzc0NoZWNrZXIgYmVuY2htYXJrQ2xhc3NDaGVja2VyID0KKyAgICAgIEJlbmNobWFya0NsYXNzQ2hlY2tlci5jcmVhdGUoQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKSk7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE5vQmVuY2htYXJrTWV0aG9kcygpIHsKKyAgICBhc3NlcnRGYWxzZShiZW5jaG1hcmtDbGFzc0NoZWNrZXIuaXNCZW5jaG1hcmsoT2JqZWN0LmNsYXNzKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QmVuY2htYXJrQW5ub3RhdGVkTWV0aG9kKCkgeworICAgIGFzc2VydFRydWUoYmVuY2htYXJrQ2xhc3NDaGVja2VyLmlzQmVuY2htYXJrKEJlbmNobWFya0Fubm90YXRlZE1ldGhvZC5jbGFzcykpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBCZW5jaG1hcmtBbm5vdGF0ZWRNZXRob2QgeworICAgIEBCZW5jaG1hcmsgdm9pZCBiZW5jaG1hcmtNZXRob2QoKSB7fQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdE1hY3JvQmVuY2htYXJrQW5ub3RhdGVkTWV0aG9kKCkgeworICAgIGFzc2VydFRydWUoYmVuY2htYXJrQ2xhc3NDaGVja2VyLmlzQmVuY2htYXJrKE1hY3JvQmVuY2htYXJrQW5ub3RhdGVkTWV0aG9kLmNsYXNzKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0TWFjcm9CZW5jaG1hcmtBbm5vdGF0ZWRNZXRob2RfTm9TdWl0YWJsZUluc3RydW1lbnQoKSB7CisgICAgYmVuY2htYXJrQ2xhc3NDaGVja2VyID0gQmVuY2htYXJrQ2xhc3NDaGVja2VyLmNyZWF0ZShBcnJheXMuYXNMaXN0KCItaSIsICJhbGxvY2F0aW9uIikpOworICAgIGFzc2VydEZhbHNlKGJlbmNobWFya0NsYXNzQ2hlY2tlci5pc0JlbmNobWFyayhNYWNyb0JlbmNobWFya0Fubm90YXRlZE1ldGhvZC5jbGFzcykpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNYWNyb0JlbmNobWFya0Fubm90YXRlZE1ldGhvZCB7CisgICAgQE1hY3JvYmVuY2htYXJrIHZvaWQgbWFjcm9iZW5jaG1hcmtNZXRob2QoKSB7fQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFRpbWVNZXRob2QoKSB7CisgICAgYXNzZXJ0VHJ1ZShiZW5jaG1hcmtDbGFzc0NoZWNrZXIuaXNCZW5jaG1hcmsoVGltZU1ldGhvZC5jbGFzcykpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lTWV0aG9kIHsKKyAgICBwdWJsaWMgdm9pZCB0aW1lTWV0aG9kKCkge30KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ2xhc3NUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CZW5jaG1hcmtDbGFzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M2MTEzCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQmVuY2htYXJrQ2xhc3NUZXN0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQWZ0ZXJFeHBlcmltZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZWZvcmVFeHBlcmltZW50OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgQmVuY2htYXJrQ2xhc3N9LgorICovCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQmVuY2htYXJrQ2xhc3NUZXN0IHsKKyAgQFRlc3QgcHVibGljIHZvaWQgYmVmb3JlTWVhc3VyZW1lbnRNZXRob2RzX0Fubm90YXRlZEJlbmNobWFyaygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKAorICAgICAgICAgICAgTXlCZW5jaG1hcmsuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImJlZm9yZTEiKSwKKyAgICAgICAgICAgIE15QmVuY2htYXJrLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJiZWZvcmUyIikpLAorICAgICAgICBCZW5jaG1hcmtDbGFzcy5mb3JDbGFzcyhNeUJlbmNobWFyay5jbGFzcykuYmVmb3JlRXhwZXJpbWVudE1ldGhvZHMoKSk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBhZnRlck1lYXN1cmVtZW50TWV0aG9kc19Bbm5vdGF0ZWRCZW5jaG1hcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIEltbXV0YWJsZVNldC5vZigKKyAgICAgICAgICAgIE15QmVuY2htYXJrLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJhZnRlcjEiKSwKKyAgICAgICAgICAgIE15QmVuY2htYXJrLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJhZnRlcjIiKSksCisgICAgICAgIEJlbmNobWFya0NsYXNzLmZvckNsYXNzKE15QmVuY2htYXJrLmNsYXNzKS5hZnRlckV4cGVyaW1lbnRNZXRob2RzKCkpOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgZm9yQ2xhc3NfaW5oZXJpdGVuY2VUaHJvd3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgQmVuY2htYXJrQ2xhc3MuZm9yQ2xhc3MoTWFsZm9ybWVkQmVuaGNtYXJrLmNsYXNzKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICB9CisKKyAgc3RhdGljIGNsYXNzIE15QmVuY2htYXJrIHsKKyAgICBAQmVmb3JlRXhwZXJpbWVudCB2b2lkIGJlZm9yZTEoKSB7fQorICAgIEBCZWZvcmVFeHBlcmltZW50IHZvaWQgYmVmb3JlMigpIHt9CisgICAgQEFmdGVyRXhwZXJpbWVudCB2b2lkIGFmdGVyMSgpIHt9CisgICAgQEFmdGVyRXhwZXJpbWVudCB2b2lkIGFmdGVyMigpIHt9CisgIH0KKworICBzdGF0aWMgY2xhc3MgTWFsZm9ybWVkQmVuaGNtYXJrIGV4dGVuZHMgTXlCZW5jaG1hcmsge30KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0JlbmNobWFya0NyZWF0b3JUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CZW5jaG1hcmtDcmVhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjJiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9CZW5jaG1hcmtDcmVhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTb3J0ZWRNYXA7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKKy8qKgorICogVGVzdCBmb3Ige0BsaW5rIEJlbmNobWFya0NyZWF0b3J9CisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCZW5jaG1hcmtDcmVhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBwdWJsaWNEZWZhdWx0Q29uc3RydWN0b3JOb1BhcmFtQmVuY2htYXJrKCkgeworICAgIEJlbmNobWFya0NyZWF0b3IgY3JlYXRvciA9IG5ldyBCZW5jaG1hcmtDcmVhdG9yKFB1YmxpY0RlZmF1bHRDb25zdHJ1Y3Rvck5vUGFyYW1CZW5jaG1hcmsuY2xhc3MsCisgICAgICAgIEltbXV0YWJsZVNvcnRlZE1hcC48U3RyaW5nLCBTdHJpbmc+b2YoKSk7CisKKyAgICBPYmplY3QgYmVuY2htYXJrSW5zdGFuY2UgPSBjcmVhdG9yLmNyZWF0ZUJlbmNobWFya0luc3RhbmNlKCk7CisgICAgYXNzZXJ0VHJ1ZShiZW5jaG1hcmtJbnN0YW5jZSBpbnN0YW5jZW9mIFB1YmxpY0RlZmF1bHRDb25zdHJ1Y3Rvck5vUGFyYW1CZW5jaG1hcmspOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBQdWJsaWNEZWZhdWx0Q29uc3RydWN0b3JOb1BhcmFtQmVuY2htYXJrIHsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHB1YmxpY0RlZmF1bHRDb25zdHJ1Y3RvcldpdGhQYXJhbUJlbmNobWFyaygpIHsKKyAgICBCZW5jaG1hcmtDcmVhdG9yIGNyZWF0b3IgPSBuZXcgQmVuY2htYXJrQ3JlYXRvcigKKyAgICAgICAgUHVibGljRGVmYXVsdENvbnN0cnVjdG9yV2l0aFBhcmFtQmVuY2htYXJrLmNsYXNzLAorICAgICAgICBJbW11dGFibGVTb3J0ZWRNYXAub2YoImJ5dGVGaWVsZCIsICIxIiwgImludEZpZWxkIiwgIjIiLCAic3RyaW5nRmllbGQiLCAic3RyaW5nIikpOworCisgICAgT2JqZWN0IGJlbmNobWFya0luc3RhbmNlID0gY3JlYXRvci5jcmVhdGVCZW5jaG1hcmtJbnN0YW5jZSgpOworICAgIGFzc2VydFRydWUoYmVuY2htYXJrSW5zdGFuY2UgaW5zdGFuY2VvZiBQdWJsaWNEZWZhdWx0Q29uc3RydWN0b3JXaXRoUGFyYW1CZW5jaG1hcmspOworICAgIFB1YmxpY0RlZmF1bHRDb25zdHJ1Y3RvcldpdGhQYXJhbUJlbmNobWFyayBiZW5jaG1hcmsgPQorICAgICAgICAoUHVibGljRGVmYXVsdENvbnN0cnVjdG9yV2l0aFBhcmFtQmVuY2htYXJrKSBiZW5jaG1hcmtJbnN0YW5jZTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYmVuY2htYXJrLmJ5dGVGaWVsZCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGJlbmNobWFyay5pbnRGaWVsZCk7CisgICAgYXNzZXJ0RXF1YWxzKCJzdHJpbmciLCBiZW5jaG1hcmsuc3RyaW5nRmllbGQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBQdWJsaWNEZWZhdWx0Q29uc3RydWN0b3JXaXRoUGFyYW1CZW5jaG1hcmsgeworICAgIEBQYXJhbQorICAgIGJ5dGUgYnl0ZUZpZWxkOworCisgICAgQFBhcmFtCisgICAgaW50IGludEZpZWxkOworCisgICAgQFBhcmFtCisgICAgU3RyaW5nIHN0cmluZ0ZpZWxkOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcHVibGljTm9TdWl0YWJsZUNvbnN0cnVjdG9yQmVuY2htYXJrKCkgeworICAgIHRyeSB7CisgICAgICBuZXcgQmVuY2htYXJrQ3JlYXRvcigKKyAgICAgICAgICBQdWJsaWNOb1N1aXRhYmxlQ29uc3RydWN0b3JCZW5jaG1hcmsuY2xhc3MsCisgICAgICAgICAgSW1tdXRhYmxlU29ydGVkTWFwLjxTdHJpbmcsIFN0cmluZz5vZigpKTsKKyAgICB9IGNhdGNoIChVc2VyQ29kZUV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoIkJlbmNobWFyayBjbGFzcyAiCisgICAgICAgICAgKyBQdWJsaWNOb1N1aXRhYmxlQ29uc3RydWN0b3JCZW5jaG1hcmsuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgKyAiIGRvZXMgbm90IGhhdmUgYSBwdWJsaWNseSB2aXNpYmxlIGRlZmF1bHQgY29uc3RydWN0b3IiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBQdWJsaWNOb1N1aXRhYmxlQ29uc3RydWN0b3JCZW5jaG1hcmsgeworICAgIEBQYXJhbQorICAgIGJ5dGUgYnl0ZUZpZWxkOworCisgICAgQFBhcmFtCisgICAgaW50IGludEZpZWxkOworCisgICAgQFBhcmFtCisgICAgU3RyaW5nIHN0cmluZ0ZpZWxkOworCisgICAgcHVibGljIFB1YmxpY05vU3VpdGFibGVDb25zdHJ1Y3RvckJlbmNobWFyaygKKyAgICAgICAgYnl0ZSBieXRlRmllbGQsIGludCBpbnRGaWVsZCwgU3RyaW5nIHN0cmluZ0ZpZWxkKSB7CisgICAgICB0aGlzLmJ5dGVGaWVsZCA9IGJ5dGVGaWVsZDsKKyAgICAgIHRoaXMuaW50RmllbGQgPSBpbnRGaWVsZDsKKyAgICAgIHRoaXMuc3RyaW5nRmllbGQgPSBzdHJpbmdGaWVsZDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0NhbGlwZXJUZXN0V2F0Y2hlci5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvQ2FsaXBlclRlc3RXYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmMDA0NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0NhbGlwZXJUZXN0V2F0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZy5JbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuVHJpYWw7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuSW52YWxpZENvbW1hbmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CisKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFdhdGNoZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5EZXNjcmlwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSB7QGxpbmsgVGVzdFdhdGNoZXJ9IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGEgcnVuIG9mIGNhbGlwZXIuCisgKiAKKyAqIDxwPlByb3ZpZGVzIGNvbW1vbiB0ZXN0IGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzIGFuZCByZWRpcmVjdHMgb3V0cHV0IHRvIGEgYnVmZmVyIGFuZCBvbmx5IGR1bXBzCisgKiBpdCBkdXJpbmcgYSBmYWlsdXJlLgorICogCisgKiA8cD5UT0RPKGx1a2VzLGdhayk6IFRoaXMgaXMgYSBiYWQgbmFtZSBzaW5jZSBpdCBpc24ndCBqdXN0IHdhdGNoaW5nIHRoZSB0ZXN0cywgaXQgaXMgaGVscGluZyB5b3UKKyAqIHJ1biB0aGUgdGVzdHMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDYWxpcGVyVGVzdFdhdGNoZXIgZXh0ZW5kcyBUZXN0V2F0Y2hlciB7CisgIC8vIE4uQi4gU3RyaW5nV3JpdGVyIGlzIGludGVybmFsbHkgc3luY2hyb25pemVkIGFuZCBpcyBzYWZlIHRvIHdyaXRlIHRvIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKyAgcHJpdmF0ZSBTdHJpbmdXcml0ZXIgc3Rkb3V0OworICBwcml2YXRlIGZpbmFsIFN0cmluZ1dyaXRlciBzdGRlcnIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgIHByaXZhdGUgRmlsZSB3b3JrZXJPdXRwdXQ7CisKKyAgcHJpdmF0ZSBTdHJpbmcgaW5zdHJ1bWVudDsKKyAgcHJpdmF0ZSBDbGFzczw/PiBiZW5jaG1hcmtDbGFzczsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXh0cmFPcHRpb25zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgQ2FsaXBlclRlc3RXYXRjaGVyIGZvckJlbmNobWFyayhDbGFzczw/PiBiZW5jaG1hcmtDbGFzcykgeworICAgIHRoaXMuYmVuY2htYXJrQ2xhc3MgPSBiZW5jaG1hcmtDbGFzczsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorICAKKyAgQ2FsaXBlclRlc3RXYXRjaGVyIGluc3RydW1lbnQoU3RyaW5nIGluc3RydW1lbnQpIHsKKyAgICB0aGlzLmluc3RydW1lbnQgPSBpbnN0cnVtZW50OworICAgIHJldHVybiB0aGlzOworICB9CisgIAorICBDYWxpcGVyVGVzdFdhdGNoZXIgb3B0aW9ucyhTdHJpbmcuLi4gZXh0cmFPcHRpb25zKSB7CisgICAgdGhpcy5leHRyYU9wdGlvbnMgPSBBcnJheXMuYXNMaXN0KGV4dHJhT3B0aW9ucyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKyAgCisgIHZvaWQgcnVuKCkgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uLCBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uLCAKKyAgICAgIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICBjaGVja1N0YXRlKGJlbmNobWFya0NsYXNzICE9IG51bGwsICJZb3UgbXVzdCBjb25maWd1cmUgYSBiZW5jaG1hcmshIik7CisgICAgd29ya2VyT3V0cHV0ID0gRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgIC8vIGNvbmZpZ3VyZSBhIGN1c3RvbSBkaXIgc28gdGhlIGZpbGVzIGFyZW4ndCBkZWxldGVkIHdoZW4gQ2FsaXBlck1haW4gcmV0dXJucworICAgIExpc3Q8U3RyaW5nPiBvcHRpb25zID0gTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgICAiLUN3b3JrZXIub3V0cHV0PSIgKyB3b3JrZXJPdXRwdXQuZ2V0UGF0aCgpLAorICAgICAgICAiLUNyZXN1bHRzLmZpbGUuY2xhc3M9IiwKKyAgICAgICAgIi1DcmVzdWx0cy51cGxvYWQuY2xhc3M9IiArIEluTWVtb3J5UmVzdWx0c1VwbG9hZGVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgaWYgKGluc3RydW1lbnQgIT0gbnVsbCkgeworICAgICAgb3B0aW9ucy5hZGQoIi1pIik7CisgICAgICBvcHRpb25zLmFkZChpbnN0cnVtZW50KTsKKyAgICB9CisgICAgb3B0aW9ucy5hZGRBbGwoZXh0cmFPcHRpb25zKTsKKyAgICBvcHRpb25zLmFkZChiZW5jaG1hcmtDbGFzcy5nZXROYW1lKCkpOworICAgIHRoaXMuc3Rkb3V0ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgIENhbGlwZXJNYWluLmV4aXRsZXNzTWFpbigKKyAgICAgICAgb3B0aW9ucy50b0FycmF5KG5ldyBTdHJpbmdbMF0pLAorICAgICAgICBuZXcgUHJpbnRXcml0ZXIoc3Rkb3V0LCAgdHJ1ZSksCisgICAgICAgIG5ldyBQcmludFdyaXRlcihzdGRlcnIsICB0cnVlKSk7CisgIH0KKworICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKyAgICBpZiAod29ya2VyT3V0cHV0ICE9IG51bGwpIHsKKyAgICAgIGZvciAoRmlsZSBmIDogd29ya2VyT3V0cHV0Lmxpc3RGaWxlcygpKSB7CisgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICB9CisgICAgICB3b3JrZXJPdXRwdXQuZGVsZXRlKCk7CisgICAgfQorICB9CisgIAorICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgZmFpbGVkKFRocm93YWJsZSBlLCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgIC8vIGRvbid0IGxvZyBpZiBydW4gd2FzIG5ldmVyIGNhbGxlZC4KKyAgICBpZiAoc3Rkb3V0ICE9IG51bGwpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2FsaXBlciBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dCAoc3Rkb3V0KTpcbiIKKyAgICAgICAgICArIHN0ZG91dC50b1N0cmluZygpICsgInN0ZGVycjpcbiIgKyBzdGRlcnIudG9TdHJpbmcoKSk7CisgICAgfQorICB9CisgIAorICBJbW11dGFibGVMaXN0PFRyaWFsPiB0cmlhbHMoKSB7CisgICAgcmV0dXJuIEluTWVtb3J5UmVzdWx0c1VwbG9hZGVyLnRyaWFscygpOworICB9CisKKyAgcHVibGljIFN0cmluZ1dyaXRlciBnZXRTdGRlcnIoKSB7CisgICAgcmV0dXJuIHN0ZGVycjsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZ1dyaXRlciBnZXRTdGRvdXQoKSB7CisgICAgcmV0dXJuIHN0ZG91dDsKKyAgfQorICAKKyAgRmlsZSB3b3JrZXJPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgcmV0dXJuIHdvcmtlck91dHB1dDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRXhwZXJpbWVudGluZ1J1bm5lck1vZHVsZVRlc3QuamF2YSBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0V4cGVyaW1lbnRpbmdSdW5uZXJNb2R1bGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0MWY1NgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0V4cGVyaW1lbnRpbmdSdW5uZXJNb2R1bGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnMuQ2FsaXBlck9wdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLlBsYXRmb3JtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5TdXBwb3J0ZWRQbGF0Zm9ybTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLkluc3RydW1lbnQuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXIuV29ya2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5ydW5uZXJzLk1vY2tpdG9KVW5pdFJ1bm5lcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgRXhwZXJpbWVudGluZ1J1bm5lck1vZHVsZX0uCisgKi8KK0BSdW5XaXRoKE1vY2tpdG9KVW5pdFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBFeHBlcmltZW50aW5nUnVubmVyTW9kdWxlVGVzdCB7CisgIHByaXZhdGUgRXhwZXJpbWVudGluZ1J1bm5lck1vZHVsZSBtb2R1bGUgPSBuZXcgRXhwZXJpbWVudGluZ1J1bm5lck1vZHVsZSgpOworICBwcml2YXRlIEluc3RydW1lbnQgaW5zdHJ1bWVudEEgPSBuZXcgRmFrZUluc3RydW1lbnQoKTsKKyAgcHJpdmF0ZSBJbnN0cnVtZW50IGluc3RydW1lbnRCID0gbmV3IEZha2VJbnN0cnVtZW50KCk7CisKKyAgQE1vY2sgQ2FsaXBlck9wdGlvbnMgb3B0aW9uczsKKworICBwcml2YXRlIE1ldGhvZCBtZXRob2RBOworICBwcml2YXRlIE1ldGhvZCBtZXRob2RCOworICBwcml2YXRlIE1ldGhvZCBtZXRob2RDOworCisgIEBCZWZvcmUgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBtZXRob2RBID0gVGVzdEJlbmNobWFyay5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiYSIpOworICAgIG1ldGhvZEIgPSBUZXN0QmVuY2htYXJrLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJiIik7CisgICAgbWV0aG9kQyA9IFRlc3RCZW5jaG1hcmsuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImMiKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHByb3ZpZGVJbnN0cnVtZW50YXRpb25zX25vTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB3aGVuKG9wdGlvbnMuYmVuY2htYXJrTWV0aG9kTmFtZXMoKSkudGhlblJldHVybihJbW11dGFibGVTZXQuPFN0cmluZz5vZigpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIG5ldyBJbW11dGFibGVTZXQuQnVpbGRlcjxJbnN0cnVtZW50YXRpb24+KCkKKyAgICAgICAgICAgIC5hZGQoaW5zdHJ1bWVudEEuY3JlYXRlSW5zdHJ1bWVudGF0aW9uKG1ldGhvZEEpKQorICAgICAgICAgICAgLmFkZChpbnN0cnVtZW50QS5jcmVhdGVJbnN0cnVtZW50YXRpb24obWV0aG9kQikpCisgICAgICAgICAgICAuYWRkKGluc3RydW1lbnRBLmNyZWF0ZUluc3RydW1lbnRhdGlvbihtZXRob2RDKSkKKyAgICAgICAgICAgIC5hZGQoaW5zdHJ1bWVudEIuY3JlYXRlSW5zdHJ1bWVudGF0aW9uKG1ldGhvZEEpKQorICAgICAgICAgICAgLmFkZChpbnN0cnVtZW50Qi5jcmVhdGVJbnN0cnVtZW50YXRpb24obWV0aG9kQikpCisgICAgICAgICAgICAuYWRkKGluc3RydW1lbnRCLmNyZWF0ZUluc3RydW1lbnRhdGlvbihtZXRob2RDKSkKKyAgICAgICAgICAgIC5idWlsZCgpLAorICAgICAgICBtb2R1bGUucHJvdmlkZUluc3RydW1lbnRhdGlvbnMob3B0aW9ucywKKyAgICAgICAgICAgIEJlbmNobWFya0NsYXNzLmZvckNsYXNzKFRlc3RCZW5jaG1hcmsuY2xhc3MpLAorICAgICAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKGluc3RydW1lbnRBLCBpbnN0cnVtZW50QikpKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBAVGVzdCBwdWJsaWMgdm9pZCBwcm92aWRlSW5zdHJ1bWVudGF0aW9uc193aXRoTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB3aGVuKG9wdGlvbnMuYmVuY2htYXJrTWV0aG9kTmFtZXMoKSkudGhlblJldHVybihJbW11dGFibGVTZXQub2YoImIiKSwKKyAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKCJhIiwgImMiKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBuZXcgSW1tdXRhYmxlU2V0LkJ1aWxkZXI8SW5zdHJ1bWVudGF0aW9uPigpCisgICAgICAgICAgICAuYWRkKGluc3RydW1lbnRBLmNyZWF0ZUluc3RydW1lbnRhdGlvbihtZXRob2RCKSkKKyAgICAgICAgICAgIC5hZGQoaW5zdHJ1bWVudEIuY3JlYXRlSW5zdHJ1bWVudGF0aW9uKG1ldGhvZEIpKQorICAgICAgICAgICAgLmJ1aWxkKCksCisgICAgICAgIG1vZHVsZS5wcm92aWRlSW5zdHJ1bWVudGF0aW9ucyhvcHRpb25zLAorICAgICAgICAgICAgQmVuY2htYXJrQ2xhc3MuZm9yQ2xhc3MoVGVzdEJlbmNobWFyay5jbGFzcyksCisgICAgICAgICAgICBJbW11dGFibGVTZXQub2YoaW5zdHJ1bWVudEEsIGluc3RydW1lbnRCKSkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbmV3IEltbXV0YWJsZVNldC5CdWlsZGVyPEluc3RydW1lbnRhdGlvbj4oKQorICAgICAgICAgICAgLmFkZChpbnN0cnVtZW50QS5jcmVhdGVJbnN0cnVtZW50YXRpb24obWV0aG9kQSkpCisgICAgICAgICAgICAuYWRkKGluc3RydW1lbnRBLmNyZWF0ZUluc3RydW1lbnRhdGlvbihtZXRob2RDKSkKKyAgICAgICAgICAgIC5hZGQoaW5zdHJ1bWVudEIuY3JlYXRlSW5zdHJ1bWVudGF0aW9uKG1ldGhvZEEpKQorICAgICAgICAgICAgLmFkZChpbnN0cnVtZW50Qi5jcmVhdGVJbnN0cnVtZW50YXRpb24obWV0aG9kQykpCisgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgbW9kdWxlLnByb3ZpZGVJbnN0cnVtZW50YXRpb25zKG9wdGlvbnMsCisgICAgICAgICAgICBCZW5jaG1hcmtDbGFzcy5mb3JDbGFzcyhUZXN0QmVuY2htYXJrLmNsYXNzKSwKKyAgICAgICAgICAgIEltbXV0YWJsZVNldC5vZihpbnN0cnVtZW50QSwgaW5zdHJ1bWVudEIpKSk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBwcm92aWRlSW5zdHJ1bWVudGF0aW9uc193aXRoSW52YWxpZE5hbWUoKSB7CisgICAgd2hlbihvcHRpb25zLmJlbmNobWFya01ldGhvZE5hbWVzKCkpLnRoZW5SZXR1cm4oCisgICAgICAgIEltbXV0YWJsZVNldC5vZigiYSIsICJjIiwgImJhZCIpKTsKKyAgICB0cnkgeworICAgICAgbW9kdWxlLnByb3ZpZGVJbnN0cnVtZW50YXRpb25zKG9wdGlvbnMsCisgICAgICAgICAgQmVuY2htYXJrQ2xhc3MuZm9yQ2xhc3MoVGVzdEJlbmNobWFyay5jbGFzcyksCisgICAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKGluc3RydW1lbnRBLCBpbnN0cnVtZW50QikpOworICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGZvciBpbnZhbGlkIGJlbmNobWFyayBtZXRob2QgbmFtZSIpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZC5nZXRNZXNzYWdlKCkuY29udGFpbnMoIltiYWRdIikpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0QmVuY2htYXJrIHsKKyAgICBAQmVuY2htYXJrIHZvaWQgYSgpIHt9CisgICAgQEJlbmNobWFyayB2b2lkIGIoKSB7fQorICAgIEBCZW5jaG1hcmsgdm9pZCBjKCkge30KKyAgfQorCisgIEBTdXBwb3J0ZWRQbGF0Zm9ybShQbGF0Zm9ybS5UeXBlLkpWTSkKKyAgc3RhdGljIGZpbmFsIGNsYXNzIEZha2VJbnN0cnVtZW50IGV4dGVuZHMgSW5zdHJ1bWVudCB7CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGlzQmVuY2htYXJrTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnN0cnVtZW50YXRpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9uKE1ldGhvZCBiZW5jaG1hcmtNZXRob2QpCisgICAgICAgIHRocm93cyBJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBuZXcgSW5zdHJ1bWVudGF0aW9uKGJlbmNobWFya01ldGhvZCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBXb3JrZXI+IHdvcmtlckNsYXNzKCkgeworICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRyeVJ1bihPYmplY3QgYmVuY2htYXJrKSB0aHJvd3MgSW52YWxpZEJlbmNobWFya0V4Y2VwdGlvbiB7fQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBNZWFzdXJlbWVudENvbGxlY3RpbmdWaXNpdG9yIGdldE1lYXN1cmVtZW50Q29sbGVjdGluZ1Zpc2l0b3IoKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBUcmlhbFNjaGVkdWxpbmdQb2xpY3kgc2NoZWR1bGluZ1BvbGljeSgpIHsKKyAgICAgIHJldHVybiBUcmlhbFNjaGVkdWxpbmdQb2xpY3kuU0VSSUFMOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvRmFrZVdvcmtlcnMuamF2YSBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0Zha2VXb3JrZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5YTQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0Zha2VXb3JrZXJzLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLkxvZ01lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5Mb2dNZXNzYWdlVmlzaXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLk9wZW5lZFNvY2tldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLkNhbGlwZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZy5JbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIucGxhdGZvcm0uUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnBsYXRmb3JtLmp2bS5Kdm1QbGF0Zm9ybTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lkd1YXJkZWRCeTsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgU2ltcGxlIGphdmEgZXhlY3V0YWJsZXMgYW5kIGEgaGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgcHJvY2VzcyBidWlsZGVycyBmb3IgCisgKiB0aGVtLgorICovCitmaW5hbCBjbGFzcyBGYWtlV29ya2VycyB7CisKKyAgQEd1YXJkZWRCeSgiRmFrZVdvcmtlcnMuY2xhc3MiKQorICBwcml2YXRlIHN0YXRpYyBWaXJ0dWFsTWFjaGluZSBqdm07CisKKyAgLyoqIAorICAgKiBUcnkgdG8gZmluZCB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBqdm0gYmluYXJ5LCBOLkIuIFRoaXMgaXNuJ3QgZ3VhcmFudGVlZCB0byBiZSBjcm9zcyAKKyAgICogcGxhdGZvcm0uCisgICAqLworICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgVmlydHVhbE1hY2hpbmUgaW5pdCgpIHsKKyAgICBpZiAoanZtID09IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIFBsYXRmb3JtIHBsYXRmb3JtID0gbmV3IEp2bVBsYXRmb3JtKCk7CisgICAgICAgIGp2bSA9IG5ldyBWaXJ0dWFsTWFjaGluZSgiZGVmYXVsdCIsIAorICAgICAgICAgICAgbmV3IENhbGlwZXJDb25maWcoSW1tdXRhYmxlTWFwLjxTdHJpbmcsIFN0cmluZz5vZigpKS5nZXREZWZhdWx0Vm1Db25maWcocGxhdGZvcm0pKTsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGp2bTsKKyAgfQorCisgIC8qKiAKKyAgICogUmV0dXJucyBhIFByb2Nlc3NCdWlsZGVyIHRoYXQgYXR0ZW1wdHMgdG8gaW52b2tlIHRoZSBnaXZlbiBjbGFzcyBhcyBtYWluIGluIGEgSlZNIGNvbmZpZ3VyZWQKKyAgICogd2l0aCBhIGNsYXNzcGF0aCBlcXVpdmFsZW50IHRvIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIEpWTS4KKyAgICovCisgIHN0YXRpYyBQcm9jZXNzQnVpbGRlciBjcmVhdGVQcm9jZXNzQnVpbGRlcihDbGFzczw/PiBtYWluQ2xhc3MsIFN0cmluZyAuLi5tYWluQXJncykgeworICAgIFZpcnR1YWxNYWNoaW5lIGp2bSA9IGluaXQoKTsKKyAgICBMaXN0PFN0cmluZz4gYXJnczsKKyAgICB0cnkgeworICAgICAgYXJncyA9IFdvcmtlclByb2Nlc3MuZ2V0SnZtQXJncyhqdm0sIEJlbmNobWFya0NsYXNzLmZvckNsYXNzKG1haW5DbGFzcykpOworICAgIH0gY2F0Y2ggKEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorICAgIGFyZ3MuYWRkKG1haW5DbGFzcy5nZXROYW1lKCkpOworICAgIENvbGxlY3Rpb25zLmFkZEFsbChhcmdzLCBtYWluQXJncyk7CisgICAgcmV0dXJuIG5ldyBQcm9jZXNzQnVpbGRlcigpLmNvbW1hbmQoYXJncyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFZpcnR1YWxNYWNoaW5lIGdldFZpcnR1YWxNYWNoaW5lKCkgeworICAgIHJldHVybiBpbml0KCk7CisgIH0KKworICAvKiogCisgICAqIEEgc2ltcGxlIG1haW4gbWV0aG9kIHRoYXQgd2lsbCBzbGVlcCBmb3IgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlY2lmaWVkIGluIHRoZSBmaXJzdAorICAgKiBhcmd1bWVudC4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBjbGFzcyBTbGVlcGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICBUaHJlYWQuc2xlZXAoTG9uZy5wYXJzZUxvbmcoYXJnc1swXSkpOworICAgIH0KKyAgfQorICAKKyAgLyoqIAorICAgKiBBIHNpbXBsZSBtYWluIG1ldGhvZCB0aGF0IGV4aXRzIGltbWVkaWF0ZWx5IHdpdGggdGhlIGNvZGUgcHJvdmlkZWQgYnkgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAqLworICBzdGF0aWMgZmluYWwgY2xhc3MgRXhpdCB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgU3lzdGVtLmV4aXQoSW50ZWdlci5wYXJzZUludChhcmdzWzBdKSk7CisgICAgfQorICB9CisgIAorICAvKiogCisgICAqIEEgc2ltcGxlIG1haW4gbWV0aG9kIHRoYXQgZXhpdHMgaW1tZWRpYXRlbHkgd2l0aCB0aGUgY29kZSBwcm92aWRlZCBieSB0aGUgZmlyc3QgYXJndW1lbnQKKyAgICovCisgIHN0YXRpYyBmaW5hbCBjbGFzcyBDbG9zZUFuZFNsZWVwIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgIFN5c3RlbS5lcnIuY2xvc2UoKTsKKyAgICAgIFN5c3RlbS5pbi5jbG9zZSgpOworICAgICAgU3lzdGVtLm91dC5jbG9zZSgpOworICAgICAgbmV3IENvdW50RG93bkxhdGNoKDEpLmF3YWl0KCk7ICAvLyB3YWl0IGZvcmV2ZXIKKyAgICB9CisgIH0KKyAgCisgIC8qKiAKKyAgICogUHJpbnRzIGFsdGVybmF0aW5nIGFyZ3VtZW50cyB0byBzdGFuZGFyZCBvdXQgYW5kIHN0YW5kYXJkIGVycm9yLgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGNsYXNzIFByaW50Q2xpZW50IHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSAgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChpICUgMiA9PSAwKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGFyZ3NbaV0pOworICAgICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oYXJnc1tpXSk7CisgICAgICAgICAgU3lzdGVtLmVyci5mbHVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFByaW50cyBhbHRlcm5hdGluZyBhcmd1bWVudHMgdG8gc3RhbmRhcmQgb3V0IGFuZCBzdGFuZGFyZCBlcnJvci4KKyAgICovCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgZmluYWwgY2xhc3MgTG9hZEJlbmNobWFya0NsYXNzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJlbmNobWFya0NsYXNzTmFtZSA9IGFyZ3NbMF07CisgICAgICAgIFV0aWwubG9hZENsYXNzKGJlbmNobWFya0NsYXNzTmFtZSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGZpbmFsIGNsYXNzIER1bW15TG9nTWVzc2FnZSBleHRlbmRzIExvZ01lc3NhZ2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRlbnQ7CisKKyAgICBEdW1teUxvZ01lc3NhZ2UoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGFjY2VwdChMb2dNZXNzYWdlVmlzaXRvciB2aXNpdG9yKSB7fQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gY29udGVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdW1teUxvZ01lc3NhZ2UgJiYgKChEdW1teUxvZ01lc3NhZ2UpIG9iaikuY29udGVudC5lcXVhbHMoY29udGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gY29udGVudC5oYXNoQ29kZSgpOworICAgIH0KKyAgfQorICAKKyAgLyoqIAorICAgKiBDb25uZWN0cyB0byBhIHNvY2tldCBvbiBsb2NhbGhvc3Qgb24gdGhlIHBvcnQgcHJvdmlkZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBlY2hvcyBhbGwgCisgICAqIGRhdGEuCisgICAqIAorICAgKiA8cD5PbmNlIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCBpdCBwcmludHMgdGhlIHJlbWFpbmluZyBhcmdzIHRvIHN0ZG91dAorICAgKi8KKyAgc3RhdGljIGZpbmFsIGNsYXNzIFNvY2tldEVjaG9DbGllbnQgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMF0pOworICAgICAgT3BlbmVkU29ja2V0IG9wZW5lZFNvY2tldCA9IE9wZW5lZFNvY2tldC5mcm9tU29ja2V0KAorICAgICAgICAgIG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnQpKTsKKyAgICAgIE9wZW5lZFNvY2tldC5SZWFkZXIgcmVhZGVyID0gb3BlbmVkU29ja2V0LnJlYWRlcigpOworICAgICAgT3BlbmVkU29ja2V0LldyaXRlciB3cml0ZXIgPSBvcGVuZWRTb2NrZXQud3JpdGVyKCk7CisgICAgICB3cml0ZXIud3JpdGUobmV3IER1bW15TG9nTWVzc2FnZSgic3RhcnQiKSk7CisgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgIFNlcmlhbGl6YWJsZSBvYmo7CisgICAgICB3aGlsZSAoKG9iaiA9IHJlYWRlci5yZWFkKCkpICE9IG51bGwpIHsKKyAgICAgICAgd3JpdGVyLndyaXRlKG9iaik7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgfQorICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYXJnc1tpXSk7CisgICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL0luTWVtb3J5UmVzdWx0c1VwbG9hZGVyLmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9Jbk1lbW9yeVJlc3VsdHNVcGxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWE2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9Jbk1lbW9yeVJlc3VsdHNVcGxvYWRlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuUmVzdWx0UHJvY2Vzc29yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5UcmlhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEEge0BsaW5rIFJlc3VsdFByb2Nlc3Nvcn0gdGhhdCBjb2xsZWN0cyBhbGwgdHJpYWxzIGluIGEgc3RhdGljIGxpc3QgZm9yIGVhc3kgaW5zcGVjdGlvbiBieSB0ZXN0cy4KKyAqLworcHVibGljIGNsYXNzIEluTWVtb3J5UmVzdWx0c1VwbG9hZGVyIGltcGxlbWVudHMgUmVzdWx0UHJvY2Vzc29yIHsKKyAgc3RhdGljIEltbXV0YWJsZUxpc3Q8VHJpYWw+IHRyaWFscygpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5jb3B5T2YodHJpYWxzKTsKKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUcmlhbD4gdHJpYWxzOworICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQ7CisKKyAgQEluamVjdCBwdWJsaWMgSW5NZW1vcnlSZXN1bHRzVXBsb2FkZXIoKSB7CisgICAgdHJpYWxzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrU3RhdGUoIWlzQ2xvc2VkKTsKKyAgICBpc0Nsb3NlZCA9IHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcHJvY2Vzc1RyaWFsKFRyaWFsIHRyaWFsKSB7CisgICAgY2hlY2tTdGF0ZSghaXNDbG9zZWQpOworICAgIHRyaWFscy5hZGQodHJpYWwpOyAKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL01hbGZvcm1lZEJlbmNobWFya3NUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9NYWxmb3JtZWRCZW5jaG1hcmtzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTEzMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9NYWxmb3JtZWRCZW5jaG1hcmtzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuSW52YWxpZENvbW1hbmRFeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworLyoqCisgKiBVbml0IHRlc3QgY292ZXJpbmcgY29tbW9uIHVzZXIgbWlzdGFrZXMgaW4gYmVuY2htYXJrIGNsYXNzZXMuCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKKworcHVibGljIGNsYXNzIE1hbGZvcm1lZEJlbmNobWFya3NUZXN0IHsKKyAgLy8gUHV0IHRoZSBleHBlY3RlZCBtZXNzYWdlcyB0b2dldGhlciBoZXJlLCB3aGljaCBtYXkgcHJvbW90ZSBzb21lIGtpbmQgb2YKKyAgLy8gY29uc2lzdGVuY3kgaW4gdGhlaXIgd29yZGluZy4gOikKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJTVFJBQ1QgPQorICAgICAgIkNsYXNzICclcycgaXMgYWJzdHJhY3QiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ09OU1RSVUNUT1IgPQorICAgICAgIkJlbmNobWFyayBjbGFzcyAlcyBkb2VzIG5vdCBoYXZlIGEgcHVibGljbHkgdmlzaWJsZSBkZWZhdWx0IGNvbnN0cnVjdG9yIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX01FVEhPRFMgPQorICAgICAgIlRoZXJlIHdlcmUgbm8gZXhwZXJpbWVudHMgdG8gYmUgcGVyZm9ybWVkIGZvciB0aGUgY2xhc3MgJXMgdXNpbmcgdGhlIGluc3RydW1lbnRzICIgKworICAgICAgIlthbGxvY2F0aW9uLCBydW50aW1lXSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfQkVOQ0hNQVJLID0KKyAgICAgICJCZW5jaG1hcmsgbWV0aG9kcyBtdXN0IG5vdCBiZSBzdGF0aWM6IHRpbWVJdCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUk9OR19BUkdVTUVOVFMgPQorICAgICAgIkJlbmNobWFyayBtZXRob2RzIG11c3QgaGF2ZSBubyBhcmd1bWVudHMgb3IgYWNjZXB0IGEgc2luZ2xlIGludCBvciBsb25nIHBhcmFtZXRlcjogdGltZUl0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19QQVJBTSA9CisgICAgICAiUGFyYW1ldGVyIGZpZWxkICdvb3BzJyBtdXN0IG5vdCBiZSBzdGF0aWMiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVJWRURfUEFSQU0gPQorICAgICAgIkNsYXNzICclcycgdXNlcyByZXNlcnZlZCBwYXJhbWV0ZXIgbmFtZSAndm0nIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0NPTlZFUlNJT04gPSAiVHlwZSAnT2JqZWN0JyBvZiBwYXJhbWV0ZXIgZmllbGQgJ29vcHMnICIKKyAgICAgICsgImhhcyBubyByZWNvZ25pemVkIFN0cmluZy1jb252ZXJ0aW5nIG1ldGhvZDsgc2VlIDxUT0RPPiBmb3IgZGV0YWlscyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0ZBSUxFRCA9IC8vIGdyYW50ZWQgdGhpcyBvbmUncyBhIGxpdHRsZSB3ZWlyZCAoYW5kIGJyaXR0bGUpCisgICAgICAiQ2Fubm90IGNvbnZlcnQgdmFsdWUgJ29vcHMnIHRvIHR5cGUgJ2ludCc6IEZvciBpbnB1dCBzdHJpbmc6IFwib29wc1wiIjsKKworICBAVGVzdCBwdWJsaWMgdm9pZCBhYnN0cmFjdEJlbmNobWFyaygpIHRocm93cyBFeGNlcHRpb24geworICAgIGV4cGVjdEV4Y2VwdGlvbihBQlNUUkFDVCwgQWJzdHJhY3RCZW5jaG1hcmsuY2xhc3MpOworICB9CisgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdEJlbmNobWFyayB7fQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIG5vU3VpdGFibGVDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIGV4cGVjdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KE5PX0NPTlNUUlVDVE9SLCBCYWRDb25zdHJ1Y3RvckJlbmNobWFyay5jbGFzcy5nZXROYW1lKCkpLAorICAgICAgICBCYWRDb25zdHJ1Y3RvckJlbmNobWFyay5jbGFzcyk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgc3RhdGljIGNsYXNzIEJhZENvbnN0cnVjdG9yQmVuY2htYXJrIHsKKyAgICBCYWRDb25zdHJ1Y3RvckJlbmNobWFyayhTdHJpbmcgZGFtblBhcmFtKSB7fQorICAgIEBCZW5jaG1hcmsgdm9pZCB0aW1lSXQoaW50IHJlcHMpIHt9CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBub0JlbmNobWFya01ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBleHBlY3RFeGNlcHRpb24oTk9fTUVUSE9EUywgTm9NZXRob2RzQmVuY2htYXJrLmNsYXNzKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBzdGF0aWMgY2xhc3MgTm9NZXRob2RzQmVuY2htYXJrIHsKKyAgICB2b2lkIHRpbWVJdChpbnQgcmVwcykge30gLy8gbm90IGFubm90YXRlZAorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgc3RhdGljQmVuY2htYXJrTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZXhwZWN0RXhjZXB0aW9uKFNUQVRJQ19CRU5DSE1BUkssIFN0YXRpY0JlbmNobWFya01ldGhvZEJlbmNobWFyay5jbGFzcyk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgc3RhdGljIGNsYXNzIFN0YXRpY0JlbmNobWFya01ldGhvZEJlbmNobWFyayB7CisgICAgQEJlbmNobWFyayBwdWJsaWMgc3RhdGljIHZvaWQgdGltZUl0KGludCByZXBzKSB7fQorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgd3JvbmdTaWduYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBleHBlY3RFeGNlcHRpb24oV1JPTkdfQVJHVU1FTlRTLCBCb3hlZFBhcmFtQmVuY2htYXJrLmNsYXNzKTsKKyAgICBleHBlY3RFeGNlcHRpb24oV1JPTkdfQVJHVU1FTlRTLCBFeHRyYVBhcmFtQmVuY2htYXJrLmNsYXNzKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBzdGF0aWMgY2xhc3MgQm94ZWRQYXJhbUJlbmNobWFyayB7CisgICAgQEJlbmNobWFyayB2b2lkIHRpbWVJdChJbnRlZ2VyIHJlcHMpIHt9CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgc3RhdGljIGNsYXNzIEV4dHJhUGFyYW1CZW5jaG1hcmsgeworICAgIEBCZW5jaG1hcmsgdm9pZCB0aW1lSXQoaW50IHJlcHMsIGludCB3aGF0KSB7fQorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgaGFzQmVuY2htYXJrT3ZlcmxvYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gTi5CLiBiYXogaXMgZmluZSBzaW5jZSBhbHRob3VnaCBpdCBoYXMgYW4gb3ZlcmxvYWQsIGl0cyBvdmVybG9hZCBpcyBub3QgYSBiZW5jaG1hcmsgbWV0aG9kLgorICAgIGV4cGVjdEV4Y2VwdGlvbigKKyAgICAgICAgIk92ZXJsb2FkcyBhcmUgZGlzYWxsb3dlZCBmb3IgYmVuY2htYXJrIG1ldGhvZHMsIGZvdW5kIG92ZXJsb2FkcyBvZiBbYmFyLCBmb29dIGluICIKKyAgICAgICAgKyAiYmVuY2htYXJrIE92ZXJsb2Fkc0Fubm90YXRlZEJlbmNobWFyayIsCisgICAgICAgIE92ZXJsb2Fkc0Fubm90YXRlZEJlbmNobWFyay5jbGFzcyk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgc3RhdGljIGNsYXNzIE92ZXJsb2Fkc0Fubm90YXRlZEJlbmNobWFyayB7CisgICAgQEJlbmNobWFyayBwdWJsaWMgdm9pZCBmb28obG9uZyByZXBzKSB7fQorICAgIEBCZW5jaG1hcmsgcHVibGljIHZvaWQgZm9vKGludCByZXBzKSB7fQorICAgIEBCZW5jaG1hcmsgcHVibGljIHZvaWQgYmFyKGxvbmcgcmVwcykge30KKyAgICBAQmVuY2htYXJrIHB1YmxpYyB2b2lkIGJhcihpbnQgcmVwcykge30KKyAgICBAQmVuY2htYXJrIHB1YmxpYyB2b2lkIGJheihpbnQgcmVwcykge30KKyAgICBwdWJsaWMgdm9pZCBiYXoobG9uZyByZXBzLCBib29sZWFuIHRoaW5nKSB7fQorICAgIHB1YmxpYyB2b2lkIGJheihsb25nIHJlcHMpIHt9CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBzdGF0aWNQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGV4cGVjdEV4Y2VwdGlvbihTVEFUSUNfUEFSQU0sIFN0YXRpY1BhcmFtQmVuY2htYXJrLmNsYXNzKTsKKyAgfQorICBzdGF0aWMgY2xhc3MgU3RhdGljUGFyYW1CZW5jaG1hcmsgeworICAgIEBQYXJhbSBzdGF0aWMgU3RyaW5nIG9vcHM7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCByZXNlcnZlZFBhcmFtZXRlck5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBleHBlY3RFeGNlcHRpb24oUkVTRVJWRURfUEFSQU0sIFJlc2VydmVkUGFyYW1CZW5jaG1hcmsuY2xhc3MpOworICB9CisgIHN0YXRpYyBjbGFzcyBSZXNlcnZlZFBhcmFtQmVuY2htYXJrIHsKKyAgICBAUGFyYW0gU3RyaW5nIHZtOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdW5wYXJzYWJsZVBhcmFtVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGV4cGVjdEV4Y2VwdGlvbihOT19DT05WRVJTSU9OLCBVbnBhcnNhYmxlUGFyYW1UeXBlQmVuY2htYXJrLmNsYXNzKTsKKyAgfQorICBzdGF0aWMgY2xhc3MgVW5wYXJzYWJsZVBhcmFtVHlwZUJlbmNobWFyayB7CisgICAgQFBhcmFtIE9iamVjdCBvb3BzOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdW5wYXJzYWJsZVBhcmFtRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGV4cGVjdEV4Y2VwdGlvbihDT05WRVJUX0ZBSUxFRCwgVW5wYXJzYWJsZVBhcmFtRGVmYXVsdEJlbmNobWFyay5jbGFzcyk7CisgIH0KKyAgc3RhdGljIGNsYXNzIFVucGFyc2FibGVQYXJhbURlZmF1bHRCZW5jaG1hcmsgeworICAgIEBQYXJhbSh7IjEiLCAiMiIsICJvb3BzIn0pIGludCBudW1iZXI7CisgIH0KKworICAvLyBlbmQgb2YgdGVzdHMKKworICBwcml2YXRlIHZvaWQgZXhwZWN0RXhjZXB0aW9uKFN0cmluZyBleHBlY3RlZE1lc3NhZ2VGbXQsIENsYXNzPD8+IGJlbmNobWFya0NsYXNzKQorICAgICAgdGhyb3dzIEludmFsaWRDb21tYW5kRXhjZXB0aW9uLCBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIENhbGlwZXJNYWluLmV4aXRsZXNzTWFpbigKKyAgICAgICAgICBuZXcgU3RyaW5nW10geyItLWluc3RydW1lbnQ9YWxsb2NhdGlvbixydW50aW1lIiwgIi0tZHJ5LXJ1biIsIGJlbmNobWFya0NsYXNzLmdldE5hbWUoKX0sCisgICAgICAgICAgbmV3IFByaW50V3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSksIG5ldyBQcmludFdyaXRlcihuZXcgU3RyaW5nV3JpdGVyKCkpKTsKKyAgICAgIGZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIFN0cmluZyBleHBlY3RlZE1lc3NhZ2VUZXh0ID0KKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoZXhwZWN0ZWRNZXNzYWdlRm10LCBiZW5jaG1hcmtDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZXNzYWdlVGV4dCwgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgIC8vIGRvbid0IHN3YWxsb3cgb3VyIHJlYWwgc3RhY2sgdHJhY2UKKyAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGFmZSkgeworICAgICAgICBhZmUuaW5pdENhdXNlKGUpOworICAgICAgICB0aHJvdyBhZmU7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9SZXN1bHRQcm9jZXNzb3JDcmVhdG9yVGVzdC5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUmVzdWx0UHJvY2Vzc29yQ3JlYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODhlZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvUmVzdWx0UHJvY2Vzc29yQ3JlYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuUmVzdWx0UHJvY2Vzc29yOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5UcmlhbDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVW5pdCB0ZXN0IHRvIGVuc3VyZSB0aGF0IHtAbGluayBSZXN1bHRQcm9jZXNzb3JDcmVhdG9yfSB3b3JrcyBwcm9wZXJseS4KKyAqLworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFJlc3VsdFByb2Nlc3NvckNyZWF0b3JUZXN0IHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfU1VQUE9SVEVEID0KKyAgICAgICJSZXN1bHRQcm9jZXNzb3IgJXMgbm90IHN1cHBvcnRlZCBhcyBpdCBkb2VzIG5vdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IiOworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3ROb3RQdWJsaWNDb25zdHJ1Y3RvcigpIHsKKyAgICB0cnkgeworICAgICAgUmVzdWx0UHJvY2Vzc29yQ3JlYXRvci5jcmVhdGVSZXN1bHRQcm9jZXNzb3IoTm9QdWJsaWNDb25zdHJ1Y3RvclJlc3VsdFByb2Nlc3Nvci5jbGFzcyk7CisgICAgICBmYWlsKCJEaWQgbm90IGZhaWwgb24gbm9uLXB1YmxpYyBjb25zdHJ1Y3RvciIpOworICAgIH0gY2F0Y2ggKFVzZXJDb2RlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KE5PVF9TVVBQT1JURUQsIE5vUHVibGljQ29uc3RydWN0b3JSZXN1bHRQcm9jZXNzb3IuY2xhc3MpLAorICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vUHVibGljQ29uc3RydWN0b3JSZXN1bHRQcm9jZXNzb3IgaW1wbGVtZW50cyBSZXN1bHRQcm9jZXNzb3IgeworCisgICAgTm9QdWJsaWNDb25zdHJ1Y3RvclJlc3VsdFByb2Nlc3NvcigpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVHJpYWwoVHJpYWwgdHJpYWwpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFB1YmxpY0J1dE5vdERlZmF1bHRDb25zdHJ1Y3RvcigpIHsKKyAgICB0cnkgeworICAgICAgUmVzdWx0UHJvY2Vzc29yQ3JlYXRvci5jcmVhdGVSZXN1bHRQcm9jZXNzb3IoCisgICAgICAgICAgUHVibGljQnV0Tm90RGVmYXVsdERlZmF1bHRDb25zdHJ1Y3RvclJlc3VsdFByb2Nlc3Nvci5jbGFzcyk7CisgICAgICBmYWlsKCJEaWQgbm90IGZhaWwgb24gcHVibGljIGJ1dCBub3QgZGVmYXVsdCBjb25zdHJ1Y3RvciIpOworICAgIH0gY2F0Y2ggKFVzZXJDb2RlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICBTdHJpbmcuZm9ybWF0KE5PVF9TVVBQT1JURUQsIFB1YmxpY0J1dE5vdERlZmF1bHREZWZhdWx0Q29uc3RydWN0b3JSZXN1bHRQcm9jZXNzb3IuY2xhc3MpLAorICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFB1YmxpY0J1dE5vdERlZmF1bHREZWZhdWx0Q29uc3RydWN0b3JSZXN1bHRQcm9jZXNzb3IKKyAgICAgIGltcGxlbWVudHMgUmVzdWx0UHJvY2Vzc29yIHsKKworICAgIHB1YmxpYyBQdWJsaWNCdXROb3REZWZhdWx0RGVmYXVsdENvbnN0cnVjdG9yUmVzdWx0UHJvY2Vzc29yKAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkUGFyYW1ldGVycyIpIGludCBpKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc1RyaWFsKFRyaWFsIHRyaWFsKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaWNDb25zdHJ1Y3RvcigpIHsKKyAgICBSZXN1bHRQcm9jZXNzb3IgcHJvY2Vzc29yID0KKyAgICAgICAgUmVzdWx0UHJvY2Vzc29yQ3JlYXRvci5jcmVhdGVSZXN1bHRQcm9jZXNzb3IoUHVibGljRGVmYXVsdENvbnN0cnVjdG9yUmVzdWx0UHJvY2Vzc29yLmNsYXNzKTsKKyAgICBhc3NlcnRUcnVlKHByb2Nlc3NvciBpbnN0YW5jZW9mIFB1YmxpY0RlZmF1bHRDb25zdHJ1Y3RvclJlc3VsdFByb2Nlc3Nvcik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFB1YmxpY0RlZmF1bHRDb25zdHJ1Y3RvclJlc3VsdFByb2Nlc3NvciBpbXBsZW1lbnRzIFJlc3VsdFByb2Nlc3NvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVHJpYWwoVHJpYWwgdHJpYWwpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9SdW50aW1lSW5zdHJ1bWVudFRlc3QuamF2YSBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1J1bnRpbWVJbnN0cnVtZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NjBjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9SdW50aW1lSW5zdHJ1bWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk5BTk9TRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuQmVmb3JlUmVwOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuTWFjcm9iZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5JbnN0cnVtZW50Lkluc3RydW1lbnRhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5TaG9ydER1cmF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXIuTWFjcm9iZW5jaG1hcmtXb3JrZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlci5SdW50aW1lV29ya2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5GbHVlbnRJdGVyYWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3RzIHtAbGluayBSdW50aW1lSW5zdHJ1bWVudH0uCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBSdW50aW1lSW5zdHJ1bWVudFRlc3QgeworICBAUnVsZSBwdWJsaWMgQ2FsaXBlclRlc3RXYXRjaGVyIHJ1bm5lciA9IG5ldyBDYWxpcGVyVGVzdFdhdGNoZXIoKTsKKworICBwcml2YXRlIFJ1bnRpbWVJbnN0cnVtZW50IGluc3RydW1lbnQ7CisKKyAgQEJlZm9yZSBwdWJsaWMgdm9pZCBjcmVhdGVJbnN0cnVtZW50KCkgeworICAgIHRoaXMuaW5zdHJ1bWVudCA9IG5ldyBSdW50aW1lSW5zdHJ1bWVudChTaG9ydER1cmF0aW9uLm9mKDEwMCwgTkFOT1NFQ09ORFMpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGlzQmVuY2htYXJrTWV0aG9kKCkgeworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKCJtYWNyb2JlbmNobWFyayIsICJtaWNyb2JlbmNobWFyayIsICJwaWNvYmVuY2htYXJrIiwgImludGVnZXJQYXJhbSIpLAorICAgICAgICBGbHVlbnRJdGVyYWJsZS5mcm9tKEFycmF5cy5hc0xpc3QoUnVudGltZUJlbmNobWFyay5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkpCisgICAgICAgICAgICAuZmlsdGVyKG5ldyBQcmVkaWNhdGU8TWV0aG9kPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGFwcGx5KE1ldGhvZCBpbnB1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnN0cnVtZW50LmlzQmVuY2htYXJrTWV0aG9kKGlucHV0KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC50cmFuc2Zvcm0obmV3IEZ1bmN0aW9uPE1ldGhvZCwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgYXBwbHkoTWV0aG9kIGlucHV0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC50b1NldCgpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGNyZWF0ZUluc3RydW1lbnRhdGlvbl9tYWNyb2JlbmNobWFyaygpIHRocm93cyBFeGNlcHRpb24geworICAgIE1ldGhvZCBiZW5jaG1hcmtNZXRob2QgPSBSdW50aW1lQmVuY2htYXJrLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJtYWNyb2JlbmNobWFyayIpOworICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBpbnN0cnVtZW50LmNyZWF0ZUluc3RydW1lbnRhdGlvbihiZW5jaG1hcmtNZXRob2QpOworICAgIGFzc2VydEVxdWFscyhiZW5jaG1hcmtNZXRob2QsIGluc3RydW1lbnRhdGlvbi5iZW5jaG1hcmtNZXRob2QoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluc3RydW1lbnQsIGluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50KCkpOworICAgIGFzc2VydEVxdWFscyhNYWNyb2JlbmNobWFya1dvcmtlci5jbGFzcywgaW5zdHJ1bWVudGF0aW9uLndvcmtlckNsYXNzKCkpOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgY3JlYXRlSW5zdHJ1bWVudGF0aW9uX21pY3JvYmVuY2htYXJrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWV0aG9kIGJlbmNobWFya01ldGhvZCA9IFJ1bnRpbWVCZW5jaG1hcmsuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm1pY3JvYmVuY2htYXJrIiwgaW50LmNsYXNzKTsKKyAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gaW5zdHJ1bWVudC5jcmVhdGVJbnN0cnVtZW50YXRpb24oYmVuY2htYXJrTWV0aG9kKTsKKyAgICBhc3NlcnRFcXVhbHMoYmVuY2htYXJrTWV0aG9kLCBpbnN0cnVtZW50YXRpb24uYmVuY2htYXJrTWV0aG9kKCkpOworICAgIGFzc2VydEVxdWFscyhpbnN0cnVtZW50LCBpbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoUnVudGltZVdvcmtlci5NaWNyby5jbGFzcywgaW5zdHJ1bWVudGF0aW9uLndvcmtlckNsYXNzKCkpOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgY3JlYXRlSW5zdHJ1bWVudGF0aW9uX3BpY29iZW5jaG1hcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXRob2QgYmVuY2htYXJrTWV0aG9kID0gUnVudGltZUJlbmNobWFyay5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgicGljb2JlbmNobWFyayIsIGxvbmcuY2xhc3MpOworICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBpbnN0cnVtZW50LmNyZWF0ZUluc3RydW1lbnRhdGlvbihiZW5jaG1hcmtNZXRob2QpOworICAgIGFzc2VydEVxdWFscyhiZW5jaG1hcmtNZXRob2QsIGluc3RydW1lbnRhdGlvbi5iZW5jaG1hcmtNZXRob2QoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluc3RydW1lbnQsIGluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50KCkpOworICAgIGFzc2VydEVxdWFscyhSdW50aW1lV29ya2VyLlBpY28uY2xhc3MsIGluc3RydW1lbnRhdGlvbi53b3JrZXJDbGFzcygpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGNyZWF0ZUluc3RydW1lbnRhdGlvbl9iYWRQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIE1ldGhvZCBiZW5jaG1hcmtNZXRob2QgPQorICAgICAgICBSdW50aW1lQmVuY2htYXJrLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJpbnRlZ2VyUGFyYW0iLCBJbnRlZ2VyLmNsYXNzKTsKKyAgICB0cnkgeworICAgICAgaW5zdHJ1bWVudC5jcmVhdGVJbnN0cnVtZW50YXRpb24oYmVuY2htYXJrTWV0aG9kKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQmVuY2htYXJrRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgY3JlYXRlSW5zdHJ1bWVudGF0aW9uX25vdEFNYWNyb2JlbmNobWFyaygpIHRocm93cyBFeGNlcHRpb24geworICAgIE1ldGhvZCBiZW5jaG1hcmtNZXRob2QgPSBSdW50aW1lQmVuY2htYXJrLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJub3RBTWFjcm9iZW5jaG1hcmsiKTsKKyAgICB0cnkgeworICAgICAgaW5zdHJ1bWVudC5jcmVhdGVJbnN0cnVtZW50YXRpb24oYmVuY2htYXJrTWV0aG9kKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBjcmVhdGVJbnN0cnVtZW50YXRpb25ub3RBTWljcm9iZW5jaG1hcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXRob2QgYmVuY2htYXJrTWV0aG9kID0KKyAgICAgICAgUnVudGltZUJlbmNobWFyay5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgibm90QU1pY3JvYmVuY2htYXJrIiwgaW50LmNsYXNzKTsKKyAgICB0cnkgeworICAgICAgaW5zdHJ1bWVudC5jcmVhdGVJbnN0cnVtZW50YXRpb24oYmVuY2htYXJrTWV0aG9kKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBjcmVhdGVJbnN0cnVtZW50YXRpb25fbm90QVBpY29iZW5jaG1hcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXRob2QgYmVuY2htYXJrTWV0aG9kID0KKyAgICAgICAgUnVudGltZUJlbmNobWFyay5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgibm90QVBpY29iZW5jaG1hcmsiLCBsb25nLmNsYXNzKTsKKyAgICB0cnkgeworICAgICAgaW5zdHJ1bWVudC5jcmVhdGVJbnN0cnVtZW50YXRpb24oYmVuY2htYXJrTWV0aG9kKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUnVudGltZUJlbmNobWFyayB7CisgICAgQEJlbmNobWFyayB2b2lkIG1hY3JvYmVuY2htYXJrKCkge30KKyAgICBAQmVuY2htYXJrIHZvaWQgbWljcm9iZW5jaG1hcmsoaW50IHJlcHMpIHt9CisgICAgQEJlbmNobWFyayB2b2lkIHBpY29iZW5jaG1hcmsobG9uZyByZXBzKSB7fQorCisgICAgQEJlbmNobWFyayB2b2lkIGludGVnZXJQYXJhbShJbnRlZ2VyIG9vcHMpIHt9CisKKyAgICB2b2lkIG5vdEFNYWNyb2JlbmNobWFyaygpIHt9CisgICAgdm9pZCBub3RBTWljcm9iZW5jaG1hcmsoaW50IHJlcHMpIHt9CisgICAgdm9pZCBub3RBUGljb2JlbmNobWFyayhsb25nIHJlcHMpIHt9CisgIH0KKworICBwcml2YXRlIGRvdWJsZSByZWxhdGl2ZURpZmZlcmVuY2UoZG91YmxlIGEsIGRvdWJsZSBiKSB7CisgICAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSAvICgoYSArIGIpIC8gMi4wKTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0QmVuY2htYXJrIHsKKyAgICBAQmVuY2htYXJrIGxvbmcgcGljbyhsb25nIHJlcHMpIHsKKyAgICAgIGxvbmcgZHVtbXkgPSAwOworICAgICAgZm9yIChsb25nIGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgIGR1bW15ICs9IHNwaW4oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBkdW1teTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrIGxvbmcgbWljcm8oaW50IHJlcHMpIHsKKyAgICAgIGxvbmcgZHVtbXkgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgZHVtbXkgKz0gc3BpbigpOworICAgICAgfQorICAgICAgcmV0dXJuIGR1bW15OworICAgIH0KKworICAgIEBNYWNyb2JlbmNobWFyayBsb25nIG1hY3JvKCkgeworICAgICAgcmV0dXJuIHNwaW4oKTsKKyAgICB9CisgIH0KKworICAvLyBidXN5IHNwaW4gZm9yIDEwbXMgYW5kIHJldHVybiB0aGUgZWxhcHNlZCB0aW1lLiAgTi5CLiB3ZSBidXN5IHNwaW4gaW5zdGVhZCBvZiBzbGVlcGluZyBzbworICAvLyB0aGF0IHdlIGFyZW4ndCBwdXQgYXQgdGhlIG1lcmN5IChhbmQgdmFyaWFuY2UpIG9mIHRoZSB0aHJlYWQgc2NoZWR1bGVyLgorICBwcml2YXRlIHN0YXRpYyBsb25nIHNwaW4oKSB7CisgICAgbG9uZyByZW1haW5pbmdOYW5vcyA9IFRpbWVVbml0Lk1JTExJU0VDT05EUy50b05hbm9zKDEwKTsKKyAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgbG9uZyBlbGFwc2VkOworICAgIHdoaWxlICgoZWxhcHNlZCA9IFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnQpIDwgcmVtYWluaW5nTmFub3MpIHt9CisgICAgcmV0dXJuIGVsYXBzZWQ7CisgIH0KKworICBAVGVzdAorCisgIHB1YmxpYyB2b2lkIGdjQmVmb3JlRWFjaE9wdGlvbklzSG9ub3JlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJ1bkJlbmNobWFya1dpdGhLbm93bkhlYXAodHJ1ZSk7CisgICAgLy8gVGhlIEdDIGVycm9yIHdpbGwgb25seSBiZSBhdm9pZGVkIGlmIGdjQmVmb3JlRWFjaCBpcyB0cnVlLCBhbmQKKyAgICAvLyBob25vcmVkIGJ5IHRoZSBNYWNyb2JlbmNobWFya1dvcmtlci4KKyAgICBhc3NlcnRGYWxzZSgiTm8gR0Mgd2FybmluZyBzaG91bGQgYmUgcHJpbnRlZCB0byBzdGRlcnIiLAorICAgICAgICBydW5uZXIuZ2V0U3Rkb3V0KCkudG9TdHJpbmcoKS5jb250YWlucygiV0FSTklORzogR0Mgb2NjdXJyZWQgZHVyaW5nIHRpbWluZy4iKSk7CisgIH0KKworICBAVGVzdAorCisgIHB1YmxpYyB2b2lkIGdjQmVmb3JlRWFjaE9wdGlvbklzUmVhbGx5TmVjZXNzYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVmVyaWZpZXMgdGhhdCB3ZSBpbmRlZWQgZ2V0IGEgR0Mgd2FybmluZyBpZiBnY0JlZm9yZUVhY2ggPSBmYWxzZS4KKyAgICBydW5CZW5jaG1hcmtXaXRoS25vd25IZWFwKGZhbHNlKTsKKyAgICBhc3NlcnRUcnVlKCJBIEdDIHdhcm5pbmcgc2hvdWxkIGJlIHByaW50ZWQgdG8gc3RkZXJyIGlmIGdjQmVmb3JlRWFjaCBpc24ndCBob25vcmVkIiwKKyAgICAgICAgcnVubmVyLmdldFN0ZG91dCgpLnRvU3RyaW5nKCkuY29udGFpbnMoIldBUk5JTkc6IEdDIG9jY3VycmVkIGR1cmluZyB0aW1pbmcuIikpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1bkJlbmNobWFya1dpdGhLbm93bkhlYXAoYm9vbGVhbiBnY0JlZm9yZUVhY2gpIHRocm93cyBFeGNlcHRpb24geworICAgIHJ1bm5lci5mb3JCZW5jaG1hcmsoQmVuY2htYXJrVGhhdEFsbG9jYXRlc0FMb3QuY2xhc3MpCisgICAgICAgIC5pbnN0cnVtZW50KCJydW50aW1lIikKKyAgICAgICAgLm9wdGlvbnMoCisgICAgICAgICAgICAiLUN2bS5hcmdzPS1YbXg1MTJtIiwKKyAgICAgICAgICAgICItQ2luc3RydW1lbnQucnVudGltZS5vcHRpb25zLm1lYXN1cmVtZW50cz0xMCIsCisgICAgICAgICAgICAiLUNpbnN0cnVtZW50LnJ1bnRpbWUub3B0aW9ucy5nY0JlZm9yZUVhY2g9IiArIGdjQmVmb3JlRWFjaCwKKyAgICAgICAgICAgICItLXRpbWUtbGltaXQ9MzBzIikKKyAgICAgICAgLnJ1bigpOworICB9CisKKyAgc3RhdGljIGZpbmFsIGNsYXNzIEJlbmNobWFya1RoYXRBbGxvY2F0ZXNBTG90IHsKKyAgICBAQmVuY2htYXJrCisgICAgaW50IGJlbmNobWFya01ldGhvZCgpIHsKKyAgICAgIC8vIEFueSBsYXJnZXIgYW5kIHRoZSBHQyBkb2Vzbid0IG1hbmFnZSB0byBtYWtlIGVub3VnaCBzcGFjZSwgcmVzdWx0aW5nIGluCisgICAgICAvLyBPT01FcnJvcnMgaW4gYm90aCB0ZXN0IGNhc2VzIGFib3ZlLgorICAgICAgbG9uZ1tdIGFycmF5ID0gbmV3IGxvbmdbMzIgKiAxMDI0ICogMTAyNF07CisgICAgICByZXR1cm4gYXJyYXkubGVuZ3RoOworICAgIH0KKyAgfQorCisgIEBUZXN0CisKKyAgcHVibGljIHZvaWQgbWF4V2FybXVwV2FsbFRpbWVPcHRpb25Jc0hvbm9yZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBydW5uZXIuZm9yQmVuY2htYXJrKE1hY3JvQmVuY2htYXJrV2l0aExvbmdCZWZvcmVSZXAuY2xhc3MpCisgICAgICAgIC5pbnN0cnVtZW50KCJydW50aW1lIikKKyAgICAgICAgLm9wdGlvbnMoCisgICAgICAgICAgICAiLUNpbnN0cnVtZW50LnJ1bnRpbWUub3B0aW9ucy5tYXhXYXJtdXBXYWxsVGltZT0xMDBtcyIsCisgICAgICAgICAgICAiLS10aW1lLWxpbWl0PTEwcyIpCisgICAgICAgIC5ydW4oKTsKKworICAgIGFzc2VydFRydWUoCisgICAgICAgICJUaGUgbWF4V2FybXVwV2FsbFRpbWUgc2hvdWxkIHRyaWdnZXIgYW4gaW50ZXJydXB0aW9uIG9mIHdhcm11cCBhbmQgYSB3YXJuaW5nICIKKyAgICAgICAgICAgICsgInNob3VsZCBiZSBwcmludGVkIHRvIHN0ZGVyciIsCisgICAgICAgIHJ1bm5lci5nZXRTdGRvdXQoKS50b1N0cmluZygpLmNvbnRhaW5zKAorICAgICAgICAgICAgIldBUk5JTkc6IFdhcm11cCB3YXMgaW50ZXJydXB0ZWQgIgorICAgICAgICAgICAgICAgICsgImJlY2F1c2UgaXQgdG9vayBsb25nZXIgdGhhbiAxMDBtcyBvZiB3YWxsLWNsb2NrIHRpbWUuIikpOworICB9CisKKyAgc3RhdGljIGZpbmFsIGNsYXNzIE1hY3JvQmVuY2htYXJrV2l0aExvbmdCZWZvcmVSZXAgeworICAgIEBCZWZvcmVSZXAKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVSZXBNdWNoTG9uZ2VyVGhhbkJlbmNobWFyaygpIHsKKyAgICAgIFVuaW50ZXJydXB0aWJsZXMuc2xlZXBVbmludGVycnVwdGlibHkoMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBsb25nIHByZXR0eUZhc3RNYWNyb0JlbmNobWFyaygpIHsKKyAgICAgIHJldHVybiBzcGluKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9TZXJ2ZXJTb2NrZXRTZXJ2aWNlVGVzdC5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU2VydmVyU29ja2V0U2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWRkNDBiCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU2VydmVyU29ja2V0U2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLk9wZW5lZFNvY2tldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYnJpZGdlLlN0YXJ0dXBBbm5vdW5jZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50Lkxpc3RlbmFibGVGdXR1cmU7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgU2VydmVyU29ja2V0U2VydmljZX0uCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKKworcHVibGljIGNsYXNzIFNlcnZlclNvY2tldFNlcnZpY2VUZXN0IHsKKworICBwcml2YXRlIGZpbmFsIFNlcnZlclNvY2tldFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2ZXJTb2NrZXRTZXJ2aWNlKCk7CisgIHByaXZhdGUgaW50IHBvcnQ7CisKKyAgQEJlZm9yZSBwdWJsaWMgdm9pZCBzdGFydFNlcnZpY2UoKSB7CisgICAgc2VydmljZS5zdGFydEFzeW5jKCkuYXdhaXRSdW5uaW5nKCk7CisgICAgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydCgpOworICB9CisKKyAgQEFmdGVyIHB1YmxpYyB2b2lkIHN0b3BTZXJ2aWNlKCkgeworICAgIHNlcnZpY2Uuc3RvcEFzeW5jKCkuYXdhaXRUZXJtaW5hdGVkKCk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBnZXRDb25uZWN0aW9uSWRfcmVxdWVzdENvbWVzSW5GaXJzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFVVSUQgaWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKyAgICBMaXN0ZW5hYmxlRnV0dXJlPE9wZW5lZFNvY2tldD4gcGVuZGluZ1NlcnZlckNvbm5lY3Rpb24gPSBzZXJ2aWNlLmdldENvbm5lY3Rpb24oaWQpOworICAgIGFzc2VydEZhbHNlKHBlbmRpbmdTZXJ2ZXJDb25uZWN0aW9uLmlzRG9uZSgpKTsKKyAgICBPcGVuZWRTb2NrZXQgY2xpZW50U29ja2V0ID0gb3BlbkNvbm5lY3Rpb25BbmRJZGVudGlmeShpZCk7CisgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGVuZHMgYXJlIGhvb2tlZCB1cCB0byBlYWNoIG90aGVyCisgICAgYXNzZXJ0RW5kc0Nvbm5lY3RlZChjbGllbnRTb2NrZXQsIHBlbmRpbmdTZXJ2ZXJDb25uZWN0aW9uLmdldCgpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIGdldENvbm5lY3Rpb25JZFR3aWNlX2FjY2VwdENvbWVzRmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisgICAgT3BlbmVkU29ja2V0IGNsaWVudFNvY2tldCA9IG9wZW5Db25uZWN0aW9uQW5kSWRlbnRpZnkoaWQpOworCisgICAgTGlzdGVuYWJsZUZ1dHVyZTxPcGVuZWRTb2NrZXQ+IHBlbmRpbmdTZXJ2ZXJDb25uZWN0aW9uID0gc2VydmljZS5nZXRDb25uZWN0aW9uKGlkKTsKKyAgICAvLyB3YWl0IGZvciB0aGUgc2VydmljZSB0byBmdWxseSBpbml0aWFsaXplIHRoZSBjb25uZWN0aW9uCisgICAgT3BlbmVkU29ja2V0IHNlcnZlclNvY2tldCA9IHBlbmRpbmdTZXJ2ZXJDb25uZWN0aW9uLmdldCgpOworICAgIGFzc2VydEVuZHNDb25uZWN0ZWQoY2xpZW50U29ja2V0LCBzZXJ2ZXJTb2NrZXQpOworICAgIHRyeSB7CisgICAgICAvLyB0aGUgc2Vjb25kIHJlcXVlc3QgaXMgYW4gZXJyb3IKKyAgICAgIHNlcnZpY2UuZ2V0Q29ubmVjdGlvbihpZCkuZ2V0KCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgZ2V0Q29ubmVjdGlvblN0b3BwZWRTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVVVJRCBpZCA9IFVVSUQucmFuZG9tVVVJRCgpOworICAgIExpc3RlbmFibGVGdXR1cmU8T3BlbmVkU29ja2V0PiBwZW5kaW5nU2VydmVyQ29ubmVjdGlvbiA9IHNlcnZpY2UuZ2V0Q29ubmVjdGlvbihpZCk7CisgICAgYXNzZXJ0RmFsc2UocGVuZGluZ1NlcnZlckNvbm5lY3Rpb24uaXNEb25lKCkpOworICAgIHNlcnZpY2Uuc3RvcEFzeW5jKCkuYXdhaXRUZXJtaW5hdGVkKCk7CisgICAgYXNzZXJ0VHJ1ZShwZW5kaW5nU2VydmVyQ29ubmVjdGlvbi5pc0RvbmUoKSk7CisKKyAgICB0cnkgeworICAgICAgcGVuZGluZ1NlcnZlckNvbm5lY3Rpb24uZ2V0KCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscygiVGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQiLCBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgc2VydmljZS5nZXRDb25uZWN0aW9uKFVVSUQucmFuZG9tVVVJRCgpKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisgIH0KKworICBwcml2YXRlIE9wZW5lZFNvY2tldCBvcGVuQ2xpZW50Q29ubmVjdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIE9wZW5lZFNvY2tldC5mcm9tU29ja2V0KG5ldyBTb2NrZXQoSW5ldEFkZHJlc3MuZ2V0TG9vcGJhY2tBZGRyZXNzKCksIHBvcnQpKTsKKyAgfQorCisgIC8qKgorICAgKiBPcGVucyBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZpY2UgYW5kIGlkZW50aWZpZXMgaXRzZWxmIHVzaW5nIHRoZSBpZC4KKyAgICovCisgIHByaXZhdGUgT3BlbmVkU29ja2V0IG9wZW5Db25uZWN0aW9uQW5kSWRlbnRpZnkoVVVJRCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBPcGVuZWRTb2NrZXQgY2xpZW50U29ja2V0ID0gb3BlbkNsaWVudENvbm5lY3Rpb24oKTsKKyAgICBPcGVuZWRTb2NrZXQuV3JpdGVyIHdyaXRlciA9IGNsaWVudFNvY2tldC53cml0ZXIoKTsKKyAgICB3cml0ZXIud3JpdGUobmV3IFN0YXJ0dXBBbm5vdW5jZU1lc3NhZ2UoaWQpKTsKKyAgICB3cml0ZXIuZmx1c2goKTsKKyAgICByZXR1cm4gY2xpZW50U29ja2V0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEVuZHNDb25uZWN0ZWQoT3BlbmVkU29ja2V0IGNsaWVudFNvY2tldCwgT3BlbmVkU29ja2V0IHNlcnZlclNvY2tldCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc2VydmVyU29ja2V0LndyaXRlcigpLndyaXRlKCJoZWxsbyBjbGllbnQhIik7CisgICAgc2VydmVyU29ja2V0LndyaXRlcigpLmZsdXNoKCk7ICAvLyBuZWNlc3NhcnkgdG8gcHJldmVudCBkZWFkbG9jaworICAgIGFzc2VydEVxdWFscygiaGVsbG8gY2xpZW50ISIsIGNsaWVudFNvY2tldC5yZWFkZXIoKS5yZWFkKCkpOworCisgICAgY2xpZW50U29ja2V0LndyaXRlcigpLndyaXRlKCJoZWxsbyBzZXJ2ZXIhIik7CisgICAgY2xpZW50U29ja2V0LndyaXRlcigpLmZsdXNoKCk7ICAvLyBkaXR0bworICAgIGFzc2VydEVxdWFscygiaGVsbG8gc2VydmVyISIsIHNlcnZlclNvY2tldC5yZWFkZXIoKS5yZWFkKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9TdHJlYW1TZXJ2aWNlVGVzdC5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU3RyZWFtU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjBlNzJhCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9ydW5uZXIvU3RyZWFtU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmJyaWRnZS5Mb2dNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5icmlkZ2UuT3BlbmVkU29ja2V0OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuRmFrZVdvcmtlcnMuRHVtbXlMb2dNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuU3RyZWFtU2VydmljZS5TdHJlYW1JdGVtOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuU3RyZWFtU2VydmljZS5TdHJlYW1JdGVtLktpbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWwuUGFyc2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZVRhc2s7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50Lk1vcmVFeGVjdXRvcnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlNlcnZpY2UuTGlzdGVuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlNlcnZpY2UuU3RhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgU3RyZWFtU2VydmljZX0uCisgKi8KK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKKworcHVibGljIGNsYXNzIFN0cmVhbVNlcnZpY2VUZXN0IHsKKworICBwcml2YXRlIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQ7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgcHJpdmF0ZSBmaW5hbCBQcmludFdyaXRlciBzdGRvdXQgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyLCB0cnVlKTsKKyAgcHJpdmF0ZSBmaW5hbCBQYXJzZXI8TG9nTWVzc2FnZT4gcGFyc2VyID0gbmV3IFBhcnNlcjxMb2dNZXNzYWdlPigpIHsKKyAgICBAT3ZlcnJpZGUgcHVibGljIExvZ01lc3NhZ2UgcGFyc2UoZmluYWwgQ2hhclNlcXVlbmNlIHRleHQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbmV3IER1bW15TG9nTWVzc2FnZSh0ZXh0LnRvU3RyaW5nKCkpOworICAgIH0KKyAgfTsKKworICBwcml2YXRlIFN0cmVhbVNlcnZpY2Ugc2VydmljZTsKKyAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCB0ZXJtaW5hbExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJJQUxfTlVNQkVSID0gMzsKKworICBAQmVmb3JlIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KDApOworICB9CisKKyAgQEFmdGVyIHB1YmxpYyB2b2lkIGNsb3NlU29ja2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgfQorCisgIEBBZnRlciBwdWJsaWMgdm9pZCBzdG9wU2VydmljZSgpIHsKKyAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIHNlcnZpY2Uuc3RhdGUoKSAhPSBTdGF0ZS5GQUlMRUQgJiYgc2VydmljZS5zdGF0ZSgpICE9IFN0YXRlLlRFUk1JTkFURUQpIHsKKyAgICAgIHNlcnZpY2Uuc3RvcEFzeW5jKCkuYXdhaXRUZXJtaW5hdGVkKCk7CisgICAgfQorICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlYWRPdXRwdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBtYWtlU2VydmljZShGYWtlV29ya2Vycy5QcmludENsaWVudC5jbGFzcywgImZvbyIsICJiYXIiKTsKKyAgICBzZXJ2aWNlLnN0YXJ0QXN5bmMoKS5hd2FpdFJ1bm5pbmcoKTsKKyAgICBTdHJlYW1JdGVtIGl0ZW0xID0gcmVhZEl0ZW0oKTsKKyAgICBhc3NlcnRFcXVhbHMoS2luZC5EQVRBLCBpdGVtMS5raW5kKCkpOworICAgIFNldDxTdHJpbmc+IGxpbmVzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgbGluZXMuYWRkKGl0ZW0xLmNvbnRlbnQoKS50b1N0cmluZygpKTsKKyAgICBTdHJlYW1JdGVtIGl0ZW0yID0gcmVhZEl0ZW0oKTsKKyAgICBhc3NlcnRFcXVhbHMoS2luZC5EQVRBLCBpdGVtMi5raW5kKCkpOworICAgIGxpbmVzLmFkZChpdGVtMi5jb250ZW50KCkudG9TdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFNldHMubmV3SGFzaFNldCgiZm9vIiwgImJhciIpLCBsaW5lcyk7CisgICAgYXNzZXJ0RXF1YWxzKFN0YXRlLlJVTk5JTkcsIHNlcnZpY2Uuc3RhdGUoKSk7CisgICAgU3RyZWFtSXRlbSBpdGVtMyA9IHJlYWRJdGVtKCk7CisgICAgYXNzZXJ0RXF1YWxzKEtpbmQuRU9GLCBpdGVtMy5raW5kKCkpOworICAgIGF3YWl0U3RvcHBlZCgxMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgYXNzZXJ0VGVybWluYXRlZCgpOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgZmFpbGluZ1Byb2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBtYWtlU2VydmljZShGYWtlV29ya2Vycy5FeGl0LmNsYXNzLCAiMSIpOworICAgIHNlcnZpY2Uuc3RhcnRBc3luYygpLmF3YWl0UnVubmluZygpOworICAgIGFzc2VydEVxdWFscyhLaW5kLkVPRiwgcmVhZEl0ZW0oKS5raW5kKCkpOworICAgIGF3YWl0U3RvcHBlZCgxMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgYXNzZXJ0RXF1YWxzKFN0YXRlLkZBSUxFRCwgc2VydmljZS5zdGF0ZSgpKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHByb2Nlc3NEb2VzbnRFeGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gY2xvc2UgYWxsIGZkcyBhbmQgdGhlbiBzbGVlcAorICAgIG1ha2VTZXJ2aWNlKEZha2VXb3JrZXJzLkNsb3NlQW5kU2xlZXAuY2xhc3MpOworICAgIHNlcnZpY2Uuc3RhcnRBc3luYygpLmF3YWl0UnVubmluZygpOworICAgIGFzc2VydEVxdWFscyhLaW5kLkVPRiwgcmVhZEl0ZW0oKS5raW5kKCkpOworICAgIGF3YWl0U3RvcHBlZCgyMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7ICAvLyB3ZQorICAgIGFzc2VydEVxdWFscyhTdGF0ZS5GQUlMRUQsIHNlcnZpY2Uuc3RhdGUoKSk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U29ja2V0SW5wdXRPdXRwdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBpbnQgbG9jYWxwb3J0ID0gc2VydmVyU29ja2V0LmdldExvY2FsUG9ydCgpOworICAgIC8vIHJlYWQgZnJvbSB0aGUgc29ja2V0IGFuZCBlY2hvIGl0IGJhY2sKKyAgICBtYWtlU2VydmljZShGYWtlV29ya2Vycy5Tb2NrZXRFY2hvQ2xpZW50LmNsYXNzLCBJbnRlZ2VyLnRvU3RyaW5nKGxvY2FscG9ydCkpOworCisgICAgc2VydmljZS5zdGFydEFzeW5jKCkuYXdhaXRSdW5uaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBEdW1teUxvZ01lc3NhZ2UoInN0YXJ0IiksIHJlYWRJdGVtKCkuY29udGVudCgpKTsKKyAgICBzZXJ2aWNlLnNlbmRNZXNzYWdlKG5ldyBEdW1teUxvZ01lc3NhZ2UoImhlbGxvIHNvY2tldCB3b3JsZCIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IER1bW15TG9nTWVzc2FnZSgiaGVsbG8gc29ja2V0IHdvcmxkIiksIHJlYWRJdGVtKCkuY29udGVudCgpKTsKKyAgICBzZXJ2aWNlLmNsb3NlV3JpdGVyKCk7CisgICAgYXNzZXJ0RXF1YWxzKFN0YXRlLlJVTk5JTkcsIHNlcnZpY2Uuc3RhdGUoKSk7CisgICAgU3RyZWFtSXRlbSBuZXh0SXRlbSA9IHJlYWRJdGVtKCk7CisgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBFT0YgIiArIG5leHRJdGVtLCBLaW5kLkVPRiwgbmV4dEl0ZW0ua2luZCgpKTsKKyAgICBhd2FpdFN0b3BwZWQoMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIGFzc2VydFRlcm1pbmF0ZWQoKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTb2NrZXRDbG9zZXNCZWZvcmVQcm9jZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgaW50IGxvY2FscG9ydCA9IHNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKTsKKyAgICAvLyByZWFkIGZyb20gdGhlIHNvY2tldCBhbmQgZWNobyBpdCBiYWNrCisgICAgbWFrZVNlcnZpY2UoRmFrZVdvcmtlcnMuU29ja2V0RWNob0NsaWVudC5jbGFzcywgSW50ZWdlci50b1N0cmluZyhsb2NhbHBvcnQpLCAiZm9vIik7CisgICAgc2VydmljZS5zdGFydEFzeW5jKCkuYXdhaXRSdW5uaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBEdW1teUxvZ01lc3NhZ2UoInN0YXJ0IiksIHJlYWRJdGVtKCkuY29udGVudCgpKTsKKyAgICBzZXJ2aWNlLnNlbmRNZXNzYWdlKG5ldyBEdW1teUxvZ01lc3NhZ2UoImhlbGxvIHNvY2tldCB3b3JsZCIpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IER1bW15TG9nTWVzc2FnZSgiaGVsbG8gc29ja2V0IHdvcmxkIiksIHJlYWRJdGVtKCkuY29udGVudCgpKTsKKyAgICBzZXJ2aWNlLmNsb3NlV3JpdGVyKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHJlYWRJdGVtKCkuY29udGVudCgpLnRvU3RyaW5nKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKFN0YXRlLlJVTk5JTkcsIHNlcnZpY2Uuc3RhdGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEtpbmQuRU9GLCByZWFkSXRlbSgpLmtpbmQoKSk7CisgICAgYXdhaXRTdG9wcGVkKDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICBhc3NlcnRUZXJtaW5hdGVkKCk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBmYWlsc1RvQWNjZXB0Q29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOyAgLy8gVGhpcyB3aWxsIGZvcmNlIHNlcnZlclNvY2tldC5hY2NlcHQgdG8gdGhyb3cgYSBTb2NrZXRFeGNlcHRpb24KKyAgICBtYWtlU2VydmljZShGYWtlV29ya2Vycy5TbGVlcGVyLmNsYXNzLCBMb25nLnRvU3RyaW5nKFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoMTApKSk7CisgICAgdHJ5IHsKKyAgICAgIHNlcnZpY2Uuc3RhcnRBc3luYygpLmF3YWl0UnVubmluZygpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkge30KKyAgICBhc3NlcnRFcXVhbHMoU29ja2V0RXhjZXB0aW9uLmNsYXNzLCBzZXJ2aWNlLmZhaWx1cmVDYXVzZSgpLmdldENsYXNzKCkpOworICB9CisKKyAgLyoqIFJlYWRzIGFuIGl0ZW0sIGFzc2VydGluZyB0aGF0IHRoZXJlIHdhcyBubyB0aW1lb3V0LiAqLworICBwcml2YXRlIFN0cmVhbUl0ZW0gcmVhZEl0ZW0oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIFN0cmVhbUl0ZW0gaXRlbSA9IHNlcnZpY2UucmVhZEl0ZW0oMTAsIFRpbWVVbml0LlNFQ09ORFMpOworICAgIGFzc2VydE5vdFNhbWUoIlRpbWVkIG91dCB3aGlsZSByZWFkaW5nIGl0ZW0gZnJvbSB3b3JrZXIiLCBLaW5kLlRJTUVPVVQsIGl0ZW0ua2luZCgpKTsKKyAgICByZXR1cm4gaXRlbTsKKyAgfQorCisgIC8qKgorICAgKiBXYWl0IGZvciB0aGUgc2VydmljZSB0byByZWFjaCBhIHRlcm1pbmFsIHN0YXRlIHdpdGhvdXQgY2FsbGluZyBzdG9wLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGF3YWl0U3RvcHBlZChsb25nIHRpbWUsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0VHJ1ZSh0ZXJtaW5hbExhdGNoLmF3YWl0KHRpbWUsIHVuaXQpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRUZXJtaW5hdGVkKCkgeworICAgIFN0YXRlIHN0YXRlID0gc2VydmljZS5zdGF0ZSgpOworICAgIGlmIChzdGF0ZSAhPSBTdGF0ZS5URVJNSU5BVEVEKSB7CisgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihzZXJ2aWNlLmZhaWx1cmVDYXVzZSgpKTsKKyAgICAgIH0KKyAgICAgIGZhaWwoIkV4cGVjdGVkIHNlcnZpY2UgdG8gYmUgdGVybWluYXRlZCBidXQgd2FzOiAiICsgc3RhdGUpOworICAgIH0KKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgIHByaXZhdGUgdm9pZCBtYWtlU2VydmljZShDbGFzczw/PiBtYWluLCBTdHJpbmcgLi4uYXJncykgeworICAgIGNoZWNrU3RhdGUoc2VydmljZSA9PSBudWxsLCAiWW91IGNhbiBvbmx5IG1ha2Ugb25lIFN0cmVhbVNlcnZpY2UgcGVyIHRlc3QiKTsKKyAgICBVVUlEIHRyaWFsSWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKyAgICBUcmlhbE91dHB1dExvZ2dlciB0cmlhbE91dHB1dCA9IG5ldyBUcmlhbE91dHB1dExvZ2dlcihuZXcgVHJpYWxPdXRwdXRGYWN0b3J5KCkgeworICAgICAgQE92ZXJyaWRlIHB1YmxpYyBGaWxlQW5kV3JpdGVyIGdldFRyaWFsT3V0cHV0RmlsZShpbnQgdHJpYWxOdW1iZXIpCisgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrQXJndW1lbnQodHJpYWxOdW1iZXIgPT0gVFJJQUxfTlVNQkVSKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlQW5kV3JpdGVyKG5ldyBGaWxlKCIvdG1wL25vdC1hLWZpbGUiKSwgc3Rkb3V0KTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHBlcnNpc3RGaWxlKEZpbGUgZikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKworICAgIH0sIFRSSUFMX05VTUJFUiwgdHJpYWxJZCwgbnVsbCAvKiBleHBlcmltZW50ICovKTsKKyAgICB0cnkgeworICAgICAgLy8gbm9ybWFsbHkgdGhlIFRyaWFsUnVuTG9vcCBvcGVucy9jbG9zZXMgdGhlIGxvZ2dlcgorICAgICAgdHJpYWxPdXRwdXQub3BlbigpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgIH0KKyAgICBzZXJ2aWNlID0gbmV3IFN0cmVhbVNlcnZpY2UoCisgICAgICAgIG5ldyBXb3JrZXJQcm9jZXNzKEZha2VXb3JrZXJzLmNyZWF0ZVByb2Nlc3NCdWlsZGVyKG1haW4sIGFyZ3MpLAorICAgICAgICAgICAgdHJpYWxJZCwKKyAgICAgICAgICAgIGdldFNvY2tldEZ1dHVyZSgpLAorICAgICAgICAgICAgbmV3IFJ1bnRpbWVTaHV0ZG93bkhvb2tSZWdpc3RyYXIoKSksCisgICAgICAgIHBhcnNlciwKKyAgICAgICAgdHJpYWxPdXRwdXQpOworICAgIHNlcnZpY2UuYWRkTGlzdGVuZXIobmV3IExpc3RlbmVyKCkgeworICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHN0YXJ0aW5nKCkge30KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW5uaW5nKCkge30KKyAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBzdG9wcGluZyhTdGF0ZSBmcm9tKSB7fQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZWQoU3RhdGUgZnJvbSkgeworICAgICAgICB0ZXJtaW5hbExhdGNoLmNvdW50RG93bigpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGZhaWxlZChTdGF0ZSBmcm9tLCBUaHJvd2FibGUgZmFpbHVyZSkgeworICAgICAgICB0ZXJtaW5hbExhdGNoLmNvdW50RG93bigpOworICAgICAgfQorICAgIH0sIE1vcmVFeGVjdXRvcnMuZGlyZWN0RXhlY3V0b3IoKSk7CisgIH0KKworICBwcml2YXRlIExpc3RlbmFibGVGdXR1cmU8T3BlbmVkU29ja2V0PiBnZXRTb2NrZXRGdXR1cmUoKSB7CisgICAgTGlzdGVuYWJsZUZ1dHVyZVRhc2s8T3BlbmVkU29ja2V0PiBvcGVuU29ja2V0VGFzayA9IExpc3RlbmFibGVGdXR1cmVUYXNrLmNyZWF0ZSgKKyAgICAgICAgbmV3IENhbGxhYmxlPE9wZW5lZFNvY2tldD4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIE9wZW5lZFNvY2tldCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gT3BlbmVkU29ja2V0LmZyb21Tb2NrZXQoc2VydmVyU29ja2V0LmFjY2VwdCgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIC8vIE4uQi4gdGhpcyB0aHJlYWQgd2lsbCBibG9jayBvbiBzZXJ2ZXJTb2NrZXQuYWNjZXB0IHVudGlsIGEgY29ubmVjdGlvbiBpcyBhY2NlcHRlZCBvciB0aGUKKyAgICAvLyBzb2NrZXQgaXMgY2xvc2VkLCBzbyBubyBtYXR0ZXIgd2hhdCB0aGlzIHRocmVhZCB3aWxsIGRpZSB3aXRoIHRoZSB0ZXN0LgorICAgIFRocmVhZCBvcGVuZXIgPSBuZXcgVGhyZWFkKG9wZW5Tb2NrZXRUYXNrLCAiU29ja2V0T3BlbmVyIik7CisgICAgb3BlbmVyLnNldERhZW1vbih0cnVlKTsKKyAgICBvcGVuZXIuc3RhcnQoKTsKKyAgICByZXR1cm4gb3BlblNvY2tldFRhc2s7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvcnVubmVyL1dvcmtlclByb2Nlc3NUZXN0LmphdmEgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9Xb3JrZXJQcm9jZXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2Y3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3J1bm5lci9Xb3JrZXJQcm9jZXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLlZtQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5tb2RlbC5CZW5jaG1hcmtTcGVjOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5wbGF0Zm9ybS5qdm0uSnZtUGxhdGZvcm07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLndvcmtlci5Xb3JrZXJNYWluOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCisvKioKKyAqIFRlc3RzIHtAbGluayBXb3JrZXJQcm9jZXNzfS4KKyAqCisgKiA8cD5UT0RPKGx1a2VzLGdhayk6IHdyaXRlIG1vcmUgdGVzdHMgZm9yIGhvdyBvdXIgc3BlY3MgZ2V0IHR1cm5lZCBpbnRvIGNvbW1hbmRsaW5lcworICovCisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBXb3JrZXJQcm9jZXNzVGVzdCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1JUX05VTUJFUiA9IDQwMDQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVVSUQgVFJJQUxfSUQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrUmVnaXN0cmFyIGltcGxlbWVudHMgU2h1dGRvd25Ib29rUmVnaXN0cmFyIHsKKyAgICBTZXQ8VGhyZWFkPiBob29rcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBhZGRTaHV0ZG93bkhvb2soVGhyZWFkIGhvb2spIHsKKyAgICAgIGhvb2tzLmFkZChob29rKTsKKyAgICB9CisgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHJlbW92ZVNodXRkb3duSG9vayhUaHJlYWQgaG9vaykgeworICAgICAgcmV0dXJuIGhvb2tzLnJlbW92ZShob29rKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIE1vY2tSZWdpc3RyYXIgcmVnaXN0cmFyID0gbmV3IE1vY2tSZWdpc3RyYXIoKTsKKyAgcHJpdmF0ZSBCZW5jaG1hcmtDbGFzcyBiZW5jaG1hcmtDbGFzczsKKworICBAQmVmb3JlIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEludmFsaWRCZW5jaG1hcmtFeGNlcHRpb24geworICAgIGJlbmNobWFya0NsYXNzID0gQmVuY2htYXJrQ2xhc3MuZm9yQ2xhc3MoVGVzdEJlbmNobWFyay5jbGFzcyk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBzaW1wbGVBcmdzVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE1ldGhvZCBtZXRob2QgPSBUZXN0QmVuY2htYXJrLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpWzBdOworICAgIEFsbG9jYXRpb25JbnN0cnVtZW50IGFsbG9jYXRpb25JbnN0cnVtZW50ID0gbmV3IEFsbG9jYXRpb25JbnN0cnVtZW50KCk7CisgICAgYWxsb2NhdGlvbkluc3RydW1lbnQuc2V0T3B0aW9ucyhJbW11dGFibGVNYXAub2YoInRyYWNrQWxsb2NhdGlvbnMiLCAidHJ1ZSIpKTsKKyAgICBWbUNvbmZpZyB2bUNvbmZpZyA9IG5ldyBWbUNvbmZpZygKKyAgICAgICAgbmV3IEZpbGUoImZvbyIpLAorICAgICAgICBBcnJheXMuYXNMaXN0KCItLWRvVGhlSHVzdGxlIiksCisgICAgICAgIG5ldyBGaWxlKCJqYXZhIiksCisgICAgICAgIG5ldyBKdm1QbGF0Zm9ybSgpKTsKKyAgICBFeHBlcmltZW50IGV4cGVyaW1lbnQgPSBuZXcgRXhwZXJpbWVudCgKKyAgICAgICAgYWxsb2NhdGlvbkluc3RydW1lbnQuY3JlYXRlSW5zdHJ1bWVudGF0aW9uKG1ldGhvZCksCisgICAgICAgIEltbXV0YWJsZU1hcC48U3RyaW5nLCBTdHJpbmc+b2YoKSwKKyAgICAgICAgbmV3IFZpcnR1YWxNYWNoaW5lKCJmb28tanZtIiwgdm1Db25maWcpKTsKKyAgICBCZW5jaG1hcmtTcGVjIHNwZWMgPSBuZXcgQmVuY2htYXJrU3BlYy5CdWlsZGVyKCkKKyAgICAgICAgLmNsYXNzTmFtZShUZXN0QmVuY2htYXJrLmNsYXNzLmdldE5hbWUoKSkKKyAgICAgICAgLm1ldGhvZE5hbWUobWV0aG9kLmdldE5hbWUoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgUHJvY2Vzc0J1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZVByb2Nlc3MoZXhwZXJpbWVudCwgc3BlYyk7CisgICAgTGlzdDxTdHJpbmc+IGNvbW1hbmRMaW5lID0gYnVpbGRlci5jb21tYW5kKCk7CisgICAgYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJqYXZhIikuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbW1hbmRMaW5lLmdldCgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKCItLWRvVGhlSHVzdGxlIiwgY29tbWFuZExpbmUuZ2V0KDEpKTsgIC8vIHZtIHNwZWNpZmljIGZsYWdzIGNvbWUgbmV4dAorICAgIGFzc2VydEVxdWFscygiLWNwIiwgY29tbWFuZExpbmUuZ2V0KDIpKTsgIC8vIHRoZW4gdGhlIGNsYXNzcGF0aAorICAgIC8vIHNob3VsZCB3ZSBhc3NlcnQgb24gY2xhc3NwYXRoIGNvbnRlbnRzPworICAgIEltbXV0YWJsZVNldDxTdHJpbmc+IGV4dHJhQ29tbWFuZExpbmVBcmdzID0KKyAgICAgICAgYWxsb2NhdGlvbkluc3RydW1lbnQuZ2V0RXh0cmFDb21tYW5kTGluZUFyZ3Modm1Db25maWcpOworICAgIGFzc2VydEVxdWFscyhleHRyYUNvbW1hbmRMaW5lQXJncy5hc0xpc3QoKSwKKyAgICAgICAgY29tbWFuZExpbmUuc3ViTGlzdCg0LCA0ICsgZXh0cmFDb21tYW5kTGluZUFyZ3Muc2l6ZSgpKSk7CisgICAgaW50IGluZGV4ID0gNCArIGV4dHJhQ29tbWFuZExpbmVBcmdzLnNpemUoKTsKKyAgICBhc3NlcnRFcXVhbHMoIi1YWDorUHJpbnRGbGFnc0ZpbmFsIiwgY29tbWFuZExpbmUuZ2V0KGluZGV4KSk7CisgICAgYXNzZXJ0RXF1YWxzKCItWFg6K1ByaW50Q29tcGlsYXRpb24iLCBjb21tYW5kTGluZS5nZXQoKytpbmRleCkpOworICAgIGFzc2VydEVxdWFscygiLVhYOitQcmludEdDIiwgY29tbWFuZExpbmUuZ2V0KCsraW5kZXgpKTsKKyAgICBhc3NlcnRFcXVhbHMoV29ya2VyTWFpbi5jbGFzcy5nZXROYW1lKCksIGNvbW1hbmRMaW5lLmdldCgrK2luZGV4KSk7CisgICAgLy8gZm9sbG93ZWQgYnkgd29ya2VyIGFyZ3MuLi4KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHNodXRkb3duSG9va193YWl0Rm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvY2VzcyB3b3JrZXIgPSBjcmVhdGVXb3JrZXJQcm9jZXNzKEZha2VXb3JrZXJzLkV4aXQuY2xhc3MsICIwIikuc3RhcnRXb3JrZXIoKTsKKyAgICBhc3NlcnRFcXVhbHMoIndvcmtlci1zaHV0ZG93bi1ob29rLSIgKyBUUklBTF9JRCwKKyAgICAgICAgSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KHJlZ2lzdHJhci5ob29rcykuZ2V0TmFtZSgpKTsKKyAgICB3b3JrZXIud2FpdEZvcigpOworICAgIGFzc2VydFRydWUocmVnaXN0cmFyLmhvb2tzLmlzRW1wdHkoKSk7CisgIH0KKworICBAVGVzdCBwdWJsaWMgdm9pZCBzaHV0ZG93bkhvb2tfZXhpdFZhbHVlVGhyb3dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvY2VzcyB3b3JrZXIgPSBjcmVhdGVXb3JrZXJQcm9jZXNzKAorICAgICAgICBGYWtlV29ya2Vycy5TbGVlcGVyLmNsYXNzLCBMb25nLnRvU3RyaW5nKE1JTlVURVMudG9NaWxsaXMoMSkpKS5zdGFydFdvcmtlcigpOworICAgIHRyeSB7CisgICAgICBUaHJlYWQgaG9vayA9IEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChyZWdpc3RyYXIuaG9va3MpOworICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JrZXItc2h1dGRvd24taG9vay0iICsgVFJJQUxfSUQsIGhvb2suZ2V0TmFtZSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHdvcmtlci5leGl0VmFsdWUoKTsKKyAgICAgICAgZmFpbCgpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICAgICAgYXNzZXJ0VHJ1ZShyZWdpc3RyYXIuaG9va3MuY29udGFpbnMoaG9vaykpOworICAgIH0gZmluYWxseSB7CisgICAgICB3b3JrZXIuZGVzdHJveSgpOyAvLyBjbGVhbiB1cAorICAgIH0KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHNodXRkb3duSG9va19leGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBQcm9jZXNzIHdvcmtlciA9IGNyZWF0ZVdvcmtlclByb2Nlc3MoRmFrZVdvcmtlcnMuRXhpdC5jbGFzcywgIjAiKS5zdGFydFdvcmtlcigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB0cnkgeworICAgICAgICB3b3JrZXIuZXhpdFZhbHVlKCk7CisgICAgICAgIGFzc2VydFRydWUocmVnaXN0cmFyLmhvb2tzLmlzRW1wdHkoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsgIC8vIGtlZXAgcG9sbGluZworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHNodXRkb3duSG9va19kZXN0cm95KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUHJvY2VzcyB3b3JrZXIgPSBjcmVhdGVXb3JrZXJQcm9jZXNzKAorICAgICAgICBGYWtlV29ya2Vycy5TbGVlcGVyLmNsYXNzLCBMb25nLnRvU3RyaW5nKE1JTlVURVMudG9NaWxsaXMoMSkpKS5zdGFydFdvcmtlcigpOworICAgIHdvcmtlci5kZXN0cm95KCk7CisgICAgYXNzZXJ0VHJ1ZShyZWdpc3RyYXIuaG9va3MuaXNFbXB0eSgpKTsKKyAgfQorCisgIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0QmVuY2htYXJrIHsKKyAgICBAQmVuY2htYXJrIGxvbmcgdGhpbmcobG9uZyByZXBzKSB7CisgICAgICBsb25nIGR1bW15ID0gMDsKKyAgICAgIGZvciAobG9uZyBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICBkdW1teSArPSBuZXcgTG9uZyhkdW1teSkuaGFzaENvZGUoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBkdW1teTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFByb2Nlc3NCdWlsZGVyIGNyZWF0ZVByb2Nlc3MoRXhwZXJpbWVudCBleHBlcmltZW50LCBCZW5jaG1hcmtTcGVjIGJlbmNobWFya1NwZWMpIHsKKyAgICByZXR1cm4gV29ya2VyUHJvY2Vzcy5idWlsZFByb2Nlc3MoVFJJQUxfSUQsIGV4cGVyaW1lbnQsIGJlbmNobWFya1NwZWMsIFBPUlRfTlVNQkVSLAorICAgICAgICBiZW5jaG1hcmtDbGFzcyk7CisgIH0KKworICBwcml2YXRlIFdvcmtlclByb2Nlc3MgY3JlYXRlV29ya2VyUHJvY2VzcyhDbGFzczw/PiBtYWluLCBTdHJpbmcgLi4uYXJncykgeworICAgIHJldHVybiBuZXcgV29ya2VyUHJvY2VzcyhGYWtlV29ya2Vycy5jcmVhdGVQcm9jZXNzQnVpbGRlcihtYWluLCBhcmdzKSwKKyAgICAgICAgVFJJQUxfSUQsCisgICAgICAgIG51bGwsCisgICAgICAgIHJlZ2lzdHJhcik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9MaW5lYXJUcmFuc2xhdGlvblRlc3QuamF2YSBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9MaW5lYXJUcmFuc2xhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWU4NzViCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci91dGlsL0xpbmVhclRyYW5zbGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5jYWxpcGVyLnV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTGluZWFyVHJhbnNsYXRpb25UZXN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIENMT1NFX0VOT1VHSCA9IDEuMEUtMTM7CisKKyAgQFRlc3QgcHVibGljIHZvaWQgbGluZWFyVHJhbnNsYXRpb24oKSB7CisgICAgTGluZWFyVHJhbnNsYXRpb24gY3RvZiA9IG5ldyBMaW5lYXJUcmFuc2xhdGlvbigwLCAzMiwgMTAwLCAyMTIpOworICAgIGFzc2VydEVxdWFscygzMiwgY3RvZi50cmFuc2xhdGUoMCksIENMT1NFX0VOT1VHSCk7CisgICAgYXNzZXJ0RXF1YWxzKDIxMiwgY3RvZi50cmFuc2xhdGUoMTAwKSwgQ0xPU0VfRU5PVUdIKTsKKyAgICBhc3NlcnRFcXVhbHMoOTguNiwgY3RvZi50cmFuc2xhdGUoMzcpLCBDTE9TRV9FTk9VR0gpOworICAgIGFzc2VydEVxdWFscygtNDAsIGN0b2YudHJhbnNsYXRlKC00MCksIENMT1NFX0VOT1VHSCk7CisKKyAgICBMaW5lYXJUcmFuc2xhdGlvbiByZXZlcnNlZCA9IG5ldyBMaW5lYXJUcmFuc2xhdGlvbig1LCA0MiwgNjksIDApOworICAgIGFzc2VydEVxdWFscygtMjEsIHJldmVyc2VkLnRyYW5zbGF0ZSgxMDEpLCBDTE9TRV9FTk9VR0gpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvU2hvcnREdXJhdGlvblRlc3QuamF2YSBiL2NhbGlwZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvdXRpbC9TaG9ydER1cmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzJmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3V0aWwvU2hvcnREdXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5nb29nbGUuY2FsaXBlci51dGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTaG9ydER1cmF0aW9uVGVzdCB7CisgIEBUZXN0IHB1YmxpYyB2b2lkIHZhbHVlT2YoKSB7CisgICAgYXNzZXJ0RXF1YWxzKFNob3J0RHVyYXRpb24uemVybygpLCBTaG9ydER1cmF0aW9uLnZhbHVlT2YoIjAiKSk7CisgICAgdGVzdEl0KDAsICIwbnMiLCAiMHMiKTsKKyAgICB0ZXN0SXQoMCwgIjAgbnMiLCAiMHMiKTsKKyAgICB0ZXN0SXQoMCwgIjBuYW5vcyIsICIwcyIpOworICAgIHRlc3RJdCgwLCAiMG5hbm9zZWNvbmRzIiwgIjBzIik7CisgICAgdGVzdEl0KDAsICIwIG1zIiwgIjBzIik7CisgICAgdGVzdEl0KDAsICIwdXMiLCAiMHMiKTsKKyAgICB0ZXN0SXQoMCwgIjFlLTEyIG1zIiwgIjBzIik7CisgICAgdGVzdEl0KDEsICIwLjUwMSBucyIsICIwLjUwMW5zIik7CisgICAgdGVzdEl0KDEwMDAsICIxIFx1MDNiY3MiLCAiMVx1MDNiY3MiKTsKKyAgICAvLyB0ZXN0SXQoNTAwLCAiMC41dXMiLCAiNTAwbnMiKTsKKyAgICAvLyB0ZXN0SXQoNDk5LCAiMC40OTkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDF1cyIsICI0OTlucyIpOworICAgIC8vIHRlc3RJdCg1MDAsICIwLjQ5OTk1IHVzIiwgIjUwMG5zIik7CisgICAgLy8gdGVzdEl0KDYwNDgwMDAwMDAwMDAwTCwgIjAuNyBkYXlzIiwgIjE2LjgwaCIpOworICAgIC8vIHRlc3RJdChMb25nLk1BWF9WQUxVRSwgIjEwNjc1MS45OTExNjczMDA2NDU5MSBkYXlzIiwgIjEwNjc1MS45OWQiKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHRvb0xvbmdGb3JBTG9uZygpIHsKKyAgICB0cnkgeworICAgICAgU2hvcnREdXJhdGlvbi52YWx1ZU9mKCIxMDY3NTEuOTkxMTY3MzAwNjQ1OTIgZGF5cyIpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKEFyaXRobWV0aWNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RJdChsb25nIGksIFN0cmluZyBzLCBTdHJpbmcgcCkgeworICAgIFNob3J0RHVyYXRpb24gZCA9IFNob3J0RHVyYXRpb24udmFsdWVPZihzKTsKKyAgICBhc3NlcnRFcXVhbHMoaSwgZC50byhUaW1lVW5pdC5OQU5PU0VDT05EUykpOworICAgIGFzc2VydEVxdWFscyhwLCBkLnRvU3RyaW5nKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9jYWxpcGVyL3dvcmtlci9SdW50aW1lV29ya2VyVGVzdC5qYXZhIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvUnVudGltZVdvcmtlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDc1ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci93b3JrZXIvUnVudGltZVdvcmtlclRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXIud29ya2VyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXIuUnVudGltZVdvcmtlci5JTklUSUFMX1JFUFM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY2FsaXBlci53b3JrZXIuUnVudGltZVdvcmtlci5jYWxjdWxhdGVUYXJnZXRSZXBzOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5IT1VSUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5TaG9ydER1cmF0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworCisvKioKKyAqIFRlc3RzIHtAbGluayBSdW50aW1lV29ya2VyfS4KKyAqLworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFJ1bnRpbWVXb3JrZXJUZXN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2hvcnREdXJhdGlvbiBUSU1JTkdfSU5URVJWQUwgPSBTaG9ydER1cmF0aW9uLm9mKDEwMCwgTUlMTElTRUNPTkRTKTsKKworICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2FsY3VsYXRlVGFyZ2V0UmVwc190aW55QmVuY2htYXJrKCkgeworICAgIC8vIHRoaXMgaXMgb25lIGN5Y2xlIG9uIGEgNUdIeiBtYWNoaW5lCisgICAgU2hvcnREdXJhdGlvbiBvbmVDeWNsZSA9IFNob3J0RHVyYXRpb24ub2YobmV3IEJpZ0RlY2ltYWwoIjIuMGUtMTAiKSwgU0VDT05EUyk7CisgICAgbG9uZyB0YXJnZXRSZXBzID0gY2FsY3VsYXRlVGFyZ2V0UmVwcyhJTklUSUFMX1JFUFMsCisgICAgICAgIG9uZUN5Y2xlLnRpbWVzKElOSVRJQUxfUkVQUykudG8oTkFOT1NFQ09ORFMpLCBUSU1JTkdfSU5URVJWQUwudG8oTkFOT1NFQ09ORFMpLCAwLjApOworICAgIGxvbmcgZXhwZWN0ZWRSZXBzID0gVElNSU5HX0lOVEVSVkFMLnRvUGljb3MoKSAvIG9uZUN5Y2xlLnRvUGljb3MoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXBzLCB0YXJnZXRSZXBzKTsKKyAgfQorCisgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDYWxjdWxhdGVUYXJnZXRSZXBzX2h1Z2VCZW5jaG1hcmsoKSB7CisgICAgbG9uZyB0YXJnZXRSZXBzID0KKyAgICAgICAgY2FsY3VsYXRlVGFyZ2V0UmVwcyhJTklUSUFMX1JFUFMsIEhPVVJTLnRvTmFub3MoMSksIFRJTUlOR19JTlRFUlZBTC50byhOQU5PU0VDT05EUyksIDAuMCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHRhcmdldFJlcHMpOworICB9CisKKyAgQFRlc3QgcHVibGljIHZvaWQgdGVzdENhbGN1bGF0ZVRhcmdldFJlcHNfYXBwbHlSYW5kb21uZXNzKCkgeworICAgIGxvbmcgdGFyZ2V0UmVwcyA9IGNhbGN1bGF0ZVRhcmdldFJlcHMoSU5JVElBTF9SRVBTLCBNSUxMSVNFQ09ORFMudG9OYW5vcygxMDApLAorICAgICAgICBUSU1JTkdfSU5URVJWQUwudG8oTkFOT1NFQ09ORFMpLCAwLjUpOworICAgIGFzc2VydEVxdWFscygxMTAsIHRhcmdldFJlcHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL2pkazYtY29tcGlsYXRpb24udHh0IGIvY2FsaXBlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9qZGs2LWNvbXBpbGF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI3ZmIxCi0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9qZGs2LWNvbXBpbGF0aW9uLnR4dApAQCAtMCwwICsxLDI4OCBAQAorICAxICAgICAgIGphdmEubGFuZy5TdHJpbmc6Omhhc2hDb2RlICg2MCBieXRlcykKKyAgMiAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjpsYXN0SW5kZXhPZiAoMTU2IGJ5dGVzKQorICAzICAgICAgIGphdmEubGFuZy5TdHJpbmc6OmluZGV4T2YgKDE1MSBieXRlcykKKyAgNCAgICAgICBzdW4ubmlvLmNzLlVURl84JERlY29kZXI6OmRlY29kZUFycmF5TG9vcCAoNTUzIGJ5dGVzKQorICA1ICAgICAgIGphdmEuaW8uVW5peEZpbGVTeXN0ZW06Om5vcm1hbGl6ZSAoNzUgYnl0ZXMpCisgIDYgICAgICAgc3VuLm5pby5jcy5VVEZfOCRFbmNvZGVyOjplbmNvZGVBcnJheUxvb3AgKDQ5MCBieXRlcykKKyAgNyAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjppbmRleE9mICgxNjYgYnl0ZXMpCisgIDElICAgICAgc3VuLm5ldC53d3cuUGFyc2VVdGlsOjplbmNvZGVQYXRoIEAgMjkgKDMzNiBieXRlcykKKyAgOCAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjplcXVhbHMgKDg4IGJ5dGVzKQorICA5ICAgICAgIHN1bi5uZXQud3d3LlBhcnNlVXRpbDo6ZW5jb2RlUGF0aCAoMzM2IGJ5dGVzKQorIDEwICAgICAgIGphdmEubGFuZy5TdHJpbmc6OmNoYXJBdCAoMzMgYnl0ZXMpCisgMTEgICAgICAgamF2YS51dGlsLkFycmF5czo6YmluYXJ5U2VhcmNoMCAoNzIgYnl0ZXMpCisgMTIgICAgICAgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyTWF0Y2hlciQxMDo6bWF0Y2hlcyAoMTcgYnl0ZXMpCisgMTMgICAgICAgamF2YS51dGlsLkFycmF5czo6YmluYXJ5U2VhcmNoICg5IGJ5dGVzKQorICAyJSAgICAgIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhck1hdGNoZXI6OnNldEJpdHMgQCAzICgyOCBieXRlcykKKyAxNCAgICAgICBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJNYXRjaGVyOjpzZXRCaXRzICgyOCBieXRlcykKKyAxNSAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ojo8aW5pdD4gKDEgYnl0ZXMpCisgMTYgICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjplbnN1cmVPcGVuICgzNyBieXRlcykKKyAxNyAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmFjY2VzcyQzMDAgKDUgYnl0ZXMpCisgMTggICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjphY2Nlc3MkMTAwICg1IGJ5dGVzKQorIDE5ICAgICAgIGphdmEudXRpbC5IYXNoTWFwOjppbmRleEZvciAoNiBieXRlcykKKyAyMCAgICAgICBqYXZhLnV0aWwuSGFzaE1hcDo6aGFzaCAoMjMgYnl0ZXMpCisgMjEgICAgICAgamF2YS5sYW5nLlN0cmluZzo6PGluaXQ+ICgyMCBieXRlcykKKyAyMiAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjpzdWJzdHJpbmcgKDgzIGJ5dGVzKQorIDIzICAgICAgIGphdmEudXRpbC5IYXNoTWFwOjpnZXQgKDc5IGJ5dGVzKQorIDI0ICAgICAgIGphdmEubGFuZy5TdHJpbmc6Omxhc3RJbmRleE9mICgxMiBieXRlcykKKy0tLSAgIG4gICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmZyZWVFbnRyeSAoc3RhdGljKQorLS0tICAgbiAgIGphdmEudXRpbC56aXAuWmlwRW50cnk6OmluaXRGaWVsZHMKKyAyNSAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmFjY2VzcyQ4MDAgKDYgYnl0ZXMpCisgMjYgICAgICAgamF2YS51dGlsLmphci5KYXJGaWxlJEphckZpbGVFbnRyeTo6PGluaXQ+ICgxMSBieXRlcykKKyAyNyAgICAgICBqYXZhLnV0aWwuamFyLkphckVudHJ5Ojo8aW5pdD4gKDYgYnl0ZXMpCistLS0gICBuICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjpnZXROZXh0RW50cnkgKHN0YXRpYykKKyAyOCAgICAgICBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ojo8aW5pdD4gKDEwMiBieXRlcykKKyAyOSAgICAgICBqYXZhLnV0aWwuamFyLkphckZpbGUkMTo6aGFzTW9yZUVsZW1lbnRzICgxMCBieXRlcykKKyAzMCAgISAgICBqYXZhLnV0aWwuemlwLlppcEZpbGUkMjo6aGFzTW9yZUVsZW1lbnRzICg0MSBieXRlcykKKyAzMSAgICAgICBzdW4ubWlzYy5VUkxDbGFzc1BhdGg6OmdldFJlc291cmNlTWFwS2V5ICg1NSBieXRlcykKKyAzMiAgICAgICBqYXZhLnV0aWwuamFyLkphckZpbGUkMTo6bmV4dEVsZW1lbnQgKDUgYnl0ZXMpCisgMzMgICAgICAgamF2YS51dGlsLmphci5KYXJGaWxlJDE6Om5leHRFbGVtZW50ICgyNiBieXRlcykKKyAzNCAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGUkMjo6bmV4dEVsZW1lbnQgKDUgYnl0ZXMpCisgMzUgICEgICAgamF2YS51dGlsLnppcC5aaXBGaWxlJDI6Om5leHRFbGVtZW50ICgyMTEgYnl0ZXMpCisgMzYgICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjphY2Nlc3MkNDAwICg2IGJ5dGVzKQorIDM3ICAgICAgIGphdmEudXRpbC56aXAuWmlwRW50cnk6Ojxpbml0PiAoNDMgYnl0ZXMpCisgMzggICAgICAgc3VuLm1pc2MuVVJMQ2xhc3NQYXRoJEphckxvYWRlcjo6YWRkSmFyRW50cmllc1RvRW50cnlNYXAgKDIwMiBieXRlcykKKyAzOSAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0OjpnZXQgKDExIGJ5dGVzKQorIDQwICAgICAgIGphdmEudXRpbC5BcnJheUxpc3Q6OnJhbmdlQ2hlY2sgKDIyIGJ5dGVzKQorIDQxICAgICAgIGphdmEudXRpbC5BcnJheUxpc3Q6OmVsZW1lbnREYXRhICg3IGJ5dGVzKQorIDIzICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLnV0aWwuSGFzaE1hcDo6Z2V0ICg3OSBieXRlcykKKyA0MiAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjpyZXBsYWNlICgxNDIgYnl0ZXMpCisgNDMgICAgICAgamF2YS51dGlsLlByb3BlcnRpZXMkTGluZVJlYWRlcjo6cmVhZExpbmUgKDQ1MiBieXRlcykKKyA0NCAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjpzdGFydHNXaXRoICg3OCBieXRlcykKKy0tLSAgIG4gICBqYXZhLmxhbmcuU3lzdGVtOjphcnJheWNvcHkgKHN0YXRpYykKKyA0NSAgICAgICBqYXZhLnV0aWwuSGFzaE1hcDo6Z2V0ICg3OSBieXRlcykKKyA0NiAgICAgICBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW06OndyaXRlVVRGICg0MzUgYnl0ZXMpCisgNDcgICEgICAgc3VuLnJlZmxlY3QuZ2VuZXJpY3MucGFyc2VyLlNpZ25hdHVyZVBhcnNlcjo6Y3VycmVudCAoNDAgYnl0ZXMpCisgNDggICAgICAgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOjppbmNDb3VudCAoMjAgYnl0ZXMpCisgNDkgcyAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW06OndyaXRlICg1NSBieXRlcykKKyA1MCAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YTo6b2YgKDEyMCBieXRlcykKKyA1MSAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YUxhdGluMTo6Z2V0UHJvcGVydGllcyAoMTEgYnl0ZXMpCisgNTIgICAgICAgamF2YS5sYW5nLlN0cmluZzo6Z2V0Q2hhcnMgKDY2IGJ5dGVzKQorIDUzICAgICAgIGphdmEubGFuZy5NYXRoOjptaW4gKDExIGJ5dGVzKQorIDU0ICAgICAgIGphdmEubGFuZy5BYnN0cmFjdFN0cmluZ0J1aWxkZXI6OmFwcGVuZCAoNDAgYnl0ZXMpCisgNTUgICAgICAgamF2YS51dGlsLmphci5NYW5pZmVzdCRGYXN0SW5wdXRTdHJlYW06OnJlYWRMaW5lICgxNjcgYnl0ZXMpCisgNTYgICAgICAgbmV0LnNmLmNnbGliLmFzbS5CeXRlVmVjdG9yOjpwdXRVVEY4ICgzOTQgYnl0ZXMpCisgNTcgICAgICAgbmV0LnNmLmNnbGliLmFzbS5UeXBlOjphICgyNTMgYnl0ZXMpCisgNTggcyAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcjo6YXBwZW5kICg4IGJ5dGVzKQorIDU5ICAgICAgIG5ldC5zZi5jZ2xpYi5hc20uVHlwZTo6YSAoMjE0IGJ5dGVzKQorIDYwICAgICAgIG5ldC5zZi5jZ2xpYi5hc20uVHlwZTo6Z2V0QXJndW1lbnRUeXBlcyAoMTMxIGJ5dGVzKQorIDYxICAgICAgIGphdmEudXRpbC5BcnJheXM6OmNvcHlPZlJhbmdlICg2MyBieXRlcykKKyA2MiAgICAgICBqYXZhLmxhbmcuQWJzdHJhY3RTdHJpbmdCdWlsZGVyOjphcHBlbmQgKDYwIGJ5dGVzKQorIDYzICAgICAgIGphdmEubGFuZy5TdHJpbmc6Ojxpbml0PiAoNzIgYnl0ZXMpCisgNjQgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlICg1IGJ5dGVzKQorIDY1ICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OmlzV2hpdGVzcGFjZSAoOSBieXRlcykKKyA2NiAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YUxhdGluMTo6aXNXaGl0ZXNwYWNlICgyMyBieXRlcykKKyA2NyAgICAgICBzdW4ucmVmbGVjdC5nZW5lcmljcy5wYXJzZXIuU2lnbmF0dXJlUGFyc2VyOjpwYXJzZUlkZW50aWZpZXIgKDExNSBieXRlcykKKyA2OCAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjo6YXBwZW5kICg4IGJ5dGVzKQorIDQzICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLnV0aWwuUHJvcGVydGllcyRMaW5lUmVhZGVyOjpyZWFkTGluZSAoNDUyIGJ5dGVzKQorIDY5ICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyOjphcHBlbmQgKDggYnl0ZXMpCisgIDMlICAgICAgamF2YS51dGlsLlByb3BlcnRpZXMkTGluZVJlYWRlcjo6cmVhZExpbmUgQCAyMSAoNDUyIGJ5dGVzKQorIDcwICAgICAgIGphdmEudXRpbC5IYXNoTWFwOjpwdXQgKDEyNiBieXRlcykKKyA3MSAgICAgICBzdW4ucmVmbGVjdC5nZW5lcmljcy5wYXJzZXIuU2lnbmF0dXJlUGFyc2VyOjphZHZhbmNlICgzNyBieXRlcykKKyA3MiAgICAgICBqYXZhLnV0aWwuemlwLlpTdHJlYW1SZWY6OmFkZHJlc3MgKDUgYnl0ZXMpCisgNzMgICAgICAgamF2YS5sYW5nLlN0cmluZzo6Y29tcGFyZVRvICgxNTAgYnl0ZXMpCisgNzQgICAgICAgc3VuLm1pc2MuTWV0YUluZGV4OjptYXlDb250YWluICg1MSBieXRlcykKKyA3NSAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjpzdGFydHNXaXRoICg3IGJ5dGVzKQorIDIzICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS51dGlsLkhhc2hNYXA6OmdldCAoNzkgYnl0ZXMpCisgNzYgICAgICAgamF2YS5sYW5nLkFic3RyYWN0U3RyaW5nQnVpbGRlcjo6PGluaXQ+ICgxMiBieXRlcykKKyA3NyAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0JEl0cjo6aGFzTmV4dCAoMjAgYnl0ZXMpCisgNzggICAgICAgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOjplbnN1cmVPcGVuICgxOCBieXRlcykKKyA3OSAgICAgICBqYXZhLnV0aWwuSGFzaE1hcDo6dHJhbnNmZXIgKDgzIGJ5dGVzKQorIDgwICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QkSXRyOjpjaGVja0ZvckNvbW9kaWZpY2F0aW9uICgyMyBieXRlcykKKyA4MSAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0JEl0cjo6bmV4dCAoNjYgYnl0ZXMpCisgODIgICAgICAgc3VuLnJlZmxlY3QuQ2xhc3NGaWxlQXNzZW1ibGVyOjplbWl0Qnl0ZSAoMTEgYnl0ZXMpCisgODMgICAgICAgc3VuLnJlZmxlY3QuQnl0ZVZlY3RvckltcGw6OmFkZCAoMzggYnl0ZXMpCisgODQgICAgICAgamF2YS51dGlsLkFycmF5TGlzdDo6ZW5zdXJlQ2FwYWNpdHkgKDU4IGJ5dGVzKQorIDg1ICAgICAgIGphdmEudXRpbC5BcnJheUxpc3Q6OmFkZCAoMjkgYnl0ZXMpCisgODYgICAgICAgamF2YS51dGlsLkhhc2hNYXAkSGFzaEl0ZXJhdG9yOjpuZXh0RW50cnkgKDk5IGJ5dGVzKQorIDg3ICAgICAgIGphdmEubGFuZy5DbGFzczo6c2VhcmNoTWV0aG9kcyAoOTAgYnl0ZXMpCisgODggICAgICAgamF2YS51dGlsLkhhc2hNYXAkSGFzaEl0ZXJhdG9yOjo8aW5pdD4gKDYzIGJ5dGVzKQorIDg5ICAgICAgIGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q6Ojxpbml0PiAoNSBieXRlcykKKyA0MyAgIG1hZGUgem9tYmllICAoMikgIGphdmEudXRpbC5Qcm9wZXJ0aWVzJExpbmVSZWFkZXI6OnJlYWRMaW5lICg0NTIgYnl0ZXMpCisgOTAgICAgICAgc3VuLnJlZmxlY3QuUmVmbGVjdGlvbkZhY3Rvcnk6OmxhbmdSZWZsZWN0QWNjZXNzICgxNSBieXRlcykKKyA5MSAgICAgICBqYXZhLmxhbmcuQ2xhc3M6OmNvcHlNZXRob2RzICgzNiBieXRlcykKKyA5MiAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0QWNjZXNzOjpjb3B5TWV0aG9kICg1IGJ5dGVzKQorIDkzICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDo6Y29weSAoNjcgYnl0ZXMpCisgOTQgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOjo8aW5pdD4gKDY4IGJ5dGVzKQorIDk1ICAgICAgIHN1bi5yZWZsZWN0LlJlZmxlY3Rpb25GYWN0b3J5Ojpjb3B5TWV0aG9kICgxMCBieXRlcykKKyA5NiAgICAgICBqYXZhLmxhbmcuU3lzdGVtOjpnZXRTZWN1cml0eU1hbmFnZXIgKDQgYnl0ZXMpCisgOTcgICEgICAgY29tLnN1bi5qZXJzZXkuY29yZS5yZWZsZWN0aW9uLlJlZmxlY3Rpb25IZWxwZXI6OmZpbmRNZXRob2RPbkNsYXNzICg5NCBieXRlcykKKyA5OCAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCRIYXNoSXRlcmF0b3I6Omhhc05leHQgKDEzIGJ5dGVzKQorIDk5ICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWlsZGVyOjp0b1N0cmluZyAoMTcgYnl0ZXMpCisxMDAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOjplcXVhbHMgKDEwNyBieXRlcykKKzEwMSAgICAgICBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U6OmdldCAoMTggYnl0ZXMpCistLS0gICBuICAgamF2YS5sYW5nLk9iamVjdDo6Y2xvbmUKKzEwMiBzICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q6OmRlY2xhcmVkQW5ub3RhdGlvbnMgKDM5IGJ5dGVzKQorMTAzICAgICAgIGphdmEubGFuZy5DbGFzczo6Y2xlYXJDYWNoZXNPbkNsYXNzUmVkZWZpbml0aW9uICg3MCBieXRlcykKKzEwNCAgICAgICBqYXZhLmxhbmcuQ2xhc3M6OmNoZWNrSW5pdHRlZCAoMTkgYnl0ZXMpCisxMDUgICAgICAgY29tLnN1bi5qZXJzZXkuY29yZS5yZWZsZWN0aW9uLkFubm90YXRlZE1ldGhvZDo6aGFzUGFyYW1ldGVyQW5ub3RhdGlvbnMgKDgwIGJ5dGVzKQorLS0tICAgbiAgIGphdmEubGFuZy5DbGFzczo6Z2V0Q2xhc3NMb2FkZXIwCisxMDYgICAgICAgamF2YS5sYW5nLkNsYXNzJE1ldGhvZEFycmF5OjphZGRJZk5vdFByZXNlbnQgKDQ3IGJ5dGVzKQorMTA3ICAgICAgIGphdmEubGFuZy5DbGFzczo6Z2V0TWV0aG9kMCAoOTcgYnl0ZXMpCistLS0gICBuICAgamF2YS5sYW5nLlN0cmluZzo6aW50ZXJuCisxMDggICAgICAgamF2YS5sYW5nLkNsYXNzOjpnZXROYW1lICgyMCBieXRlcykKKzEwOSAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMkRW1wdHlNYXA6OmdldCAoMiBieXRlcykKKzExMCAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q6OmdldEFubm90YXRpb24gKDI2IGJ5dGVzKQorMTExICAgICAgIGphdmEudXRpbC5IYXNoTWFwJEtleUl0ZXJhdG9yOjpuZXh0ICg4IGJ5dGVzKQorMTEwICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q6OmdldEFubm90YXRpb24gKDI2IGJ5dGVzKQorMTEyICAgICAgIGphdmEubGFuZy5DbGFzczo6cHJpdmF0ZUdldERlY2xhcmVkTWV0aG9kcyAoMTE5IGJ5dGVzKQorLS0tICAgbiAgIGphdmEubGFuZy5DbGFzczo6Z2V0SW50ZXJmYWNlcworMTEzICAgICAgIGNvbS5zdW4uamVyc2V5LmNvcmUucmVmbGVjdGlvbi5Bbm5vdGF0ZWRNZXRob2Q6Omhhc01ldGhvZEFubm90YXRpb25zICg0MyBieXRlcykKKzExNCAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjo6PGluaXQ+ICg3IGJ5dGVzKQorMTE1ICAgICAgIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb246Ojxpbml0PiAoNSBieXRlcykKKzExNiAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjp0b0xvd2VyQ2FzZSAoOSBieXRlcykKKzExNyAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YUxhdGluMTo6dG9Mb3dlckNhc2UgKDM5IGJ5dGVzKQorLS0tICAgbiAgIGphdmEubGFuZy5DbGFzczo6aXNJbnRlcmZhY2UKKzExOCAgICAgICBqYXZhLmxhbmcuQ2xhc3M6OmFyZ3VtZW50VHlwZXNUb1N0cmluZyAoNzggYnl0ZXMpCisxMTkgICAgICAgamF2YS5sYW5nLkNsYXNzOjpjaGVja01lbWJlckFjY2VzcyAoNzggYnl0ZXMpCistLS0gICBuICAgamF2YS5sYW5nLkNsYXNzOjpnZXRTdXBlcmNsYXNzCisxMjAgICAgICAgc3VuLnJlZmxlY3QuZ2VuZXJpY3MudHJlZS5TaW1wbGVDbGFzc1R5cGVTaWduYXR1cmU6Om1ha2UgKDExIGJ5dGVzKQorMTIxICAgICAgIHN1bi5yZWZsZWN0LmdlbmVyaWNzLnRyZWUuU2ltcGxlQ2xhc3NUeXBlU2lnbmF0dXJlOjo8aW5pdD4gKDIwIGJ5dGVzKQorMTIyICAgICAgIHN1bi5yZWZsZWN0LmdlbmVyaWNzLnBhcnNlci5TaWduYXR1cmVQYXJzZXI6OnBhcnNlQ2xhc3NUeXBlU2lnbmF0dXJlU3VmZml4ICg1MyBieXRlcykKKzEyMyAgICAgICBzdW4ucmVmbGVjdC5nZW5lcmljcy5wYXJzZXIuU2lnbmF0dXJlUGFyc2VyOjpwYXJzZVNpbXBsZUNsYXNzVHlwZVNpZ25hdHVyZSAoNzEgYnl0ZXMpCisxMjQgICAgICAgamF2YS51dGlsLkhhc2hNYXAkRW50cnk6Ojxpbml0PiAoMjYgYnl0ZXMpCisxMjUgICAgICAgc3VuLnJlZmxlY3QuZ2VuZXJpY3MudmlzaXRvci5SZWlmaWVyOjp2aXNpdENsYXNzVHlwZVNpZ25hdHVyZSAoMzgxIGJ5dGVzKQorMTI2ICAgICAgIGphdmEudXRpbC5Qcm9wZXJ0aWVzJExpbmVSZWFkZXI6OnJlYWRMaW5lICg0NTIgYnl0ZXMpCisxMjcgICAgICAgamF2YS51dGlsLlByb3BlcnRpZXM6OmxvYWRDb252ZXJ0ICg1MDUgYnl0ZXMpCisxMjggICAgICAgc3VuLnJlZmxlY3QuQ2xhc3NGaWxlQXNzZW1ibGVyOjplbWl0Q29uc3RhbnRQb29sVVRGOCAoNTAgYnl0ZXMpCisxMjkgICEgICAgc3VuLnJlZmxlY3QuVVRGODo6ZW5jb2RlICgxODkgYnl0ZXMpCisxMzAgICAgICAgc3VuLnJlZmxlY3QuVVRGODo6dXRmOExlbmd0aCAoODEgYnl0ZXMpCisxMzEgICAgICAgamF2YS51dGlsLkFic3RyYWN0TGlzdDo6PGluaXQ+ICgxMCBieXRlcykKKzEzMiAgICAgICBqYXZhLnV0aWwucmVnZXguUGF0dGVybiRCbXBDaGFyUHJvcGVydHk6Om1hdGNoICg1MCBieXRlcykKKzEzMyAgICAgICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjo6c2VhcmNoICgxMDkgYnl0ZXMpCisxMzQgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQ3VybHk6Om1hdGNoMCAoMTc0IGJ5dGVzKQorMTMyICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLnV0aWwucmVnZXguUGF0dGVybiRCbXBDaGFyUHJvcGVydHk6Om1hdGNoICg1MCBieXRlcykKKzEzNSAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjpjaGFyQ291bnQgKDEyIGJ5dGVzKQorMTM2ICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OmlzSGlnaFN1cnJvZ2F0ZSAoMTggYnl0ZXMpCisxMzcgICAgICAgamF2YS5sYW5nLlN0cmluZzo6Y29kZVBvaW50QXQgKDQ0IGJ5dGVzKQorMTM4ICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OmNvZGVQb2ludEF0SW1wbCAoNDEgYnl0ZXMpCisxMzkgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kU3RhcnQ6Om1hdGNoICgxMDkgYnl0ZXMpCisxNDAgICAgICAgY29tLmdvb2dsZS5jb21tb24uaW8uTGluZUJ1ZmZlcjo6YWRkICgyMDEgYnl0ZXMpCisxNDEgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQ3VybHk6Om1hdGNoICg4NiBieXRlcykKKzE0MiAgICAgICBqYXZhLnV0aWwuemlwLkluZmxhdGVyOjplbnN1cmVPcGVuICg0NyBieXRlcykKKzE0MyAgICAgICBqYXZhLnV0aWwucmVnZXguUGF0dGVybjo6aGFzICgxNSBieXRlcykKKzE0NCAgICAgICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjo6cmVzZXQgKDgzIGJ5dGVzKQorMTQ1ICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJE5vZGU6Om1hdGNoICgyNyBieXRlcykKKzE0NiAgICAgICBqYXZhLnV0aWwucmVnZXguUGF0dGVybiRDaGFyUHJvcGVydHk6Om1hdGNoICg1NiBieXRlcykKKzE0NyAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjpjb2RlUG9pbnRBdCAoNTEgYnl0ZXMpCisxNDggICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQ3R5cGU6OmlzU2F0aXNmaWVkQnkgKDI0IGJ5dGVzKQorMTQ5ICAgICAgIGphdmEudXRpbC5yZWdleC5BU0NJSTo6aXNUeXBlICgxNSBieXRlcykKKzE1MCAgICAgICBqYXZhLnV0aWwucmVnZXguQVNDSUk6OmdldFR5cGUgKDE3IGJ5dGVzKQorMTUxICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJFNsaWNlOjptYXRjaCAoNzkgYnl0ZXMpCisxNTIgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kRG90Ojppc1NhdGlzZmllZEJ5ICgzNCBieXRlcykKKzE1MyAgICAgICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjo6bWF0Y2ggKDEwOSBieXRlcykKKzE1NCAgICAgICBqYXZhLnV0aWwucmVnZXguUGF0dGVybiRCbXBDaGFyUHJvcGVydHk6Om1hdGNoICg1MCBieXRlcykKKzE1NSAgICAgICBqYXZhLnV0aWwucmVnZXguUGF0dGVybiRTaW5nbGU6OmlzU2F0aXNmaWVkQnkgKDE0IGJ5dGVzKQorLS0tICAgbiAgIGphdmEubGFuZy5UaHJlYWQ6OmN1cnJlbnRUaHJlYWQgKHN0YXRpYykKKzE1NiAgICAgICBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFic3RyYWN0SW5kZXhlZExpc3RJdGVyYXRvcjo6aGFzTmV4dCAoMTcgYnl0ZXMpCisxNTcgICAgICAgamF2YS5sYW5nLlN0cmluZzo6aW5kZXhPZiAoNyBieXRlcykKKyA3MCAgIG1hZGUgbm90IGVudHJhbnQgICgyKSAgamF2YS51dGlsLkhhc2hNYXA6OnB1dCAoMTI2IGJ5dGVzKQorMTMzICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjo6c2VhcmNoICgxMDkgYnl0ZXMpCisxNTggICAgICAgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI6OnNlYXJjaCAoMTA5IGJ5dGVzKQorMTQ2ICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLnV0aWwucmVnZXguUGF0dGVybiRDaGFyUHJvcGVydHk6Om1hdGNoICg1NiBieXRlcykKKzE1OSAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjp0b1VwcGVyQ2FzZSAoNDQyIGJ5dGVzKQorMTYwICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OnRvVXBwZXJDYXNlRXggKDMwIGJ5dGVzKQorMTYxICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXJEYXRhTGF0aW4xOjp0b1VwcGVyQ2FzZUV4ICg3MSBieXRlcykKKzExMCAgIG1hZGUgem9tYmllICAoMikgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDo6Z2V0QW5ub3RhdGlvbiAoMjYgYnl0ZXMpCisxNjIgICAgICAgamF2YS5uaW8uQnVmZmVyOjpwb3NpdGlvbiAoNDMgYnl0ZXMpCisxNjMgICAgICAgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdDo6aXNVbmRlcmZsb3cgKDEzIGJ5dGVzKQorMTY0ICAgICAgIGphdmEubmlvLkJ1ZmZlcjo6bGltaXQgKDYyIGJ5dGVzKQorMTY1ICAgICAgIGphdmEubmlvLkJ1ZmZlcjo6PGluaXQ+ICgxMjEgYnl0ZXMpCisxNjYgICAgICAgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdDo6aXNPdmVyZmxvdyAoMTQgYnl0ZXMpCisxNjcgICAgICAgamF2YS5uaW8uQnVmZmVyOjpoYXNSZW1haW5pbmcgKDE3IGJ5dGVzKQorMTY4ICAgICAgIGphdmEubmlvLkNoYXJCdWZmZXI6Omhhc0FycmF5ICgyMCBieXRlcykKKzE2OSAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyOjpoYXNBcnJheSAoMjAgYnl0ZXMpCisxNzAgICEgICAgamF2YS5uaW8uQ2hhckJ1ZmZlcjo6d3JhcCAoMjAgYnl0ZXMpCisxNzEgICAgICAgamF2YS5uaW8uSGVhcENoYXJCdWZmZXI6Ojxpbml0PiAoMTQgYnl0ZXMpCisxNzIgICAgICAgamF2YS5uaW8uQ2hhckJ1ZmZlcjo6PGluaXQ+ICgyMiBieXRlcykKKzE3MyAgISAgICBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyOjplbmNvZGUgKDI4NSBieXRlcykKKzE3NCAgICAgICBzdW4ubmlvLmNzLlVURl84JEVuY29kZXI6OmVuY29kZUxvb3AgKDI4IGJ5dGVzKQorMTc1ICAgICAgIGphdmEubmlvLkJ1ZmZlcjo6cmVtYWluaW5nICgxMCBieXRlcykKKzE3NiAgICAgICBzdW4ubmlvLmNzLlN0cmVhbUVuY29kZXI6OmVuc3VyZU9wZW4gKDE4IGJ5dGVzKQorMTc3ICAgICAgIHN1bi5uaW8uY3MuU3RyZWFtRW5jb2Rlcjo6aW1wbFdyaXRlICgxNTYgYnl0ZXMpCisxNzggICEgICAgc3VuLm5pby5jcy5TdHJlYW1FbmNvZGVyOjp3cml0ZSAoNzggYnl0ZXMpCisxNzkgICAgICAgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uV3JpdGVyOjpzdHJpbmcgKDM2NSBieXRlcykKKzE4MCAgICAgICBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjo6d3JpdGUgKDkgYnl0ZXMpCisxODEgICAgICAgc3VuLm5pby5jcy5TdHJlYW1FbmNvZGVyOjp3cml0ZSAoMTcgYnl0ZXMpCisxNzkgICBtYWRlIG5vdCBlbnRyYW50ICAoMikgIGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvbldyaXRlcjo6c3RyaW5nICgzNjUgYnl0ZXMpCisxODIgICAgICAgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uV3JpdGVyOjpzdHJpbmcgKDM2NSBieXRlcykKKzE4MyAgICAgICBqYXZhLmlvLlN0cmluZ1dyaXRlcjo6d3JpdGUgKDExIGJ5dGVzKQorMTg0IHMgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXI6OmFwcGVuZCAoOCBieXRlcykKKyA0OSAgIG1hZGUgbm90IGVudHJhbnQgICgyKSAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW06OndyaXRlICg1NSBieXRlcykKKzE4NSAgICAgICBzdW4uc2VjdXJpdHkudXRpbC5DYWNoZSRFcXVhbEJ5dGVBcnJheTo6aGFzaENvZGUgKDU3IGJ5dGVzKQorMTg2ICAgICAgIGphdmEubGFuZy5NYXRoOjptYXggKDExIGJ5dGVzKQorIDcwICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS51dGlsLkhhc2hNYXA6OnB1dCAoMTI2IGJ5dGVzKQorMTg3IHMgICAgIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW06OnJlYWQgKDM2IGJ5dGVzKQorMTg4ICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyOjpzdHJpcExlYWRpbmdaZXJvQnl0ZXMgKDEzMiBieXRlcykKKzE4OSBzICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOjphdmFpbGFibGUgKDEwIGJ5dGVzKQorMTMyICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQm1wQ2hhclByb3BlcnR5OjptYXRjaCAoNTAgYnl0ZXMpCisxOTAgICAgICAgc3VuLnNlY3VyaXR5LnV0aWwuRGVySW5wdXRTdHJlYW06OmF2YWlsYWJsZSAoOCBieXRlcykKKzE5MSAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOjptYXJrICg5IGJ5dGVzKQorMTkyICAgICAgIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOjpyZWFkVVRGICg1MDEgYnl0ZXMpCisxOTMgICAgICAgc3VuLnNlY3VyaXR5LnV0aWwuRGVySW5wdXRTdHJlYW06OmdldExlbmd0aCAoMTExIGJ5dGVzKQorMTk0ICAgICAgIHN1bi5zZWN1cml0eS51dGlsLk9iamVjdElkZW50aWZpZXI6OmNoZWNrVmFsaWRPaWQgKDExNSBieXRlcykKKzE5NSAgICAgICBzdW4uc2VjdXJpdHkudXRpbC5EZXJJbnB1dFN0cmVhbTo6Z2V0Qnl0ZSAoMTIgYnl0ZXMpCisxOTYgICAgICAgc3VuLnNlY3VyaXR5LnV0aWwuT2JqZWN0SWRlbnRpZmllcjo6aW5pdEZyb21FbmNvZGluZyAoMjA2IGJ5dGVzKQorMTk3ICAgICAgIHN1bi5zZWN1cml0eS51dGlsLk9iamVjdElkZW50aWZpZXI6OmdldENvbXBvbmVudCAoNzMgYnl0ZXMpCisxOTggICAgICAgc3VuLnNlY3VyaXR5LnV0aWwuT2JqZWN0SWRlbnRpZmllcjo6ZXF1YWxzICg2OSBieXRlcykKKzE5OSAgICAgICBzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyOjpoYXNoQ29kZSAoMzUgYnl0ZXMpCisyMDAgICAgICAgc3VuLnNlY3VyaXR5LnV0aWwuRGVySW5wdXRTdHJlYW06Ojxpbml0PiAoMTkgYnl0ZXMpCisyMDEgICEgICAgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOjpoYXNoQ29kZSAoMzQgYnl0ZXMpCisyMDIgICAgICAgamF2YS5sYW5nLlN0cmluZzo6dG9Mb3dlckNhc2UgKDQzNiBieXRlcykKKzIwMyAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjp0b0xvd2VyQ2FzZSAoNiBieXRlcykKKzIwNCAgICAgICBqYXZhLnV0aWwuSGFzaE1hcDo6YWRkRW50cnkgKDU4IGJ5dGVzKQorMjA1IHMgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOjp3cml0ZSAoNTUgYnl0ZXMpCisyMDYgICAgICAgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOjpnZXRCdWZJZk9wZW4gKDIxIGJ5dGVzKQorMjA3IHMgICAgIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTo6cmVhZCAoNDkgYnl0ZXMpCisyMDggICAgICAgamF2YS5pby5EYXRhSW5wdXRTdHJlYW06OnJlYWRDaGFyICg0MCBieXRlcykKKyAgNCUgICAgICBzdW4udGV4dC5ub3JtYWxpemVyLk5vcm1hbGl6ZXJEYXRhUmVhZGVyOjpyZWFkIEAgMTIgKDg2IGJ5dGVzKQorMjA4ICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTo6cmVhZENoYXIgKDQwIGJ5dGVzKQorMjA5ICAgICAgIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOjpyZWFkQ2hhciAoNDAgYnl0ZXMpCisyMTAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXI6Om11bEFkZCAoODEgYnl0ZXMpCisgIDUlICAgICAgY29tLnN1bi5jcnlwdG8ucHJvdmlkZXIuQUVTQ3J5cHQ6OjxjbGluaXQ+IEAgNzI0ICgxNTc3IGJ5dGVzKQorIDUwICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YTo6b2YgKDEyMCBieXRlcykKKyA2NCAgIG1hZGUgbm90IGVudHJhbnQgICgyKSAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlICg1IGJ5dGVzKQorIDY1ICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UgKDkgYnl0ZXMpCisgNjcgICBtYWRlIG5vdCBlbnRyYW50ICAoMikgIHN1bi5yZWZsZWN0LmdlbmVyaWNzLnBhcnNlci5TaWduYXR1cmVQYXJzZXI6OnBhcnNlSWRlbnRpZmllciAoMTE1IGJ5dGVzKQorMTE2ICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjp0b0xvd2VyQ2FzZSAoOSBieXRlcykKKzE2MCAgIG1hZGUgbm90IGVudHJhbnQgICgyKSAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6dG9VcHBlckNhc2VFeCAoMzAgYnl0ZXMpCisyMDMgICBtYWRlIG5vdCBlbnRyYW50ICAoMikgIGphdmEubGFuZy5DaGFyYWN0ZXI6OnRvTG93ZXJDYXNlICg2IGJ5dGVzKQorMTU5ICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLmxhbmcuU3RyaW5nOjp0b1VwcGVyQ2FzZSAoNDQyIGJ5dGVzKQorMjAyICAgbWFkZSBub3QgZW50cmFudCAgKDIpICBqYXZhLmxhbmcuU3RyaW5nOjp0b0xvd2VyQ2FzZSAoNDM2IGJ5dGVzKQorMjExICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXJEYXRhOjpvZiAoMTIwIGJ5dGVzKQorMjEyICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnRvTG93ZXJDYXNlICg0MzYgYnl0ZXMpCisyMTMgICAgICAgamF2YS5sYW5nLlN0cmluZzo6dG9VcHBlckNhc2UgKDQ0MiBieXRlcykKKzIwMSAgIG1hZGUgbm90IGVudHJhbnQgICgyKSAgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOjpoYXNoQ29kZSAoMzQgYnl0ZXMpCisxOTggICBtYWRlIG5vdCBlbnRyYW50ICAoMikgIHN1bi5zZWN1cml0eS51dGlsLk9iamVjdElkZW50aWZpZXI6OmVxdWFscyAoNjkgYnl0ZXMpCisyMTQgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6dG9VcHBlckNhc2VFeCAoMzAgYnl0ZXMpCisxNDYgICBtYWRlIHpvbWJpZSAgKDIpICBqYXZhLnV0aWwucmVnZXguUGF0dGVybiRDaGFyUHJvcGVydHk6Om1hdGNoICg1NiBieXRlcykKKzEzMyAgIG1hZGUgem9tYmllICAoMikgIGphdmEudXRpbC5yZWdleC5NYXRjaGVyOjpzZWFyY2ggKDEwOSBieXRlcykKKzE3OSAgIG1hZGUgem9tYmllICAoMikgIGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvbldyaXRlcjo6c3RyaW5nICgzNjUgYnl0ZXMpCisyMTUgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6dG9Mb3dlckNhc2UgKDkgYnl0ZXMpCisyMTYgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlICg1IGJ5dGVzKQorMjE3ICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OmlzV2hpdGVzcGFjZSAoOSBieXRlcykKKzIxOCAgICAgICBzdW4udGV4dC5ub3JtYWxpemVyLk5vcm1hbGl6ZXJJbXBsOjpkZWNvbXBvc2UgKDY4MCBieXRlcykKKzIxOSAgISAgICBzdW4uc2VjdXJpdHkueDUwOS5BVkE6OnRvUkZDMjI1M0Nhbm9uaWNhbFN0cmluZyAoNDg0IGJ5dGVzKQorMjIwICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnJlZ2lvbk1hdGNoZXMgKDE1NyBieXRlcykKKzIyMSAgICAgICBzdW4uc2VjdXJpdHkucHJvdmlkZXIuU0hBOjppbXBsQ29tcHJlc3MgKDQ5MSBieXRlcykKKy0tLSAgIG4gICBzdW4ubWlzYy5VbnNhZmU6OmdldEludAorIDQ5ICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW06OndyaXRlICg1NSBieXRlcykKKyAgNiUgICAgICBjb20uc3VuLmNyeXB0by5wcm92aWRlci5BUkNGT1VSQ2lwaGVyOjpjcnlwdCBAIDE1ICgxMjkgYnl0ZXMpCisyMDggICBtYWRlIHpvbWJpZSAgKDIpICBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTo6cmVhZENoYXIgKDQwIGJ5dGVzKQorMjIyICAgICAgIGNvbS5zdW4uY3J5cHRvLnByb3ZpZGVyLkFSQ0ZPVVJDaXBoZXI6OmNyeXB0ICgxMjkgYnl0ZXMpCisyMjMgICAgICAgamF2YS5sYW5nLkludGVnZXI6OnJldmVyc2VCeXRlcyAoMjYgYnl0ZXMpCisgNDUgICBtYWRlIG5vdCBlbnRyYW50ICAoMikgIGphdmEudXRpbC5IYXNoTWFwOjpnZXQgKDc5IGJ5dGVzKQorIDUwICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS5sYW5nLkNoYXJhY3RlckRhdGE6Om9mICgxMjAgYnl0ZXMpCisyMjQgICAgICAgamF2YS51dGlsLkhhc2hNYXAkRW50cnlJdGVyYXRvcjo6bmV4dCAoNSBieXRlcykKKzIyNSAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeUl0ZXJhdG9yOjpuZXh0ICg1IGJ5dGVzKQorIDY0ICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlICg1IGJ5dGVzKQorIDY1ICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlICg5IGJ5dGVzKQorIDY3ICAgbWFkZSB6b21iaWUgICgyKSAgc3VuLnJlZmxlY3QuZ2VuZXJpY3MucGFyc2VyLlNpZ25hdHVyZVBhcnNlcjo6cGFyc2VJZGVudGlmaWVyICgxMTUgYnl0ZXMpCisxMTYgICBtYWRlIHpvbWJpZSAgKDIpICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjp0b0xvd2VyQ2FzZSAoOSBieXRlcykKKzIyNiAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeTo6aGFzaENvZGUgKDM4IGJ5dGVzKQorMjI3ICAgICAgIGphdmEudXRpbC5BYnN0cmFjdE1hcDo6aGFzaENvZGUgKDQxIGJ5dGVzKQorMTYwICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6dG9VcHBlckNhc2VFeCAoMzAgYnl0ZXMpCisxOTggICBtYWRlIHpvbWJpZSAgKDIpICBzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyOjplcXVhbHMgKDY5IGJ5dGVzKQorMjAzICAgbWFkZSB6b21iaWUgICgyKSAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6dG9Mb3dlckNhc2UgKDYgYnl0ZXMpCisyMDEgICBtYWRlIHpvbWJpZSAgKDIpICBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU6Omhhc2hDb2RlICgzNCBieXRlcykKKzE1OSAgIG1hZGUgem9tYmllICAoMikgIGphdmEubGFuZy5TdHJpbmc6OnRvVXBwZXJDYXNlICg0NDIgYnl0ZXMpCisyMDIgICBtYWRlIHpvbWJpZSAgKDIpICBqYXZhLmxhbmcuU3RyaW5nOjp0b0xvd2VyQ2FzZSAoNDM2IGJ5dGVzKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvamRrNi1mbGFncy50eHQgYi9jYWxpcGVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL2pkazYtZmxhZ3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTRlNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL2pkazYtZmxhZ3MudHh0CkBAIC0wLDAgKzEsNzcwIEBACisgYm9vbCBBSFJCeURlYXRoQ29sbGVjdFRpbWVSYXRpbyAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQUhSQnlNaW5vclBhdXNlVGltZU1ham9yRnJlcSAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEFIUkJ5UHJvbW9Ub0FsbG9jUmF0aW8gICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBBSFJCeVN1cnZpdm9yQWdlICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQUhSSW5jcmVtZW50U2l6ZSAgICAgICAgICAgICAgICAgICAgID0gNTI0Mjg4MCAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEFIUk1heERlYXRoQ29sbGVjdFRpbWVSYXRpbyAgICAgICAgICA9IDU1ICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBBSFJNYXhNaW5vckludm9jYXRpb25zUGVyTWFqb3IgICAgICAgPSAzMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQUhSTWF4TWlub3JQYXVzZVRpbWVNaWxsaXMgICAgICAgICAgID0gMTAwICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEFIUk1heFByb21vVG9BbGxvY1JhdGlvICAgICAgICAgICAgICA9IDI1ICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBBSFJNYXhSYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQUhSTWF4U2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA0ODU3NjAwICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEFIUk1heFN1cnZpdm9yQWdlICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBBSFJNaW5EZWF0aENvbGxlY3RUaW1lUmF0aW8gICAgICAgICAgPSA1MCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQUhSTWluTWlub3JJbnZvY2F0aW9uc1Blck1ham9yICAgICAgID0gNSAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEFIUk1pbk1pbm9yUGF1c2VUaW1lTWlsbGlzICAgICAgICAgICA9IDE1MCAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBBSFJNaW5Qcm9tb1RvQWxsb2NSYXRpbyAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQUhSTWluU3Vydml2b3JBZ2UgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEFkYXB0aXZlSGVhcFJlYmFsYW5jZSAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBBZGFwdGl2ZVBlcm1TaXplV2VpZ2h0ICAgICAgICAgICAgICAgPSAyMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQWRhcHRpdmVTaXplRGVjcmVtZW50U2NhbGVGYWN0b3IgICAgID0gNCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEFkYXB0aXZlU2l6ZU1ham9yR0NEZWNheVRpbWVTY2FsZSAgICA9IDEwICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBBZGFwdGl2ZVNpemVQYXVzZVBvbGljeSAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQWRhcHRpdmVTaXplUG9saWN5Q29sbGVjdGlvbkNvc3RNYXJnaW4gID0gNTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEFkYXB0aXZlU2l6ZVBvbGljeUluaXRpYWxpemluZ1N0ZXBzICA9IDIwICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBBZGFwdGl2ZVNpemVQb2xpY3lPdXRwdXRJbnRlcnZhbCAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQWRhcHRpdmVTaXplUG9saWN5V2VpZ2h0ICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEFkYXB0aXZlU2l6ZVRocm91Z2hQdXRQb2xpY3kgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBBZGFwdGl2ZVRpbWVXZWlnaHQgICAgICAgICAgICAgICAgICAgPSAyNSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQWRqdXN0Q29uY3VycmVuY3kgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEFnZ3Jlc3NpdmVPcHRzICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBBbGlhc0xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQWxsb2NhdGVQcmVmZXRjaERpc3RhbmNlICAgICAgICAgICAgID0gMTkyICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEFsbG9jYXRlUHJlZmV0Y2hJbnN0ciAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBBbGxvY2F0ZVByZWZldGNoTGluZXMgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQWxsb2NhdGVQcmVmZXRjaFN0ZXBTaXplICAgICAgICAgICAgID0gNjQgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEFsbG9jYXRlUHJlZmV0Y2hTdHlsZSAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBBbGxvd0pOSUVudlByb3h5ICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQWxsb3dQYXJhbGxlbERlZmluZUNsYXNzICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEFsbG93VXNlclNpZ25hbEhhbmRsZXJzICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBBbHdheXNBY3RBc1NlcnZlckNsYXNzTWFjaGluZSAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQWx3YXlzQ29tcGlsZUxvb3BNZXRob2RzICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEFsd2F5c0luZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBBbHdheXNMb2NrQ2xhc3NMb2FkZXIgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQWx3YXlzUHJlVG91Y2ggICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEFsd2F5c1Jlc3RvcmVGUFUgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBBbHdheXNUZW51cmUgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQW5vbnltb3VzQ2xhc3NlcyAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEFzc2VydE9uU3VzcGVuZFdhaXRGYWlsdXJlICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBBdG9taWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQXV0b0JveENhY2hlTWF4ICAgICAgICAgICAgICAgICAgICAgID0gMTI4ICAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KK3VpbnR4IEF1dG9HQ1NlbGVjdFBhdXNlTWlsbGlzICAgICAgICAgICAgICA9IDUwMDAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBCQ0VBVHJhY2VMZXZlbCAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQmFja0VkZ2VUaHJlc2hvbGQgICAgICAgICAgICAgICAgICAgID0gMTAwMDAwICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIEJhY2tncm91bmRDb21waWxhdGlvbiAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3BkIHByb2R1Y3R9Cit1aW50eCBCYXNlRm9vdFByaW50RXN0aW1hdGUgICAgICAgICAgICAgICAgPSAyNjg0MzU0NTYgICAgICAgIHtwcm9kdWN0fQorIGludHggQmlhc2VkTG9ja2luZ0J1bGtSZWJpYXNUaHJlc2hvbGQgICAgID0gMjAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEJpYXNlZExvY2tpbmdCdWxrUmV2b2tlVGhyZXNob2xkICAgICA9IDQwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBCaWFzZWRMb2NraW5nRGVjYXlUaW1lICAgICAgICAgICAgICAgPSAyNTAwMCAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQmlhc2VkTG9ja2luZ1N0YXJ0dXBEZWxheSAgICAgICAgICAgID0gNDAwMCAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEJpbmRDTVNUaHJlYWRUb0NQVSAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBCaW5kR0NUYXNrVGhyZWFkc1RvQ1BVcyAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQmxvY2tMYXlvdXRCeUZyZXF1ZW5jeSAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBpbnR4IEJsb2NrTGF5b3V0TWluRGlhbW9uZFBlcmNlbnRhZ2UgICAgICA9IDIwICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBCbG9ja0xheW91dFJvdGF0ZUxvb3BzICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGJvb2wgQmxvY2tPZmZzZXRBcnJheVVzZVVuYWxsb2NhdGVkQmxvY2sgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEJyYW5jaE9uUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBCeXRlY29kZVZlcmlmaWNhdGlvbkxvY2FsICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQnl0ZWNvZGVWZXJpZmljYXRpb25SZW1vdGUgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IENJQ29tcGlsZXJDb3VudCAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDSUNvbXBpbGVyQ291bnRQZXJDUFUgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ0lUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU0Fib3J0U2VtYW50aWNzICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNBYm9ydGFibGVQcmVjbGVhbk1pbldvcmtQZXJJdGVyYXRpb24gID0gMTAwICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IENNU0Fib3J0YWJsZVByZWNsZWFuV2FpdE1pbGxpcyAgICAgICA9IDEwMCAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNCaXRNYXBZaWVsZFF1YW50dW0gICAgICAgICAgICAgICAgPSAxMDQ4NTc2MCAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TQm9vdHN0cmFwT2NjdXBhbmN5ICAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU0NsYXNzVW5sb2FkaW5nRW5hYmxlZCAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNDbGFzc1VubG9hZGluZ01heEludGVydmFsICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ01TQ2xlYW5PbkVudGVyICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU0NvbXBhY3RXaGVuQ2xlYXJBbGxTb2Z0UmVmcyAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNDb25jTWFya011bHRpcGxlICAgICAgICAgICAgICAgICAgPSAzMiAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ01TQ29uY3VycmVudE1URW5hYmxlZCAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU0Nvb3JkaW5hdG9yWWllbGRTbGVlcENvdW50ICAgICAgICA9IDEwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDTVNEdW1wQXRQcm9tb3Rpb25GYWlsdXJlICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TRXhwQXZnRmFjdG9yICAgICAgICAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU0V4dHJhcG9sYXRlU3dlZXAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNGdWxsR0NzQmVmb3JlQ29tcGFjdGlvbiAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TSW5jcmVtZW50YWxEdXR5Q3ljbGUgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU0luY3JlbWVudGFsRHV0eUN5Y2xlTWluICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDTVNJbmNyZW1lbnRhbE1vZGUgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TSW5jcmVtZW50YWxPZmZzZXQgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU0luY3JlbWVudGFsUGFjaW5nICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNJbmNyZW1lbnRhbFNhZmV0eUZhY3RvciAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TSW5kZXhlZEZyZWVMaXN0UmVwbGVuaXNoICAgICAgICAgID0gNCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IENNU0luaXRpYXRpbmdPY2N1cGFuY3lGcmFjdGlvbiAgICAgICA9IC0xICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBDTVNJbml0aWF0aW5nT2NjdXBhbmN5RnJhY3Rpb25EZWx0YSAgPSAtMSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQ01TSW5pdGlhdGluZ1Blcm1PY2N1cGFuY3lGcmFjdGlvbiAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IENNU0luaXRpYXRpbmdQZXJtT2NjdXBhbmN5RnJhY3Rpb25EZWx0YSAgPSAtMSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQ01TSW5pdGlhdGluZ1JhbUxpbWl0RnJhY3Rpb24gICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IENNU0lzVG9vRnVsbFBlcmNlbnRhZ2UgICAgICAgICAgICAgICA9IDk4ICAgICAgICAgICAgICAge3Byb2R1Y3R9Citkb3VibGUgQ01TTGFyZ2VDb2FsU3VycGx1c1BlcmNlbnQgICAgICAgICAgID0gIHtwcm9kdWN0fQorZG91YmxlIENNU0xhcmdlU3BsaXRTdXJwbHVzUGVyY2VudCAgICAgICAgICA9ICB7cHJvZHVjdH0KKyBib29sIENNU0xvb3BXYXJuICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNNYXhBYm9ydGFibGVQcmVjbGVhbkxvb3BzICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQ01TTWF4QWJvcnRhYmxlUHJlY2xlYW5UaW1lICAgICAgICAgID0gNTAwMCAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU09sZFBMQUJNYXggICAgICAgICAgICAgICAgICAgICAgICA9IDEwMjQgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNPbGRQTEFCTWluICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TT2xkUExBQk51bVJlZmlsbHMgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU09sZFBMQUJSZWFjdGl2aXR5Q2VpbGluZyAgICAgICAgICA9IDEwICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNPbGRQTEFCUmVhY3Rpdml0eUZhY3RvciAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ01TT2xkUExBQlJlc2l6ZVF1aWNrZXIgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU09sZFBMQUJUb2xlcmFuY2VGYWN0b3IgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDTVNQTEFCUmVjb3JkQWx3YXlzICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TUGFyUHJvbW90ZUJsb2Nrc1RvQ2xhaW0gICAgICAgICAgID0gMTYgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU1BhcmFsbGVsUmVtYXJrRW5hYmxlZCAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDTVNQYXJhbGxlbFN1cnZpdm9yUmVtYXJrRW5hYmxlZCAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ01TUGVybUdlblByZWNsZWFuaW5nRW5hYmxlZCAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU1ByZWNsZWFuRGVub21pbmF0b3IgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNQcmVjbGVhbkl0ZXIgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TUHJlY2xlYW5OdW1lcmF0b3IgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU1ByZWNsZWFuUmVmTGlzdHMxICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDTVNQcmVjbGVhblJlZkxpc3RzMiAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ01TUHJlY2xlYW5TdXJ2aXZvcnMxICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU1ByZWNsZWFuU3Vydml2b3JzMiAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNQcmVjbGVhblRocmVzaG9sZCAgICAgICAgICAgICAgICAgPSAxMDAwICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ01TUHJlY2xlYW5pbmdFbmFibGVkICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU1ByaW50Q2h1bmtzSW5EdW1wICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDTVNQcmludE9iamVjdHNJbkR1bXAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TUmVtYXJrVmVyaWZ5VmFyaWFudCAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENNU1JlcGxlbmlzaEludGVybWVkaWF0ZSAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNSZXNjYW5NdWx0aXBsZSAgICAgICAgICAgICAgICAgICAgPSAzMiAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TUmV2aXNpdFN0YWNrU2l6ZSAgICAgICAgICAgICAgICAgID0gMTA0ODU3NiAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU1NhbXBsaW5nR3JhaW4gICAgICAgICAgICAgICAgICAgICA9IDE2Mzg0ICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDTVNTY2F2ZW5nZUJlZm9yZVJlbWFyayAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TU2NoZWR1bGVSZW1hcmtFZGVuUGVuZXRyYXRpb24gICAgID0gNTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU1NjaGVkdWxlUmVtYXJrRWRlblNpemVUaHJlc2hvbGQgICA9IDIwOTcxNTIgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNTY2hlZHVsZVJlbWFya1NhbXBsaW5nUmF0aW8gICAgICAgPSA1ICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorZG91YmxlIENNU1NtYWxsQ29hbFN1cnBsdXNQZXJjZW50ICAgICAgICAgICA9ICB7cHJvZHVjdH0KK2RvdWJsZSBDTVNTbWFsbFNwbGl0U3VycGx1c1BlcmNlbnQgICAgICAgICAgPSAge3Byb2R1Y3R9CisgYm9vbCBDTVNTcGxpdEluZGV4ZWRGcmVlTGlzdEJsb2NrcyAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQ01TVHJpZ2dlclBlcm1SYXRpbyAgICAgICAgICAgICAgICAgID0gODAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IENNU1RyaWdnZXJSYXRpbyAgICAgICAgICAgICAgICAgICAgICA9IDgwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDTVNVc2VHQ092ZXJoZWFkTGltaXQgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ01TVXNlT2xkRGVmYXVsdHMgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IENNU1dhaXREdXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICA9IDIwMDAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNXb3JrUXVldWVEcmFpblRocmVzaG9sZCAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ01TWWllbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU1lpZWxkU2xlZXBDb3VudCAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBDTVNZb3VuZ0dlblBlcldvcmtlciAgICAgICAgICAgICAgICAgPSAxNjc3NzIxNiAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TX0ZMU1BhZGRpbmcgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU19GTFNXZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICA9IDc1ICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDTVNfU3dlZXBQYWRkaW5nICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ01TX1N3ZWVwVGltZXJUaHJlc2hvbGRNaWxsaXMgICAgICAgID0gMTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENNU19Td2VlcFdlaWdodCAgICAgICAgICAgICAgICAgICAgICA9IDc1ICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBDUFVGb3JDTVNUaHJlYWQgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgQ2hlY2tKTklDYWxscyAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENsYXNzVW5sb2FkaW5nICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBDbGVhckZQVUF0UGFyayAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgQ2xpcElubGluaW5nICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IENvZGVDYWNoZUV4cGFuc2lvblNpemUgICAgICAgICAgICAgICA9IDMyNzY4ICAgICAgICAgICAge3BkIHByb2R1Y3R9Cit1aW50eCBDb2RlQ2FjaGVGbHVzaGluZ01pbmltdW1GcmVlU3BhY2UgICAgPSAxNTM2MDAwICAgICAgICAgIHtwcm9kdWN0fQordWludHggQ29kZUNhY2hlTWluaW11bUZyZWVTcGFjZSAgICAgICAgICAgID0gNTEyMDAwICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIENvbGxlY3RHZW4wRmlyc3QgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDb21wYWN0RmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQ29tcGlsYXRpb25Qb2xpY3lDaG9pY2UgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IENvbXBpbGF0aW9uUmVwZWF0ICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge0MxIHByb2R1Y3R9CitjY3N0cmxpc3QgQ29tcGlsZUNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK2Njc3RyIENvbXBpbGVDb21tYW5kRmlsZSAgICAgICAgICAgICAgICAgICA9ICB7cHJvZHVjdH0KK2Njc3RybGlzdCBDb21waWxlT25seSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQ29tcGlsZVRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgID0gMTAwMDAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIENvbXBpbGVyVGhyZWFkSGludE5vUHJlZW1wdCAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBDb21waWxlclRocmVhZFByaW9yaXR5ICAgICAgICAgICAgICAgPSAtMSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggQ29tcGlsZXJUaHJlYWRTdGFja1NpemUgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KK3VpbnR4IENvbmNHQ1RocmVhZHMgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBDb25kaXRpb25hbE1vdmVMaW1pdCAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgICAgIHtDMiBwZCBwcm9kdWN0fQorIGJvb2wgQ29udmVydFNsZWVwVG9ZaWVsZCAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIENvbnZlcnRZaWVsZFRvU2xlZXAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBDeWNsZVRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRFRyYWNlQWxsb2NQcm9iZXMgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIERUcmFjZU1ldGhvZFByb2JlcyAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBEVHJhY2VNb25pdG9yUHJvYmVzICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRGVhbGxvY2F0ZUhlYXBQYWdlcyAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIERlYWxsb2NhdGVTdGFja1BhZ2VzICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBEZWFsbG9jYXRlU3RhY2tQYWdlc01pbkludGVydmFsTXMgICAgPSAxMDAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRGVidWdDb250aW51YXRpb24gICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIERlYnVnSW5saW5lZENhbGxzICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBEZWJ1Z05vblNhZmVwb2ludHMgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQordWludHggRGVmYXVsdE1heFJBTUZyYWN0aW9uICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IERlZmF1bHRUaHJlYWRQcmlvcml0eSAgICAgICAgICAgICAgICA9IC0xICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBEZWZlckluaXRpYWxDYXJkTWFyayAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGludHggRGVmZXJQb2xsaW5nUGFnZUxvb3BDb3VudCAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IERlZmVyVGhyU3VzcGVuZExvb3BDb3VudCAgICAgICAgICAgICA9IDQwMDAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBEZW9wdGltaXplUmFuZG9tICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRGlzYWJsZUF0dGFjaE1lY2hhbmlzbSAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIERpc2FibGVFeHBsaWNpdEdDICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CitjY3N0cmxpc3QgRGlzYWJsZUludHJpbnNpYyAgICAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIERpc3BsYXlWTU91dHB1dCAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBEaXNwbGF5Vk1PdXRwdXRUb1N0ZGVyciAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRGlzcGxheVZNT3V0cHV0VG9TdGRvdXQgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIERvRXNjYXBlQW5hbHlzaXMgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgaW50eCBEb21pbmF0b3JTZWFyY2hMaW1pdCAgICAgICAgICAgICAgICAgPSAxMDAwICAgICAgICAgICAgIHtDMiBkaWFnbm9zdGljfQorIGJvb2wgRG9udENvbXBpbGVIdWdlTWV0aG9kcyAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIERvbnRZaWVsZEFMb3QgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBEdW1wU2hhcmVkU3BhY2VzICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRWFnZXJYcnVuSW5pdCAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEVsaW1pbmF0ZUFsbG9jYXRpb25BcnJheVNpemVMaW1pdCAgICA9IDY0ICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBFbGltaW5hdGVBbGxvY2F0aW9ucyAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGJvb2wgRWxpbWluYXRlQXV0b0JveCAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7QzIgZGlhZ25vc3RpY30KKyBib29sIEVsaW1pbmF0ZUxvY2tzICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgaW50eCBFbWl0U3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggRXJnb0hlYXBTaXplTGltaXQgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK2Njc3RyIEVycm9yRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICB7cHJvZHVjdH0KKyBib29sIEVzdGltYXRlQXJnRXNjYXBlICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBFdmVudExvZ0xlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgPSAyMDAwICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRXhwbGljaXRHQ0ludm9rZXNDb25jdXJyZW50ICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEV4cGxpY2l0R0NJbnZva2VzQ29uY3VycmVudEFuZFVubG9hZHNDbGFzc2VzICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBFeHRlbmRlZERUcmFjZVByb2JlcyAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRkxTQWx3YXlzQ29hbGVzY2VMYXJnZSAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEZMU0NvYWxlc2NlUG9saWN5ICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAge3Byb2R1Y3R9Citkb3VibGUgRkxTTGFyZ2VzdEJsb2NrQ29hbGVzY2VQcm94aW1pdHkgICAgID0gIHtwcm9kdWN0fQorIGJvb2wgRkxTVmVyaWZ5QWxsSGVhcFJlZmVyZW5jZXMgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIEZMU1ZlcmlmeUluZGV4VGFibGUgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBGTFNWZXJpZnlMaXN0cyAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgRmFpbE92ZXJUb09sZFZlcmlmaWVyICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEZhc3RDYXJkVGFibGVTY2FuICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBGYXN0VExBQlJlZmlsbCAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggRmVuY2VJbnN0cnVjdGlvbiAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEZpZWxkc0FsbG9jYXRpb25TdHlsZSAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBGaWx0ZXJTcHVyaW91c1dha2V1cHMgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRm9yY2VGdWxsR0NKVk1USUVwaWxvZ3VlcyAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEZvcmNlTlVNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBGb3JjZVNoYXJlZFNwYWNlcyAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRm9yY2VUaW1lSGlnaFJlc29sdXRpb24gICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEZyZXFJbmxpbmVTaXplICAgICAgICAgICAgICAgICAgICAgICA9IDMyNSAgICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBGdWxsUHJvZmlsZU9uUmVJbnRlcnByZXQgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGludHggRzFDb25jUmVmaW5lbWVudEdyZWVuWm9uZSAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEcxQ29uY1JlZmluZW1lbnRSZWRab25lICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBHMUNvbmNSZWZpbmVtZW50U2VydmljZUludGVydmFsTWlsbGlzICA9IDMwMCAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBHMUNvbmNSZWZpbmVtZW50VGhyZWFkcyAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggRzFDb25jUmVmaW5lbWVudFRocmVzaG9sZFN0ZXAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEcxQ29uY1JlZmluZW1lbnRZZWxsb3dab25lICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBHMUNvbmZpZGVuY2VQZXJjZW50ICAgICAgICAgICAgICAgICAgPSA1MCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggRzFIZWFwUmVnaW9uU2l6ZSAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEcxTWFya1JlZ2lvblN0YWNrU2l6ZSAgICAgICAgICAgICAgICA9IDEwNDg1NzYgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBHMVByaW50SGVhcFJlZ2lvbnMgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGludHggRzFSU2V0UmVnaW9uRW50cmllcyAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEcxUlNldFNjYW5CbG9ja1NpemUgICAgICAgICAgICAgICAgICA9IDY0ICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBHMVJTZXRTcGFyc2VSZWdpb25FbnRyaWVzICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggRzFSU2V0VXBkYXRpbmdQYXVzZVRpbWVQZXJjZW50ICAgICAgID0gMTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEcxUmVzZXJ2ZVBlcmNlbnQgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBHMVNBVEJCdWZmZXJTaXplICAgICAgICAgICAgICAgICAgICAgPSAxMDI0ICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRzFTdW1tYXJpemVDb25jTWFyayAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIEcxU3VtbWFyaXplUlNldFN0YXRzICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgaW50eCBHMVN1bW1hcml6ZVJTZXRTdGF0c1BlcmlvZCAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgRzFTdW1tYXJpemVaRlN0YXRzICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIEcxVHJhY2VDb25jUmVmaW5lbWVudCAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgaW50eCBHMVVwZGF0ZUJ1ZmZlclNpemUgICAgICAgICAgICAgICAgICAgPSAyNTYgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgRzFVc2VBZGFwdGl2ZUNvbmNSZWZpbmVtZW50ICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEdDRHJhaW5TdGFja1RhcmdldFNpemUgICAgICAgICAgICAgICA9IDY0ICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBHQ0hlYXBGcmVlTGltaXQgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgR0NMb2NrZXJJbnZva2VzQ29uY3VycmVudCAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEdDT3ZlcmhlYWRSZXBvcnRpbmcgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBHQ092ZXJoZWFkUmVwb3J0aW5nUGVyaW9kTVMgICAgICAgICAgPSAxMDAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgR0NQYXJhbGxlbFZlcmlmaWNhdGlvbkVuYWJsZWQgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7ZGlhZ25vc3RpY30KK3VpbnR4IEdDUGF1c2VJbnRlcnZhbE1pbGxpcyAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBHQ1Rhc2tUaW1lU3RhbXBFbnRyaWVzICAgICAgICAgICAgICAgPSAyMDAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggR0NUaW1lTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTggICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEdDVGltZVJhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk5ICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBHb29nbGVBZ2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorY2NzdHIgR29vZ2xlQWdlbnRGbGFncyAgICAgICAgICAgICAgICAgICAgID0gIHtwcm9kdWN0fQorIGJvb2wgR29vZ2xlQWdlbnRXUyAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KK2Njc3RyIEdvb2dsZUFnZW50V1NGbGFncyAgICAgICAgICAgICAgICAgICA9ICB7cHJvZHVjdH0KK3VpbnR4IEdvb2dsZUdDSGVhcEZyZWVMaW1pdFBvbGljeSAgICAgICAgICA9IDIgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBHb29nbGVIZWFwSW5zdHJ1bWVudGF0aW9uICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgR29vZ2xlSGVhcE1vbml0b3IgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEdvb2dsZUluaGVyaXRBbHRTaWdTdGFjayAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBHb29nbGVMb2dSb3RhdGlvblNpemUgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtkaWFnbm9zdGljfQordWludHggR29vZ2xlTWF4R2FyYmFnZUhlYXB6VHJhY2VzICAgICAgICAgID0gMjAwICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEdvb2dsZVNjb3BpbmcgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBHb29nbGVTb2Z0UmVmTFJVUG9saWN5ICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggR29vZ2xlU29mdFJlZkxSVVBvbGljeUV4Y2x1ZGVkTUIgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEdvb2dsZVVzZUNvbnN0YW50T01Qcm92aXNpb24gICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBHb29nbGVVc2VMaWJ1bndpbmQgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgR29vZ2xlVXNlU1NFRm9yVk0gICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KK2Njc3RyIEhQSUxpYlBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICA9ICB7cHJvZHVjdH0KKyBib29sIEhhbmRsZVByb21vdGlvbkZhaWx1cmUgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBIZWFwQmFzZU1pbkFkZHJlc3MgICAgICAgICAgICAgICAgICAgPSAyMTQ3NDgzNjQ4ICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgSGVhcER1bXBBZnRlckZ1bGxHQyAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7bWFuYWdlYWJsZX0KKyBib29sIEhlYXBEdW1wQmVmb3JlRnVsbEdDICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge21hbmFnZWFibGV9CisgYm9vbCBIZWFwRHVtcE9uT3V0T2ZNZW1vcnlFcnJvciAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHttYW5hZ2VhYmxlfQorY2NzdHIgSGVhcER1bXBQYXRoICAgICAgICAgICAgICAgICAgICAgICAgID0gIHttYW5hZ2VhYmxlfQordWludHggSGVhcEZpcnN0TWF4aW11bUNvbXBhY3Rpb25Db3VudCAgICAgID0gMyAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEhlYXBNYXhpbXVtQ29tcGFjdGlvbkludGVydmFsICAgICAgICA9IDIwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBIb2lzdEZpbmFsTG9hZHMgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgSWdub3JlVW5yZWNvZ25pemVkVk1PcHRpb25zICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IEluaXRpYWxDb2RlQ2FjaGVTaXplICAgICAgICAgICAgICAgICA9IDIzNTkyOTYgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBJbml0aWFsQ29tcGlsZUZhc3QgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgSW5pdGlhbENvbXBpbGVSZWFsbHlGYXN0ICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KK3VpbnR4IEluaXRpYWxIZWFwU2l6ZSAgICAgICAgICAgICAgICAgICAgIDo9IDY3MTA4ODY0ICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBJbml0aWFsUkFNRnJhY3Rpb24gICAgICAgICAgICAgICAgICAgPSA2NCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggSW5pdGlhbFN1cnZpdm9yUmF0aW8gICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEluaXRpYWxUZW51cmluZ1RocmVzaG9sZCAgICAgICAgICAgICA9IDcgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBJbml0aWF0aW5nSGVhcE9jY3VwYW5jeVBlcmNlbnQgICAgICAgPSA0NSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgSW5saW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIElubGluZU1ldGhvZHNXaXRoTnVsbFVubG9hZGVkVHlwZXNJblNpZ25hdHVyZSAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggSW5saW5lU21hbGxDb2RlICAgICAgICAgICAgICAgICAgICAgID0gMTAwMCAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIEluc2VydE1lbUJhckFmdGVyQXJyYXljb3B5ICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgaW50eCBJbnRlcmlvckVudHJ5QWxpZ25tZW50ICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAgIHtDMiBwZCBwcm9kdWN0fQorIGludHggSW50ZXJwcmV0ZXJQcm9maWxlUGVyY2VudGFnZSAgICAgICAgID0gMzMgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIEpOSURldGFjaFJlbGVhc2VzTW9uaXRvcnMgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBKYXZhTW9uaXRvcnNJblN0YWNrVHJhY2UgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggSmF2YVByaW9yaXR5MTBfVG9fT1NQcmlvcml0eSAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEphdmFQcmlvcml0eTFfVG9fT1NQcmlvcml0eSAgICAgICAgICA9IC0xICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBKYXZhUHJpb3JpdHkyX1RvX09TUHJpb3JpdHkgICAgICAgICAgPSAtMSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggSmF2YVByaW9yaXR5M19Ub19PU1ByaW9yaXR5ICAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEphdmFQcmlvcml0eTRfVG9fT1NQcmlvcml0eSAgICAgICAgICA9IC0xICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBKYXZhUHJpb3JpdHk1X1RvX09TUHJpb3JpdHkgICAgICAgICAgPSAtMSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggSmF2YVByaW9yaXR5Nl9Ub19PU1ByaW9yaXR5ICAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IEphdmFQcmlvcml0eTdfVG9fT1NQcmlvcml0eSAgICAgICAgICA9IC0xICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBKYXZhUHJpb3JpdHk4X1RvX09TUHJpb3JpdHkgICAgICAgICAgPSAtMSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggSmF2YVByaW9yaXR5OV9Ub19PU1ByaW9yaXR5ICAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIExJUkZpbGxEZWxheVNsb3RzICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge0MxIHBkIHByb2R1Y3R9Cit1aW50eCBMYXJnZVBhZ2VIZWFwU2l6ZVRocmVzaG9sZCAgICAgICAgICAgPSAxMzQyMTc3MjggICAgICAgIHtwcm9kdWN0fQorY2NzdHIgTGFyZ2VQYWdlTW91bnRQb2ludCAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IExhcmdlUGFnZVNpemVJbkJ5dGVzICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBMYXp5Qm9vdENsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgTGlua1dlbGxLbm93bkNsYXNzZXMgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIExvZ0FIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBMb2dDb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorY2NzdHIgTG9nRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIHtkaWFnbm9zdGljfQorIGJvb2wgTG9nR0NPdmVyaGVhZExpbWl0ICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIExvZ1ZNT3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgaW50eCBMb29wT3B0c0NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgPSA0MyAgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGludHggTG9vcFVucm9sbExpbWl0ICAgICAgICAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgICB7QzIgcGQgcHJvZHVjdH0KKyBpbnR4IExvb3BVbnJvbGxNaW4gICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBMb29wVW5zd2l0Y2hpbmcgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGludHggTWFsbG9jVmVyaWZ5SW50ZXJ2YWwgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBpbnR4IE1hbGxvY1ZlcmlmeVN0YXJ0ICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBNYW5hZ2VtZW50U2VydmVyICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggTWFya1N0YWNrU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjggICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IE1hcmtTdGFja1NpemVNYXggICAgICAgICAgICAgICAgICAgICA9IDQxOTQzMDQgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBNYXJrU3dlZXBBbHdheXNDb21wYWN0Q291bnQgICAgICAgICAgPSA0ICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggTWFya1N3ZWVwRGVhZFJhdGlvICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE1heEJDRUFFc3RpbWF0ZUxldmVsICAgICAgICAgICAgICAgICA9IDUgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBNYXhCQ0VBRXN0aW1hdGVTaXplICAgICAgICAgICAgICAgICAgPSAxNTAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggTWF4RGlyZWN0TWVtb3J5U2l6ZSAgICAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIE1heEZETGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBNYXhHQ01pbm9yUGF1c2VNaWxsaXMgICAgICAgICAgICAgICAgPSA0Mjk0OTY3Mjk1ICAgICAgIHtwcm9kdWN0fQordWludHggTWF4R0NQYXVzZU1pbGxpcyAgICAgICAgICAgICAgICAgICAgID0gNDI5NDk2NzI5NSAgICAgICB7cHJvZHVjdH0KK3VpbnR4IE1heEhlYXBGcmVlUmF0aW8gICAgICAgICAgICAgICAgICAgICA9IDcwICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBNYXhIZWFwU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICA6PSAxMDczNzQxODI0ICAgICAgIHtwcm9kdWN0fQorIGludHggTWF4SW5saW5lTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgID0gOSAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE1heElubGluZVNpemUgICAgICAgICAgICAgICAgICAgICAgICA9IDM1ICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBNYXhKYXZhU3RhY2tUcmFjZURlcHRoICAgICAgICAgICAgICAgPSAxMDI0ICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggTWF4SnVtcFRhYmxlU2l6ZSAgICAgICAgICAgICAgICAgICAgID0gNjUwMDAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBpbnR4IE1heEp1bXBUYWJsZVNwYXJzZW5lc3MgICAgICAgICAgICAgICA9IDUgICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgaW50eCBNYXhMYWJlbFJvb3REZXB0aCAgICAgICAgICAgICAgICAgICAgPSAxMTAwICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQordWludHggTWF4TGl2ZU9iamVjdEV2YWN1YXRpb25SYXRpbyAgICAgICAgID0gMTAwICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE1heExvb3BQYWQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9Cit1aW50eCBNYXhOZXdTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0Mjk0OTAxNzYwICAgICAgIHtwcm9kdWN0fQorIGludHggTWF4Tm9kZUxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUwMDAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KK3VpbnR4IE1heFBlcm1IZWFwRXhwYW5zaW9uICAgICAgICAgICAgICAgICA9IDQxOTQzMDQgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBNYXhQZXJtU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NzEwODg2NCAgICAgICAgIHtwZCBwcm9kdWN0fQordWludDY0X3QgTWF4UkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KK3VpbnR4IE1heFJBTUZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBNYXhSZWN1cnNpdmVJbmxpbmVMZXZlbCAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggTWF4VGVudXJpbmdUaHJlc2hvbGQgICAgICAgICAgICAgICAgID0gMTUgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE1heFRyaXZpYWxTaXplICAgICAgICAgICAgICAgICAgICAgICA9IDYgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBNZXRob2RGbHVzaGluZyAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggTWV0aG9kSGFuZGxlUHVzaExpbWl0ICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBpbnR4IE1pbkNvZGVDYWNoZUZsdXNoaW5nSW50ZXJ2YWwgICAgICAgICA9IDMwICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBNaW5IZWFwRGVsdGFCeXRlcyAgICAgICAgICAgICAgICAgICAgPSAxMzEwNzIgICAgICAgICAgIHtwcm9kdWN0fQordWludHggTWluSGVhcEZyZWVSYXRpbyAgICAgICAgICAgICAgICAgICAgID0gNDAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE1pbklubGluaW5nVGhyZXNob2xkICAgICAgICAgICAgICAgICA9IDI1MCAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBNaW5KdW1wVGFibGVTaXplICAgICAgICAgICAgICAgICAgICAgPSAxOCAgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQordWludHggTWluUGVybUhlYXBFeHBhbnNpb24gICAgICAgICAgICAgICAgID0gMjYyMTQ0ICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IE1pblJBTUZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBNaW5TdXJ2aXZvclJhdGlvICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggTWluVExBQlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIE1peGVkTW9kZVRocmVhZER1bXAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBNb25pdG9yQm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgTW9uaXRvckluVXNlTGlzdHMgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE11bHRpQXJyYXlFeHBhbmRMaW1pdCAgICAgICAgICAgICAgICA9IDYgICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBNdXN0Q2FsbExvYWRDbGFzc0ludGVybmFsICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggTlVNQUNodW5rUmVzaXplV2VpZ2h0ICAgICAgICAgICAgICAgID0gMjAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE5VTUFQYWdlU2NhblJhdGUgICAgICAgICAgICAgICAgICAgICA9IDI1NiAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBOVU1BU3BhY2VSZXNpemVSYXRlICAgICAgICAgICAgICAgICAgPSAxMDczNzQxODI0ICAgICAgIHtwcm9kdWN0fQorIGJvb2wgTlVNQVN0YXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE5hdGl2ZU1vbml0b3JGbGFncyAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBOYXRpdmVNb25pdG9yU3BpbkxpbWl0ICAgICAgICAgICAgICAgPSAyMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggTmF0aXZlTW9uaXRvclRpbWVvdXQgICAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIE5lZWRzRGVvcHRTdXNwZW5kICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBOZXZlckFjdEFzU2VydmVyQ2xhc3NNYWNoaW5lICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgTmV2ZXJUZW51cmUgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IE5ld1JhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBOZXdTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDQ4NTc2ICAgICAgICAgIHtwcm9kdWN0fQordWludHggTmV3U2l6ZVRocmVhZEluY3JlYXNlICAgICAgICAgICAgICAgID0gNDA5NiAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBpbnR4IE5tZXRob2RTd2VlcENoZWNrSW50ZXJ2YWwgICAgICAgICAgICA9IDUgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBObWV0aG9kU3dlZXBGcmFjdGlvbiAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggTm9kZUxpbWl0RnVkZ2VGYWN0b3IgICAgICAgICAgICAgICAgID0gMTAwMCAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBpbnR4IE51bWJlck9mTG9vcEluc3RyVG9BbGlnbiAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBPYmpMaWZlVHJhY2tpbmcgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggT2JqTGlmZVRyYWNraW5nQ3B1RnJhY3Rpb24gICAgICAgICAgID0gMTAwICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IE9iakxpZmV0aW1lSGlzdG9CdWNrZXRDb3VudCAgICAgICAgICA9IDEwMjQgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBPYmpMaWZldGltZUhpc3RvRXhwb3J0VmFyUGVyQnVja2V0ICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggT2xkUExBQlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAyNCAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IE9sZFBMQUJXZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICA9IDUwICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBPbGRTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTk0MzA0ICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgT21pdFN0YWNrVHJhY2VJbkZhc3RUaHJvdyAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KK2Njc3RybGlzdCBPbkVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorY2NzdHJsaXN0IE9uT3V0T2ZNZW1vcnlFcnJvciAgICAgICAgICAgICAgICAgICA9ICAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBPblN0YWNrUmVwbGFjZVBlcmNlbnRhZ2UgICAgICAgICAgICAgPSAxNDAgICAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgT3B0aW1pemVGaWxsICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIE9wdGltaXplTWV0aG9kSGFuZGxlcyAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBPcHRpbWl6ZVN0cmluZ0NvbmNhdCAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGJvb2wgT3B0b0J1bmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7QzIgcGQgcHJvZHVjdH0KKyBpbnR4IE9wdG9Mb29wQWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICA9IDE2ICAgICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBPcHRvU2NoZWR1bGluZyAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtDMiBwZCBwcm9kdWN0fQordWludHggUExBQldlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFBTQ2h1bmtMYXJnZUFycmF5cyAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQU1Jlc2l6ZUJ5RnJlZVJhdGlvICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUFNSZXNpemVCeUZyZWVSYXRpb1dpdGhTeXN0ZW1HQyAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFBhckdDQXJyYXlTY2FuQ2h1bmsgICAgICAgICAgICAgICAgICA9IDUwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQYXJHQ0NhcmRzUGVyU3RyaWRlQ2h1bmsgICAgICAgICAgICAgPSAyNTYgICAgICAgICAgICAgIHtkaWFnbm9zdGljfQordWludHggUGFyR0NEZXNpcmVkT2Jqc0Zyb21PdmVyZmxvd0xpc3QgICAgID0gMjAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFBhckdDU3RyaWRlc1BlclRocmVhZCAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBQYXJHQ1RyaW1PdmVyZmxvdyAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUGFyR0NVc2VMb2NhbE92ZXJmbG93ICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFBhcmFsbGVsR0NCdWZmZXJXYXN0ZVBjdCAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQYXJhbGxlbEdDUmV0YWluUExBQiAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggUGFyYWxsZWxHQ1RocmVhZHMgICAgICAgICAgICAgICAgICAgOj0gMTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFBhcmFsbGVsR0NWZXJib3NlICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBQYXJhbGxlbE9sZERlYWRXb29kTGltaXRlck1lYW4gICAgICAgPSA1MCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggUGFyYWxsZWxPbGREZWFkV29vZExpbWl0ZXJTdGREZXYgICAgID0gODAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFBhcmFsbGVsUmVmUHJvY0JhbGFuY2luZ0VuYWJsZWQgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQYXJhbGxlbFJlZlByb2NFbmFibGVkICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUGFydGlhbFBlZWxBdFVuc2lnbmVkVGVzdHMgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFBhcnRpYWxQZWVsTG9vcCAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgaW50eCBQYXJ0aWFsUGVlbE5ld1BoaURlbHRhICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGJvb2wgUGF1c2VBdFN0YXJ0dXAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KK2Njc3RyIFBhdXNlQXRTdGFydHVwRmlsZSAgICAgICAgICAgICAgICAgICA9ICB7ZGlhZ25vc3RpY30KK3VpbnR4IFBhdXNlUGFkZGluZyAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQZXJCeXRlY29kZVJlY29tcGlsYXRpb25DdXRvZmYgICAgICAgPSAyMDAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggUGVyQnl0ZWNvZGVUcmFwTGltaXQgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFBlck1ldGhvZFJlY29tcGlsYXRpb25DdXRvZmYgICAgICAgICA9IDQwMCAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQZXJNZXRob2RUcmFwTGltaXQgICAgICAgICAgICAgICAgICAgPSAxMDAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUGVyZkFsbG93QXRFeGl0UmVnaXN0cmF0aW9uICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFBlcmZCeXBhc3NGaWxlU3lzdGVtQ2hlY2sgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQZXJmRGF0YU1lbW9yeVNpemUgICAgICAgICAgICAgICAgICAgPSAzMjc2OCAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggUGVyZkRhdGFTYW1wbGluZ0ludGVydmFsICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK2Njc3RyIFBlcmZEYXRhU2F2ZUZpbGUgICAgICAgICAgICAgICAgICAgICA9ICB7cHJvZHVjdH0KKyBib29sIFBlcmZEYXRhU2F2ZVRvRmlsZSAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQZXJmRGlzYWJsZVNoYXJlZE1lbSAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggUGVyZk1heFN0cmluZ0NvbnN0TGVuZ3RoICAgICAgICAgICAgID0gMTAyNCAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IFBlcm1HZW5QYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBQZXJtTWFya1N3ZWVwRGVhZFJhdGlvICAgICAgICAgICAgICAgPSAyMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggUGVybVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY3NzcyMTYgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIFBvc3RTcGluWWllbGQgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQcmVCbG9ja1NwaW4gICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggUHJlSW5mbGF0ZVNwaW4gICAgICAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIFByZVNwaW5ZaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmVmZXJJbnRlcnByZXRlck5hdGl2ZVN0dWJzICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGludHggUHJlZmV0Y2hDb3B5SW50ZXJ2YWxJbkJ5dGVzICAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFByZWZldGNoRmllbGRzQWhlYWQgICAgICAgICAgICAgICAgICA9IC0xICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQcmVmZXRjaFNjYW5JbnRlcnZhbEluQnl0ZXMgICAgICAgICAgPSAtMSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJlc2VydmVBbGxBbm5vdGF0aW9ucyAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IFByZXNlcnZlTWFya1N0YWNrU2l6ZSAgICAgICAgICAgICAgICA9IDEwMjQgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBQcmV0ZW51cmVTaXplVGhyZXNob2xkICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJpbnRBZGFwdGVySGFuZGxlcnMgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFByaW50QWRhcHRpdmVTaXplUG9saWN5ICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludEFzc2VtYmx5ICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorY2NzdHIgUHJpbnRBc3NlbWJseU9wdGlvbnMgICAgICAgICAgICAgICAgID0gIHtkaWFnbm9zdGljfQorIGJvb2wgUHJpbnRCaWFzZWRMb2NraW5nU3RhdGlzdGljcyAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFByaW50Q01TSW5pdGlhdGlvbkNhdXNlICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludENNU0luaXRpYXRpb25TdGF0aXN0aWNzICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggUHJpbnRDTVNTdGF0aXN0aWNzICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50Q2FyZFRhYmxlU3RhdHMgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludENsYXNzSGlzdG9ncmFtICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHttYW5hZ2VhYmxlfQorIGJvb2wgUHJpbnRDbGFzc0hpc3RvZ3JhbUFmdGVyRnVsbEdDICAgICAgID0gZmFsc2UgICAgICAgICAgICB7bWFuYWdlYWJsZX0KKyBib29sIFByaW50Q2xhc3NIaXN0b2dyYW1CZWZvcmVGdWxsR0MgICAgICA9IGZhbHNlICAgICAgICAgICAge21hbmFnZWFibGV9CisgYm9vbCBQcmludENvbW1hbmRMaW5lRmxhZ3MgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJpbnRDb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50Q29tcHJlc3NlZE9vcHNNb2RlICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBQcmludENvbmN1cnJlbnRMb2NrcyAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHttYW5hZ2VhYmxlfQorIGJvb2wgUHJpbnREVHJhY2VET0YgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBpbnR4IFByaW50RkxTQ2Vuc3VzICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQcmludEZMU1N0YXRpc3RpY3MgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJpbnRGbGFnc0ZpbmFsICAgICAgICAgICAgICAgICAgICAgOj0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50RmxhZ3NJbml0aWFsICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludEdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHttYW5hZ2VhYmxlfQorIGJvb2wgUHJpbnRHQ0FwcGxpY2F0aW9uQ29uY3VycmVudFRpbWUgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50R0NBcHBsaWNhdGlvblN0b3BwZWRUaW1lICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludEdDRGF0ZVN0YW1wcyAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHttYW5hZ2VhYmxlfQorIGJvb2wgUHJpbnRHQ0RldGFpbHMgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7bWFuYWdlYWJsZX0KKyBib29sIFByaW50R0NUYXNrVGltZVN0YW1wcyAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludEdDVGltZVN0YW1wcyAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHttYW5hZ2VhYmxlfQorIGJvb2wgUHJpbnRIZWFwQXRHQyAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdCByd30KKyBib29sIFByaW50SGVhcEF0R0NFeHRlbmRlZCAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3Qgcnd9CisgYm9vbCBQcmludEhlYXBBdFNJR0JSRUFLICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJpbnRJbmxpbmluZyAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFByaW50SW50ZXJwcmV0ZXIgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBQcmludEludHJpbnNpY3MgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgUHJpbnRKTklHQ1N0YWxscyAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50Sk5JUmVzb2x2aW5nICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludE5NZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgUHJpbnROYXRpdmVOTWV0aG9kcyAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFByaW50T2xkUExBQiAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludE9vcEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJpbnRQTEFCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50UGFyYWxsZWxPbGRHQ1BoYXNlVGltZXMgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludFByZWNpc2VCaWFzZWRMb2NraW5nU3RhdGlzdGljcyAgPSBmYWxzZSAgICAgICAgICAgIHtDMiBkaWFnbm9zdGljfQorIGJvb2wgUHJpbnRQcm9tb3Rpb25GYWlsdXJlICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50UmVmZXJlbmNlR0MgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludFJldmlzaXRTdGF0cyAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJpbnRTYWZlcG9pbnRTdGF0aXN0aWNzICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFByaW50U2FmZXBvaW50U3RhdGlzdGljc0NvdW50ICAgICAgICA9IDMwMCAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQcmludFNhZmVwb2ludFN0YXRpc3RpY3NUaW1lb3V0ICAgICAgPSAtMSAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJpbnRTaGFyZWRTcGFjZXMgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50U2lnbmF0dXJlSGFuZGxlcnMgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBQcmludFN0dWJDb2RlICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgUHJpbnRUTEFCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByaW50VGVudXJpbmdEaXN0cmlidXRpb24gICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcmludFZNT3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJpbnRWTVFXYWl0VGltZSAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IFByb2Nlc3NEaXN0cmlidXRpb25TdHJpZGUgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcm9maWxlSW50ZXJwcmV0ZXIgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgUHJvZmlsZUludGVydmFscyAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFByb2ZpbGVJbnRlcnZhbHNUaWNrcyAgICAgICAgICAgICAgICA9IDEwMCAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBQcm9maWxlTWF0dXJpdHlQZXJjZW50YWdlICAgICAgICAgICAgPSAyMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUHJvZmlsZVZNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFByb2ZpbGVyUHJpbnRCeXRlQ29kZVN0YXRpc3RpY3MgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBQcm9maWxlclJlY29yZFBDICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggUHJvbW90ZWRQYWRkaW5nICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFF1ZXVlZEFsbG9jYXRpb25XYXJuaW5nQ291bnQgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBSYW1MaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUmFuZ2VDaGVja0VsaW1pbmF0aW9uICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFJlYWRQcmVmZXRjaEluc3RyICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBSZWFkU3Bpbkl0ZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgPSAxMDAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUmVhc3NvY2lhdGVJbnZhcmlhbnRzICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFJlZHVjZUJ1bGtaZXJvaW5nICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBSZWR1Y2VGaWVsZFplcm9pbmcgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGJvb2wgUmVkdWNlSW5pdGlhbENhcmRNYXJrcyAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFJlZHVjZVNpZ25hbFVzYWdlICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBSZWZEaXNjb3ZlcnlQb2xpY3kgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUmVmbGVjdGlvbldyYXBSZXNvbHV0aW9uRXJyb3JzICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFJlZ2lzdGVyRmluYWxpemVyc0F0SW5pdCAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBSZWxheEFjY2Vzc0NvbnRyb2xDaGVjayAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUmVxdWlyZVNoYXJlZFNwYWNlcyAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IFJlc2VydmVkQ29kZUNhY2hlU2l6ZSAgICAgICAgICAgICAgICA9IDUwMzMxNjQ4ICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBSZXNpemVPbGRQTEFCICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUmVzaXplUExBQiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFJlc2l6ZVRMQUIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBSZXN0b3JlTVhDU1JPbkpOSUNhbGxzICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgUmV3cml0ZUJ5dGVjb2RlcyAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIFJld3JpdGVGcmVxdWVudFBhaXJzICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgaW50eCBTYWZlcG9pbnRQb2xsT2Zmc2V0ICAgICAgICAgICAgICAgICAgPSAyNTYgICAgICAgICAgICAgIHtDMSBwZCBwcm9kdWN0fQorIGludHggU2FmZXBvaW50U3BpbkJlZm9yZVlpZWxkICAgICAgICAgICAgID0gMjAwMCAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFNhZmVwb2ludFRpbWVvdXQgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBTYWZlcG9pbnRUaW1lb3V0RGVsYXkgICAgICAgICAgICAgICAgPSAxMDAwMCAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgU2NhdmVuZ2VCZWZvcmVGdWxsR0MgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFNjYXZlbmdlUm9vdHNJbkNvZGUgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge2RpYWdub3N0aWN9CisgaW50eCBTZWxmRGVzdHJ1Y3RUaW1lciAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgU2VyaWFsaXplVk1PdXRwdXQgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7ZGlhZ25vc3RpY30KK3VpbnR4IFNoYXJlZER1bW15QmxvY2tTaXplICAgICAgICAgICAgICAgICA9IDUzNjg3MDkxMiAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBTaGFyZWRNaXNjQ29kZVNpemUgICAgICAgICAgICAgICAgICAgPSA0MTk0MzA0ICAgICAgICAgIHtwcm9kdWN0fQordWludHggU2hhcmVkTWlzY0RhdGFTaXplICAgICAgICAgICAgICAgICAgID0gNDE5NDMwNCAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFNoYXJlZE9wdGltaXplQ29sZFN0YXJ0ICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge2RpYWdub3N0aWN9Cit1aW50eCBTaGFyZWRSZWFkT25seVNpemUgICAgICAgICAgICAgICAgICAgPSAxMDQ4NTc2MCAgICAgICAgIHtwcm9kdWN0fQordWludHggU2hhcmVkUmVhZFdyaXRlU2l6ZSAgICAgICAgICAgICAgICAgID0gMTI1ODI5MTIgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFNoYXJlZFNraXBWZXJpZnkgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBTaG93TWVzc2FnZUJveE9uRXJyb3IgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggU29mdFJlZkxSVVBvbGljeU1TUGVyTUIgICAgICAgICAgICAgID0gMTAwMCAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFNwbGl0SWZCbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBTdGFja1JlZFBhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGludHggU3RhY2tTaGFkb3dQYWdlcyAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIFN0YWNrVHJhY2VJblRocm93YWJsZSAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBTdGFja1llbGxvd1BhZ2VzICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgU3RhcnRBdHRhY2hMaXN0ZW5lciAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFN0YXJ0U3VzcGVuZGVkICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBTdGFydmF0aW9uTW9uaXRvckludGVydmFsICAgICAgICAgICAgPSAyMDAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgU3RyZXNzTGRjUmV3cml0ZSAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFN0cmVzc1RpZXJlZFJ1bnRpbWUgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBTdXBwcmVzc0ZhdGFsRXJyb3JNZXNzYWdlICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggU3Vydml2b3JQYWRkaW5nICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFN1cnZpdm9yUmF0aW8gICAgICAgICAgICAgICAgICAgICAgICA9IDggICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBTdXNwZW5kUmV0cnlDb3VudCAgICAgICAgICAgICAgICAgICAgPSA1MCAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggU3VzcGVuZFJldHJ5RGVsYXkgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFN5bmNGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9CitjY3N0ciBTeW5jS25vYnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAge3Byb2R1Y3R9CisgaW50eCBTeW5jVmVyYm9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggVExBQkFsbG9jYXRpb25XZWlnaHQgICAgICAgICAgICAgICAgID0gMzUgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IFRMQUJSZWZpbGxXYXN0ZUZyYWN0aW9uICAgICAgICAgICAgICA9IDY0ICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBUTEFCU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVExBQlN0YXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IFRMQUJXYXN0ZUluY3JlbWVudCAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBUTEFCV2FzdGVUYXJnZXRQZXJjZW50ICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggVGFyZ2V0UExBQldhc3RlUGN0ICAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFRhcmdldFN1cnZpdm9yUmF0aW8gICAgICAgICAgICAgICAgICA9IDUwICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBUZW51cmVkR2VuZXJhdGlvblNpemVJbmNyZW1lbnQgICAgICAgPSAyMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggVGVudXJlZEdlbmVyYXRpb25TaXplU3VwcGxlbWVudCAgICAgID0gODAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IFRlbnVyZWRHZW5lcmF0aW9uU2l6ZVN1cHBsZW1lbnREZWNheSAgPSAyICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggVGhyZWFkUHJpb3JpdHlQb2xpY3kgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFRocmVhZFByaW9yaXR5VmVyYm9zZSAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBUaHJlYWRTYWZldHlNYXJnaW4gICAgICAgICAgICAgICAgICAgPSA1MjQyODgwMCAgICAgICAgIHtwcm9kdWN0fQorIGludHggVGhyZWFkU3RhY2tTaXplICAgICAgICAgICAgICAgICAgICAgID0gMzIwICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KK3VpbnR4IFRocmVzaG9sZFRvbGVyYW5jZSAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBUaWVyMUJ5dGVjb2RlTGltaXQgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggVGllcjFGcmVxSW5saW5lU2l6ZSAgICAgICAgICAgICAgICAgID0gMzUgICAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBpbnR4IFRpZXIxSW5saW5lICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgaW50eCBUaWVyMUxvb3BPcHRzQ291bnQgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGludHggVGllcjFNYXhJbmxpbmVTaXplICAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFRpZXIxT3B0aW1pemVWaXJ0dWFsQ2FsbFByb2ZpbGluZyAgICA9IHRydWUgICAgICAgICAgICAge0MxIHByb2R1Y3R9CisgYm9vbCBUaWVyMVByb2ZpbGVCcmFuY2hlcyAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtDMSBwcm9kdWN0fQorIGJvb2wgVGllcjFQcm9maWxlQ2FsbHMgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzEgcHJvZHVjdH0KKyBib29sIFRpZXIxUHJvZmlsZUNoZWNrY2FzdHMgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge0MxIHByb2R1Y3R9CisgYm9vbCBUaWVyMVByb2ZpbGVJbmxpbmVkQ2FsbHMgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtDMSBwcm9kdWN0fQorIGJvb2wgVGllcjFQcm9maWxlVmlydHVhbENhbGxzICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzEgcHJvZHVjdH0KKyBib29sIFRpZXIxVXBkYXRlTWV0aG9kRGF0YSAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBUaWVyMkJhY2tFZGdlVGhyZXNob2xkICAgICAgICAgICAgICAgPSAxMDAwMDAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGludHggVGllcjJDb21waWxlVGhyZXNob2xkICAgICAgICAgICAgICAgID0gMTAwMDAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBpbnR4IFRpZXIzQmFja0VkZ2VUaHJlc2hvbGQgICAgICAgICAgICAgICA9IDEwMDAwMCAgICAgICAgICAge3BkIHByb2R1Y3R9CisgaW50eCBUaWVyM0NvbXBpbGVUaHJlc2hvbGQgICAgICAgICAgICAgICAgPSAyMDAwMCAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGludHggVGllcjRCYWNrRWRnZVRocmVzaG9sZCAgICAgICAgICAgICAgID0gMTAwMDAwICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBpbnR4IFRpZXI0Q29tcGlsZVRocmVzaG9sZCAgICAgICAgICAgICAgICA9IDQwMDAwICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBUaWVyZWRDb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgVGltZUxpbmVhclNjYW4gICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7QzEgcHJvZHVjdH0KKyBib29sIFRyYWNlQmlhc2VkTG9ja2luZyAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBUcmFjZUNsYXNzTG9hZGluZyAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0IHJ3fQorIGJvb2wgVHJhY2VDbGFzc0xvYWRpbmdQcmVvcmRlciAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFRyYWNlQ2xhc3NSZXNvbHV0aW9uICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBUcmFjZUNsYXNzVW5sb2FkaW5nICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0IHJ3fQorIGJvb2wgVHJhY2VDb21waWxlVHJpZ2dlcmVkICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFRyYWNlR2VuMFRpbWUgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBUcmFjZUdlbjFUaW1lICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorY2NzdHIgVHJhY2VKVk1USSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIHtwcm9kdWN0fQorIGJvb2wgVHJhY2VKVk1USU9iamVjdFRhZ2dpbmcgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFRyYWNlTG9hZGVyQ29uc3RyYWludHMgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3Qgcnd9CisgYm9vbCBUcmFjZU1vbml0b3JJbmZsYXRpb24gICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVHJhY2VOTWV0aG9kSW5zdGFsbHMgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFRyYWNlT1NSQnJlYWtwb2ludCAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBUcmFjZVBhcmFsbGVsT2xkR0NUYXNrcyAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggVHJhY2VSZWRlZmluZUNsYXNzZXMgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFRyYWNlUmVkdW5kYW50Q29tcGlsZXMgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBUcmFjZVNhZmVwb2ludENsZWFudXBUaW1lICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVHJhY2VTdXBlcldvcmQgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFRyYWNlU3VzcGVuZFdhaXRGYWlsdXJlcyAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBUcmFjZVRyaWdnZXJzICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGludHggVHJhY2tlZEluaXRpYWxpemF0aW9uTGltaXQgICAgICAgICAgID0gNTAgICAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBpbnR4IFR5cGVQcm9maWxlTWFqb3JSZWNlaXZlclBlcmNlbnQgICAgICA9IDkwICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgaW50eCBUeXBlUHJvZmlsZVdpZHRoICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggVW5ndWFyZE9uRXhlY3V0aW9uVmlvbGF0aW9uICAgICAgICAgID0gMCAgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVubG9ja0RpYWdub3N0aWNWTU9wdGlvbnMgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBVbnN5bmNsb2FkQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgVXNlNDg2SW5zdHJzT25seSAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUFkYXB0aXZlR0NCb3VuZGFyeSAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VBZGFwdGl2ZUdlbmVyYXRpb25TaXplUG9saWN5QXRNYWpvckNvbGxlY3Rpb24gID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUFkYXB0aXZlR2VuZXJhdGlvblNpemVQb2xpY3lBdE1pbm9yQ29sbGVjdGlvbiAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlQWRhcHRpdmVOVU1BQ2h1bmtTaXppbmcgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUFkYXB0aXZlU2l6ZURlY2F5TWFqb3JHQ0Nvc3QgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VBZGFwdGl2ZVNpemVQb2xpY3kgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlQWRhcHRpdmVTaXplUG9saWN5Rm9vdHByaW50R29hbCAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUFkYXB0aXZlU2l6ZVBvbGljeVdpdGhTeXN0ZW1HQyAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VBZGRyZXNzTm9wICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlQWx0U2lncyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUF1dG9HQ1NlbGVjdFBvbGljeSAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VCaWFzZWRMb2NraW5nICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlQmltb3JwaGljSW5saW5pbmcgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFVzZUJvdW5kVGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VDTVNCZXN0Rml0ICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlQ01TQ29sbGVjdGlvblBhc3NpbmcgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUNNU0NvbXBhY3RBdEZ1bGxDb2xsZWN0aW9uICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VDTVNJbml0aWF0aW5nT2NjdXBhbmN5T25seSAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlQ29kZUNhY2hlRmx1c2hpbmcgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUNvbXBpbGVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VDb21waWxlclNhZmVwb2ludHMgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlQ29uY01hcmtTd2VlcEdDICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUNvdW50TGVhZGluZ1plcm9zSW5zdHJ1Y3Rpb24gICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VDb3VudGVyRGVjYXkgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlRGl2TW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFVzZUZQVUZvclNwaWxsaW5nICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBVc2VGYXN0QWNjZXNzb3JNZXRob2RzICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlRmFzdEVtcHR5TWV0aG9kcyAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUZhc3RKTklBY2Nlc3NvcnMgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VHMUdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlR0NPdmVyaGVhZExpbWl0ICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZUdDVGFza0FmZmluaXR5ICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VIZWF2eU1vbml0b3JzICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlSW5jRGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFVzZUlubGluZUNhY2hlcyAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VJbnRlcnByZXRlciAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlSnVtcFRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFVzZUxXUFN5bmNocm9uaXphdGlvbiAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VMYXJnZVBhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgVXNlTGFyZ2VQYWdlc0luZGl2aWR1YWxBbGxvY2F0aW9uICAgID0gZmFsc2UgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIFVzZUxpbnV4UG9zaXhUaHJlYWRDUFVDbG9ja3MgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VMb29wQ291bnRlciAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlTG9vcFByZWRpY2F0ZSAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFVzZU1heGltdW1Db21wYWN0aW9uT25TeXN0ZW1HQyAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VNZW1iYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlTlVNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZU5ld0NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBVc2VOZXdDb2RlMiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgVXNlTmV3Q29kZTMgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFVzZU5ld0ZlYXR1cmUxICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge0MxIHByb2R1Y3R9CisgYm9vbCBVc2VOZXdGZWF0dXJlMiAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtDMSBwcm9kdWN0fQorIGJvb2wgVXNlTmV3RmVhdHVyZTMgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7QzEgcHJvZHVjdH0KKyBib29sIFVzZU5ld0ZlYXR1cmU0ICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge0MxIHByb2R1Y3R9CisgYm9vbCBVc2VOZXdMb25nTFNoaWZ0ICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlTmlhZ2FyYUluc3RycyAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZU9TRXJyb3JSZXBvcnRpbmcgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBVc2VPbGRJbmxpbmluZyAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGJvb2wgVXNlT25TdGFja1JlcGxhY2VtZW50ICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIFVzZU9ubHlJbmxpbmVkQmltb3JwaGljICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBVc2VPcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlT3B0b0JpYXNJbmxpbmluZyAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7QzIgcHJvZHVjdH0KKyBib29sIFVzZVBTQWRhcHRpdmVTdXJ2aXZvclNpemVQb2xpY3kgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VQYXJOZXdHQyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlUGFyYWxsZWxEZW5zZVByZWZpeFVwZGF0ZSAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZVBhcmFsbGVsR0MgICAgICAgICAgICAgICAgICAgICAgIDo9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VQYXJhbGxlbE9sZEdDICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlUGFyYWxsZWxPbGRHQ0NvbXBhY3RpbmcgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZVBhcmFsbGVsT2xkR0NEZW5zZVByZWZpeCAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VQZXJmRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlUG9wQ291bnRJbnN0cnVjdGlvbiAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFVzZVNTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VTU0U0MkludHJpbnNpY3MgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlU2VwYXJhdGVWU3BhY2VzSW5Zb3VuZ0dlbiAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZVNlcmlhbEdDICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VTaGFyZWRTcGFjZXMgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlU2lnbmFsQ2hhaW5pbmcgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZVNwaW5uaW5nICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VTcGxpdFZlcmlmaWVyICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlU3RvcmVJbW1JMTYgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZVN0cmluZ0NhY2hlICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VTdXBlcldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtDMiBwcm9kdWN0fQorIGJvb2wgVXNlVExBQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cGQgcHJvZHVjdH0KKyBib29sIFVzZVRocmVhZFByaW9yaXRpZXMgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgYm9vbCBVc2VUeXBlUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlVW5hbGlnbmVkTG9hZFN0b3JlcyAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZVZNSW50ZXJydXB0aWJsZUlPICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VWZWN0b3JlZEV4Y2VwdGlvbnMgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fQorIGJvb2wgVXNlWE1NRm9yQXJyYXlDb3B5ICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZVhtbUkyRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBVc2VYbW1JMkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgVXNlWG1tTG9hZEFuZENsZWFyVXBwZXIgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFVzZVhtbVJlZ1RvUmVnTW92ZUFsbCAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICAge3Byb2R1Y3R9CisgYm9vbCBWTVRocmVhZEhpbnROb1ByZWVtcHQgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtwcm9kdWN0fQorIGludHggVk1UaHJlYWRQcmlvcml0eSAgICAgICAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IFZNVGhyZWFkU3RhY2tTaXplICAgICAgICAgICAgICAgICAgICA9IDUxMiAgICAgICAgICAgICAge3BkIHByb2R1Y3R9CisgaW50eCBWYWx1ZU1hcEluaXRpYWxTaXplICAgICAgICAgICAgICAgICAgPSAxMSAgICAgICAgICAgICAgIHtDMSBwcm9kdWN0fQorIGludHggVmFsdWVNYXBNYXhMb29wU2l6ZSAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAgICB7QzEgcHJvZHVjdH0KKyBpbnR4IFZhbHVlU2VhcmNoTGltaXQgICAgICAgICAgICAgICAgICAgICA9IDEwMDAgICAgICAgICAgICAge0MyIHByb2R1Y3R9CisgYm9vbCBWZXJpZnlBZnRlckdDICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgVmVyaWZ5QmVmb3JlRXhpdCAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBib29sIFZlcmlmeUJlZm9yZUdDICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBWZXJpZnlCZWZvcmVJdGVyYXRpb24gICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgVmVyaWZ5RHVyaW5nR0MgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBpbnR4IFZlcmlmeUdDTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge2RpYWdub3N0aWN9Cit1aW50eCBWZXJpZnlHQ1N0YXJ0QXQgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgVmVyaWZ5TWVyZ2VkQ1BCeXRlY29kZXMgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgICB7cHJvZHVjdH0KKyBib29sIFZlcmlmeU1ldGhvZEhhbmRsZXMgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICAge2RpYWdub3N0aWN9CisgYm9vbCBWZXJpZnlPYmplY3RTdGFydEFycmF5ICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAgIHtkaWFnbm9zdGljfQorIGJvb2wgVmVyaWZ5UmVtZW1iZXJlZFNldHMgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7ZGlhZ25vc3RpY30KKyBpbnR4IFdvcmtBcm91bmROUFRMVGltZWRXYWl0SGFuZyAgICAgICAgICA9IDEgICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBZb3VuZ0dlbmVyYXRpb25TaXplSW5jcmVtZW50ICAgICAgICAgPSAyMCAgICAgICAgICAgICAgIHtwcm9kdWN0fQordWludHggWW91bmdHZW5lcmF0aW9uU2l6ZVN1cHBsZW1lbnQgICAgICAgID0gODAgICAgICAgICAgICAgICB7cHJvZHVjdH0KK3VpbnR4IFlvdW5nR2VuZXJhdGlvblNpemVTdXBwbGVtZW50RGVjYXkgICA9IDggICAgICAgICAgICAgICAge3Byb2R1Y3R9Cit1aW50eCBZb3VuZ1BMQUJTaXplICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDk2ICAgICAgICAgICAgIHtwcm9kdWN0fQorIGJvb2wgWmVyb1RMQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgICB7cHJvZHVjdH0KKyBpbnR4IGhhc2hDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICAge3Byb2R1Y3R9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2FsaXBlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9qZGs2LWdjLnR4dCBiL2NhbGlwZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvamRrNi1nYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5ZDA3YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbGlwZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvamRrNi1nYy50eHQKQEAgLTAsMCArMSwyMDAgQEAKK1tHQyA5ODdLLT4zODRLKDYyODQ4SyksIDAuMDAxMjMyMCBzZWNzXQorW0Z1bGwgR0MgMzg0Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTQ1NTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDQ1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDk1ODAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDU5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDgyNDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNTcwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjMyNTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzU0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDgyMTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzcwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDk0MzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDI1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc3MDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzU1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcwOTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzg1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcyMjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzgzMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDczMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDIzMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcxMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzE0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDczNjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzU0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcyMTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzYxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcyODAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDY0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDY5MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDcwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcwODAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzIyMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcwMjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDEwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc4NjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDM0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDczMTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzk4MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc0NDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDU0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcyNjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzM0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcxMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzQyMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDY4MzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzU2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcwMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzQ0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDczNDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDk4MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDg0NDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzUwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDgwMDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDA5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDgxNDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDk2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDgxMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzE0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc5OTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzM1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDg0NjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjE5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc3MDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzIwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc2OTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzIyMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc0OTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzIxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc1OTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjU2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcyNTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzU2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc0MzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjg2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDczMjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzQ3MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDczNzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzAyMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcxNDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjY3MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc1MTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzUxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcxNDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjY4MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcxMDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjM5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc4MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjc4MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc0ODAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjU5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDg5NTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDEwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc1ODAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzYzMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDcyMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzIwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc0OTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMjk0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDczMDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAxNjY2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTI1MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzA5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTE3MTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzIyMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTAyNzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzM5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDg0NTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzgzMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNDc4NzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzgwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTE3NTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDM4MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTI5MDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzU1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTMzNTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzA5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTMwNjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzAzMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTI3MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzIyMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTMyMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzYxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTM5NzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzU5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTM3NDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzYxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTQxMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDc1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTM1NjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzUxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTMxNDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDM1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTMyNjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDAxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTQ0MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDMwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNTM3NDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzYxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNzAwNjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzI0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjc4MzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzUwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjgwMzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzI2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjY4NTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDYwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjc1MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzU1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjcwMTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDU5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjk1NTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDQ1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjg3NzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNTgzMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjc0MTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDg1MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjc2NjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDI3MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjc3NzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDE0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjcwOTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDM2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjc3NjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNTc0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjcwMDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDczMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjY4MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzQ5MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjcwMTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDYxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjc3MzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNTU2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjc3MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDI0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjYzMDAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNTIwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjk5MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDI0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNzY1NTAgc2Vjc10KK1tHQyA2MTdLLT4zMDRLKDYyODQ4SyksIDAuMDAwNDk2MCBzZWNzXQorW0Z1bGwgR0MgMzA0Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNzY4NDAgc2Vjc10KK1tHQyA2MTdLLT4zMDRLKDYyODQ4SyksIDAuMDAwMzg3MCBzZWNzXQorW0Z1bGwgR0MgMzA0Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNzcwODAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDE0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNzM0MTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDY0MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjY3MTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDgzMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjYzOTAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNjk3MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjYwNzAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzUwMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjU0NjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwNDE2MCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjU0MjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzcxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjYwNjAgc2Vjc10KK1tHQyAyODhLLT4yODhLKDYyODQ4SyksIDAuMDAwMzUxMCBzZWNzXQorW0Z1bGwgR0MgMjg4Sy0+Mjg4Syg2Mjg0OEspLCAwLjAwNjU0MjAgc2Vjc10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL2pkazctY29tcGlsYXRpb24udHh0IGIvY2FsaXBlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9qZGs3LWNvbXBpbGF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmFjYjA1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9qZGs3LWNvbXBpbGF0aW9uLnR4dApAQCAtMCwwICsxLDM1MiBAQAorICAgICA5MSAgICAxICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6Omhhc2hDb2RlICg2NyBieXRlcykKKyAgICAxMDYgICAgMiAgICBiICAgICAgICBzdW4ubmlvLmNzLlVURl84JERlY29kZXI6OmRlY29kZSAoNjQwIGJ5dGVzKQorICAgIDEzMCAgICAzICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6Omxhc3RJbmRleE9mICg2OCBieXRlcykKKyAgICAxMzIgICAgNCAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjppbmRleE9mICg4NyBieXRlcykKKyAgICAxMzYgICAgNSAgICBiICAgICAgICBqYXZhLmlvLlVuaXhGaWxlU3lzdGVtOjpub3JtYWxpemUgKDc1IGJ5dGVzKQorICAgIDEzOCAgICAxICUgIGIgICAgICAgIGphdmEuaW8uVW5peEZpbGVTeXN0ZW06Om5vcm1hbGl6ZSBAIDEwICg3NSBieXRlcykKKyAgICAxNDIgICAgNiAgICBiICAgICAgICBzdW4ubmlvLmNzLlVURl84JEVuY29kZXI6OmVuY29kZSAoMzYxIGJ5dGVzKQorICAgIDE0OSAgICAyICUgIGIgICAgICAgIHN1bi5uaW8uY3MuVVRGXzgkRW5jb2Rlcjo6ZW5jb2RlIEAgMjAgKDM2MSBieXRlcykKKyAgICAxNjIgICAgMiAgICAgICAgICAgICBzdW4ubmlvLmNzLlVURl84JERlY29kZXI6OmRlY29kZSAoNjQwIGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgICAxNjUgICAgNyAgICBiICAgICAgICBzdW4ubmlvLmNzLlVURl84JERlY29kZXI6OmRlY29kZSAoNjQwIGJ5dGVzKQorICAgIDE4NSAgICA4ICAgIGIgICAgICAgIHN1bi5uZXQud3d3LlBhcnNlVXRpbDo6ZW5jb2RlUGF0aCAoMzM2IGJ5dGVzKQorICAgIDIwMCAgICA5ICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OmluZGV4T2YgKDE2NiBieXRlcykKKyAgICAyMzYgICAxMCAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjplcXVhbHMgKDg4IGJ5dGVzKQorICAgIDI1MyAgIDExICAgIGIgICAgICAgIGphdmEudXRpbC5BcnJheXM6OmJpbmFyeVNlYXJjaDAgKDcyIGJ5dGVzKQorICAgIDI1NSAgIDEyICAgIGIgICAgICAgIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhck1hdGNoZXIkMTA6Om1hdGNoZXMgKDE3IGJ5dGVzKQorICAgIDI1NiAgIDEzICAgIGIgICAgICAgIGphdmEudXRpbC5BcnJheXM6OmJpbmFyeVNlYXJjaCAoOSBieXRlcykKKyAgICAyNTcgICAgMyAlICBiICAgICAgICBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJNYXRjaGVyOjpzZXRCaXRzIEAgMyAoMjggYnl0ZXMpCittYWRlIG5vdCBjb21waWxhYmxlICBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJNYXRjaGVyOjptYXRjaGVzCisgICAgMjYzICAgMTQgICAgYiAgICAgICAgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyTWF0Y2hlcjo6c2V0Qml0cyAoMjggYnl0ZXMpCisgICAgMzYzICAgMTUgICAgYiAgICAgICAgamF2YS5sYW5nLk9iamVjdDo6PGluaXQ+ICgxIGJ5dGVzKQorICAgIDM2NSAgIDE2ICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OmNoYXJBdCAoMzMgYnl0ZXMpCisgICAgNDgzICAgMTcgICAgYiAgICAgICAgamF2YS5sYW5nLlN0cmluZzo6bGVuZ3RoICg1IGJ5dGVzKQorICAgIDQ4NyAgIDE4ICAgICBuICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZTo6Z2V0RW50cnlCeXRlcyAoMCBieXRlcykgICAoc3RhdGljKQorICAgIDUyNCAgIDE5ICAgIGIgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZTo6ZW5zdXJlT3BlbiAoMzcgYnl0ZXMpCisgICAgNTI1ICAgMjAgICAgYiAgICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjphY2Nlc3MkNDAwICg1IGJ5dGVzKQorICAgIDUyNyAgIDIxICAgIGIgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZTo6YWNjZXNzJDIwMCAoNSBieXRlcykKKyAgICA1MjcgICAyMiAgICBiICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmFjY2VzcyQzMDAgKDUgYnl0ZXMpCisgICAgNTM0ICAgMjMgICAgIG4gICAgICAgamF2YS5sYW5nLlN5c3RlbTo6YXJyYXljb3B5ICgwIGJ5dGVzKSAgIChzdGF0aWMpCisgICAgNTUwICAgMjQgICAgYiAgICAgICAgamF2YS5sYW5nLk1hdGg6Om1pbiAoMTEgYnl0ZXMpCisgICAgNTU3ICAgMjUgICAgYiAgICAgICAgamF2YS51dGlsLkhhc2hNYXA6OmluZGV4Rm9yICg2IGJ5dGVzKQorICAgIDU1OSAgIDI2ICAgIGIgICAgICAgIGphdmEudXRpbC5IYXNoTWFwOjpoYXNoICgyMyBieXRlcykKKyAgICA1NjEgICAyNyAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjo8aW5pdD4gKDIwIGJ5dGVzKQorICAgIDU2MyAgIDI4ICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnN1YnN0cmluZyAoODMgYnl0ZXMpCisgICAgNTY2ICAgMjkgICAgYiAgICAgICAgamF2YS51dGlsLkhhc2hNYXA6OmdldCAoNzkgYnl0ZXMpCisgICAgNTY5ICAgMzAgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5czo6Y29weU9mUmFuZ2UgKDYzIGJ5dGVzKQorICAgIDU3MyAgIDMxICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6Ojxpbml0PiAoNzIgYnl0ZXMpCisgICAgNTc3ICAgMzIgICAgYiAgICAgICAgamF2YS5sYW5nLlN0cmluZzo6bGFzdEluZGV4T2YgKDEyIGJ5dGVzKQorICAgIDU4OCAgIDMzICAgICBuICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZTo6Z2V0RW50cnlTaXplICgwIGJ5dGVzKSAgIChzdGF0aWMpCisgICAgNTg4ICAgMzQgICAgYiAgICAgICAgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2Rlcjo6bWF4Q2hhcnNQZXJCeXRlICg1IGJ5dGVzKQorICAgIDU4OSAgIDM1ICAgICBuICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZTo6Z2V0RW50cnlDU2l6ZSAoMCBieXRlcykgICAoc3RhdGljKQorICAgIDU4OSAgIDM2ICAgICBuICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZTo6Z2V0RW50cnlNZXRob2QgKDAgYnl0ZXMpICAgKHN0YXRpYykKKyAgICA1ODkgICAzNyAgICAgbiAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmZyZWVFbnRyeSAoMCBieXRlcykgICAoc3RhdGljKQorICAgIDU5MCAgIDM4ICAgIGIgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZTo6Z2V0WmlwRW50cnkgKDI0NSBieXRlcykKK21hZGUgbm90IGNvbXBpbGFibGUgIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDo6bmV3RGVjb2RlcgorICAgIDYxMiAgIDM5ICAgIGIgICAgICAgIGphdmEudXRpbC56aXAuWmlwRW50cnk6Ojxpbml0PiAoNDMgYnl0ZXMpCisgICAgNjEzICAgNDAgICAgIG4gICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjpnZXRFbnRyeUZsYWcgKDAgYnl0ZXMpICAgKHN0YXRpYykKKyAgICA2MTMgICA0MSAgICBiICAgICAgICBqYXZhLnV0aWwuemlwLlppcENvZGVyOjppc1VURjggKDUgYnl0ZXMpCisgICAgNjEzICAgNDIgICAgIG4gICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjpnZXRFbnRyeVRpbWUgKDAgYnl0ZXMpICAgKHN0YXRpYykKKyAgICA2MTMgICA0MyAgICAgbiAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmdldEVudHJ5Q3JjICgwIGJ5dGVzKSAgIChzdGF0aWMpCisgICAgNjEzICAgNDQgICAgYiAgICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjphY2Nlc3MkMTAwMCAoNiBieXRlcykKKyAgICA2MTQgICA0NSAgICBiICAgICAgICBqYXZhLnV0aWwuamFyLkphckZpbGUkSmFyRmlsZUVudHJ5Ojo8aW5pdD4gKDExIGJ5dGVzKQorICAgIDYxNSAgIDQ2ICAgIGIgICAgICAgIGphdmEudXRpbC5qYXIuSmFyRW50cnk6Ojxpbml0PiAoNiBieXRlcykKKyAgICA2MTUgICA0NyAgICBiICAgICAgICBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ojo8aW5pdD4gKDExNSBieXRlcykKKyAgICA2MTYgICA0OCAgICBiICAgICAgICBzdW4ubWlzYy5VUkxDbGFzc1BhdGg6OmdldFJlc291cmNlTWFwS2V5ICg1NSBieXRlcykKKyAgICA2MjEgICA0OSAgICBiICAgICAgICBqYXZhLnV0aWwuamFyLkphckZpbGUkMTo6aGFzTW9yZUVsZW1lbnRzICgxMCBieXRlcykKKyAgICA2MjMgICA1MCAgICFiICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGUkMTo6aGFzTW9yZUVsZW1lbnRzICg0MSBieXRlcykKKyAgICA2MjQgICA1MSAgICBiICAgICAgICBqYXZhLnV0aWwuemlwLlppcEVudHJ5OjpnZXROYW1lICg1IGJ5dGVzKQorICAgIDYyNSAgIDUyICAgIGIgICAgICAgIGphdmEudXRpbC5qYXIuSmFyRmlsZSQxOjpuZXh0RWxlbWVudCAoNSBieXRlcykKKyAgICA2MjkgICA1MyAgICBiICAgICAgICBqYXZhLnV0aWwuamFyLkphckZpbGUkMTo6bmV4dEVsZW1lbnQgKDI2IGJ5dGVzKQorICAgIDYzMyAgIDU0ICAgIGIgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZSQxOjpuZXh0RWxlbWVudCAoNSBieXRlcykKKyAgICA2MzYgICA1NSAgICFiICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGUkMTo6bmV4dEVsZW1lbnQgKDIxMiBieXRlcykKKyAgICA2MzkgICA1NiAgICBiICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmFjY2VzcyQ1MDAgKDYgYnl0ZXMpCisgICAgNjM5ICAgNTcgICAgIG4gICAgICAgamF2YS51dGlsLnppcC5aaXBGaWxlOjpnZXROZXh0RW50cnkgKDAgYnl0ZXMpICAgKHN0YXRpYykKKyAgICA2MzkgICA1OCAgICBiICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmFjY2VzcyQ5MDAgKDcgYnl0ZXMpCisgICAgNjQwICAgNTkgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdDo6c2l6ZSAoNSBieXRlcykKKyAgICA2NDEgICA2MCAgICBiICAgICAgICBzdW4ubWlzYy5VUkxDbGFzc1BhdGgkSmFyTG9hZGVyOjphZGRKYXJFbnRyaWVzVG9FbnRyeU1hcCAoMjAyIGJ5dGVzKQorICAgIDY2NCAgIDYxICAgIGIgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3Q6OmdldCAoMTEgYnl0ZXMpCisgICAgNjY0ICAgNjIgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdDo6cmFuZ2VDaGVjayAoMjIgYnl0ZXMpCisgICAgNjY1ICAgNjMgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdDo6ZWxlbWVudERhdGEgKDcgYnl0ZXMpCisgICAgNzA3ICAgMjkgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXA6OmdldCAoNzkgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAgIDcxOSAgIDY0ICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnJlcGxhY2UgKDE0MiBieXRlcykKKyAgICA3NDkgICA2NSAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjpzdGFydHNXaXRoICg3OCBieXRlcykKKyAgICA4NjUgICA2NiAgICBiICAgICAgICBqYXZhLnV0aWwuSGFzaE1hcDo6Z2V0ICg3OSBieXRlcykKKyAgICA4NjcgICA2NyAgICBiICAgICAgICBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW06OndyaXRlVVRGICg0MzUgYnl0ZXMpCisgICAgOTEzICAgNjggICAgYiAgICAgICAgamF2YS5sYW5nLlN0cmluZzo6Z2V0Q2hhcnMgKDY2IGJ5dGVzKQorICAgIDkxNyAgIDY5ICAgIWIgICAgICAgIHN1bi5yZWZsZWN0LmdlbmVyaWNzLnBhcnNlci5TaWduYXR1cmVQYXJzZXI6OmN1cnJlbnQgKDQwIGJ5dGVzKQorICAgIDkxOCAgIDcwICAgIGIgICAgICAgIGphdmEubGFuZy5BYnN0cmFjdFN0cmluZ0J1aWxkZXI6OmVuc3VyZUNhcGFjaXR5SW50ZXJuYWwgKDE2IGJ5dGVzKQorICAgIDkyMiAgIDcxICAgIGIgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOjplbnN1cmVDYXBhY2l0eSAoMTYgYnl0ZXMpCisgICAgOTIyICAgNzIgICAgYiAgICAgICAgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOjppbmNDb3VudCAoMjAgYnl0ZXMpCisgICAgOTIzICAgNzMgIHMgYiAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW06OndyaXRlICgzMiBieXRlcykKKyAgICA5MzMgICA3NCAgICBiICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YTo6b2YgKDEyMCBieXRlcykKKyAgICA5MzQgICA3NSAgICBiICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YUxhdGluMTo6Z2V0UHJvcGVydGllcyAoMTEgYnl0ZXMpCisgICAgOTY3ICAgNzYgICAgYiAgICAgICAgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0TWFwOjpmaW5kUHJlZGVjZXNzb3IgKDEyMSBieXRlcykKKyAgICA5NzkgICA3NyAgICBiICAgICAgICBqYXZhLmxhbmcuSW50ZWdlcjo6Y29tcGFyZVRvICg5IGJ5dGVzKQorICAgIDk4MCAgIDc4ICAgIGIgICAgICAgIGphdmEubGFuZy5JbnRlZ2VyOjpjb21wYXJlVG8gKDEyIGJ5dGVzKQorICAgIDk4MCAgIDc5ICAgIGIgICAgICAgIGphdmEubGFuZy5JbnRlZ2VyOjpjb21wYXJlICgyMCBieXRlcykKKyAgIDEwMzAgICA4MCAgICBiICAgICAgICBqYXZhLmxhbmcuQWJzdHJhY3RTdHJpbmdCdWlsZGVyOjphcHBlbmQgKDI5IGJ5dGVzKQorICAgMTA0NiAgIDgxICAgIGIgICAgICAgIGphdmEudXRpbC5qYXIuTWFuaWZlc3QkRmFzdElucHV0U3RyZWFtOjpyZWFkTGluZSAoMTY3IGJ5dGVzKQorICAgMTA3MyAgIDgyICAgIGIgICAgICAgIG5ldC5zZi5jZ2xpYi5hc20uQnl0ZVZlY3Rvcjo6cHV0VVRGOCAoMzk0IGJ5dGVzKQorICAgMTA4MSAgIDgzICAgIGIgICAgICAgIG5ldC5zZi5jZ2xpYi5hc20uVHlwZTo6YSAoMjUzIGJ5dGVzKQorICAgMTA4NyAgIDg0ICBzIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXI6OmFwcGVuZCAoOCBieXRlcykKKyAgIDEwOTEgICA4NSAgICBiICAgICAgICBuZXQuc2YuY2dsaWIuYXNtLlR5cGU6OmEgKDIxNCBieXRlcykKKyAgIDExMTYgICA4NiAgICBiICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0OjphY2Nlc3MkMTAwICg1IGJ5dGVzKQorICAgMTExOCAgIDg3ICAgIGIgICAgICAgIGphdmEubGFuZy5BYnN0cmFjdFN0cmluZ0J1aWxkZXI6OmFwcGVuZCAoNDggYnl0ZXMpCisgICAxMTI3ICAgODggICAgYiAgICAgICAgbmV0LnNmLmNnbGliLmFzbS5UeXBlOjpnZXRBcmd1bWVudFR5cGVzICgxMzEgYnl0ZXMpCisgICAxMTU0ICAgODkgICAgYiAgICAgICAgc3VuLm1pc2MuTWV0YUluZGV4OjptYXlDb250YWluICg1MSBieXRlcykKKyAgIDExODEgICA5MCAgICBiICAgICAgICBzdW4ucmVmbGVjdC5nZW5lcmljcy5wYXJzZXIuU2lnbmF0dXJlUGFyc2VyOjphZHZhbmNlICgzNyBieXRlcykKKyAgIDExODkgICA5MSAgICBiICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UgKDUgYnl0ZXMpCisgICAxMTg5ICAgOTIgICAgYiAgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlICg5IGJ5dGVzKQorICAgMTE5MCAgIDkzICAgIGIgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXJEYXRhTGF0aW4xOjppc1doaXRlc3BhY2UgKDIzIGJ5dGVzKQorICAgMTE5MCAgIDk0ICAgIGIgICAgICAgIHN1bi5yZWZsZWN0LmdlbmVyaWNzLnBhcnNlci5TaWduYXR1cmVQYXJzZXI6OnBhcnNlSWRlbnRpZmllciAoMTE1IGJ5dGVzKQorICAgMTI1MyAgIDk1ICAgIGIgICAgICAgIGphdmEudXRpbC5Qcm9wZXJ0aWVzJExpbmVSZWFkZXI6OnJlYWRMaW5lICg0NTIgYnl0ZXMpCittYWRlIG5vdCBjb21waWxhYmxlICBqYXZhLmlvLlJlYWRlcjo6cmVhZAorICAgMTI4NyAgIDk2ICAgIGIgICAgICAgIGphdmEudXRpbC56aXAuWlN0cmVhbVJlZjo6YWRkcmVzcyAoNSBieXRlcykKKyAgIDEzMTQgICA5NyAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjo6YXBwZW5kICg4IGJ5dGVzKQorICAgMTMyMyAgIDk4ICAgICBuICAgICAgIGphdmEubGFuZy5UaHJlYWQ6OmN1cnJlbnRUaHJlYWQgKDAgYnl0ZXMpICAgKHN0YXRpYykKKyAgIDEzMjcgICA5OSAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjpjb21wYXJlVG8gKDE1MCBieXRlcykKKyAgIDEzNDYgIDEwMCAgICBiICAgICAgICBzdW4ubWlzYy5VUkxDbGFzc1BhdGg6OmFjY2VzcyQxMDAgKDUgYnl0ZXMpCisgICAxMzUzICAxMDEgICAgYiAgICAgICAgamF2YS51dGlsLkhhc2hNYXA6OnB1dCAoMTI2IGJ5dGVzKQorICAgMTM3NyAgMTAyICAgIGIgICAgICAgIGphdmEubGFuZy5BYnN0cmFjdFN0cmluZ0J1aWxkZXI6Ojxpbml0PiAoMTIgYnl0ZXMpCisgICAxMzk2ICAxMDMgICAgYiAgICAgICAgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOjplbnN1cmVPcGVuICgxOCBieXRlcykKKyAgIDEzOTkgIDEwNCAgICBiICAgICAgICBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50U2tpcExpc3RNYXA6OmZpbmROb2RlICgxMDggYnl0ZXMpCisgICAxNDA3ICAxMDUgICAgYiAgICAgICAgamF2YS51dGlsLkhhc2hNYXA6OnRyYW5zZmVyICg4MyBieXRlcykKKyAgIDE0MTMgIDEwNiAgICBiICAgICAgICBzdW4ucmVmbGVjdC5DbGFzc0ZpbGVBc3NlbWJsZXI6OmVtaXRCeXRlICgxMSBieXRlcykKKyAgIDE0MTQgIDEwNyAgICBiICAgICAgICBzdW4ucmVmbGVjdC5CeXRlVmVjdG9ySW1wbDo6YWRkICgzOCBieXRlcykKKyAgIDE0MjIgIDEwOCAgICBiICAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCRIYXNoSXRlcmF0b3I6Om5leHRFbnRyeSAoOTkgYnl0ZXMpCisgICAxNDI1ICAxMDkgICAgYiAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOjpnZXROYW1lICg1IGJ5dGVzKQorICAgMTQyOCAgMTEwICAgICBuICAgICAgIGphdmEubGFuZy5PYmplY3Q6Omhhc2hDb2RlICgwIGJ5dGVzKSAgIAorICAgMTQ0MyAgMTExICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnN0YXJ0c1dpdGggKDcgYnl0ZXMpCisgICAxNDUyICAxMTIgICAgYiAgICAgICAgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U6OmdldCAoNSBieXRlcykKKyAgIDE0NTMgIDExMyAgICBiICAgICAgICBqYXZhLmxhbmcuQ2xhc3M6OnNlYXJjaE1ldGhvZHMgKDkwIGJ5dGVzKQorICAgMTQ2MyAgMTE0ICAgIGIgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QkSXRyOjpoYXNOZXh0ICgyMCBieXRlcykKKyAgIDE0NjMgIDExNSAgICBiICAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCRIYXNoSXRlcmF0b3I6Ojxpbml0PiAoNjMgYnl0ZXMpCisgICAxNDczICAxMTYgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdDo6ZW5zdXJlQ2FwYWNpdHlJbnRlcm5hbCAoMjYgYnl0ZXMpCisgICAxNDc4ICAxMTcgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdDo6YWRkICgyOSBieXRlcykKKyAgIDE0ODQgIDExOCAgICAgbiAgICAgICBqYXZhLmxhbmcuT2JqZWN0OjpjbG9uZSAoMCBieXRlcykgICAKKyAgIDE0ODkgIDExOSAgICBiICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0Ojo8aW5pdD4gKDUgYnl0ZXMpCisgICAxNDkwICAxMjAgICAgYiAgICAgICAgc3VuLnJlZmxlY3QuUmVmbGVjdGlvbkZhY3Rvcnk6OmxhbmdSZWZsZWN0QWNjZXNzICgxNSBieXRlcykKKyAgIDE0OTMgIDEyMSAgICBiICAgICAgICBqYXZhLmxhbmcuQ2xhc3M6OmNvcHlNZXRob2RzICgzNiBieXRlcykKKyAgIDE1MDEgIDEyMiAgICBiICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0JEl0cjo6Y2hlY2tGb3JDb21vZGlmaWNhdGlvbiAoMjMgYnl0ZXMpCisgICAxNTAzICAxMjMgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5czo6aGFzaENvZGUgKDU2IGJ5dGVzKQorICAgMTUwNSAgMTI0ICAgIGIgICAgICAgIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RBY2Nlc3M6OmNvcHlNZXRob2QgKDUgYnl0ZXMpCisgICAxNTA3ICAxMjUgICAgYiAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOjpjb3B5ICg2NyBieXRlcykKKyAgIDE1MDggIDEyNiAgICBiICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q6Ojxpbml0PiAoNjggYnl0ZXMpCisgICAxNTEwICAxMjcgICAgYiAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOjpnZXREZWNsYXJpbmdDbGFzcyAoNSBieXRlcykKKyAgIDE1MjEgIDEyOCAgICBiICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q6OmdldFBhcmFtZXRlclR5cGVzICgxNCBieXRlcykKKyAgIDE1MjQgIDEyOSAgICFiICAgICAgICBjb20uc3VuLmplcnNleS5jb3JlLnJlZmxlY3Rpb24uUmVmbGVjdGlvbkhlbHBlcjo6ZmluZE1ldGhvZE9uQ2xhc3MgKDk0IGJ5dGVzKQorICAgMTU0NSAgMTMwICAgIGIgICAgICAgIGphdmEubGFuZy5TeXN0ZW06OmdldFNlY3VyaXR5TWFuYWdlciAoNCBieXRlcykKKyAgIDE1NDYgIDEzMSAgICBiICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0JEl0cjo6bmV4dCAoNjYgYnl0ZXMpCisgICAxNTQ3ICAxMzIgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdDo6YWNjZXNzJDIwMCAoNSBieXRlcykKKyAgIDE1NTMgIDEzMyAgICBiICAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCRIYXNoSXRlcmF0b3I6Omhhc05leHQgKDEzIGJ5dGVzKQorICAgMTU1NSAgMTM0ICAgIGIgICAgICAgIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5Ojo8aW5pdD4gKDI2IGJ5dGVzKQorICAgMTU1OCAgMTM1ICAgIGIgICAgICAgIGphdmEubGFuZy5JbnRlZ2VyOjp2YWx1ZU9mICg1NCBieXRlcykKKyAgIDE1NjAgIDEzNiAgICBiICAgICAgICBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U6OmdldCAoMjkgYnl0ZXMpCisgICAxNTY1ICAxMzcgIHMgYiAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOjpkZWNsYXJlZEFubm90YXRpb25zICgzOSBieXRlcykKKyAgIDE1NjkgIDEzOCAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjo6dG9TdHJpbmcgKDE3IGJ5dGVzKQorICAgMTU3NCAgMTM5ICAgIGIgICAgICAgIGphdmEubGFuZy5DbGFzczo6Y2xlYXJDYWNoZXNPbkNsYXNzUmVkZWZpbml0aW9uICg3MCBieXRlcykKKyAgIDE1ODAgIDE0MCAgICBiICAgICAgICBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOjo8aW5pdD4gKDUgYnl0ZXMpCisgICAxNTgxICAxNDEgICAgYiAgICAgICAgamF2YS5sYW5nLkNsYXNzOjpjaGVja0luaXR0ZWQgKDE5IGJ5dGVzKQorICAgMTU5NSAgMTQyICAgIGIgICAgICAgIGNvbS5zdW4uamVyc2V5LmNvcmUucmVmbGVjdGlvbi5Bbm5vdGF0ZWRNZXRob2Q6Omhhc1BhcmFtZXRlckFubm90YXRpb25zICg4MCBieXRlcykKKyAgIDE2MDQgIDE0MyAgICAgbiAgICAgICBqYXZhLmxhbmcuQ2xhc3M6OmdldENsYXNzTG9hZGVyMCAoMCBieXRlcykgICAKKyAgIDE2MDcgIDE0NCAgICBiICAgICAgICBqYXZhLmxhbmcuQ2xhc3M6OmdldE1ldGhvZDAgKDk3IGJ5dGVzKQorICAgMTYzNCAgMTQ1ICAgIGIgICAgICAgIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5OjpnZXRLZXkgKDUgYnl0ZXMpCisgICAxNjM0ICAxNDYgICAgYiAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb25zJEVtcHR5TWFwOjpnZXQgKDIgYnl0ZXMpCisgICAxNjM2ICAxNDcgICAgIG4gICAgICAgamF2YS5sYW5nLlN0cmluZzo6aW50ZXJuICgwIGJ5dGVzKSAgIAorICAgMTYzNiAgMTQ4ICAgIGIgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDo6Z2V0QW5ub3RhdGlvbiAoMjYgYnl0ZXMpCisgICAxNjQwICAxNDggICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOjpnZXRBbm5vdGF0aW9uICgyNiBieXRlcykgICBtYWRlIG5vdCBlbnRyYW50CisgICAxNjQxICAxNDkgICAgYiAgICAgICAgamF2YS51dGlsLkhhc2hNYXAkS2V5SXRlcmF0b3I6Om5leHQgKDggYnl0ZXMpCisgICAxNjQ2ICAxNTAgICAgYiAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOjpnZXRSZXR1cm5UeXBlICg1IGJ5dGVzKQorICAgMTY0NyAgMTUxICAgIGIgICAgICAgIGphdmEubGFuZy5DbGFzczo6Z2V0TmFtZSAoMjEgYnl0ZXMpCisgICAxNjU4ICAxNTIgICAgIG4gICAgICAgamF2YS5sYW5nLkNsYXNzOjpnZXRJbnRlcmZhY2VzICgwIGJ5dGVzKSAgIAorICAgMTY1OSAgMTUzICAgIGIgICAgICAgIGphdmEudXRpbC5BYnN0cmFjdExpc3Q6Ojxpbml0PiAoMTAgYnl0ZXMpCisgICAxNjYwICAxNTQgICAgYiAgICAgICAgY29tLnN1bi5qZXJzZXkuY29yZS5yZWZsZWN0aW9uLkFubm90YXRlZE1ldGhvZDo6aGFzTWV0aG9kQW5ub3RhdGlvbnMgKDQzIGJ5dGVzKQorICAgMTY3NiAgMTU1ICAgIGIgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OnRvTG93ZXJDYXNlICg5IGJ5dGVzKQorICAgMTY3NyAgMTU2ICAgIGIgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXJEYXRhTGF0aW4xOjp0b0xvd2VyQ2FzZSAoMzkgYnl0ZXMpCisgICAxNjg4ICAxNTcgICAgYiAgICAgICAgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXI6OmdldFN0YXRlICg1IGJ5dGVzKQorICAgMTY5NSAgMTU4ICAgIGIgICAgICAgIGphdmEubGFuZy5DbGFzczo6YXJndW1lbnRUeXBlc1RvU3RyaW5nICg3OCBieXRlcykKKyAgIDE3MDEgICAgMiAgICAgICAgICAgICBzdW4ubmlvLmNzLlVURl84JERlY29kZXI6OmRlY29kZSAoNjQwIGJ5dGVzKSAgIG1hZGUgem9tYmllCisgICAxNzAxICAgMjkgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXA6OmdldCAoNzkgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgIDE3MDIgIDE1OSAgICBiICAgICAgICBqYXZhLmxhbmcuQ2xhc3M6OmNoZWNrTWVtYmVyQWNjZXNzICg3OCBieXRlcykKKyAgIDE3MDQgIDE2MCAgICBiICAgICAgICBzdW4ucmVmbGVjdC5nZW5lcmljcy5wYXJzZXIuU2lnbmF0dXJlUGFyc2VyOjpwYXJzZVBhY2thZ2VOYW1lQW5kU2ltcGxlQ2xhc3NUeXBlU2lnbmF0dXJlICgxMzkgYnl0ZXMpCisgICAxNzM0ICAxNjEgIHMhYiAgICAgICAgc3VuLm1pc2MuVVJMQ2xhc3NQYXRoOjpnZXRMb2FkZXIgKDE4MiBieXRlcykKKyAgIDE3NzIgIDE2MiAgICBiICAgICAgICBqYXZhLnV0aWwuUHJvcGVydGllczo6bG9hZENvbnZlcnQgKDUwNSBieXRlcykKKyAgIDE3ODkgIDE2MyAgICBiICAgICAgICBzdW4ucmVmbGVjdC5DbGFzc0ZpbGVBc3NlbWJsZXI6OmVtaXRDb25zdGFudFBvb2xVVEY4ICg1MCBieXRlcykKKyAgIDE4MDkgIDE2NCAgICFiICAgICAgICBzdW4ucmVmbGVjdC5VVEY4OjplbmNvZGUgKDE4OSBieXRlcykKKyAgIDE4MTggIDE2NSAgICBiICAgICAgICBzdW4ucmVmbGVjdC5VVEY4Ojp1dGY4TGVuZ3RoICg4MSBieXRlcykKKyAgIDE4NDEgIDE2NiAgICBiICAgICAgICBzdW4ubmlvLmNzLlVURl84JERlY29kZXI6OmRlY29kZUFycmF5TG9vcCAoNTQzIGJ5dGVzKQorICAgMTg2OSAgMTY3ICAgIGIgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJEJtcENoYXJQcm9wZXJ0eTo6bWF0Y2ggKDUwIGJ5dGVzKQorbWFkZSBub3QgY29tcGlsYWJsZSAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQ2hhclByb3BlcnR5Ojppc1NhdGlzZmllZEJ5CisgICAxODgyICAxNjggICAgYiAgICAgICAgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI6OnNlYXJjaCAoMTA5IGJ5dGVzKQorICAgMjAyMyAgMTY5ICAgIGIgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OmNoYXJDb3VudCAoMTIgYnl0ZXMpCisgICAyMDIzICAxNzAgICAgYiAgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6aXNIaWdoU3Vycm9nYXRlICgxOCBieXRlcykKKyAgIDIwMjQgIDE3MSAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjpjb2RlUG9pbnRBdCAoNDQgYnl0ZXMpCisgICAyMDI1ICAxNzIgICAgYiAgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6Y29kZVBvaW50QXRJbXBsICg0MSBieXRlcykKKyAgIDIwMzYgIDE3MyAgICBiICAgICAgICBqYXZhLm5pby5CdWZmZXI6OmNoZWNrSW5kZXggKDIyIGJ5dGVzKQorICAgMjAzNiAgMTc0ICAgIGIgICAgICAgIGphdmEubmlvLkRpcmVjdExvbmdCdWZmZXJVOjppeCAoMTAgYnl0ZXMpCisgICAyMDQwICAxNzUgICAgYiAgICAgICAgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RPd25hYmxlU3luY2hyb25pemVyOjpzZXRFeGNsdXNpdmVPd25lclRocmVhZCAoNiBieXRlcykKKyAgIDIwNDEgIDE3NiAgICBiICAgICAgICBzdW4ubWlzYy5VUkxDbGFzc1BhdGg6OmdldFJlc291cmNlICg3OSBieXRlcykKK21hZGUgbm90IGNvbXBpbGFibGUgIGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI6Om9wZW5Db25uZWN0aW9uCisgICAyMDU5ICAxNzYgICAgICAgICAgICAgc3VuLm1pc2MuVVJMQ2xhc3NQYXRoOjpnZXRSZXNvdXJjZSAoNzkgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAgMjA2MyAgMTc3ICAgIGIgICAgICAgIGNvbS5nb29nbGUuY29tbW9uLmlvLkxpbmVCdWZmZXI6OmFkZCAoMjAxIGJ5dGVzKQorbWFkZSBub3QgY29tcGlsYWJsZSAgY29tLmdvb2dsZS5jb21tb24uaW8uTGluZUJ1ZmZlcjo6aGFuZGxlTGluZQorICAgMjA3MyAgMTc4ICAgIGIgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOjpoYXMgKDE1IGJ5dGVzKQorICAgMjA3NCAgMTc5ICAgIGIgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3Q6Ojxpbml0PiAoNDQgYnl0ZXMpCisgICAyMDgwICAxODAgICAgYiAgICAgICAgamF2YS5uZXQuVVJMOjpnZXRIb3N0ICg1IGJ5dGVzKQorICAgMjA4OSAgMTY4ICAgICAgICAgICAgIGphdmEudXRpbC5yZWdleC5NYXRjaGVyOjpzZWFyY2ggKDEwOSBieXRlcykgICBtYWRlIG5vdCBlbnRyYW50CisgICAyMDg5ICAxNjcgICAgICAgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQm1wQ2hhclByb3BlcnR5OjptYXRjaCAoNTAgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAgMjEyNCAgMTgxICAgIGIgICAgICAgIGphdmEudXRpbC5IYXNoTWFwOjphZGRFbnRyeSAoNTggYnl0ZXMpCisgICAyMTQwICAxODIgICAgIG4gICAgICAgamF2YS5sYW5nLlN5c3RlbTo6bmFub1RpbWUgKDAgYnl0ZXMpICAgKHN0YXRpYykKKyAgIDIxNDUgIDE4MyAgICBiICAgICAgICBqYXZhLnV0aWwuemlwLkluZmxhdGVyOjplbnN1cmVPcGVuICg0NyBieXRlcykKKyAgIDIyMDQgIDE4NCAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjp0cmltICg4NyBieXRlcykKKyAgIDMwMTkgIDE4NSAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjppbmRleE9mICg3IGJ5dGVzKQorICAgMzAyMyAgMTg2ICAgIGIgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJEN1cmx5OjptYXRjaDAgKDE3NCBieXRlcykKKyAgIDMwMzAgIDE4NyAgICBiICAgICAgICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjo6cmVzZXQgKDgzIGJ5dGVzKQorICAgMzAzNSAgMTg4ICAgIGIgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJE5vZGU6Om1hdGNoICgyNyBieXRlcykKKyAgIDMwMzYgIDE0OCAgICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q6OmdldEFubm90YXRpb24gKDI2IGJ5dGVzKSAgIG1hZGUgem9tYmllCisgICAzMDM3ICAxODkgICAgYiAgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQm1wQ2hhclByb3BlcnR5OjptYXRjaCAoNTAgYnl0ZXMpCisgICAzMDM5ICAxOTAgICAgYiAgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQ3R5cGU6OmlzU2F0aXNmaWVkQnkgKDI0IGJ5dGVzKQorICAgMzAzOSAgMTkxICAgIGIgICAgICAgIGphdmEudXRpbC5yZWdleC5BU0NJSTo6aXNUeXBlICgxNSBieXRlcykKKyAgIDMwNDAgIDE5MiAgICBiICAgICAgICBqYXZhLnV0aWwucmVnZXguQVNDSUk6OmdldFR5cGUgKDE3IGJ5dGVzKQorICAgMzA0MiAgMTkzICAgIGIgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJENoYXJQcm9wZXJ0eTo6bWF0Y2ggKDU2IGJ5dGVzKQorICAgMzA0NSAgMTk0ICAgIGIgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJFNsaWNlOjptYXRjaCAoNzkgYnl0ZXMpCisgICAzMDUyICAxOTUgICAgYiAgICAgICAgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI6Om1hdGNoICgxMDkgYnl0ZXMpCisgICAzMDYyICAxOTYgICAgYiAgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQ3VybHk6Om1hdGNoICg4NiBieXRlcykKKyAgIDMwNzQgIDE5NyAgICBiICAgICAgICBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFic3RyYWN0SW5kZXhlZExpc3RJdGVyYXRvcjo6aGFzTmV4dCAoMTcgYnl0ZXMpCisgICAzMDc4ICAxOTggICAgYiAgICAgICAgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXAkU2VnbWVudDo6cmVoYXNoICgyNjIgYnl0ZXMpCisgICAzMDk0ICAxMDEgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXA6OnB1dCAoMTI2IGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTUxNzIgIDE5OSAgICBiICAgICAgICBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdE93bmFibGVTeW5jaHJvbml6ZXI6OmdldEV4Y2x1c2l2ZU93bmVyVGhyZWFkICg1IGJ5dGVzKQorICAxNzQyNyAgMjAwICAgICBuICAgICAgIHN1bi5taXNjLlVuc2FmZTo6Y29tcGFyZUFuZFN3YXBJbnQgKDAgYnl0ZXMpICAgCisgIDE3NDMxICAxOTMgICAgICAgICAgICAgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4kQ2hhclByb3BlcnR5OjptYXRjaCAoNTYgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxNzQzNiAgMjAxICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnRvVXBwZXJDYXNlICg0NDIgYnl0ZXMpCisgIDE3NDg0ICAyMDIgICAhYiAgICAgICAgc3VuLm1pc2MuVVJMQ2xhc3NQYXRoJEphckxvYWRlcjo6Z2V0UmVzb3VyY2UgKDkxIGJ5dGVzKQorICAxNzUxOCAgMjAzICAgIGIgICAgICAgIGphdmEubmlvLkJ1ZmZlcjo6cG9zaXRpb24gKDQzIGJ5dGVzKQorICAxNzUxOSAgMTY3ICAgICAgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJEJtcENoYXJQcm9wZXJ0eTo6bWF0Y2ggKDUwIGJ5dGVzKSAgIG1hZGUgem9tYmllCisgIDE3NTE5ICAxNzYgICAgICAgICAgICAgc3VuLm1pc2MuVVJMQ2xhc3NQYXRoOjpnZXRSZXNvdXJjZSAoNzkgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgMTc1MTkgIDE2OCAgICAgICAgICAgICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjo6c2VhcmNoICgxMDkgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgMTc1MTkgIDIwNCAgICBiICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyOjphcnJheU9mZnNldCAoMzUgYnl0ZXMpCisgIDE3NTIwICAyMDUgICAgYiAgICAgICAgamF2YS5uaW8uQ2hhckJ1ZmZlcjo6YXJyYXlPZmZzZXQgKDM1IGJ5dGVzKQorICAxNzUyNCAgMjA2ICAgIGIgICAgICAgIGphdmEubmlvLkJ1ZmZlcjo6cG9zaXRpb24gKDUgYnl0ZXMpCisgIDE3NTI0ICAyMDcgICAgYiAgICAgICAgc3VuLm5pby5jcy5VVEZfOCRFbmNvZGVyOjplbmNvZGVBcnJheUxvb3AgKDQ4OSBieXRlcykKKyAgMTc1MzEgIDIwOCAgICBiICAgICAgICBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0Ojppc1VuZGVyZmxvdyAoMTMgYnl0ZXMpCisgIDE3NTM5ICAyMDkgICAgYiAgICAgICAgamF2YS5uaW8uQnVmZmVyOjpsaW1pdCAoNjIgYnl0ZXMpCisgIDE3NTQwICAyMTAgICAgYiAgICAgICAgamF2YS5uaW8uQnVmZmVyOjo8aW5pdD4gKDEyMSBieXRlcykKKyAgMTc1NDEgIDIxMSAgICBiICAgICAgICBqYXZhLm5pby5CdWZmZXI6OnJlbWFpbmluZyAoMTAgYnl0ZXMpCisgIDE3NTQyICAyMTIgICAgYiAgICAgICAgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdDo6aXNPdmVyZmxvdyAoMTQgYnl0ZXMpCisgIDE3NTQyICAyMTMgICAgYiAgICAgICAgamF2YS5uaW8uQnVmZmVyOjpoYXNSZW1haW5pbmcgKDE3IGJ5dGVzKQorICAxNzU0MiAgMjE0ICAgIGIgICAgICAgIGphdmEubmlvLkNoYXJCdWZmZXI6Omhhc0FycmF5ICgyMCBieXRlcykKKyAgMTc1NDMgIDIxNSAgICBiICAgICAgICBqYXZhLm5pby5CeXRlQnVmZmVyOjpoYXNBcnJheSAoMjAgYnl0ZXMpCisgIDE3NTQzICAyMTYgICAhYiAgICAgICAgamF2YS5uaW8uQ2hhckJ1ZmZlcjo6d3JhcCAoMjAgYnl0ZXMpCisgIDE3NTQ1ICAyMTcgICAgYiAgICAgICAgamF2YS5uaW8uSGVhcENoYXJCdWZmZXI6Ojxpbml0PiAoMTQgYnl0ZXMpCisgIDE3NTQ2ICAyMTggICAgYiAgICAgICAgamF2YS5uaW8uQ2hhckJ1ZmZlcjo6PGluaXQ+ICgyMiBieXRlcykKKyAgMTc1NDcgIDIxOSAgICBiICAgICAgICBzdW4ubmlvLmNzLlN0cmVhbUVuY29kZXI6OmVuc3VyZU9wZW4gKDE4IGJ5dGVzKQorICAxNzU0NyAgMjIwICAgIGIgICAgICAgIHN1bi5uaW8uY3MuU3RyZWFtRW5jb2Rlcjo6aW1wbFdyaXRlICgxNTYgYnl0ZXMpCisgIDE3NTU2ICAyMjEgICAhYiAgICAgICAgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2Rlcjo6ZW5jb2RlICgyODUgYnl0ZXMpCisgIDE3NTYxICAyMjIgICAgYiAgICAgICAgc3VuLm5pby5jcy5VVEZfOCRFbmNvZGVyOjplbmNvZGVMb29wICgyOCBieXRlcykKKyAgMTc1NjIgIDIyMyAgICFiICAgICAgICBzdW4ubmlvLmNzLlN0cmVhbUVuY29kZXI6OndyaXRlICg3OCBieXRlcykKKyAgMTc1NjUgIDIyNCAgICBiICAgICAgICBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25Xcml0ZXI6OnN0cmluZyAoMzY1IGJ5dGVzKQorICAxNzU3NyAgMjI1ICAgIGIgICAgICAgIHN1bi5uaW8uY3MuU3RyZWFtRW5jb2Rlcjo6d3JpdGUgKDM3IGJ5dGVzKQorICAxNzU4OCAgMjI0ICAgICAgICAgICAgIGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvbldyaXRlcjo6c3RyaW5nICgzNjUgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxNzU4OSAgMjI2ICAgIGIgICAgICAgIGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvbldyaXRlcjo6c3RyaW5nICgzNjUgYnl0ZXMpCisgIDE3NjE4ICAyMjcgICAgYiAgICAgICAgamF2YS5sYW5nLlN0cmluZzo6dG9Mb3dlckNhc2UgKDQ3NyBieXRlcykKKyAgMTc2MzcgICAxMCAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjplcXVhbHMgKDg4IGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTc2NDEgICA3MyAgcyAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTo6d3JpdGUgKDMyIGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTc2NTYgICAgNyAgICAgICAgICAgICBzdW4ubmlvLmNzLlVURl84JERlY29kZXI6OmRlY29kZSAoNjQwIGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTc2NTYgICAzNCAgICAgICAgICAgICBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOjptYXhDaGFyc1BlckJ5dGUgKDUgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxNzY1NiAgIDM4ICAgICAgICAgICAgIGphdmEudXRpbC56aXAuWmlwRmlsZTo6Z2V0WmlwRW50cnkgKDI0NSBieXRlcykgICBtYWRlIG5vdCBlbnRyYW50CisgIDE3NjU4ICAyMjggICAgYiAgICAgICAgc3VuLm5pby5jcy5VVEZfOCREZWNvZGVyOjpkZWNvZGUgKDY0MCBieXRlcykKKyAgMTc2NzIgIDIyOSAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjo6PGluaXQ+ICg3IGJ5dGVzKQorICAxNzY4MCAgMjMwICAgIGIgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyOjpkZXN0cnVjdGl2ZU11bEFkZCAoMTUwIGJ5dGVzKQorICAxNzY4NSAgMTAxICAgICAgICAgICAgIGphdmEudXRpbC5IYXNoTWFwOjpwdXQgKDEyNiBieXRlcykgICBtYWRlIHpvbWJpZQorICAxNzY4NSAgMjMxICAgIGIgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJFNpbmdsZTo6aXNTYXRpc2ZpZWRCeSAoMTQgYnl0ZXMpCisgIDE3Njg3ICAyMzIgICAgYiAgICAgICAgamF2YS5sYW5nLkludGVnZXI6OnBhcnNlSW50ICgyNjEgYnl0ZXMpCisgIDE3NjkzICAyMzMgICAgYiAgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6ZGlnaXQgKDYgYnl0ZXMpCisgIDE3NjkzICAyMzQgICAgYiAgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6ZGlnaXQgKDEwIGJ5dGVzKQorICAxNzY5NCAgMjM1ICAgIGIgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXJEYXRhTGF0aW4xOjpkaWdpdCAoOTEgYnl0ZXMpCisgIDE3Njk4ICAyMzYgICAgYiAgICAgICAgc3VuLnNlY3VyaXR5LnV0aWwuQ2FjaGUkRXF1YWxCeXRlQXJyYXk6Omhhc2hDb2RlICg1NyBieXRlcykKKyAgMTc3MjEgIDIzNyAgICBiICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjplcXVhbHMgKDg4IGJ5dGVzKQorICAxNzczMyAgMjM4ICAgIGIgICAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyOjpzdHJpcExlYWRpbmdaZXJvQnl0ZXMgKDEzMiBieXRlcykKKyAgMTc3NDAgIDIzOSAgcyBiICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOjpyZWFkICgzNiBieXRlcykKKyAgMTc3NDkgIDI0MCAgcyBiICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOjphdmFpbGFibGUgKDEwIGJ5dGVzKQorICAxNzc1NiAgMjQxICAgIGIgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW06Om1hcmsgKDkgYnl0ZXMpCisgIDE3NzY4ICAyNDIgICAgYiAgICAgICAgc3VuLnNlY3VyaXR5LnV0aWwuRGVySW5wdXRTdHJlYW06OmdldExlbmd0aCAoMTExIGJ5dGVzKQorbWFkZSBub3QgY29tcGlsYWJsZSAgamF2YS5pby5JbnB1dFN0cmVhbTo6cmVhZAorICAxNzc3NCAgMjQzICAgIGIgICAgICAgIGphdmEudXRpbC5BcnJheXM6OmNvcHlPZiAoMTkgYnl0ZXMpCisgIDE3NzgxICAyNDQgICAgYiAgICAgICAgamF2YS5pby5EYXRhSW5wdXRTdHJlYW06OnJlYWRVVEYgKDUwMSBieXRlcykKKyAgMTc4MjIgIDI0NSAgICBiICAgICAgICBzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyOjpjaGVjayAoNzggYnl0ZXMpCisgIDE3ODI5ICAyNDYgIHMgYiAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW06OndyaXRlICgzMiBieXRlcykKKyAgMTc4NTQgIDI0NyAgICBiICAgICAgICBzdW4uc2VjdXJpdHkudXRpbC5EZXJJbnB1dFN0cmVhbTo6PGluaXQ+ICgxOSBieXRlcykKKyAgMTc4NTggIDI0OCAgICBiICAgICAgICBzdW4uc2VjdXJpdHkudXRpbC5EZXJJbnB1dFN0cmVhbTo6YXZhaWxhYmxlICg4IGJ5dGVzKQorICAxNzg2MyAgMjQ5ICAgIWIgICAgICAgIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTo6aGFzaENvZGUgKDM0IGJ5dGVzKQorICAxNzg4OSAgMjAyICAgISAgICAgICAgIHN1bi5taXNjLlVSTENsYXNzUGF0aCRKYXJMb2FkZXI6OmdldFJlc291cmNlICg5MSBieXRlcykgICBtYWRlIG5vdCBlbnRyYW50CisgIDE3OTE5ICAyNTAgICAgYiAgICAgICAgamF2YS51dGlsLkFycmF5czo6ZXF1YWxzICg1NCBieXRlcykKKyAgMTc5MzAgIDI1MSAgICBiICAgICAgICBqYXZhLnV0aWwuQXJyYXlzOjpoYXNoQ29kZSAoNDQgYnl0ZXMpCisgIDE3OTM2ICAyNTIgICAgYiAgICAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXI6Om11bEFkZCAoODEgYnl0ZXMpCisgIDE3OTU3ICAxOTUgICAgICAgICAgICAgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI6Om1hdGNoICgxMDkgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxNzk2NSAgICA0ICUgIGIgICAgICAgIGNvbS5zdW4uY3J5cHRvLnByb3ZpZGVyLkFFU0NyeXB0Ojo8Y2xpbml0PiBAIDcyNCAoMTU3NyBieXRlcykKKyAgMTgwNzMgIDIzMiAgICAgICAgICAgICBqYXZhLmxhbmcuSW50ZWdlcjo6cGFyc2VJbnQgKDI2MSBieXRlcykgICBtYWRlIG5vdCBlbnRyYW50CisgIDE4MTQyICAyMzMgICAgICAgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6ZGlnaXQgKDYgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxODE0MiAgIDc0ICAgICAgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXJEYXRhOjpvZiAoMTIwIGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTgxNDIgICA5MSAgICAgICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UgKDUgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxODE0MiAgIDk0ICAgICAgICAgICAgIHN1bi5yZWZsZWN0LmdlbmVyaWNzLnBhcnNlci5TaWduYXR1cmVQYXJzZXI6OnBhcnNlSWRlbnRpZmllciAoMTE1IGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTgxNDIgICA5MiAgICAgICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UgKDkgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxODE0MiAgMTU1ICAgICAgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OnRvTG93ZXJDYXNlICg5IGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTgxNDIgIDIwMSAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nOjp0b1VwcGVyQ2FzZSAoNDQyIGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTgxNDIgIDIzNCAgICAgICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjpkaWdpdCAoMTAgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxODE0MiAgMjI3ICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnRvTG93ZXJDYXNlICg0NzcgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICAxODE0MyAgMjUzICAgIGIgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OnRvVXBwZXJDYXNlRXggKDMwIGJ5dGVzKQorICAxODE0NSAgIDEwICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OmVxdWFscyAoODggYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgMTgxNDggIDI1NCAgICBiICAgICAgICBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW06OmdldEJ1ZklmT3BlbiAoMjEgYnl0ZXMpCisgIDE4MTQ4ICAyNTUgIHMgYiAgICAgICAgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOjpyZWFkICg0OSBieXRlcykKKyAgMTgxNTEgIDI1NiAgICBiICAgICAgICBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTo6cmVhZENoYXIgKDQwIGJ5dGVzKQorICAxODE1OCAgMTkzICAgICAgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuJENoYXJQcm9wZXJ0eTo6bWF0Y2ggKDU2IGJ5dGVzKSAgIG1hZGUgem9tYmllCisgIDE4MTU4ICAyMjQgICAgICAgICAgICAgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uV3JpdGVyOjpzdHJpbmcgKDM2NSBieXRlcykgICBtYWRlIHpvbWJpZQorICAxODE1OCAgICA1ICUgIGIgICAgICAgIHN1bi50ZXh0Lm5vcm1hbGl6ZXIuTm9ybWFsaXplckRhdGFSZWFkZXI6OnJlYWQgQCAxMSAoODMgYnl0ZXMpCisgIDE4MTY1ICAyNTYgICAgICAgICAgICAgamF2YS5pby5EYXRhSW5wdXRTdHJlYW06OnJlYWRDaGFyICg0MCBieXRlcykgICBtYWRlIG5vdCBlbnRyYW50CisgIDE4MTY5ICAyNTcgICAgYiAgICAgICAgamF2YS5pby5EYXRhSW5wdXRTdHJlYW06OnJlYWRJbnQgKDcyIGJ5dGVzKQorICAxODE4MCAgMjU4ICAgIGIgICAgICAgIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOjpyZWFkQ2hhciAoNDAgYnl0ZXMpCisgIDE4MTkyICAyNTkgICAgYiAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXI6OmFwcGVuZCAoOCBieXRlcykKKyAgMTgyMDMgIDI2MCAgICBiICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YTo6b2YgKDEyMCBieXRlcykKKyAgMTgyMDYgIDI2MSAgICBiICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjp0b0xvd2VyQ2FzZSAoNiBieXRlcykKK21hZGUgbm90IGNvbXBpbGFibGUgIGphdmEubGFuZy5DaGFyYWN0ZXJEYXRhOjp0b0xvd2VyQ2FzZQorICAxODIwOCAgMjYyICAgIGIgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnRvTG93ZXJDYXNlICg0NzcgYnl0ZXMpCisgIDE4MjI5ICAyNjMgICAgYiAgICAgICAgamF2YS5sYW5nLlN0cmluZzo6dG9VcHBlckNhc2UgKDQ0MiBieXRlcykKKyAgMTgyNTEgIDI2NCAgICBiICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UgKDUgYnl0ZXMpCittYWRlIG5vdCBjb21waWxhYmxlICBqYXZhLmxhbmcuQ2hhcmFjdGVyRGF0YTo6aXNXaGl0ZXNwYWNlCisgIDE4MjUxICAyNjUgICAgYiAgICAgICAgamF2YS5sYW5nLkNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlICg5IGJ5dGVzKQorICAxODI1NSAgMjY2ICAgIGIgICAgICAgIHN1bi50ZXh0Lm5vcm1hbGl6ZXIuTm9ybWFsaXplckJhc2U6Om5vcm1hbGl6ZSAoMjIzIGJ5dGVzKQorICAxODI2MiAgMjY3ICAgIWIgICAgICAgIHN1bi5zZWN1cml0eS54NTA5LkFWQTo6dG9SRkMyMjUzQ2Fub25pY2FsU3RyaW5nICg0ODQgYnl0ZXMpCittYWRlIG5vdCBjb21waWxhYmxlICBqYXZhLm5pby5jaGFyc2V0LnNwaS5DaGFyc2V0UHJvdmlkZXI6OmNoYXJzZXRGb3JOYW1lCisgIDE4MzM0ICAyNjggICAgYiAgICAgICAgamF2YS5sYW5nLlN0cmluZzo6cmVnaW9uTWF0Y2hlcyAoMTU3IGJ5dGVzKQorbWFkZSBub3QgY29tcGlsYWJsZSAgamF2YS5sYW5nLkNoYXJhY3RlckRhdGE6OnRvVXBwZXJDYXNlCisgIDE4MzQ3ICAgIDcgICAgICAgICAgICAgc3VuLm5pby5jcy5VVEZfOCREZWNvZGVyOjpkZWNvZGUgKDY0MCBieXRlcykgICBtYWRlIHpvbWJpZQorICAxODM0NyAgIDM0ICAgICAgICAgICAgIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldERlY29kZXI6Om1heENoYXJzUGVyQnl0ZSAoNSBieXRlcykgICBtYWRlIHpvbWJpZQorICAxODM0NyAgIDczICBzICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOjp3cml0ZSAoMzIgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgMTgzNDcgICAzOCAgICAgICAgICAgICBqYXZhLnV0aWwuemlwLlppcEZpbGU6OmdldFppcEVudHJ5ICgyNDUgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgMTgzNDggIDIzMiAgICAgICAgICAgICBqYXZhLmxhbmcuSW50ZWdlcjo6cGFyc2VJbnQgKDI2MSBieXRlcykgICBtYWRlIHpvbWJpZQorICAxODM0OCAgMjQ5ICAgISAgICAgICAgIGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTo6aGFzaENvZGUgKDM0IGJ5dGVzKSAgIG1hZGUgbm90IGVudHJhbnQKKyAgMTgzNTcgIDI2OSAgICBiICAgICAgICBzdW4uc2VjdXJpdHkucHJvdmlkZXIuU0hBOjppbXBsQ29tcHJlc3MgKDQ5MSBieXRlcykKKyAgMTg0MjkgICAgNiAlICBiICAgICAgICBjb20uc3VuLmNyeXB0by5wcm92aWRlci5BUkNGT1VSQ2lwaGVyOjpjcnlwdCBAIDE1ICgxMjkgYnl0ZXMpCisgIDE4NDM1ICAyNzAgICAgIG4gICAgICAgc3VuLm1pc2MuVW5zYWZlOjpnZXRJbnQgKDAgYnl0ZXMpICAgCisgIDE4NDM2ICAyNzEgICAgYiAgICAgICAgamF2YS5sYW5nLkludGVnZXI6OnJldmVyc2VCeXRlcyAoMjYgYnl0ZXMpCisgIDE4NDM2ICAyNzIgICAgYiAgICAgICAgY29tLnN1bi5jcnlwdG8ucHJvdmlkZXIuQVJDRk9VUkNpcGhlcjo6Y3J5cHQgKDEyOSBieXRlcykKKyAgMTg0NDIgIDIwMiAgICEgICAgICAgICBzdW4ubWlzYy5VUkxDbGFzc1BhdGgkSmFyTG9hZGVyOjpnZXRSZXNvdXJjZSAoOTEgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgMTg0NDIgIDE5NSAgICAgICAgICAgICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjo6bWF0Y2ggKDEwOSBieXRlcykgICBtYWRlIHpvbWJpZQorICA0OTM4MSAgMjMzICAgICAgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OmRpZ2l0ICg2IGJ5dGVzKSAgIG1hZGUgem9tYmllCisgIDQ5MzgxICAgNzQgICAgICAgICAgICAgamF2YS5sYW5nLkNoYXJhY3RlckRhdGE6Om9mICgxMjAgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgNDkzODEgICA5MSAgICAgICAgICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UgKDUgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgNDkzODEgICA5NCAgICAgICAgICAgICBzdW4ucmVmbGVjdC5nZW5lcmljcy5wYXJzZXIuU2lnbmF0dXJlUGFyc2VyOjpwYXJzZUlkZW50aWZpZXIgKDExNSBieXRlcykgICBtYWRlIHpvbWJpZQorICA0OTM4MSAgIDkyICAgICAgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OmlzV2hpdGVzcGFjZSAoOSBieXRlcykgICBtYWRlIHpvbWJpZQorICA0OTM4MSAgMTU1ICAgICAgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OnRvTG93ZXJDYXNlICg5IGJ5dGVzKSAgIG1hZGUgem9tYmllCisgIDQ5MzgxICAxNjEgIHMhICAgICAgICAgc3VuLm1pc2MuVVJMQ2xhc3NQYXRoOjpnZXRMb2FkZXIgKDE4MiBieXRlcykgICBtYWRlIG5vdCBlbnRyYW50CisgIDQ5MzgxICAyMDEgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZzo6dG9VcHBlckNhc2UgKDQ0MiBieXRlcykgICBtYWRlIHpvbWJpZQorICA0OTM4MSAgMjM0ICAgICAgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXI6OmRpZ2l0ICgxMCBieXRlcykgICBtYWRlIHpvbWJpZQorICA0OTM4MSAgMjI3ICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmc6OnRvTG93ZXJDYXNlICg0NzcgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgNDkzODIgIDI3MyAgICBiICAgICAgICBzdW4ubWlzYy5VUkxDbGFzc1BhdGgkTG9hZGVyU2VhcmNoQ3Vyc29yOjpuZXh0TG9hZGVyICgyMTEgYnl0ZXMpCisgIDQ5NDA2ICAgNjYgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXA6OmdldCAoNzkgYnl0ZXMpICAgbWFkZSBub3QgZW50cmFudAorICA0OTQyMCAgMjc0ICAgIGIgICAgICAgIGphdmEudXRpbC5IYXNoTWFwJEVudHJ5SXRlcmF0b3I6Om5leHQgKDUgYnl0ZXMpCisgIDQ5NDIyICAyNzUgICAgYiAgICAgICAgamF2YS51dGlsLkhhc2hNYXAkRW50cnlJdGVyYXRvcjo6bmV4dCAoNSBieXRlcykKKyAgNDk0MzQgIDI3NiAgICBiICAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCRFbnRyeTo6aGFzaENvZGUgKDM4IGJ5dGVzKQorICA0OTQzNiAgMjU2ICAgICAgICAgICAgIGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOjpyZWFkQ2hhciAoNDAgYnl0ZXMpICAgbWFkZSB6b21iaWUKKyAgNDk0MzYgIDI3NyAgICBiICAgICAgICBqYXZhLnV0aWwuQWJzdHJhY3RNYXA6Omhhc2hDb2RlICg0MyBieXRlcykKK21hZGUgbm90IGNvbXBpbGFibGUgIGphdmEudXRpbC5BYnN0cmFjdE1hcDo6ZW50cnlTZXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jYWxpcGVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL2pkazctZmxhZ3MudHh0IGIvY2FsaXBlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9qZGs3LWZsYWdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDljZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FsaXBlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9jYWxpcGVyL2JyaWRnZS9qZGs3LWZsYWdzLnR4dApAQCAtMCwwICsxLDgzMiBAQAorICAgICBib29sIEFIUkJ5RGVhdGhDb2xsZWN0VGltZVJhdGlvICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQUhSQnlNaW5vclBhdXNlVGltZU1ham9yRnJlcSAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBBSFJCeVByb21vVG9BbGxvY1JhdGlvICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEFIUkJ5U3Vydml2b3JBZ2UgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQUhSSW5jcmVtZW50U2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjQyODgwICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBBSFJNYXhEZWF0aENvbGxlY3RUaW1lUmF0aW8gICAgICAgICAgICAgICA9IDU1ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFIUk1heE1pbm9ySW52b2NhdGlvbnNQZXJNYWpvciAgICAgICAgICAgID0gMzAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQUhSTWF4TWlub3JQYXVzZVRpbWVNaWxsaXMgICAgICAgICAgICAgICAgPSAxMDAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBBSFJNYXhQcm9tb1RvQWxsb2NSYXRpbyAgICAgICAgICAgICAgICAgICA9IDI1ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFIUk1heFJhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQUhSTWF4U2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDQ4NTc2MDAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBBSFJNYXhTdXJ2aXZvckFnZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFIUk1pbkRlYXRoQ29sbGVjdFRpbWVSYXRpbyAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQUhSTWluTWlub3JJbnZvY2F0aW9uc1Blck1ham9yICAgICAgICAgICAgPSA1ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBBSFJNaW5NaW5vclBhdXNlVGltZU1pbGxpcyAgICAgICAgICAgICAgICA9IDE1MCAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFIUk1pblByb21vVG9BbGxvY1JhdGlvICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQUhSTWluU3Vydml2b3JBZ2UgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBBZGFwdGl2ZUhlYXBSZWJhbGFuY2UgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFkYXB0aXZlUGVybVNpemVXZWlnaHQgICAgICAgICAgICAgICAgICAgID0gMjAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQWRhcHRpdmVTaXplRGVjcmVtZW50U2NhbGVGYWN0b3IgICAgICAgICAgPSA0ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBBZGFwdGl2ZVNpemVNYWpvckdDRGVjYXlUaW1lU2NhbGUgICAgICAgICA9IDEwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFkYXB0aXZlU2l6ZVBhdXNlUG9saWN5ICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQWRhcHRpdmVTaXplUG9saWN5Q29sbGVjdGlvbkNvc3RNYXJnaW4gICAgPSA1MCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBBZGFwdGl2ZVNpemVQb2xpY3lJbml0aWFsaXppbmdTdGVwcyAgICAgICA9IDIwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFkYXB0aXZlU2l6ZVBvbGljeU91dHB1dEludGVydmFsICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQWRhcHRpdmVTaXplUG9saWN5V2VpZ2h0ICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBBZGFwdGl2ZVNpemVUaHJvdWdoUHV0UG9saWN5ICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFkYXB0aXZlVGltZVdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgID0gMjUgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQWRqdXN0Q29uY3VycmVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBBZ2dyZXNzaXZlT3B0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEFsaWFzTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQWxsb2NhdGVJbnN0YW5jZVByZWZldGNoTGluZXMgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBBbGxvY2F0ZVByZWZldGNoRGlzdGFuY2UgICAgICAgICAgICAgICAgICA9IDE5MiAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEFsbG9jYXRlUHJlZmV0Y2hJbnN0ciAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQWxsb2NhdGVQcmVmZXRjaExpbmVzICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBBbGxvY2F0ZVByZWZldGNoU3RlcFNpemUgICAgICAgICAgICAgICAgICA9IDY0ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEFsbG9jYXRlUHJlZmV0Y2hTdHlsZSAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQWxsb3dKTklFbnZQcm94eSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBBbGxvd1BhcmFsbGVsRGVmaW5lQ2xhc3MgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEFsbG93VXNlclNpZ25hbEhhbmRsZXJzICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQWx3YXlzQWN0QXNTZXJ2ZXJDbGFzc01hY2hpbmUgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBBbHdheXNDb21waWxlTG9vcE1ldGhvZHMgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEFsd2F5c0luZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQWx3YXlzTG9ja0NsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBBbHdheXNQcmVUb3VjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEFsd2F5c1Jlc3RvcmVGUFUgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQWx3YXlzVGVudXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBBbm9ueW1vdXNDbGFzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEFycmF5Y29weURzdFByZWZldGNoRGlzdGFuY2UgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQXJyYXljb3B5U3JjUHJlZmV0Y2hEaXN0YW5jZSAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBBc3NlcnRPblN1c3BlbmRXYWl0RmFpbHVyZSAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEF0b21pY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQXV0b0JveENhY2hlTWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjggICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICB1aW50eCBBdXRvR0NTZWxlY3RQYXVzZU1pbGxpcyAgICAgICAgICAgICAgICAgICA9IDUwMDAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEJDRUFUcmFjZUxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQmFja0VkZ2VUaHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAwMDAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBCYWNrZ3JvdW5kQ29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgIHVpbnR4IEJhc2VGb290UHJpbnRFc3RpbWF0ZSAgICAgICAgICAgICAgICAgICAgID0gMjY4NDM1NDU2ICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQmlhc2VkTG9ja2luZ0J1bGtSZWJpYXNUaHJlc2hvbGQgICAgICAgICAgPSAyMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBCaWFzZWRMb2NraW5nQnVsa1Jldm9rZVRocmVzaG9sZCAgICAgICAgICA9IDQwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEJpYXNlZExvY2tpbmdEZWNheVRpbWUgICAgICAgICAgICAgICAgICAgID0gMjUwMDAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQmlhc2VkTG9ja2luZ1N0YXJ0dXBEZWxheSAgICAgICAgICAgICAgICAgPSA0MDAwICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBCaW5kQ01TVGhyZWFkVG9DUFUgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIEJpbmRHQ1Rhc2tUaHJlYWRzVG9DUFVzICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQmxvY2tDb3B5TG93TGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDQ4ICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBCbG9ja0xheW91dEJ5RnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IEJsb2NrTGF5b3V0TWluRGlhbW9uZFBlcmNlbnRhZ2UgICAgICAgICAgID0gMjAgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgQmxvY2tMYXlvdXRSb3RhdGVMb29wcyAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBCbG9ja09mZnNldEFycmF5VXNlVW5hbGxvY2F0ZWRCbG9jayAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBpbnR4IEJsb2NrWmVyb2luZ0xvd0xpbWl0ICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQnJhbmNoT25SZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBCeXRlY29kZVZlcmlmaWNhdGlvbkxvY2FsICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEJ5dGVjb2RlVmVyaWZpY2F0aW9uUmVtb3RlICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQzFPcHRpbWl6ZVZpcnR1YWxDYWxsUHJvZmlsaW5nICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MxIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBDMVByb2ZpbGVCcmFuY2hlcyAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzEgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIEMxUHJvZmlsZUNhbGxzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtDMSBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgQzFQcm9maWxlQ2hlY2tjYXN0cyAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MxIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBDMVByb2ZpbGVJbmxpbmVkQ2FsbHMgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzEgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIEMxUHJvZmlsZVZpcnR1YWxDYWxscyAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtDMSBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgQzFVcGRhdGVNZXRob2REYXRhICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MxIHByb2R1Y3R9ICAgICAgICAKKyAgICAgaW50eCBDSUNvbXBpbGVyQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENJQ29tcGlsZXJDb3VudFBlckNQVSAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ0lUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNBYm9ydFNlbWFudGljcyAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU0Fib3J0YWJsZVByZWNsZWFuTWluV29ya1Blckl0ZXJhdGlvbiAgID0gMTAwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQ01TQWJvcnRhYmxlUHJlY2xlYW5XYWl0TWlsbGlzICAgICAgICAgICAgPSAxMDAgICAgICAgICAgICAge21hbmFnZWFibGV9ICAgICAgICAKKyAgICB1aW50eCBDTVNCaXRNYXBZaWVsZFF1YW50dW0gICAgICAgICAgICAgICAgICAgICA9IDEwNDg1NzYwICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU0Jvb3RzdHJhcE9jY3VwYW5jeSAgICAgICAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ01TQ2xhc3NVbmxvYWRpbmdFbmFibGVkICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNDbGFzc1VubG9hZGluZ01heEludGVydmFsICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENNU0NsZWFuT25FbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ01TQ29tcGFjdFdoZW5DbGVhckFsbFNvZnRSZWZzICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNDb25jTWFya011bHRpcGxlICAgICAgICAgICAgICAgICAgICAgICA9IDMyICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENNU0NvbmN1cnJlbnRNVEVuYWJsZWQgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TQ29vcmRpbmF0b3JZaWVsZFNsZWVwQ291bnQgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNEdW1wQXRQcm9tb3Rpb25GYWlsdXJlICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENNU0VkZW5DaHVua3NSZWNvcmRBbHdheXMgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TRXhwQXZnRmFjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNFeHRyYXBvbGF0ZVN3ZWVwICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU0Z1bGxHQ3NCZWZvcmVDb21wYWN0aW9uICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TSW5jcmVtZW50YWxEdXR5Q3ljbGUgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNJbmNyZW1lbnRhbER1dHlDeWNsZU1pbiAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENNU0luY3JlbWVudGFsTW9kZSAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TSW5jcmVtZW50YWxPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNJbmNyZW1lbnRhbFBhY2luZyAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU0luY3JlbWVudGFsU2FmZXR5RmFjdG9yICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TSW5kZXhlZEZyZWVMaXN0UmVwbGVuaXNoICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBDTVNJbml0aWF0aW5nT2NjdXBhbmN5RnJhY3Rpb24gICAgICAgICAgICA9IC0xICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IENNU0luaXRpYXRpbmdPY2N1cGFuY3lGcmFjdGlvbkRlbHRhICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQ01TSW5pdGlhdGluZ1Blcm1PY2N1cGFuY3lGcmFjdGlvbiAgICAgICAgPSAtMSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBDTVNJbml0aWF0aW5nUGVybU9jY3VwYW5jeUZyYWN0aW9uRGVsdGEgICA9IC0xICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IENNU0luaXRpYXRpbmdSYW1MaW1pdEZyYWN0aW9uICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQ01TSXNUb29GdWxsUGVyY2VudGFnZSAgICAgICAgICAgICAgICAgICAgPSA5OCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgIGRvdWJsZSBDTVNMYXJnZUNvYWxTdXJwbHVzUGVyY2VudCAgICAgICAgICAgICAgICA9IDAuOTUwMDAwICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgZG91YmxlIENNU0xhcmdlU3BsaXRTdXJwbHVzUGVyY2VudCAgICAgICAgICAgICAgID0gMS4wMDAwMDAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ01TTG9vcFdhcm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNNYXhBYm9ydGFibGVQcmVjbGVhbkxvb3BzICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IENNU01heEFib3J0YWJsZVByZWNsZWFuVGltZSAgICAgICAgICAgICAgID0gNTAwMCAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TT2xkUExBQk1heCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDI0ICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNPbGRQTEFCTWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU09sZFBMQUJOdW1SZWZpbGxzICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TT2xkUExBQlJlYWN0aXZpdHlDZWlsaW5nICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNPbGRQTEFCUmVhY3Rpdml0eUZhY3RvciAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENNU09sZFBMQUJSZXNpemVRdWlja2VyICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TT2xkUExBQlRvbGVyYW5jZUZhY3RvciAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNQTEFCUmVjb3JkQWx3YXlzICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU1BhclByb21vdGVCbG9ja3NUb0NsYWltICAgICAgICAgICAgICAgID0gMTYgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ01TUGFyYWxsZWxJbml0aWFsTWFya0VuYWJsZWQgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNQYXJhbGxlbFJlbWFya0VuYWJsZWQgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU1BhcmFsbGVsU1RXRnVsbEdDSGVhcFJlZ2lvblNpemUgICAgICAgID0gMTA0ODU3NiAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ01TUGFyYWxsZWxTdXJ2aXZvclJlbWFya0VuYWJsZWQgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNQZXJtR2VuUHJlY2xlYW5pbmdFbmFibGVkICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU1ByZWNsZWFuRGVub21pbmF0b3IgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TUHJlY2xlYW5JdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNQcmVjbGVhbk51bWVyYXRvciAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENNU1ByZWNsZWFuUmVmTGlzdHMxICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ01TUHJlY2xlYW5SZWZMaXN0czIgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNQcmVjbGVhblN1cnZpdm9yczEgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENNU1ByZWNsZWFuU3Vydml2b3JzMiAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TUHJlY2xlYW5UaHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgPSAxMDAwICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNQcmVjbGVhbmluZ0VuYWJsZWQgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENNU1ByaW50Q2h1bmtzSW5EdW1wICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ01TUHJpbnRFZGVuU3Vydml2b3JDaHVua3MgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNQcmludE9iamVjdHNJbkR1bXAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU1JlbWFya1ZlcmlmeVZhcmlhbnQgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ01TUmVwbGVuaXNoSW50ZXJtZWRpYXRlICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNSZXNjYW5NdWx0aXBsZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU1JldmlzaXRTdGFja1NpemUgICAgICAgICAgICAgICAgICAgICAgID0gMTA0ODU3NiAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TU2FtcGxpbmdHcmFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjM4NCAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNTY2F2ZW5nZUJlZm9yZVJlbWFyayAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU1NjaGVkdWxlUmVtYXJrRWRlblBlbmV0cmF0aW9uICAgICAgICAgID0gNTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TU2NoZWR1bGVSZW1hcmtFZGVuU2l6ZVRocmVzaG9sZCAgICAgICAgPSAyMDk3MTUyICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNTY2hlZHVsZVJlbWFya1NhbXBsaW5nUmF0aW8gICAgICAgICAgICA9IDUgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgZG91YmxlIENNU1NtYWxsQ29hbFN1cnBsdXNQZXJjZW50ICAgICAgICAgICAgICAgID0gMS4wNTAwMDAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICBkb3VibGUgQ01TU21hbGxTcGxpdFN1cnBsdXNQZXJjZW50ICAgICAgICAgICAgICAgPSAxLjEwMDAwMCAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNTcGxpdEluZGV4ZWRGcmVlTGlzdEJsb2NrcyAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IENNU1RyaWdnZXJQZXJtUmF0aW8gICAgICAgICAgICAgICAgICAgICAgID0gODAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQ01TVHJpZ2dlclJhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNVc2VHQ092ZXJoZWFkTGltaXQgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IENNU1dhaXREdXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAwMCAgICAgICAgICAgIHttYW5hZ2VhYmxlfSAgICAgICAgCisgICAgdWludHggQ01TV29ya1F1ZXVlRHJhaW5UaHJlc2hvbGQgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDTVNZaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU1lpZWxkU2xlZXBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQ01TWW91bmdHZW5QZXJXb3JrZXIgICAgICAgICAgICAgICAgICAgICAgPSA2NzEwODg2NCAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICB1aW50eCBDTVNfRkxTUGFkZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU19GTFNXZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ01TX1N3ZWVwUGFkZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDTVNfU3dlZXBUaW1lclRocmVzaG9sZE1pbGxpcyAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENNU19Td2VlcFdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggQ1BVRm9yQ01TVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBDaGVja0pOSUNhbGxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENsYXNzVW5sb2FkaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQ2xlYXJGUFVBdFBhcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBDbGlwSW5saW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IENvZGVDYWNoZUV4cGFuc2lvblNpemUgICAgICAgICAgICAgICAgICAgID0gMzI3NjggICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgdWludHggQ29kZUNhY2hlRmx1c2hpbmdNaW5pbXVtRnJlZVNwYWNlICAgICAgICAgPSAxNTM2MDAwICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBDb2RlQ2FjaGVNaW5pbXVtRnJlZVNwYWNlICAgICAgICAgICAgICAgICA9IDUxMjAwMCAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENvbGxlY3RHZW4wRmlyc3QgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ29tcGFjdEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBDb21waWxhdGlvblBvbGljeUNob2ljZSAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IENvbXBpbGF0aW9uUmVwZWF0ICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtDMSBwcm9kdWN0fSAgICAgICAgCitjY3N0cmxpc3QgQ29tcGlsZUNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICBjY3N0ciBDb21waWxlQ29tbWFuZEZpbGUgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorY2NzdHJsaXN0IENvbXBpbGVPbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQ29tcGlsZVRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAwMCAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBDb21waWxlclRocmVhZEhpbnROb1ByZWVtcHQgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IENvbXBpbGVyVGhyZWFkUHJpb3JpdHkgICAgICAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggQ29tcGlsZXJUaHJlYWRTdGFja1NpemUgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICB1aW50eCBDb25jR0NUaHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IENvbmRpdGlvbmFsTW92ZUxpbWl0ICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgIHtDMiBwZCBwcm9kdWN0fSAgICAgCisgICAgIGJvb2wgQ29udmVydFNsZWVwVG9ZaWVsZCAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBDb252ZXJ0WWllbGRUb1NsZWVwICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIENyZWF0ZU1pbmlkdW1wT25DcmFzaCAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgQ3ljbGVUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBEVHJhY2VBbGxvY1Byb2JlcyAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIERUcmFjZU1ldGhvZFByb2JlcyAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRFRyYWNlTW9uaXRvclByb2JlcyAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBEZWFsbG9jYXRlSGVhcFBhZ2VzICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIERlYWxsb2NhdGVTdGFja1BhZ2VzICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggRGVhbGxvY2F0ZVN0YWNrUGFnZXNNaW5JbnRlcnZhbE1zICAgICAgICAgPSAxMDAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBEZWJ1Z0NvbnRpbnVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIERlYnVnSW5saW5lZENhbGxzICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgRGVidWdOb25TYWZlcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICB1aW50eCBEZWZhdWx0TWF4UkFNRnJhY3Rpb24gICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IERlZmF1bHRUaHJlYWRQcmlvcml0eSAgICAgICAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRGVmZXJJbml0aWFsQ2FyZE1hcmsgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgaW50eCBEZWZlclBvbGxpbmdQYWdlTG9vcENvdW50ICAgICAgICAgICAgICAgICA9IC0xICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IERlZmVyVGhyU3VzcGVuZExvb3BDb3VudCAgICAgICAgICAgICAgICAgID0gNDAwMCAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRGVvcHRpbWl6ZVJhbmRvbSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBEaXNhYmxlQXR0YWNoTWVjaGFuaXNtICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIERpc2FibGVFeHBsaWNpdEdDICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCitjY3N0cmxpc3QgRGlzYWJsZUludHJpbnNpYyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBEaXNwbGF5Vk1PdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIERpc3BsYXlWTU91dHB1dFRvU3RkZXJyICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRGlzcGxheVZNT3V0cHV0VG9TdGRvdXQgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBEb0VzY2FwZUFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IERvbWluYXRvclNlYXJjaExpbWl0ICAgICAgICAgICAgICAgICAgICAgID0gMTAwMCAgICAgICAgICAgIHtDMiBkaWFnbm9zdGljfSAgICAgCisgICAgIGJvb2wgRG9udENvbXBpbGVIdWdlTWV0aG9kcyAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBEb250WWllbGRBTG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIER1bXBTaGFyZWRTcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRWFnZXJYcnVuSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBFbGltaW5hdGVBbGxvY2F0aW9uQXJyYXlTaXplTGltaXQgICAgICAgICA9IDY0ICAgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIEVsaW1pbmF0ZUFsbG9jYXRpb25zICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgRWxpbWluYXRlQXV0b0JveCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge0MyIGRpYWdub3N0aWN9ICAgICAKKyAgICAgYm9vbCBFbGltaW5hdGVMb2NrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IEVtaXRTeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRW5hYmxlSW52b2tlRHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICB1aW50eCBFcmdvSGVhcFNpemVMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIGNjc3RyIEVycm9yRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgY2NzdHIgRXJyb3JSZXBvcnRTZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBFc3RpbWF0ZUFyZ0VzY2FwZSAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEV2ZW50TG9nTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAwMCAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRXhwbGljaXRHQ0ludm9rZXNDb25jdXJyZW50ICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBFeHBsaWNpdEdDSW52b2tlc0NvbmN1cnJlbnRBbmRVbmxvYWRzQ2xhc3NlcyAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBFeHRlbmRlZERUcmFjZVByb2JlcyAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEZMU0Fsd2F5c0NvYWxlc2NlTGFyZ2UgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggRkxTQ29hbGVzY2VQb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgIGRvdWJsZSBGTFNMYXJnZXN0QmxvY2tDb2FsZXNjZVByb3hpbWl0eSAgICAgICAgICA9IDAuOTkwMDAwICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEZMU1ZlcmlmeUFsbEhlYXBSZWZlcmVuY2VzICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgRkxTVmVyaWZ5SW5kZXhUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBGTFNWZXJpZnlMaXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIEZhaWxPdmVyVG9PbGRWZXJpZmllciAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRmFzdENhcmRUYWJsZVNjYW4gICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBGYXN0VExBQlJlZmlsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEZlbmNlSW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggRmllbGRzQWxsb2NhdGlvblN0eWxlICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBGaWx0ZXJTcHVyaW91c1dha2V1cHMgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEZvcmNlTlVNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgRm9yY2VUaW1lSGlnaFJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBGcmVxSW5saW5lU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNSAgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIEZ1bGxQcm9maWxlT25SZUludGVycHJldCAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICBkb3VibGUgRzFDb25jTWFya1N0ZXBEdXJhdGlvbk1pbGxpcyAgICAgICAgICAgICAgPSAxMC4wMDAwMDAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBHMUNvbmNSZWZpbmVtZW50R3JlZW5ab25lICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEcxQ29uY1JlZmluZW1lbnRSZWRab25lICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggRzFDb25jUmVmaW5lbWVudFNlcnZpY2VJbnRlcnZhbE1pbGxpcyAgICAgPSAzMDAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBHMUNvbmNSZWZpbmVtZW50VGhyZWFkcyAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEcxQ29uY1JlZmluZW1lbnRUaHJlc2hvbGRTdGVwICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggRzFDb25jUmVmaW5lbWVudFllbGxvd1pvbmUgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBHMUNvbmZpZGVuY2VQZXJjZW50ICAgICAgICAgICAgICAgICAgICAgICA9IDUwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEcxSGVhcFJlZ2lvblNpemUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggRzFNYXJrUmVnaW9uU3RhY2tTaXplICAgICAgICAgICAgICAgICAgICAgPSAxMDQ4NTc2ICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBHMVByaW50SGVhcFJlZ2lvbnMgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIEcxUHJpbnRSZWdpb25MaXZlbmVzc0luZm8gICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGludHggRzFSU2V0UmVnaW9uRW50cmllcyAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBHMVJTZXRTY2FuQmxvY2tTaXplICAgICAgICAgICAgICAgICAgICAgICA9IDY0ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEcxUlNldFNwYXJzZVJlZ2lvbkVudHJpZXMgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggRzFSU2V0VXBkYXRpbmdQYXVzZVRpbWVQZXJjZW50ICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBHMVJlZlByb2NEcmFpbkludGVydmFsICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEcxUmVzZXJ2ZVBlcmNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggRzFTQVRCQnVmZmVyRW5xdWV1ZWluZ1RocmVzaG9sZFBlcmNlbnQgICAgPSA2MCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBHMVNBVEJCdWZmZXJTaXplICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMjQgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEcxU3VtbWFyaXplQ29uY01hcmsgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgRzFTdW1tYXJpemVSU2V0U3RhdHMgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgaW50eCBHMVN1bW1hcml6ZVJTZXRTdGF0c1BlcmlvZCAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIEcxVHJhY2VDb25jUmVmaW5lbWVudCAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGludHggRzFVcGRhdGVCdWZmZXJTaXplICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTYgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBHMVVzZUFkYXB0aXZlQ29uY1JlZmluZW1lbnQgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEdDRHJhaW5TdGFja1RhcmdldFNpemUgICAgICAgICAgICAgICAgICAgID0gNjQgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggR0NIZWFwRnJlZUxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBHQ0xvY2tlckVkZW5FeHBhbnNpb25QZXJjZW50ICAgICAgICAgICAgICA9IDUgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEdDTG9ja2VySW52b2tlc0NvbmN1cnJlbnQgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggR0NMb2dGaWxlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBHQ092ZXJoZWFkUmVwb3J0aW5nICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEdDT3ZlcmhlYWRSZXBvcnRpbmdQZXJpb2RNUyAgICAgICAgICAgICAgID0gMTAwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgR0NQYXJhbGxlbFZlcmlmaWNhdGlvbkVuYWJsZWQgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICB1aW50eCBHQ1BhdXNlSW50ZXJ2YWxNaWxsaXMgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEdDVGFza1RpbWVTdGFtcEVudHJpZXMgICAgICAgICAgICAgICAgICAgID0gMjAwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggR0NUaW1lTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBHQ1RpbWVSYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk5ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEdvb2dsZUFkanVzdEdDVGhyZWFkcyAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgR29vZ2xlQWdlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICBjY3N0ciBHb29nbGVBZ2VudEZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEdvb2dsZUFnZW50V1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgY2NzdHIgR29vZ2xlQWdlbnRXU0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBHb29nbGVBbGlnbkludGVycHJldGVyQ2FsbHMgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEdvb2dsZURldGFpbE9taXR0ZWRTdGFja1RyYWNlICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggR29vZ2xlR0NIZWFwRnJlZUxpbWl0UG9saWN5ICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBHb29nbGVHZXRNZXRob2RzSW5PcmRlciAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIEdvb2dsZUdldE1ldGhvZHNSZXZlcnNlICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgR29vZ2xlSGVhcEluc3RydW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBHb29nbGVIZWFwTW9uaXRvciAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIEdvb2dsZUhlYXBTYW1wbGluZ0luc3RydW1lbnRhdGlvbiAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgR29vZ2xlSW5oZXJpdEFsdFNpZ1N0YWNrICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBHb29nbGVMb2dSb3RhdGlvblNpemUgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgIHVpbnR4IEdvb2dsZU1heEdhcmJhZ2VIZWFwelRyYWNlcyAgICAgICAgICAgICAgID0gMjAwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgR29vZ2xlU2NvcGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBHb29nbGVTb2Z0UmVmTFJVUG9saWN5ICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEdvb2dsZVNvZnRSZWZMUlVQb2xpY3lFeGNsdWRlZE1CICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggR29vZ2xlVXNlQ29uc3RhbnRPTVByb3Zpc2lvbiAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBHb29nbGVVc2VMaWJ1bndpbmQgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIEdvb2dsZVVzZVNTRUZvclZNICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggR3VhcmFudGVlZFNhZmVwb2ludEludGVydmFsICAgICAgICAgICAgICAgPSAxMDAwICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICBjY3N0ciBIUElMaWJQYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEhlYXBCYXNlTWluQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgID0gMjE0NzQ4MzY0OCAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgSGVhcER1bXBBZnRlckZ1bGxHQyAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge21hbmFnZWFibGV9ICAgICAgICAKKyAgICAgYm9vbCBIZWFwRHVtcEJlZm9yZUZ1bGxHQyAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7bWFuYWdlYWJsZX0gICAgICAgIAorICAgICBib29sIEhlYXBEdW1wT25PdXRPZk1lbW9yeUVycm9yICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHttYW5hZ2VhYmxlfSAgICAgICAgCisgICAgY2NzdHIgSGVhcER1bXBQYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAge21hbmFnZWFibGV9ICAgICAgICAKKyAgICB1aW50eCBIZWFwRmlyc3RNYXhpbXVtQ29tcGFjdGlvbkNvdW50ICAgICAgICAgICA9IDMgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEhlYXBNYXhpbXVtQ29tcGFjdGlvbkludGVydmFsICAgICAgICAgICAgID0gMjAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgSG9pc3RGaW5hbExvYWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBJZ25vcmVVbnJlY29nbml6ZWRWTU9wdGlvbnMgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IEluaXRpYWxDb2RlQ2FjaGVTaXplICAgICAgICAgICAgICAgICAgICAgID0gMjM1OTI5NiAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgSW5pdGlhbENvbXBpbGVGYXN0ICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBJbml0aWFsQ29tcGlsZVJlYWxseUZhc3QgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgIHVpbnR4IEluaXRpYWxIZWFwU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gNjcxMDg4NjQgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggSW5pdGlhbFJBTUZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgPSA2NCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBJbml0aWFsU3Vydml2b3JSYXRpbyAgICAgICAgICAgICAgICAgICAgICA9IDggICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEluaXRpYWxUZW51cmluZ1RocmVzaG9sZCAgICAgICAgICAgICAgICAgID0gNyAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggSW5pdGlhdGluZ0hlYXBPY2N1cGFuY3lQZXJjZW50ICAgICAgICAgICAgPSA0NSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBJbmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIElubGluZUdldEN1cnJlbnRUaHJlYWRBbGxvY2F0ZWRNZW1vcnkgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgSW5saW5lTWV0aG9kc1dpdGhOdWxsVW5sb2FkZWRUeXBlc0luU2lnbmF0dXJlICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IElubGluZVNtYWxsQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAwMCAgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgSW5zZXJ0TWVtQmFyQWZ0ZXJBcnJheWNvcHkgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgaW50eCBJbnRlcmlvckVudHJ5QWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICB7QzIgcGQgcHJvZHVjdH0gICAgIAorICAgICBpbnR4IEludGVycHJldGVyUHJvZmlsZVBlcmNlbnRhZ2UgICAgICAgICAgICAgID0gMzMgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgSk5JRGV0YWNoUmVsZWFzZXNNb25pdG9ycyAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBKYXZhTW9uaXRvcnNJblN0YWNrVHJhY2UgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEphdmFQcmlvcml0eTEwX1RvX09TUHJpb3JpdHkgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggSmF2YVByaW9yaXR5MV9Ub19PU1ByaW9yaXR5ICAgICAgICAgICAgICAgPSAtMSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBKYXZhUHJpb3JpdHkyX1RvX09TUHJpb3JpdHkgICAgICAgICAgICAgICA9IC0xICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEphdmFQcmlvcml0eTNfVG9fT1NQcmlvcml0eSAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggSmF2YVByaW9yaXR5NF9Ub19PU1ByaW9yaXR5ICAgICAgICAgICAgICAgPSAtMSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBKYXZhUHJpb3JpdHk1X1RvX09TUHJpb3JpdHkgICAgICAgICAgICAgICA9IC0xICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEphdmFQcmlvcml0eTZfVG9fT1NQcmlvcml0eSAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggSmF2YVByaW9yaXR5N19Ub19PU1ByaW9yaXR5ICAgICAgICAgICAgICAgPSAtMSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBKYXZhUHJpb3JpdHk4X1RvX09TUHJpb3JpdHkgICAgICAgICAgICAgICA9IC0xICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IEphdmFQcmlvcml0eTlfVG9fT1NQcmlvcml0eSAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgTElSRmlsbERlbGF5U2xvdHMgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge0MxIHBkIHByb2R1Y3R9ICAgICAKKyAgICB1aW50eCBMYXJnZVBhZ2VIZWFwU2l6ZVRocmVzaG9sZCAgICAgICAgICAgICAgICA9IDEzNDIxNzcyOCAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIGNjc3RyIExhcmdlUGFnZU1vdW50UG9pbnQgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggTGFyZ2VQYWdlU2l6ZUluQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBMYXp5Qm9vdENsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIExpbmtXZWxsS25vd25DbGFzc2VzICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgTG9nQUhSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBMb2dDTVNQYXJhbGxlbFNUV0Z1bGxHQyAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIExvZ0NvbXBpbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgY2NzdHIgTG9nRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBMb2dHQ092ZXJoZWFkTGltaXQgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIExvZ1ZNT3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgTG9vcExpbWl0Q2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MyIGRpYWdub3N0aWN9ICAgICAKKyAgICAgaW50eCBMb29wT3B0c0NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzICAgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IExvb3BVbnJvbGxMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgIHtDMiBwZCBwcm9kdWN0fSAgICAgCisgICAgIGludHggTG9vcFVucm9sbE1pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBMb29wVW5zd2l0Y2hpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IE1hbGxvY1ZlcmlmeUludGVydmFsICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGludHggTWFsbG9jVmVyaWZ5U3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBNYW5hZ2VtZW50U2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IE1hcmtTdGFja1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjggICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggTWFya1N0YWNrU2l6ZU1heCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTk0MzA0ICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBNYXJrU3dlZXBBbHdheXNDb21wYWN0Q291bnQgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IE1hcmtTd2VlcERlYWRSYXRpbyAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggTWF4QkNFQUVzdGltYXRlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBNYXhCQ0VBRXN0aW1hdGVTaXplICAgICAgICAgICAgICAgICAgICAgICA9IDE1MCAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IE1heERpcmVjdE1lbW9yeVNpemUgICAgICAgICAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgTWF4RkRMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBNYXhHQ01pbm9yUGF1c2VNaWxsaXMgICAgICAgICAgICAgICAgICAgICA9IDQyOTQ5NjcyOTUgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IE1heEdDUGF1c2VNaWxsaXMgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDI5NDk2NzI5NSAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggTWF4SGVhcEZyZWVSYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBNYXhIZWFwU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IDEwNzM3NDE4MjQgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IE1heElubGluZUxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggTWF4SW5saW5lU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBNYXhKYXZhU3RhY2tUcmFjZURlcHRoICAgICAgICAgICAgICAgICAgICA9IDEwMjQgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IE1heEp1bXBUYWJsZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUwMDAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGludHggTWF4SnVtcFRhYmxlU3BhcnNlbmVzcyAgICAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgaW50eCBNYXhMYWJlbFJvb3REZXB0aCAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMDAgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IE1heExvb3BQYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgdWludHggTWF4TmV3U2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0Mjk0OTAxNzYwICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBNYXhOb2RlTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1MDAwICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgIHVpbnR4IE1heFBlcm1IZWFwRXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAgID0gNDE5NDMwNCAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggTWF4UGVybVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NzEwODg2NCAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyB1aW50NjRfdCBNYXhSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgIHVpbnR4IE1heFJBTUZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggTWF4UmVjdXJzaXZlSW5saW5lTGV2ZWwgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBNYXhUZW51cmluZ1RocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICA9IDE1ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IE1heFRyaXZpYWxTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgTWV0aG9kRmx1c2hpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBNZXRob2RIYW5kbGVQdXNoTGltaXQgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBpbnR4IE1pbkNvZGVDYWNoZUZsdXNoaW5nSW50ZXJ2YWwgICAgICAgICAgICAgID0gMzAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggTWluSGVhcERlbHRhQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzEwNzIgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBNaW5IZWFwRnJlZVJhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IE1pbklubGluaW5nVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgID0gMjUwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggTWluSnVtcFRhYmxlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCAgICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICB1aW50eCBNaW5QZXJtSGVhcEV4cGFuc2lvbiAgICAgICAgICAgICAgICAgICAgICA9IDI2MjE0NCAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IE1pblJBTUZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggTWluU3Vydml2b3JSYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBNaW5UTEFCU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNDggICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIE1peGVkTW9kZVRocmVhZER1bXAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggTW9uaXRvckJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBNb25pdG9ySW5Vc2VMaXN0cyAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IE11bHRpQXJyYXlFeHBhbmRMaW1pdCAgICAgICAgICAgICAgICAgICAgID0gNiAgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgTXVzdENhbGxMb2FkQ2xhc3NJbnRlcm5hbCAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBOVU1BQ2h1bmtSZXNpemVXZWlnaHQgICAgICAgICAgICAgICAgICAgICA9IDIwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IE5VTUFJbnRlcmxlYXZlR3JhbnVsYXJpdHkgICAgICAgICAgICAgICAgID0gMjA5NzE1MiAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggTlVNQVBhZ2VTY2FuUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTYgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBOVU1BU3BhY2VSZXNpemVSYXRlICAgICAgICAgICAgICAgICAgICAgICA9IDEwNzM3NDE4MjQgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIE5VTUFTdGF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggTmF0aXZlTW9uaXRvckZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBOYXRpdmVNb25pdG9yU3BpbkxpbWl0ICAgICAgICAgICAgICAgICAgICA9IDIwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IE5hdGl2ZU1vbml0b3JUaW1lb3V0ICAgICAgICAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgTmVlZHNEZW9wdFN1c3BlbmQgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBOZXZlckFjdEFzU2VydmVyQ2xhc3NNYWNoaW5lICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIE5ldmVyVGVudXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggTmV3UmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBOZXdTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNDg1NzYgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IE5ld1NpemVUaHJlYWRJbmNyZWFzZSAgICAgICAgICAgICAgICAgICAgID0gNDA5NiAgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGludHggTm1ldGhvZFN3ZWVwQ2hlY2tJbnRlcnZhbCAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBObWV0aG9kU3dlZXBGcmFjdGlvbiAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IE5vZGVMaW1pdEZ1ZGdlRmFjdG9yICAgICAgICAgICAgICAgICAgICAgID0gMTAwMCAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgdWludHggTnVtYmVyT2ZHQ0xvZ0ZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBOdW1iZXJPZkxvb3BJbnN0clRvQWxpZ24gICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIE9iakxpZmVUcmFja2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggT2JqTGlmZVRyYWNraW5nQ3B1RnJhY3Rpb24gICAgICAgICAgICAgICAgPSAxMDAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBPYmpMaWZldGltZUhpc3RvQnVja2V0Q291bnQgICAgICAgICAgICAgICA9IDEwMjQgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIE9iakxpZmV0aW1lSGlzdG9FeHBvcnRWYXJQZXJCdWNrZXQgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggT2xkUExBQlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDI0ICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBPbGRQTEFCV2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IE9sZFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDE5NDMwNCAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgT21pdFN0YWNrVHJhY2VJbkZhc3RUaHJvdyAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKK2Njc3RybGlzdCBPbkVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorY2NzdHJsaXN0IE9uT3V0T2ZNZW1vcnlFcnJvciAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggT25TdGFja1JlcGxhY2VQZXJjZW50YWdlICAgICAgICAgICAgICAgICAgPSAxNDAgICAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBPcHRpbWl6ZUZpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIE9wdGltaXplTWV0aG9kSGFuZGxlcyAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgT3B0aW1pemVTdHJpbmdDb25jYXQgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBPcHRvQnVuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7QzIgcGQgcHJvZHVjdH0gICAgIAorICAgICBpbnR4IE9wdG9Mb29wQWxpZ25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYgICAgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgT3B0b1NjaGVkdWxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge0MyIHBkIHByb2R1Y3R9ICAgICAKKyAgICB1aW50eCBQTEFCV2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFBTQ2h1bmtMYXJnZUFycmF5cyAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUFNSZXNpemVCeUZyZWVSYXRpbyAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQU1Jlc2l6ZUJ5RnJlZVJhdGlvV2l0aFN5c3RlbUdDICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFBhckdDQXJyYXlTY2FuQ2h1bmsgICAgICAgICAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggUGFyR0NDYXJkc1BlclN0cmlkZUNodW5rICAgICAgICAgICAgICAgICAgPSAyNTYgICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICB1aW50eCBQYXJHQ0Rlc2lyZWRPYmpzRnJvbU92ZXJmbG93TGlzdCAgICAgICAgICA9IDIwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFBhckdDU3RyaWRlc1BlclRocmVhZCAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgUGFyR0NUcmltT3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQYXJHQ1VzZUxvY2FsT3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFBhcmFsbGVsR0NCdWZmZXJXYXN0ZVBjdCAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUGFyYWxsZWxHQ1JldGFpblBMQUIgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICB1aW50eCBQYXJhbGxlbEdDVGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgIDo9IDEwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFBhcmFsbGVsR0NWZXJib3NlICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggUGFyYWxsZWxPbGREZWFkV29vZExpbWl0ZXJNZWFuICAgICAgICAgICAgPSA1MCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBQYXJhbGxlbE9sZERlYWRXb29kTGltaXRlclN0ZERldiAgICAgICAgICA9IDgwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFBhcmFsbGVsUmVmUHJvY0JhbGFuY2luZ0VuYWJsZWQgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUGFyYWxsZWxSZWZQcm9jRW5hYmxlZCAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQYXJ0aWFsUGVlbEF0VW5zaWduZWRUZXN0cyAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFBhcnRpYWxQZWVsTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGludHggUGFydGlhbFBlZWxOZXdQaGlEZWx0YSAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBQYXVzZUF0RXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFBhdXNlQXRTdGFydHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgY2NzdHIgUGF1c2VBdFN0YXJ0dXBGaWxlICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICB1aW50eCBQYXVzZVBhZGRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFBlckJ5dGVjb2RlUmVjb21waWxhdGlvbkN1dG9mZiAgICAgICAgICAgID0gMjAwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggUGVyQnl0ZWNvZGVUcmFwTGltaXQgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBQZXJNZXRob2RSZWNvbXBpbGF0aW9uQ3V0b2ZmICAgICAgICAgICAgICA9IDQwMCAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFBlck1ldGhvZFRyYXBMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgID0gMTAwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUGVyZkFsbG93QXRFeGl0UmVnaXN0cmF0aW9uICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQZXJmQnlwYXNzRmlsZVN5c3RlbUNoZWNrICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFBlcmZEYXRhTWVtb3J5U2l6ZSAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjggICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggUGVyZkRhdGFTYW1wbGluZ0ludGVydmFsICAgICAgICAgICAgICAgICAgPSA1MCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICBjY3N0ciBQZXJmRGF0YVNhdmVGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFBlcmZEYXRhU2F2ZVRvRmlsZSAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUGVyZkRpc2FibGVTaGFyZWRNZW0gICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBQZXJmTWF4U3RyaW5nQ29uc3RMZW5ndGggICAgICAgICAgICAgICAgICA9IDEwMjQgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFBlcm1HZW5QYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggUGVybU1hcmtTd2VlcERlYWRSYXRpbyAgICAgICAgICAgICAgICAgICAgPSAyMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBQZXJtU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2Nzc3MjE2ICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFBvc3RTcGluWWllbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggUHJlQmxvY2tTcGluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBQcmVJbmZsYXRlU3BpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFByZVNwaW5ZaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJlZmVySW50ZXJwcmV0ZXJOYXRpdmVTdHVicyAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgaW50eCBQcmVmZXRjaENvcHlJbnRlcnZhbEluQnl0ZXMgICAgICAgICAgICAgICA9IC0xICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFByZWZldGNoRmllbGRzQWhlYWQgICAgICAgICAgICAgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggUHJlZmV0Y2hTY2FuSW50ZXJ2YWxJbkJ5dGVzICAgICAgICAgICAgICAgPSAtMSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmVzZXJ2ZUFsbEFubm90YXRpb25zICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFByZXNlcnZlTWFya1N0YWNrU2l6ZSAgICAgICAgICAgICAgICAgICAgID0gMTAyNCAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggUHJldGVudXJlU2l6ZVRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludEFkYXB0ZXJIYW5kbGVycyAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFByaW50QWRhcHRpdmVTaXplUG9saWN5ICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRBc3NlbWJseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICBjY3N0ciBQcmludEFzc2VtYmx5T3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFByaW50Qmlhc2VkTG9ja2luZ1N0YXRpc3RpY3MgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgUHJpbnRDTVNJbml0aWF0aW9uQ2F1c2UgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludENNU0luaXRpYXRpb25TdGF0aXN0aWNzICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFByaW50Q01TU3RhdGlzdGljcyAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRDYXJkVGFibGVTdGF0cyAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludENsYXNzSGlzdG9ncmFtICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7bWFuYWdlYWJsZX0gICAgICAgIAorICAgICBib29sIFByaW50Q2xhc3NIaXN0b2dyYW1BZnRlckZ1bGxHQyAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHttYW5hZ2VhYmxlfSAgICAgICAgCisgICAgIGJvb2wgUHJpbnRDbGFzc0hpc3RvZ3JhbUJlZm9yZUZ1bGxHQyAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge21hbmFnZWFibGV9ICAgICAgICAKKyAgICAgYm9vbCBQcmludENsYXNzTG9hZGluZ0RhdGVTdGFtcHMgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50Q2xhc3NMb2FkaW5nVGltZVN0YW1wcyAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRDb21tYW5kTGluZUZsYWdzICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludENvbXBpbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50Q29tcHJlc3NlZE9vcHNNb2RlICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgUHJpbnRDb25jdXJyZW50TG9ja3MgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge21hbmFnZWFibGV9ICAgICAgICAKKyAgICAgYm9vbCBQcmludERUcmFjZURPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBpbnR4IFByaW50RkxTQ2Vuc3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggUHJpbnRGTFNTdGF0aXN0aWNzICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludEZsYWdzRmluYWwgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50RmxhZ3NJbml0aWFsICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRGdWxsR0NQaGFzZVRpbWVzICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludEdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7bWFuYWdlYWJsZX0gICAgICAgIAorICAgICBib29sIFByaW50R0NBcHBsaWNhdGlvbkNvbmN1cnJlbnRUaW1lICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRHQ0FwcGxpY2F0aW9uU3RvcHBlZFRpbWUgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludEdDRGF0ZVN0YW1wcyAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7bWFuYWdlYWJsZX0gICAgICAgIAorICAgICBib29sIFByaW50R0NEZXRhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHttYW5hZ2VhYmxlfSAgICAgICAgCisgICAgIGJvb2wgUHJpbnRHQ1Rhc2tUaW1lU3RhbXBzICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludEdDVGltZVN0YW1wcyAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7bWFuYWdlYWJsZX0gICAgICAgIAorICAgICBib29sIFByaW50SGVhcEF0R0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0IHJ3fSAgICAgICAgCisgICAgIGJvb2wgUHJpbnRIZWFwQXRHQ0V4dGVuZGVkICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3Qgcnd9ICAgICAgICAKKyAgICAgYm9vbCBQcmludEhlYXBBdFNJR0JSRUFLICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50SW5saW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgUHJpbnRJbnRlcnByZXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBQcmludEludHJpbnNpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFByaW50Sk5JR0NTdGFsbHMgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRKTklSZXNvbHZpbmcgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludE1ldGhvZEhhbmRsZVN0dWJzICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFByaW50Tk1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgUHJpbnROYXRpdmVOTWV0aG9kcyAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBQcmludE9sZFBMQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50T29wQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRQTEFCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludFBhcmFsbGVsT2xkR0NQaGFzZVRpbWVzICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50UHJlY2lzZUJpYXNlZExvY2tpbmdTdGF0aXN0aWNzICAgICAgID0gZmFsc2UgICAgICAgICAgIHtDMiBkaWFnbm9zdGljfSAgICAgCisgICAgIGJvb2wgUHJpbnRQcm9tb3Rpb25GYWlsdXJlICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludFJlZmVyZW5jZUdDICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50UmV2aXNpdFN0YXRzICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRTYWZlcG9pbnRTdGF0aXN0aWNzICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBQcmludFNhZmVwb2ludFN0YXRpc3RpY3NDb3VudCAgICAgICAgICAgICA9IDMwMCAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFByaW50U2FmZXBvaW50U3RhdGlzdGljc1RpbWVvdXQgICAgICAgICAgID0gLTEgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRTaGFyZWRTcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludFNpZ25hdHVyZUhhbmRsZXJzICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFByaW50U3R1YkNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgUHJpbnRUTEFCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludFRlbnVyaW5nRGlzdHJpYnV0aW9uICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50VGllcmVkRXZlbnRzICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJpbnRWTU9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcmludFZNUVdhaXRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByaW50V2FybmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggUHJvY2Vzc0Rpc3RyaWJ1dGlvblN0cmlkZSAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcm9maWxlRHluYW1pY1R5cGVzICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFByb2ZpbGVJbnRlcnByZXRlciAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgUHJvZmlsZUludGVydmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBQcm9maWxlSW50ZXJ2YWxzVGlja3MgICAgICAgICAgICAgICAgICAgICA9IDEwMCAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFByb2ZpbGVNYXR1cml0eVBlcmNlbnRhZ2UgICAgICAgICAgICAgICAgID0gMjAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUHJvZmlsZVZNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBQcm9maWxlclByaW50Qnl0ZUNvZGVTdGF0aXN0aWNzICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFByb2ZpbGVyUmVjb3JkUEMgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggUHJvbW90ZWRQYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBRdWV1ZWRBbGxvY2F0aW9uV2FybmluZ0NvdW50ICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFJhbUxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUmFuZ2VDaGVja0VsaW1pbmF0aW9uICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBSYW5nZUxpbWl0Q2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgZGlhZ25vc3RpY30gICAgIAorICAgICBpbnR4IFJlYWRQcmVmZXRjaEluc3RyICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggUmVhZFNwaW5JdGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBSZWFzc29jaWF0ZUludmFyaWFudHMgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFJlZHVjZUJ1bGtaZXJvaW5nICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgUmVkdWNlRmllbGRaZXJvaW5nICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBSZWR1Y2VJbml0aWFsQ2FyZE1hcmtzICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFJlZHVjZVNpZ25hbFVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggUmVmRGlzY292ZXJ5UG9saWN5ICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBSZWZsZWN0aW9uV3JhcFJlc29sdXRpb25FcnJvcnMgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFJlZ2lzdGVyRmluYWxpemVyc0F0SW5pdCAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgUmVsYXhBY2Nlc3NDb250cm9sQ2hlY2sgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBSZXF1aXJlU2hhcmVkU3BhY2VzICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFJlc2VydmVkQ29kZUNhY2hlU2l6ZSAgICAgICAgICAgICAgICAgICAgID0gNTAzMzE2NDggICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgUmVzaXplT2xkUExBQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBSZXNpemVQTEFCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFJlc2l6ZVRMQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgUmVzdG9yZU1YQ1NST25KTklDYWxscyAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBSZXdyaXRlQnl0ZWNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFJld3JpdGVGcmVxdWVudFBhaXJzICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGludHggU2FmZXBvaW50UG9sbE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgPSAyNTYgICAgICAgICAgICAge0MxIHBkIHByb2R1Y3R9ICAgICAKKyAgICAgaW50eCBTYWZlcG9pbnRTcGluQmVmb3JlWWllbGQgICAgICAgICAgICAgICAgICA9IDIwMDAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFNhZmVwb2ludFRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggU2FmZXBvaW50VGltZW91dERlbGF5ICAgICAgICAgICAgICAgICAgICAgPSAxMDAwMCAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBTY2F2ZW5nZUJlZm9yZUZ1bGxHQyAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFNjYXZlbmdlUm9vdHNJbkNvZGUgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGludHggU2VsZkRlc3RydWN0VGltZXIgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBTZXJpYWxpemVWTU91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFNoYXJlQ01TTWFya0JpdE1hcFdpdGhQYXJhbGxlU1RXRnVsbEdDICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggU2hhcmVkRHVtbXlCbG9ja1NpemUgICAgICAgICAgICAgICAgICAgICAgPSA1MzY4NzA5MTIgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBTaGFyZWRNaXNjQ29kZVNpemUgICAgICAgICAgICAgICAgICAgICAgICA9IDQxOTQzMDQgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFNoYXJlZE1pc2NEYXRhU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgID0gNDE5NDMwNCAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgU2hhcmVkT3B0aW1pemVDb2xkU3RhcnQgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICB1aW50eCBTaGFyZWRSZWFkT25seVNpemUgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNDg1NzYwICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFNoYXJlZFJlYWRXcml0ZVNpemUgICAgICAgICAgICAgICAgICAgICAgID0gMTI1ODI5MTIgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgU2hhcmVkU2tpcFZlcmlmeSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBTaG93TWVzc2FnZUJveE9uRXJyb3IgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFNvZnRSZWZMUlVQb2xpY3lNU1Blck1CICAgICAgICAgICAgICAgICAgID0gMTAwMCAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgU3BsaXRJZkJsb2NrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBTdGFja1JlZFBhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IFN0YWNrU2hhZG93UGFnZXMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgU3RhY2tUcmFjZUluVGhyb3dhYmxlICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBTdGFja1llbGxvd1BhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFN0YXJ0QXR0YWNoTGlzdGVuZXIgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgU3RhcnRTdXNwZW5kZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBTdGFydmF0aW9uTW9uaXRvckludGVydmFsICAgICAgICAgICAgICAgICA9IDIwMCAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFN0cmVzc0xkY1Jld3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgU3RyZXNzVGllcmVkUnVudGltZSAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBTdHJpbmdUYWJsZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMDkgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFN1cHByZXNzRmF0YWxFcnJvck1lc3NhZ2UgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggU3Vydml2b3JQYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBTdXJ2aXZvclJhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDggICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFN1c3BlbmRSZXRyeUNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggU3VzcGVuZFJldHJ5RGVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBTeW5jRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIGNjc3RyIFN5bmNLbm9icyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggU3luY1ZlcmJvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBUTEFCQWxsb2NhdGlvbldlaWdodCAgICAgICAgICAgICAgICAgICAgICA9IDM1ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFRMQUJSZWZpbGxXYXN0ZUZyYWN0aW9uICAgICAgICAgICAgICAgICAgID0gNjQgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggVExBQlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBUTEFCU3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFRMQUJXYXN0ZUluY3JlbWVudCAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggVExBQldhc3RlVGFyZ2V0UGVyY2VudCAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUYXJnZXRQTEFCV2FzdGVQY3QgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRhcmdldFN1cnZpdm9yUmF0aW8gICAgICAgICAgICAgICAgICAgICAgID0gNTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggVGVudXJlZEdlbmVyYXRpb25TaXplSW5jcmVtZW50ICAgICAgICAgICAgPSAyMCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBUZW51cmVkR2VuZXJhdGlvblNpemVTdXBwbGVtZW50ICAgICAgICAgICA9IDgwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFRlbnVyZWRHZW5lcmF0aW9uU2l6ZVN1cHBsZW1lbnREZWNheSAgICAgID0gMiAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGhyZWFkUHJpb3JpdHlQb2xpY3kgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBUaHJlYWRQcmlvcml0eVZlcmJvc2UgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFRocmVhZFNhZmV0eU1hcmdpbiAgICAgICAgICAgICAgICAgICAgICAgID0gNTI0Mjg4MDAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGhyZWFkU3RhY2tTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjAgICAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICB1aW50eCBUaHJlc2hvbGRUb2xlcmFuY2UgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXIwQmFja2VkZ2VOb3RpZnlGcmVxTG9nICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGllcjBJbnZva2VOb3RpZnlGcmVxTG9nICAgICAgICAgICAgICAgICAgPSA3ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUaWVyMFByb2ZpbGluZ1N0YXJ0UGVyY2VudGFnZSAgICAgICAgICAgICA9IDIwMCAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXIxRnJlcUlubGluZVNpemUgICAgICAgICAgICAgICAgICAgICAgID0gMzUgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGludHggVGllcjFJbmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgaW50eCBUaWVyMUxvb3BPcHRzQ291bnQgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IFRpZXIxTWF4SW5saW5lU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGludHggVGllcjJCYWNrRWRnZVRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUaWVyMkJhY2tlZGdlTm90aWZ5RnJlcUxvZyAgICAgICAgICAgICAgICA9IDE0ICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXIyQ29tcGlsZVRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGllcjJJbnZva2VOb3RpZnlGcmVxTG9nICAgICAgICAgICAgICAgICAgPSAxMSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUaWVyM0JhY2tFZGdlVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICA9IDcwMDAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXIzQmFja2VkZ2VOb3RpZnlGcmVxTG9nICAgICAgICAgICAgICAgID0gMTMgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGllcjNDb21waWxlVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgPSAyMDAwICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUaWVyM0RlbGF5T2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXIzRGVsYXlPbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGllcjNJbnZvY2F0aW9uVGhyZXNob2xkICAgICAgICAgICAgICAgICAgPSAyMDAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUaWVyM0ludm9rZU5vdGlmeUZyZXFMb2cgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXIzTG9hZEZlZWRiYWNrICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGllcjNNaW5JbnZvY2F0aW9uVGhyZXNob2xkICAgICAgICAgICAgICAgPSAxMDAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUaWVyNEJhY2tFZGdlVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICA9IDQwMDAwICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXI0Q29tcGlsZVRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgID0gMTUwMDAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGllcjRJbnZvY2F0aW9uVGhyZXNob2xkICAgICAgICAgICAgICAgICAgPSA1MDAwICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUaWVyNExvYWRGZWVkYmFjayAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXI0TWluSW52b2NhdGlvblRocmVzaG9sZCAgICAgICAgICAgICAgID0gNjAwICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVGllcmVkQ29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgaW50eCBUaWVyZWRDb21waWxlVGFza1RpbWVvdXQgICAgICAgICAgICAgICAgICA9IDUwICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFRpZXJlZFJhdGVVcGRhdGVNYXhUaW1lICAgICAgICAgICAgICAgICAgID0gMjUgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVGllcmVkUmF0ZVVwZGF0ZU1pblRpbWUgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBUaWVyZWRTdG9wQXRMZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFRpbWVMaW5lYXJTY2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtDMSBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgVHJhY2VCaWFzZWRMb2NraW5nICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBUcmFjZUNsYXNzTG9hZGluZyAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdCByd30gICAgICAgIAorICAgICBib29sIFRyYWNlQ2xhc3NMb2FkaW5nUHJlb3JkZXIgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVHJhY2VDbGFzc1Jlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBUcmFjZUNsYXNzVW5sb2FkaW5nICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdCByd30gICAgICAgIAorICAgICBib29sIFRyYWNlQ29tcGlsZVRyaWdnZXJlZCAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgVHJhY2VHZW4wVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBUcmFjZUdlbjFUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIGNjc3RyIFRyYWNlSlZNVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVHJhY2VKVk1USU9iamVjdFRhZ2dpbmcgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBUcmFjZUxvYWRlckNvbnN0cmFpbnRzICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdCByd30gICAgICAgIAorICAgICBib29sIFRyYWNlTW9uaXRvckluZmxhdGlvbiAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVHJhY2VOTWV0aG9kSW5zdGFsbHMgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBUcmFjZU9TUkJyZWFrcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFRyYWNlUGFyYWxsZWxPbGRHQ1Rhc2tzICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVHJhY2VSZWRlZmluZUNsYXNzZXMgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBUcmFjZVJlZHVuZGFudENvbXBpbGVzICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFRyYWNlU2FmZXBvaW50Q2xlYW51cFRpbWUgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVHJhY2VTdXBlcldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBUcmFjZVN1c3BlbmRXYWl0RmFpbHVyZXMgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFRyYWNlVHJpZ2dlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGludHggVHJhY2tlZEluaXRpYWxpemF0aW9uTGltaXQgICAgICAgICAgICAgICAgPSA1MCAgICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBUcmFuc21pdEVycm9yUmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBpbnR4IFR5cGVQcm9maWxlTWFqb3JSZWNlaXZlclBlcmNlbnQgICAgICAgICAgID0gOTAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVHlwZVByb2ZpbGVXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBVbmd1YXJkT25FeGVjdXRpb25WaW9sYXRpb24gICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVubGlua1N5bWJvbHNBTG90ICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVW5sb2NrRGlhZ25vc3RpY1ZNT3B0aW9ucyAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBVbnJvbGxMaW1pdENoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgZGlhZ25vc3RpY30gICAgIAorICAgICBib29sIFVuc3luY2xvYWRDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgVXNlNDg2SW5zdHJzT25seSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VBZGFwdGl2ZUdDQm91bmRhcnkgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUFkYXB0aXZlR2VuZXJhdGlvblNpemVQb2xpY3lBdE1ham9yQ29sbGVjdGlvbiAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VBZGFwdGl2ZUdlbmVyYXRpb25TaXplUG9saWN5QXRNaW5vckNvbGxlY3Rpb24gID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQWRhcHRpdmVOVU1BQ2h1bmtTaXppbmcgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VBZGFwdGl2ZVNpemVEZWNheU1ham9yR0NDb3N0ICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUFkYXB0aXZlU2l6ZVBvbGljeSAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQWRhcHRpdmVTaXplUG9saWN5Rm9vdHByaW50R29hbCAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VBZGFwdGl2ZVNpemVQb2xpY3lXaXRoU3lzdGVtR0MgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUFkZHJlc3NOb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQWx0U2lncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VBdXRvR0NTZWxlY3RQb2xpY3kgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUJpYXNlZExvY2tpbmcgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQmltb3JwaGljSW5saW5pbmcgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBVc2VCbG9ja0NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUJsb2NrWmVyb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQm91bmRUaHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VDQkNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUNNU0Jlc3RGaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQ01TQ29sbGVjdGlvblBhc3NpbmcgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VDTVNDb21wYWN0QXRGdWxsQ29sbGVjdGlvbiAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUNNU0luaXRpYXRpbmdPY2N1cGFuY3lPbmx5ICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQ01TUGFyYWxsZWxTVFdGdWxsR0MgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VDb2RlQ2FjaGVGbHVzaGluZyAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUNvbXBpbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQ29tcGlsZXJTYWZlcG9pbnRzICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VDb25jTWFya1N3ZWVwR0MgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUNvbmRDYXJkTWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlQ291bnRMZWFkaW5nWmVyb3NJbnN0cnVjdGlvbiAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VDb3VudGVyRGVjYXkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZURpdk1vZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgVXNlRlBVRm9yU3BpbGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBVc2VGYXN0QWNjZXNzb3JNZXRob2RzICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUZhc3RFbXB0eU1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlRmFzdEpOSUFjY2Vzc29ycyAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VHMUdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUdDTG9nRmlsZVJvdGF0aW9uICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlR0NPdmVyaGVhZExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VHQ1Rhc2tBZmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZUhlYXZ5TW9uaXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlSHVnZVRMQkZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VJbmNEZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFVzZUlubGluZUNhY2hlcyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlSW50ZXJwcmV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VKdW1wVGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFVzZUxXUFN5bmNocm9uaXphdGlvbiAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlTGFyZ2VQYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBVc2VMYXJnZVBhZ2VzSW5kaXZpZHVhbEFsbG9jYXRpb24gICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFVzZUxpbnV4UG9zaXhUaHJlYWRDUFVDbG9ja3MgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlTG9vcENvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VMb29wUHJlZGljYXRlICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFVzZU1heGltdW1Db21wYWN0aW9uT25TeXN0ZW1HQyAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlTWVtYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBVc2VOVU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZU5VTUFJbnRlcmxlYXZpbmcgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlTmV3Q29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBVc2VOZXdDb2RlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFVzZU5ld0NvZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgVXNlTmV3TG9uZ0xTaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VOaWFnYXJhSW5zdHJzICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZU9TRXJyb3JSZXBvcnRpbmcgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgVXNlT2xkSW5saW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBVc2VPblN0YWNrUmVwbGFjZW1lbnQgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFVzZU9ubHlJbmxpbmVkQmltb3JwaGljICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtDMiBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgVXNlT3Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VPcHRvQmlhc0lubGluaW5nICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFVzZVBQQ0xXU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlUFNBZGFwdGl2ZVN1cnZpdm9yU2l6ZVBvbGljeSAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VQYXJOZXdHQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZVBhcmFsbGVsR0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlUGFyYWxsZWxPbGRHQyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VQZXJmRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZVBvcENvdW50SW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlUkRQQ0ZvckNvbnN0YW50VGFibGVCYXNlICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge0MyIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBVc2VSaWNvY2hldEZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFVzZVNITSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVXNlU1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VTU0U0MkludHJpbnNpY3MgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZVNlcGFyYXRlVlNwYWNlc0luWW91bmdHZW4gICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlU2VyaWFsR0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VTaGFyZWRTcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZVNpZ25hbENoYWluaW5nICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlU3Bpbm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VTcGxpdFZlcmlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZVN0b3JlSW1tSTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlU3RyaW5nQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VTdXBlcldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFVzZVRMQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgVXNlVGhyZWFkUHJpb3JpdGllcyAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3BkIHByb2R1Y3R9ICAgICAgICAKKyAgICAgYm9vbCBVc2VUeXBlUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZVVuYWxpZ25lZExvYWRTdG9yZXMgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVXNlVklTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VWTUludGVycnVwdGlibGVJTyAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZVZlY3RvcmVkRXhjZXB0aW9ucyAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwZCBwcm9kdWN0fSAgICAgICAgCisgICAgIGJvb2wgVXNlWE1NRm9yQXJyYXlDb3B5ICAgICAgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VYbW1JMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFVzZVhtbUkyRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgVXNlWG1tTG9hZEFuZENsZWFyVXBwZXIgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBVc2VYbW1SZWdUb1JlZ01vdmVBbGwgICAgICAgICAgICAgICAgICAgICA9IHRydWUgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgICBib29sIFZNVGhyZWFkSGludE5vUHJlZW1wdCAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGludHggVk1UaHJlYWRQcmlvcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMSAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBWTVRocmVhZFN0YWNrU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMiAgICAgICAgICAgICB7cGQgcHJvZHVjdH0gICAgICAgIAorICAgICBpbnR4IFZhbHVlTWFwSW5pdGlhbFNpemUgICAgICAgICAgICAgICAgICAgICAgID0gMTEgICAgICAgICAgICAgIHtDMSBwcm9kdWN0fSAgICAgICAgCisgICAgIGludHggVmFsdWVNYXBNYXhMb29wU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgPSA4ICAgICAgICAgICAgICAge0MxIHByb2R1Y3R9ICAgICAgICAKKyAgICAgaW50eCBWYWx1ZVNlYXJjaExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMDAgICAgICAgICAgICB7QzIgcHJvZHVjdH0gICAgICAgIAorICAgICBib29sIFZlcmlmeUFmdGVyR0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgVmVyaWZ5QmVmb3JlRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgYm9vbCBWZXJpZnlCZWZvcmVHQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFZlcmlmeUJlZm9yZUl0ZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgID0gZmFsc2UgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgVmVyaWZ5RHVyaW5nR0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgaW50eCBWZXJpZnlHQ0xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgIHVpbnR4IFZlcmlmeUdDU3RhcnRBdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgVmVyaWZ5TWVyZ2VkQ1BCeXRlY29kZXMgICAgICAgICAgICAgICAgICAgPSB0cnVlICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgYm9vbCBWZXJpZnlNZXRob2RIYW5kbGVzICAgICAgICAgICAgICAgICAgICAgICA9IGZhbHNlICAgICAgICAgICB7ZGlhZ25vc3RpY30gICAgICAgIAorICAgICBib29sIFZlcmlmeU9iamVjdFN0YXJ0QXJyYXkgICAgICAgICAgICAgICAgICAgID0gdHJ1ZSAgICAgICAgICAgIHtkaWFnbm9zdGljfSAgICAgICAgCisgICAgIGJvb2wgVmVyaWZ5UmVtZW1iZXJlZFNldHMgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge2RpYWdub3N0aWN9ICAgICAgICAKKyAgICAgaW50eCBXb3JrQXJvdW5kTlBUTFRpbWVkV2FpdEhhbmcgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFlvdW5nR2VuZXJhdGlvblNpemVJbmNyZW1lbnQgICAgICAgICAgICAgID0gMjAgICAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgdWludHggWW91bmdHZW5lcmF0aW9uU2l6ZVN1cHBsZW1lbnQgICAgICAgICAgICAgPSA4MCAgICAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICB1aW50eCBZb3VuZ0dlbmVyYXRpb25TaXplU3VwcGxlbWVudERlY2F5ICAgICAgICA9IDggICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIAorICAgIHVpbnR4IFlvdW5nUExBQlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDA5NiAgICAgICAgICAgIHtwcm9kdWN0fSAgICAgICAgICAgCisgICAgIGJvb2wgWmVyb1RMQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmYWxzZSAgICAgICAgICAge3Byb2R1Y3R9ICAgICAgICAgICAKKyAgICAgaW50eCBoYXNoQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgICB7cHJvZHVjdH0gICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9nb29nbGUvY2FsaXBlci9icmlkZ2UvamRrNy1nYy50eHQgYi9jYWxpcGVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL2pkazctZ2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWZjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jYWxpcGVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2NhbGlwZXIvYnJpZGdlL2pkazctZ2MudHh0CkBAIC0wLDAgKzEsMjAwIEBACisyMDEzLTAyLTExVDIwOjE1OjI2LjcwNi0wNjAwOiAwLjA5ODogW0dDIDEzMTZLLT41NzZLKDYyODQ4SyksIDAuMDAxNDI0MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43MDgtMDYwMDogMC4wOTk6IFtGdWxsIEdDIDU3NkstPjQ4NksoNjI4NDhLKSwgMC4wMDQ0ODYwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjcxMy0wNjAwOiAwLjEwNDogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDA1MDAwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjcxMy0wNjAwOiAwLjEwNTogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzk4NDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzE3LTA2MDA6IDAuMTA5OiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDc2NTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzE4LTA2MDA6IDAuMTEwOiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzODM1MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43MjItMDYwMDogMC4xMTM6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwNTQzMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43MjMtMDYwMDogMC4xMTQ6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDQ1NDgwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjcyNy0wNjAwOiAwLjExOTogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDAzOTUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjcyOC0wNjAwOiAwLjExOTogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzY1NzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzMxLTA2MDA6IDAuMTIzOiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDU4NTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzMyLTA2MDA6IDAuMTIzOiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNjY1MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43MzYtMDYwMDogMC4xMjc6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwNDY0MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43MzYtMDYwMDogMC4xMjg6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1OTkwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc0MC0wNjAwOiAwLjEzMTogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDA1NTAwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc0MC0wNjAwOiAwLjEzMjogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzgxNTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzQ0LTA2MDA6IDAuMTM2OiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDQ0NjAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzQ1LTA2MDA6IDAuMTM2OiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNjAwMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43NDgtMDYwMDogMC4xNDA6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwMzEyMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43NDktMDYwMDogMC4xNDA6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1ODIwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc1Mi0wNjAwOiAwLjE0NDogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDAzMzQwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc1My0wNjAwOiAwLjE0NDogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzYxNzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzU2LTA2MDA6IDAuMTQ4OiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDQzNzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzU3LTA2MDA6IDAuMTQ4OiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNjAwMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43NjEtMDYwMDogMC4xNTI6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwMzc2MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43NjEtMDYwMDogMC4xNTI6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1OTUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc2NS0wNjAwOiAwLjE1NjogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDA0MDAwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc2NS0wNjAwOiAwLjE1NzogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzU3NjAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzY5LTA2MDA6IDAuMTYwOiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDM0ODAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzY5LTA2MDA6IDAuMTYxOiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNTcxMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43NzMtMDYwMDogMC4xNjQ6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwMzM3MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43NzMtMDYwMDogMC4xNjQ6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1OTEwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc3Ny0wNjAwOiAwLjE2ODogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDAzODQwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc3Ny0wNjAwOiAwLjE2OTogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzU3NjAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzgxLTA2MDA6IDAuMTcyOiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDM1NjAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzgxLTA2MDA6IDAuMTczOiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNTkyMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43ODUtMDYwMDogMC4xNzY6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwMzUyMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43ODUtMDYwMDogMC4xNzc6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1NjUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc4OS0wNjAwOiAwLjE4MDogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDA0MjgwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljc4OS0wNjAwOiAwLjE4MTogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzU0NjAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzkzLTA2MDA6IDAuMTg0OiBbR0MgODE1Sy0+NTAySyg2Mjg0OEspLCAwLjAwMDMzNDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuNzkzLTA2MDA6IDAuMTg1OiBbRnVsbCBHQyA1MDJLLT40ODZLKDYyODQ4SyksIDAuMDAzNzAxMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43OTctMDYwMDogMC4xODg6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwNDE4MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi43OTctMDYwMDogMC4xODk6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1MzEwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjgwMS0wNjAwOiAwLjE5MzogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDAzODQwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjgwMS0wNjAwOiAwLjE5MzogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzU1NTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODA1LTA2MDA6IDAuMTk3OiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDMyNDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODA1LTA2MDA6IDAuMTk3OiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNTU2MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44MDktMDYwMDogMC4yMDE6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwMjk5MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44MDktMDYwMDogMC4yMDE6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1NjAwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjgxMy0wNjAwOiAwLjIwNDogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDAyNzYwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjgxMy0wNjAwOiAwLjIwNTogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzU0NzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODE3LTA2MDA6IDAuMjA4OiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDI5ODAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODE3LTA2MDA6IDAuMjA5OiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNTQ0MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44MjEtMDYwMDogMC4yMTI6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwMjc3MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44MjEtMDYwMDogMC4yMTM6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1NTEwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjgyNS0wNjAwOiAwLjIxNjogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDAyMzQwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjgyNS0wNjAwOiAwLjIxNjogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzUyODAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODI4LTA2MDA6IDAuMjIwOiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDI0NDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODI5LTA2MDA6IDAuMjIwOiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNTMzMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44MzItMDYwMDogMC4yMjQ6IFtHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAwMzE0MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44MzMtMDYwMDogMC4yMjQ6IFtGdWxsIEdDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDM1NjAwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjgzNi0wNjAwOiAwLjIyODogW0dDIDQ4NkstPjQ4NksoNjI4NDhLKSwgMC4wMDAyNzgwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjgzNy0wNjAwOiAwLjIyODogW0Z1bGwgR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMzUyNDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODQwLTA2MDA6IDAuMjMyOiBbR0MgNDg2Sy0+NDg2Syg2Mjg0OEspLCAwLjAwMDMxMzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODQwLTA2MDA6IDAuMjMyOiBbRnVsbCBHQyA0ODZLLT40ODZLKDYyODQ4SyksIDAuMDAzNTM1MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44NDQtMDYwMDogMC4yMzY6IFtHQyA4MTVLLT41MDJLKDYyODQ4SyksIDAuMDAwMjYxMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44NDQtMDYwMDogMC4yMzY6IFtGdWxsIEdDIDUwMkstPjQ4N0soNjI4NDhLKSwgMC4wMDM1MjcwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg0OC0wNjAwOiAwLjIzOTogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAyOTMwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg0OC0wNjAwOiAwLjI0MDogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzU0NzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODUyLTA2MDA6IDAuMjQzOiBbR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMDI3MzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODUyLTA2MDA6IDAuMjQ0OiBbRnVsbCBHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAzNTQ3MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44NTYtMDYwMDogMC4yNDc6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwMzQyMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44NTYtMDYwMDogMC4yNDg6IFtGdWxsIEdDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDM1MzkwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg2MC0wNjAwOiAwLjI1MTogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAyMzIwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg2MC0wNjAwOiAwLjI1MjogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzUwNTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODY0LTA2MDA6IDAuMjU1OiBbR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMDI4ODAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODY0LTA2MDA6IDAuMjU1OiBbRnVsbCBHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAzNTE5MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44NjctMDYwMDogMC4yNTk6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwMjY1MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44NjgtMDYwMDogMC4yNTk6IFtGdWxsIEdDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDM0OTUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg3MS0wNjAwOiAwLjI2MzogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAzODUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg3Mi0wNjAwOiAwLjI2MzogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzU0NTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODc1LTA2MDA6IDAuMjY3OiBbR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMDM2MzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODc2LTA2MDA6IDAuMjY3OiBbRnVsbCBHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAzNTM4MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44NzktMDYwMDogMC4yNzE6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwMjgwMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44NzktMDYwMDogMC4yNzE6IFtGdWxsIEdDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDM1MzQwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg4My0wNjAwOiAwLjI3NTogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAyNTgwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg4My0wNjAwOiAwLjI3NTogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzU1NTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODg3LTA2MDA6IDAuMjc4OiBbR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMDM4ODAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODg3LTA2MDA6IDAuMjc5OiBbRnVsbCBHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAzNTY5MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44OTEtMDYwMDogMC4yODM6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwMzA0MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi44OTEtMDYwMDogMC4yODM6IFtGdWxsIEdDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDM1NzIwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg5NS0wNjAwOiAwLjI4NjogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAyNzUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljg5NS0wNjAwOiAwLjI4NzogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzU3MDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODk5LTA2MDA6IDAuMjkwOiBbR0MgODE2Sy0+NTAzSyg2Mjg0OEspLCAwLjAwMDI4MzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuODk5LTA2MDA6IDAuMjkxOiBbRnVsbCBHQyA1MDNLLT40ODdLKDYyODQ4SyksIDAuMDAzNzYzMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45MDMtMDYwMDogMC4yOTU6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwMjg5MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45MDMtMDYwMDogMC4yOTU6IFtGdWxsIEdDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDM3MzMwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjkwNy0wNjAwOiAwLjI5OTogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAyNTgwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjkwNy0wNjAwOiAwLjI5OTogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzU0ODAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTExLTA2MDA6IDAuMzAzOiBbR0MgODE2Sy0+NTAzSyg2Mjg0OEspLCAwLjAwMDM1NDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTExLTA2MDA6IDAuMzAzOiBbRnVsbCBHQyA1MDNLLT40ODdLKDYyODQ4SyksIDAuMDAzNTYxMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45MTUtMDYwMDogMC4zMDc6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwNDE2MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45MTUtMDYwMDogMC4zMDc6IFtGdWxsIEdDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDM1MzkwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjkxOS0wNjAwOiAwLjMxMTogW0dDIDgxNkstPjUxOUsoNjI4NDhLKSwgMC4wMDAzNjUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjkyMC0wNjAwOiAwLjMxMTogW0Z1bGwgR0MgNTE5Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzU0MzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTIzLTA2MDA6IDAuMzE1OiBbR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMDMzNDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTI0LTA2MDA6IDAuMzE1OiBbRnVsbCBHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAzNTYwMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45MjctMDYwMDogMC4zMTk6IFtHQyA4MTZLLT41MDNLKDYyODQ4SyksIDAuMDAwMzc1MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45MjgtMDYwMDogMC4zMTk6IFtGdWxsIEdDIDUwM0stPjQ4N0soNjI4NDhLKSwgMC4wMDM1MzMwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjkzMS0wNjAwOiAwLjMyMzogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAzNzkwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2LjkzMi0wNjAwOiAwLjMyMzogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzU0OTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTM1LTA2MDA6IDAuMzI3OiBbR0MgODE2Sy0+NTAzSyg2Mjg0OEspLCAwLjAwMDI5MzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTM2LTA2MDA6IDAuMzI3OiBbRnVsbCBHQyA1MDNLLT40ODdLKDYyODQ4SyksIDAuMDAzNTQwMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45MzktMDYwMDogMC4zMzE6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwMjg3MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45MzktMDYwMDogMC4zMzE6IFtGdWxsIEdDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDM1NjMwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk0My0wNjAwOiAwLjMzNTogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAzNzkwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk0My0wNjAwOiAwLjMzNTogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzU5NTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTQ3LTA2MDA6IDAuMzM5OiBbR0MgODE2Sy0+NTAzSyg2Mjg0OEspLCAwLjAwMDM2NDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTQ4LTA2MDA6IDAuMzM5OiBbRnVsbCBHQyA1MDNLLT40ODdLKDYyODQ4SyksIDAuMDAzODEyMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45NTEtMDYwMDogMC4zNDM6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwMzUyMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45NTItMDYwMDogMC4zNDM6IFtGdWxsIEdDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDM1NTgwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk1NS0wNjAwOiAwLjM0NzogW0dDIDQ4N0stPjQ4N0soNjI4NDhLKSwgMC4wMDAzNjIwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk1Ni0wNjAwOiAwLjM0NzogW0Z1bGwgR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMzUyOTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTU5LTA2MDA6IDAuMzUxOiBbR0MgNDg3Sy0+NDg3Syg2Mjg0OEspLCAwLjAwMDM2MzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTYwLTA2MDA6IDAuMzUxOiBbRnVsbCBHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAzNTA4MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45NjMtMDYwMDogMC4zNTU6IFtHQyA0ODdLLT40ODdLKDYyODQ4SyksIDAuMDAwMzMxMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45NjQtMDYwMDogMC4zNTU6IFtGdWxsIEdDIDQ4N0stPjQ4MksoNjI4NDhLKSwgMC4wMDM4MDYwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk2OC0wNjAwOiAwLjM1OTogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzNjUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk2OC0wNjAwOiAwLjM1OTogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzUzNDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTcyLTA2MDA6IDAuMzYzOiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDMzMDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTcyLTA2MDA6IDAuMzYzOiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNTM0MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45NzYtMDYwMDogMC4zNjc6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzIyMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45NzYtMDYwMDogMC4zNjc6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM1MjMwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk3OS0wNjAwOiAwLjM3MTogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzMjIwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk4MC0wNjAwOiAwLjM3MTogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzUyMDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTgzLTA2MDA6IDAuMzc1OiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDMwMzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTg0LTA2MDA6IDAuMzc1OiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNTM3MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45ODctMDYwMDogMC4zNzk6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzIzMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45ODgtMDYwMDogMC4zNzk6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM1MTUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk5MS0wNjAwOiAwLjM4MzogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzMDUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI2Ljk5Mi0wNjAwOiAwLjM4MzogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzUwODAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTk1LTA2MDA6IDAuMzg3OiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDMzMjAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjYuOTk1LTA2MDA6IDAuMzg3OiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNTA2MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45OTktMDYwMDogMC4zOTE6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMjUyMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNi45OTktMDYwMDogMC4zOTE6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM1MTkwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjAwMy0wNjAwOiAwLjM5NDogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzMDUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjAwMy0wNjAwOiAwLjM5NTogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzU0MzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDA3LTA2MDA6IDAuMzk4OiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDI4MDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDA3LTA2MDA6IDAuMzk5OiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNTIxMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wMTEtMDYwMDogMC40MDI6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzEzMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wMTEtMDYwMDogMC40MDM6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM1NTMwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjAxNS0wNjAwOiAwLjQwNjogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDA0MDIwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjAxNS0wNjAwOiAwLjQwNzogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzUzNDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDE5LTA2MDA6IDAuNDEwOiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDMzMTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDE5LTA2MDA6IDAuNDExOiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNTM5MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wMjMtMDYwMDogMC40MTQ6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzYzMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wMjMtMDYwMDogMC40MTQ6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM1NTAwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjAyNy0wNjAwOiAwLjQxODogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzNDMwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjAyNy0wNjAwOiAwLjQxODogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzUyMjAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDMxLTA2MDA6IDAuNDIyOiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDMyNjAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDMxLTA2MDA6IDAuNDIyOiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNTIzMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wMzQtMDYwMDogMC40MjY6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzY1MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wMzUtMDYwMDogMC40MjY6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM1MDEwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjAzOC0wNjAwOiAwLjQzMDogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzMDAwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjAzOS0wNjAwOiAwLjQzMDogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzUwOTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDQyLTA2MDA6IDAuNDM0OiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDQ1NzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDQzLTA2MDA6IDAuNDM0OiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNjAxMCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wNDYtMDYwMDogMC40Mzg6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwNDU3MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wNDctMDYwMDogMC40Mzg6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM2MDkwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA1MS0wNjAwOiAwLjQ0MjogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzNzQwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA1MS0wNjAwOiAwLjQ0MjogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzYxNDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDU1LTA2MDA6IDAuNDQ2OiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDM2MzAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDU1LTA2MDA6IDAuNDQ2OiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNjA4MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wNTktMDYwMDogMC40NTA6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzc3MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wNTktMDYwMDogMC40NTE6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM2MDYwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA2My0wNjAwOiAwLjQ1NDogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzNDEwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA2My0wNjAwOiAwLjQ1NTogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzYzMDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDY3LTA2MDA6IDAuNDU4OiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDI5OTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDY3LTA2MDA6IDAuNDU5OiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNjE2MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wNzEtMDYwMDogMC40NjI6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzk3MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wNzEtMDYwMDogMC40NjM6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM2NjYwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA3NS0wNjAwOiAwLjQ2NjogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAzMTYwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA3NS0wNjAwOiAwLjQ2NzogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzYwODAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDc5LTA2MDA6IDAuNDcwOiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDMxNDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDc5LTA2MDA6IDAuNDcxOiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNTc0MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wODMtMDYwMDogMC40NzQ6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzQ1MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wODMtMDYwMDogMC40NzU6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM2MjQwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA4Ny0wNjAwOiAwLjQ3ODogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDA0NjcwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA4Ny0wNjAwOiAwLjQ3OTogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzc3OTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDkxLTA2MDA6IDAuNDgzOiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDI2OTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMDkxLTA2MDA6IDAuNDgzOiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNjI5MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wOTUtMDYwMDogMC40ODc6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzM0MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4wOTYtMDYwMDogMC40ODc6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM1OTUwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA5OS0wNjAwOiAwLjQ5MTogW0dDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDAyNDgwIHNlY3NdCisyMDEzLTAyLTExVDIwOjE1OjI3LjA5OS0wNjAwOiAwLjQ5MTogW0Z1bGwgR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMzU5NDAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMTAzLTA2MDA6IDAuNDk1OiBbR0MgNDgySy0+NDgySyg2Mjg0OEspLCAwLjAwMDM1MTAgc2Vjc10KKzIwMTMtMDItMTFUMjA6MTU6MjcuMTA0LTA2MDA6IDAuNDk1OiBbRnVsbCBHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAzNzA2MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4xMDctMDYwMDogMC40OTk6IFtHQyA0ODJLLT40ODJLKDYyODQ4SyksIDAuMDAwMzY4MCBzZWNzXQorMjAxMy0wMi0xMVQyMDoxNToyNy4xMDgtMDYwMDogMC40OTk6IFtGdWxsIEdDIDQ4MkstPjQ4MksoNjI4NDhLKSwgMC4wMDM1OTIwIHNlY3NdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcG9tLnhtbCBiL2V4YW1wbGVzL3BvbS54bWwKaW5kZXggNzM1MmQ3Yi4uMGU5MDRjYiAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvcG9tLnhtbAorKysgYi9leGFtcGxlcy9wb20ueG1sCkBAIC0xLDE5ICsxLDU3IEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4KKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jYWxpcGVyPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5jYWxpcGVyLWV4YW1wbGVzPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4wLjUtcmMxPC92ZXJzaW9uPgotICA8aW5jZXB0aW9uWWVhcj4yMDA5PC9pbmNlcHRpb25ZZWFyPgotICA8bmFtZT5DYWxpcGVyIEV4YW1wbGVzPC9uYW1lPgogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5zb25hdHlwZS5vc3M8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3NzLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj41PC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjc8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgotICA8dXJsPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jYWxpcGVyLzwvdXJsPgorCisgIDxncm91cElkPmNvbS5nb29nbGUuY2FsaXBlcjwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+Y2FsaXBlci1leGFtcGxlczwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgIDxuYW1lPkNhbGlwZXIgRXhhbXBsZXM8L25hbWU+CiAgIDxkZXNjcmlwdGlvbj5DYWxpcGVyIEV4YW1wbGVzPC9kZXNjcmlwdGlvbj4KKworICA8dXJsPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jYWxpcGVyLzwvdXJsPgorCisgIDxpbmNlcHRpb25ZZWFyPjIwMDk8L2luY2VwdGlvblllYXI+CisKKyAgPG9yZ2FuaXphdGlvbj4KKyAgICA8bmFtZT5Hb29nbGUgSW5jLjwvbmFtZT4KKyAgICA8dXJsPmh0dHA6Ly93d3cuZ29vZ2xlLmNvbTwvdXJsPgorICA8L29yZ2FuaXphdGlvbj4KKworICA8ZGV2ZWxvcGVycz4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPG5hbWU+R3JlZ29yeSBLaWNrPC9uYW1lPgorICAgICAgPG9yZ2FuaXphdGlvbj5Hb29nbGUgSW5jLjwvb3JnYW5pemF0aW9uPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8bmFtZT5KZXNzZSBXaWxzb248L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgIDwvZGV2ZWxvcGVycz4KKwogICA8bGljZW5zZXM+CiAgICAgPGxpY2Vuc2U+CiAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgpAQCAtMjEsMjQgKzU5LDIzIEBACiAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KICAgICA8L2xpY2Vuc2U+CiAgIDwvbGljZW5zZXM+CisKICAgPHNjbT4KICAgICA8Y29ubmVjdGlvbj5zY206Z2l0Omh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jYWxpcGVyL2V4YW1wbGVzPC9jb25uZWN0aW9uPgogICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpnaXQ6Z2l0Omh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jYWxpcGVyL2V4YW1wbGVzPC9kZXZlbG9wZXJDb25uZWN0aW9uPgogICAgIDx1cmw+aHR0cDovL2NhbGlwZXIuY29kZWdvb2dsZS5jb20vc3ZuL3RydW5rL2V4YW1wbGVzPC91cmw+CiAgIDwvc2NtPgorCiAgIDxpc3N1ZU1hbmFnZW1lbnQ+CiAgICAgPHN5c3RlbT5Hb29nbGUgQ29kZSBJc3N1ZSBUcmFja2luZzwvc3lzdGVtPgogICAgIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2NhbGlwZXIvaXNzdWVzL2xpc3Q8L3VybD4KICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0gIDxvcmdhbml6YXRpb24+Ci0gICAgPG5hbWU+R29vZ2xlLCBJbmMuPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5nb29nbGUuY29tPC91cmw+Ci0gIDwvb3JnYW5pemF0aW9uPgorCiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNhbGlwZXI8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5jYWxpcGVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MC41LXJjMTwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KQEAgLTQ3LDEzICs4NCwxNCBAQAogICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CisKICAgPGJ1aWxkPgogICAgIDxkZWZhdWx0R29hbD5wYWNrYWdlPC9kZWZhdWx0R29hbD4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjMuMjwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+My4yPC92ZXJzaW9uPgogICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICA8c291cmNlPjEuNjwvc291cmNlPgogICAgICAgICAgIDx0YXJnZXQ+MS42PC90YXJnZXQ+CkBAIC02Miw3ICsxMDAsNyBAQAogICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lY2xpcHNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi44PC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4yLjk8L3ZlcnNpb24+CiAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgIDxkb3dubG9hZFNvdXJjZXM+dHJ1ZTwvZG93bmxvYWRTb3VyY2VzPgogICAgICAgICAgIDxkb3dubG9hZEphdmFkb2NzPnRydWU8L2Rvd25sb2FkSmF2YWRvY3M+CkBAIC03MiwxNyArMTEwLDEyIEBACiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjIuNS4xPC92ZXJzaW9uPgogICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICA8YXJndW1lbnRzPi1EZW5hYmxlQ2lQcm9maWxlPXRydWU8L2FyZ3VtZW50cz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgogICA8L2J1aWxkPgotICA8ZGV2ZWxvcGVycz4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPG5hbWU+SmVzc2UgV2lsc29uPC9uYW1lPgotICAgICAgPG9yZ2FuaXphdGlvbj5Hb29nbGUgSW5jLjwvb3JnYW5pemF0aW9uPgotICAgIDwvZGV2ZWxvcGVyPgotICA8L2RldmVsb3BlcnM+CisKIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQXJyYXlTb3J0QmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0FycmF5U29ydEJlbmNobWFyay5qYXZhCmluZGV4IGY0MjM5MGYuLjgxYmUyYTYgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQXJyYXlTb3J0QmVuY2htYXJrLmphdmEKKysrIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9BcnJheVNvcnRCZW5jaG1hcmsuamF2YQpAQCAtMTYsMTYgKzE2LDE3IEBACiAKIHBhY2thZ2UgZXhhbXBsZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVmb3JlRXhwZXJpbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOwogaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKIC8qKgogICogTWVhc3VyZXMgc29ydGluZyBvbiBkaWZmZXJlbnQgZGlzdHJpYnV0aW9ucyBvZiBpbnRlZ2Vycy4KICAqLwotcHVibGljIGNsYXNzIEFycmF5U29ydEJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CitwdWJsaWMgY2xhc3MgQXJyYXlTb3J0QmVuY2htYXJrIHsKIAogICBAUGFyYW0oeyIxMCIsICIxMDAiLCAiMTAwMCIsICIxMDAwMCJ9KSBwcml2YXRlIGludCBsZW5ndGg7CiAKQEAgLTM0LDEyICszNSwxMiBAQAogICBwcml2YXRlIGludFtdIHZhbHVlczsKICAgcHJpdmF0ZSBpbnRbXSBjb3B5OwogCi0gIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICBAQmVmb3JlRXhwZXJpbWVudCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgdmFsdWVzID0gZGlzdHJpYnV0aW9uLmNyZWF0ZShsZW5ndGgpOwogICAgIGNvcHkgPSBuZXcgaW50W2xlbmd0aF07CiAgIH0KIAotICBwdWJsaWMgdm9pZCB0aW1lU29ydChpbnQgcmVwcykgeworICBAQmVuY2htYXJrIHZvaWQgc29ydChpbnQgcmVwcykgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlcywgMCwgY29weSwgMCwgdmFsdWVzLmxlbmd0aCk7CiAgICAgICBBcnJheXMuc29ydChjb3B5KTsKQEAgLTk1LDggKzk2LDQgQEAKIAogICAgIGFic3RyYWN0IGludFtdIGNyZWF0ZShpbnQgbGVuZ3RoKTsKICAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIFJ1bm5lci5tYWluKEFycmF5U29ydEJlbmNobWFyay5jbGFzcywgYXJncyk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQml0U2V0QmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0JpdFNldEJlbmNobWFyay5qYXZhCmluZGV4IDMxNTRiMDEuLjk4Y2RjYzggMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQml0U2V0QmVuY2htYXJrLmphdmEKKysrIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9CaXRTZXRCZW5jaG1hcmsuamF2YQpAQCAtMTYsOCArMTYsMTAgQEAKIAogcGFja2FnZSBleGFtcGxlczsKIAotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZWZvcmVFeHBlcmltZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CisKIGltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKQEAgLTQ0LDE3ICs0NiwxNyBAQAogICogQmFzZWxpbmVJdGVyYXRpb24gICA2OCBYWHx8fHx8fHx8fHx8fHx8fHx8CiAgKiA8L3ByZT4KICAqCi0gKiA8cD5Jbml0aWFsbHkgdGhpbmdzIGxvb2sgc2ltcGxlLiBUaGUge0BsaW5rICN0aW1lU2V0Qml0U2V0WDY0KGludCl9IGJlbmNobWFyawotICogdGFrZXMgYXBwcm94aW1hdGVseSB0d2ljZSBhcyBsb25nIGFzIHtAbGluayAjdGltZVNldE1hc2tYNjQoaW50KX0uIEhvd2V2ZXIKKyAqIDxwPkluaXRpYWxseSB0aGluZ3MgbG9vayBzaW1wbGUuIFRoZSB7QGxpbmsgI3NldEJpdFNldFg2NChpbnQpfSBiZW5jaG1hcmsKKyAqIHRha2VzIGFwcHJveGltYXRlbHkgdHdpY2UgYXMgbG9uZyBhcyB7QGxpbmsgI3NldE1hc2tYNjQoaW50KX0uIEhvd2V2ZXIKICAqIHRoZSBpbm5lciBsb29wcyBpbiB0aGVzZSBiZW5jaG1hcmtzIGhhdmUgYWxtb3N0IG5vIGNvbnRlbnQsIHNvIGEgbW9yZQogICogJ3JlYWwgd29ybGQnIGJlbmNobWFyayB3YXMgZGV2aXNlZCBpbiBhbiBhdHRlbXB0IHRvIGJhY2sgdXAgdGhlc2UgcmVzdWx0cy4KICAqCi0gKiA8cD5UaGUge0BsaW5rICN0aW1lQ2hhcnNUb01hc2soaW50KX0gYW5kIHtAbGluayAjdGltZUNoYXJzVG9CaXRTZXQoaW50KX0KKyAqIDxwPlRoZSB7QGxpbmsgI2NoYXJzVG9NYXNrKGludCl9IGFuZCB7QGxpbmsgI2NoYXJzVG9CaXRTZXQoaW50KX0KICAqIGJlbmNobWFya3MgY29udmVydCBhIHNpbXBsZSBjaGFyW10gb2YgJzEncyBhbmQgJzAncyB0byBhIGNvcnJlc3BvbmRpbmcgQml0U2V0CiAgKiBvciBiaXQgbWFzay4gVGhlc2UgYWxzbyBwcm9jZXNzZXMgNjQgYml0cyBwZXIgaXRlcmF0aW9uIGFuZCBzbyBhcHBlYXJzIHRvIGJlCiAgKiBkb2luZyB0aGUgc2FtZSBhbW91bnQgb2Ygd29yayBhcyB0aGUgZmlyc3QgYmVuY2htYXJrcy4KICAqCi0gKiA8cD5BZGRpdGlvbmFsbHkgdGhlIHtAbGluayBCaXRTZXRCZW5jaG1hcmsjdGltZUJhc2VsaW5lSXRlcmF0aW9uKGludCl9CisgKiA8cD5BZGRpdGlvbmFsbHkgdGhlIHtAbGluayBCaXRTZXRCZW5jaG1hcmsjYmFzZWxpbmVJdGVyYXRpb24oaW50KX0KICAqIGJlbmNobWFyayBhdHRlbXB0cyB0byBtZWFzdXJlIHRoZSByYXcgY29zdCBvZiBsb29waW5nIHRocm91Z2ggYW5kIHJlYWRpbmcgdGhlCiAgKiBzb3VyY2UgZGF0YS4KICAqCkBAIC04MywxMSArODUsMTEgQEAKICAqIDxwPjxiPjI6PC9iPk92ZXJseSBzaW1wbGlzdGljIGJlbmNobWFya3MgY2FuIGdpdmUgYSB2ZXJ5IGZhbHNlIGltcHJlc3Npb24gb2YKICAqIHBlcmZvcm1hbmNlLgogICovCi1wdWJsaWMgY2xhc3MgQml0U2V0QmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKK3B1YmxpYyBjbGFzcyBCaXRTZXRCZW5jaG1hcmsgewogICBwcml2YXRlIEJpdFNldCBiaXRTZXQ7CiAgIHByaXZhdGUgY2hhcltdIGJpdFN0cmluZzsKIAotICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgQEJlZm9yZUV4cGVyaW1lbnQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIGJpdFNldCA9IG5ldyBCaXRTZXQoNjQpOwogICAgIGJpdFN0cmluZyA9IG5ldyBjaGFyWzY0XTsKICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKQEAgLTk5LDcgKzEwMSw3IEBACiAgIC8qKgogICAgKiBUaGlzIGJlbmNobWFyayBhdHRlbXB0cyB0byBtZWFzdXJlIHBlcmZvcm1hbmNlIG9mIHtAbGluayBCaXRTZXQjc2V0fS4KICAgICovCi0gIHB1YmxpYyBpbnQgdGltZVNldEJpdFNldFg2NChpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCBzZXRCaXRTZXRYNjQoaW50IHJlcHMpIHsKICAgICBsb25nIGNvdW50ID0gNjRMICogcmVwczsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgIGJpdFNldC5zZXQoaSAmIDB4M0YsIHRydWUpOwpAQCAtMTEwLDcgKzExMiw3IEBACiAgIC8qKgogICAgKiBUaGlzIGJlbmNobWFyayBhdHRlbXB0cyB0byBtZWFzdXJlIHBlcmZvcm1hbmNlIG9mIGRpcmVjdCBiaXQtbWFuaXB1bGF0aW9uLgogICAgKi8KLSAgcHVibGljIGxvbmcgdGltZVNldE1hc2tYNjQoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBsb25nIHNldE1hc2tYNjQoaW50IHJlcHMpIHsKICAgICBsb25nIGNvdW50ID0gNjRMICogcmVwczsKICAgICBsb25nIGJpdE1hc2sgPSAwTDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKQEAgLTEyMiw5ICsxMjQsOSBAQAogICAvKioKICAgICogVGhpcyBiZW5jaG1hcmsgcGFyc2VzIGEgY2hhcltdIG9mIDEncyBhbmQgMCdzIGludG8gYSBCaXRTZXQuIFJlc3VsdHMgZnJvbQogICAgKiB0aGlzIGJlbmNobWFyayBzaG91bGQgYmUgY29tcGFyYWJsZSB3aXRoIHRob3NlIGZyb20KLSAgICoge0BsaW5rICN0aW1lQ2hhcnNUb01hc2soaW50KX0uCisgICAqIHtAbGluayAjY2hhcnNUb01hc2soaW50KX0uCiAgICAqLwotICBwdWJsaWMgU3RyaW5nIHRpbWVDaGFyc1RvQml0U2V0KGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgU3RyaW5nIGNoYXJzVG9CaXRTZXQoaW50IHJlcHMpIHsKICAgICAvKgogICAgICAqIFRoaXMgYmVuY2htYXJrIG5vdyBtZWFzdXJlcyB0aGUgY29tcGxldGUgcGFyc2luZyBvZiBhIGNoYXJbXSByYXRoZXIgdGhhbgogICAgICAqIGEgc2luZ2xlIGludm9jYXRpb24gb2Yge0BsaW5rIEJpdFNldCNzZXR9LiBIb3dldmVyIHRoaXMgZmluZSBiZWNhdXNlCkBAIC0xNDEsOSArMTQzLDkgQEAKICAgLyoqCiAgICAqIFRoaXMgYmVuY2htYXJrIHBhcnNlcyBhIGNoYXJbXSBvZiAxJ3MgYW5kIDAncyBpbnRvIGEgYml0IG1hc2suIFJlc3VsdHMgZnJvbQogICAgKiB0aGlzIGJlbmNobWFyayBzaG91bGQgYmUgY29tcGFyYWJsZSB3aXRoIHRob3NlIGZyb20KLSAgICoge0BsaW5rICN0aW1lQ2hhcnNUb0JpdFNldChpbnQpfS4KKyAgICoge0BsaW5rICNjaGFyc1RvQml0U2V0KGludCl9LgogICAgKi8KLSAgcHVibGljIGxvbmcgdGltZUNoYXJzVG9NYXNrKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgbG9uZyBjaGFyc1RvTWFzayhpbnQgcmVwcykgewogICAgIC8qCiAgICAgICogQ29tcGFyaW5nIHJlc3VsdHMgd2Ugc2VlIGEgZmFyIG1vcmUgcmVhbGlzdGljIHNvdW5kaW5nIHJlc3VsdCB3aGVyZWJ5CiAgICAgICogdXNpbmcgYSBiaXQgbWFzayBpcyBhIGxpdHRsZSBvdmVyIDR4IGZhc3RlciB0aGFuIHVzaW5nIEJpdFNldC4KQEAgLTE2NCwxMiArMTY2LDEyIEBACiAKICAgLyoqCiAgICAqIFRoaXMgYmVuY2htYXJrIGF0dGVtcHRzIHRvIG1lYXN1cmUgdGhlIGJhc2VsaW5lIGNvc3Qgb2YgYm90aAotICAgKiB7QGxpbmsgI3RpbWVDaGFyc1RvQml0U2V0KGludCl9IGFuZCB7QGxpbmsgI3RpbWVDaGFyc1RvTWFzayhpbnQpfS4KKyAgICoge0BsaW5rICNjaGFyc1RvQml0U2V0KGludCl9IGFuZCB7QGxpbmsgI2NoYXJzVG9NYXNrKGludCl9LgogICAgKiBJdCBkb2VzIHRoaXMgYnkgdW5jb25kaXRpb25hbGx5IHN1bW1pbmcgdGhlIGNoYXJhY3RlciB2YWx1ZXMgb2YgdGhlIGNoYXJbXS4KICAgICogVGhpcyBpcyBhcyBjbG9zZSB0byBhIG5vLW9wIGNhc2UgYXMgd2UgY2FuIGV4cGVjdCB0byBnZXQgd2l0aG91dCB1bndhbnRlZAogICAgKiBvdmVyLW9wdGltaXphdGlvbi4KICAgICovCi0gIHB1YmxpYyBsb25nIHRpbWVCYXNlbGluZUl0ZXJhdGlvbihpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGxvbmcgYmFzZWxpbmVJdGVyYXRpb24oaW50IHJlcHMpIHsKICAgICBpbnQgYmFkSGFzaCA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgYml0U3RyaW5nLmxlbmd0aDsgbisrKSB7CkBAIC0xNzgsOSArMTgwLDQgQEAKICAgICB9CiAgICAgcmV0dXJuIGJhZEhhc2g7CiAgIH0KLQotICAvLyBUT0RPOiByZW1vdmUgdGhpcyBmcm9tIGFsbCBleGFtcGxlcyB3aGVuIElERSBwbHVnaW5zIGFyZSByZWFkeQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgIFJ1bm5lci5tYWluKEJpdFNldEJlbmNobWFyay5jbGFzcywgYXJncyk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQ2hhcmFjdGVyQmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0NoYXJhY3RlckJlbmNobWFyay5qYXZhCmluZGV4IDFlMDEzYWYuLjgyYzQ0MzkgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQ2hhcmFjdGVyQmVuY2htYXJrLmphdmEKKysrIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9DaGFyYWN0ZXJCZW5jaG1hcmsuamF2YQpAQCAtMTYsMTUgKzE2LDE1IEBACiAKIHBhY2thZ2UgZXhhbXBsZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVmb3JlRXhwZXJpbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOwogaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CiAKIC8qKgogICogVGVzdHMgdmFyaW91cyBDaGFyYWN0ZXIgbWV0aG9kcywgaW50ZW5kZWQgZm9yIHRlc3RpbmcgbXVsdGlwbGUKICAqIGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0IGVhY2ggb3RoZXIuCiAgKi8KLXB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworcHVibGljIGNsYXNzIENoYXJhY3RlckJlbmNobWFyayB7CiAKICAgICBAUGFyYW0gcHJpdmF0ZSBDaGFyYWN0ZXJTZXQgY2hhcmFjdGVyU2V0OwogCkBAIC0zMiw3ICszMiw3IEBACiAKICAgICBwcml2YXRlIGNoYXJbXSBjaGFyczsKIAotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEBCZWZvcmVFeHBlcmltZW50IHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jaGFycyA9IGNoYXJhY3RlclNldC5jaGFyczsKICAgICB9CiAKQEAgLTUxLDcgKzUxLDcgQEAKICAgICB9CiAKICAgICAvLyBBIGZha2UgYmVuY2htYXJrIHRvIGdpdmUgdXMgYSBiYXNlbGluZS4KLSAgICBwdWJsaWMgYm9vbGVhbiB0aW1lSXNTcGFjZShpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgYm9vbGVhbiBpc1NwYWNlKGludCByZXBzKSB7CiAgICAgICAgIGJvb2xlYW4gZHVtbXkgPSBmYWxzZTsKICAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgIHJldHVybiBkdW1teTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0aW1lRGlnaXQoaW50IHJlcHMpIHsKKyAgICBAQmVuY2htYXJrIHZvaWQgZGlnaXQoaW50IHJlcHMpIHsKICAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CkBAIC04NSw3ICs4NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0aW1lR2V0TnVtZXJpY1ZhbHVlKGludCByZXBzKSB7CisgICAgQEJlbmNobWFyayB2b2lkIGdldE51bWVyaWNWYWx1ZShpbnQgcmVwcykgewogICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGltZUlzRGlnaXQoaW50IHJlcHMpIHsKKyAgICBAQmVuY2htYXJrIHZvaWQgaXNEaWdpdChpbnQgcmVwcykgewogICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGltZUlzSWRlbnRpZmllcklnbm9yYWJsZShpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgdm9pZCBpc0lkZW50aWZpZXJJZ25vcmFibGUoaW50IHJlcHMpIHsKICAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRpbWVJc0phdmFJZGVudGlmaWVyUGFydChpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgdm9pZCBpc0phdmFJZGVudGlmaWVyUGFydChpbnQgcmVwcykgewogICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGltZUlzSmF2YUlkZW50aWZpZXJTdGFydChpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgdm9pZCBpc0phdmFJZGVudGlmaWVyU3RhcnQoaW50IHJlcHMpIHsKICAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRpbWVJc0xldHRlcihpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgdm9pZCBpc0xldHRlcihpbnQgcmVwcykgewogICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGltZUlzTGV0dGVyT3JEaWdpdChpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgdm9pZCBpc0xldHRlck9yRGlnaXQoaW50IHJlcHMpIHsKICAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRpbWVJc0xvd2VyQ2FzZShpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgdm9pZCBpc0xvd2VyQ2FzZShpbnQgcmVwcykgewogICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKQEAgLTIxMyw3ICsyMTMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdGltZUlzU3BhY2VDaGFyKGludCByZXBzKSB7CisgICAgQEJlbmNobWFyayB2b2lkIGlzU3BhY2VDaGFyKGludCByZXBzKSB7CiAgICAgICAgIGlmIChvdmVybG9hZCA9PSBPdmVybG9hZC5DSEFSKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgewpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0aW1lSXNVcHBlckNhc2UoaW50IHJlcHMpIHsKKyAgICBAQmVuY2htYXJrIHZvaWQgaXNVcHBlckNhc2UoaW50IHJlcHMpIHsKICAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CkBAIC0yNDUsNyArMjQ1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRpbWVJc1doaXRlc3BhY2UoaW50IHJlcHMpIHsKKyAgICBAQmVuY2htYXJrIHZvaWQgaXNXaGl0ZXNwYWNlKGludCByZXBzKSB7CiAgICAgICAgIGlmIChvdmVybG9hZCA9PSBPdmVybG9hZC5DSEFSKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCA2NTUzNjsgKytjaCkgewpAQCAtMjYxLDcgKzI2MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0aW1lVG9Mb3dlckNhc2UoaW50IHJlcHMpIHsKKyAgICBAQmVuY2htYXJrIHZvaWQgdG9Mb3dlckNhc2UoaW50IHJlcHMpIHsKICAgICAgICAgaWYgKG92ZXJsb2FkID09IE92ZXJsb2FkLkNIQVIpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IDY1NTM2OyArK2NoKSB7CkBAIC0yNzcsNyArMjc3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRpbWVUb1VwcGVyQ2FzZShpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgdm9pZCB0b1VwcGVyQ2FzZShpbnQgcmVwcykgewogICAgICAgICBpZiAob3ZlcmxvYWQgPT0gT3ZlcmxvYWQuQ0hBUikgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgNjU1MzY7ICsrY2gpIHsKQEAgLTI5Miw5ICsyOTIsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZnJvbSBhbGwgZXhhbXBsZXMgd2hlbiBJREUgcGx1Z2lucyBhcmUgcmVhZHkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUnVubmVyLm1haW4oQ2hhcmFjdGVyQmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0NvbXByZXNzaW9uU2l6ZUJlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Db21wcmVzc2lvblNpemVCZW5jaG1hcmsuamF2YQppbmRleCA5MGRkZDM5Li5kNGZlZDVlIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0NvbXByZXNzaW9uU2l6ZUJlbmNobWFyay5qYXZhCisrKyBiL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQ29tcHJlc3Npb25TaXplQmVuY2htYXJrLmphdmEKQEAgLTE2LDEwICsxNiw5IEBACiAKIHBhY2thZ2UgZXhhbXBsZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOwogaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYXBpLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIubW9kZWwuQXJiaXRyYXJ5TWVhc3VyZW1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5DYWxpcGVyTWFpbjsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMCw3ICsyOSw3IEBACiAvKioKICAqIEV4YW1wbGUgImFyYml0cmFyeSBtZWFzdXJlbWVudCIgYmVuY2htYXJrLgogICovCi1wdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25TaXplQmVuY2htYXJrIGV4dGVuZHMgQmVuY2htYXJrIHsKK3B1YmxpYyBjbGFzcyBDb21wcmVzc2lvblNpemVCZW5jaG1hcmsgewogCiAgIEBQYXJhbSh7CiAgICAgICAidGhpcyBzdHJpbmcgd2lsbCBjb21wcmVzcyBiYWRseSIsCkBAIC01MCw3ICs0OSw3IEBACiAgICAgICBjb21wcmVzc2lvbkxldmVsTWFwLnB1dCgiaHVmZm1hbk9ubHkiLCBEZWZsYXRlci5IVUZGTUFOX09OTFkpOwogICB9CiAKLSAgcHVibGljIGxvbmcgdGltZVNpbXBsZUNvbXByZXNzaW9uKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgbG9uZyBzaW1wbGVDb21wcmVzc2lvbihpbnQgcmVwcykgewogICAgIGxvbmcgZHVtbXkgPSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICBkdW1teSArPSBjb21wcmVzcyh0b0NvbXByZXNzLmdldEJ5dGVzKCkpLmxlbmd0aDsKQEAgLTgzLDggKzgyLDQgQEAKICAgICB9CiAgICAgcmV0dXJuIGJvcy50b0J5dGVBcnJheSgpOwogICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIENhbGlwZXJNYWluLm1haW4oQ29tcHJlc3Npb25TaXplQmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Db250YWluc0JlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Db250YWluc0JlbmNobWFyay5qYXZhCmluZGV4IDAxYmI4YzYuLjI2ZDJlYjkgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQ29udGFpbnNCZW5jaG1hcmsuamF2YQorKysgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0NvbnRhaW5zQmVuY2htYXJrLmphdmEKQEAgLTE2LDIwICsxNiwxOSBAQAogCiBwYWNrYWdlIGV4YW1wbGVzOwogCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlZm9yZUV4cGVyaW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotcHVibGljIGNsYXNzIENvbnRhaW5zQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKK3B1YmxpYyBjbGFzcyBDb250YWluc0JlbmNobWFyayB7CiAgIEBQYXJhbSh7IjAiLCAiMjUiLCAiNTAiLCAiNzUiLCAiMTAwIn0pIHByaXZhdGUgaW50IHBlcmNlbnROdWxsczsKICAgQFBhcmFtKHsiMTAwIiwgIjEwMDAiLCAiMTAwMDAifSkgcHJpdmF0ZSBpbnQgY29udGFpbnNQZXJSZXA7CiAKQEAgLTM5LDcgKzM4LDcgQEAKICAgLyoqIHR3ZW50eS1maXZlIHBlcmNlbnQgbnVsbHMgKi8KICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9iamVjdD4gcXVlcmllcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwogCi0gIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgQEJlZm9yZUV4cGVyaW1lbnQgdm9pZCBzZXRVcCgpIHsKICAgICBzZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QoInN0cjEiLCAic3RyMiIsICJzdHIzIiwgInN0cjQiKSk7CiAgICAgaW50IG51bGxUaHJlc2hvbGQgPSBwZXJjZW50TnVsbHMgKiBjb250YWluc1BlclJlcCAvIDEwMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bGxUaHJlc2hvbGQ7IGkrKykgewpAQCAtNTEsMjggKzUwLDExIEBACiAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShxdWVyaWVzLCBuZXcgUmFuZG9tKDApKTsKICAgfQogCi0gIEBPdmVycmlkZSBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0VGltZVVuaXROYW1lcygpIHsKLSAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiB1bml0TmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgdW5pdE5hbWVzLnB1dCgibnMvY29udGFpbnMiLCAxKTsKLSAgICB1bml0TmFtZXMucHV0KCJ1cy9jb250YWlucyIsIDEwMDApOwotICAgIHVuaXROYW1lcy5wdXQoIm1zL2NvbnRhaW5zIiwgMTAwMDAwMCk7Ci0gICAgdW5pdE5hbWVzLnB1dCgicy9jb250YWlucyIsIDEwMDAwMDAwMDApOwotICAgIHJldHVybiB1bml0TmFtZXM7Ci0gIH0KLQotICBAT3ZlcnJpZGUgcHVibGljIGRvdWJsZSBuYW5vc1RvVW5pdHMoZG91YmxlIG5hbm9zKSB7Ci0gICAgcmV0dXJuIG5hbm9zIC8gY29udGFpbnNQZXJSZXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0aW1lQ29udGFpbnMoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayB2b2lkIGNvbnRhaW5zKGludCByZXBzKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIGZvciAoT2JqZWN0IHF1ZXJ5IDogcXVlcmllcykgewogICAgICAgICBzZXQuY29udGFpbnMocXVlcnkpOwogICAgICAgfQogICAgIH0KICAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBSdW5uZXIubWFpbihDb250YWluc0JlbmNobWFyay5jbGFzcywgYXJncyk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQ29weUFycmF5QmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0NvcHlBcnJheUJlbmNobWFyay5qYXZhCmluZGV4IGZlZDA5NTAuLjU0M2RiNWIgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvQ29weUFycmF5QmVuY2htYXJrLmphdmEKKysrIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Db3B5QXJyYXlCZW5jaG1hcmsuamF2YQpAQCAtMTYsOSArMTYsOSBAQAogCiBwYWNrYWdlIGV4YW1wbGVzOwogCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlZm9yZUV4cGVyaW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwpAQCAtNDQsNyArNDQsNyBAQAogICogICAgIG1lbW9yeSAoYm9vbGVhbiBhcnJheXMgY291bnQgYXMgYnl0ZSBhcnJheXMhKS4KICAqIDwvdWw+CiAgKi8KLXB1YmxpYyBjbGFzcyBDb3B5QXJyYXlCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworcHVibGljIGNsYXNzIENvcHlBcnJheUJlbmNobWFyayB7CiAgIHB1YmxpYyBlbnVtIFN0cmF0ZWd5IHsKICAgICBDTE9ORSB7CiAgICAgICBAT3ZlcnJpZGUgT2JqZWN0W10gY29weShPYmplY3RbXSBhcnJheSkgewpAQCAtMjUyLDcgKzI1Miw3IEBACiAgIGxvbmdbXSBsb25nQXJyYXk7CiAgIHNob3J0W10gc2hvcnRBcnJheTsKIAotICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgIEBCZWZvcmVFeHBlcmltZW50IHZvaWQgc2V0VXAoKSB7CiAgICAgb2JqZWN0QXJyYXkgPSBuZXcgT2JqZWN0W3NpemVdOwogICAgIGJvb2xlYW5BcnJheSA9IG5ldyBib29sZWFuW3NpemVdOwogICAgIGJ5dGVBcnJheSA9IG5ldyBieXRlW3NpemVdOwpAQCAtMjcxLDg2ICsyNzEsODIgQEAKICAgICAgIGJ5dGVBcnJheVtpXSA9IChieXRlKSBudW07CiAgICAgICBjaGFyQXJyYXlbaV0gPSAoY2hhcikgbnVtOwogICAgICAgZG91YmxlQXJyYXlbaV0gPSBudW07Ci0gICAgICBmbG9hdEFycmF5W2ldID0gKGZsb2F0KSBudW07CisgICAgICBmbG9hdEFycmF5W2ldID0gbnVtOwogICAgICAgaW50QXJyYXlbaV0gPSBudW07CiAgICAgICBsb25nQXJyYXlbaV0gPSBudW07CiAgICAgICBzaG9ydEFycmF5W2ldID0gKHNob3J0KSBudW07CiAgICAgfQogICB9CiAKLSAgcHVibGljIGludCB0aW1lT2JqZWN0cyhpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCBvYmplY3RzKGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewotICAgICAgZHVtbXkgKz0gc3RyYXRlZ3kuY29weShvYmplY3RBcnJheSkuaGFzaENvZGUoKTsKKyAgICAgIGR1bW15ICs9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHN0cmF0ZWd5LmNvcHkob2JqZWN0QXJyYXkpKTsKICAgICB9CiAgICAgcmV0dXJuIGR1bW15OwogICB9CiAKLSAgcHVibGljIGludCB0aW1lQm9vbGVhbnMoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgYm9vbGVhbnMoaW50IHJlcHMpIHsKICAgICBpbnQgZHVtbXkgPSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7Ci0gICAgICBkdW1teSArPSBzdHJhdGVneS5jb3B5KGJvb2xlYW5BcnJheSkuaGFzaENvZGUoKTsKKyAgICAgIGR1bW15ICs9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHN0cmF0ZWd5LmNvcHkoYm9vbGVhbkFycmF5KSk7CiAgICAgfQogICAgIHJldHVybiBkdW1teTsKICAgfQogCi0gIHB1YmxpYyBpbnQgdGltZUJ5dGVzKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgaW50IGJ5dGVzKGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewotICAgICAgZHVtbXkgKz0gc3RyYXRlZ3kuY29weShieXRlQXJyYXkpLmhhc2hDb2RlKCk7CisgICAgICBkdW1teSArPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShzdHJhdGVneS5jb3B5KGJ5dGVBcnJheSkpOwogICAgIH0KICAgICByZXR1cm4gZHVtbXk7CiAgIH0KIAotICBwdWJsaWMgaW50IHRpbWVDaGFycyhpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCBjaGFycyhpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKLSAgICAgIGR1bW15ICs9IHN0cmF0ZWd5LmNvcHkoY2hhckFycmF5KS5oYXNoQ29kZSgpOworICAgICAgZHVtbXkgKz0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoc3RyYXRlZ3kuY29weShjaGFyQXJyYXkpKTsKICAgICB9CiAgICAgcmV0dXJuIGR1bW15OwogICB9CiAKLSAgcHVibGljIGludCB0aW1lRG91YmxlcyhpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCBkb3VibGVzKGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewotICAgICAgZHVtbXkgKz0gc3RyYXRlZ3kuY29weShkb3VibGVBcnJheSkuaGFzaENvZGUoKTsKKyAgICAgIGR1bW15ICs9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHN0cmF0ZWd5LmNvcHkoZG91YmxlQXJyYXkpKTsKICAgICB9CiAgICAgcmV0dXJuIGR1bW15OwogICB9CiAKLSAgcHVibGljIGludCB0aW1lRmxvYXRzKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgaW50IGZsb2F0cyhpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKLSAgICAgIGR1bW15ICs9IHN0cmF0ZWd5LmNvcHkoZmxvYXRBcnJheSkuaGFzaENvZGUoKTsKKyAgICAgIGR1bW15ICs9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHN0cmF0ZWd5LmNvcHkoZmxvYXRBcnJheSkpOwogICAgIH0KICAgICByZXR1cm4gZHVtbXk7CiAgIH0KIAotICBwdWJsaWMgaW50IHRpbWVJbnRzKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgaW50IGludHMoaW50IHJlcHMpIHsKICAgICBpbnQgZHVtbXkgPSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7Ci0gICAgICBkdW1teSArPSBzdHJhdGVneS5jb3B5KGludEFycmF5KS5oYXNoQ29kZSgpOworICAgICAgZHVtbXkgKz0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoc3RyYXRlZ3kuY29weShpbnRBcnJheSkpOwogICAgIH0KICAgICByZXR1cm4gZHVtbXk7CiAgIH0KIAotICBwdWJsaWMgaW50IHRpbWVMb25ncyhpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCBsb25ncyhpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKLSAgICAgIGR1bW15ICs9IHN0cmF0ZWd5LmNvcHkobG9uZ0FycmF5KS5oYXNoQ29kZSgpOworICAgICAgZHVtbXkgKz0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoc3RyYXRlZ3kuY29weShsb25nQXJyYXkpKTsKICAgICB9CiAgICAgcmV0dXJuIGR1bW15OwogICB9CiAKLSAgcHVibGljIGludCB0aW1lU2hvcnRzKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgaW50IHNob3J0cyhpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKLSAgICAgIGR1bW15ICs9IHN0cmF0ZWd5LmNvcHkoc2hvcnRBcnJheSkuaGFzaENvZGUoKTsKKyAgICAgIGR1bW15ICs9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHN0cmF0ZWd5LmNvcHkoc2hvcnRBcnJheSkpOwogICAgIH0KICAgICByZXR1cm4gZHVtbXk7CiAgIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgUnVubmVyLm1haW4oQ29weUFycmF5QmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9EZW1vQmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0RlbW9CZW5jaG1hcmsuamF2YQppbmRleCAzYjdlMmRkLi4zMzEzZWVlIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0RlbW9CZW5jaG1hcmsuamF2YQorKysgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0RlbW9CZW5jaG1hcmsuamF2YQpAQCAtMTYsMjMgKzE2LDI0IEBACiAKIHBhY2thZ2UgZXhhbXBsZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQWZ0ZXJFeHBlcmltZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZWZvcmVFeHBlcmltZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CiBpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuQmVuY2htYXJrOwogaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5hcGkuU2tpcFRoaXNTY2VuYXJpb0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYXBpLlZtUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5DYWxpcGVyTWFpbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuYXBpLlZtT3B0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIudXRpbC5TaG9ydER1cmF0aW9uOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiAKLXB1YmxpYyBjbGFzcyBEZW1vQmVuY2htYXJrIGV4dGVuZHMgQmVuY2htYXJrIHsKK0BWbU9wdGlvbnMoIi1zZXJ2ZXIiKQorcHVibGljIGNsYXNzIERlbW9CZW5jaG1hcmsgewogICBAUGFyYW0oeyJhYmMiLCAiZGVmIiwgInh5eiJ9KSBTdHJpbmcgc3RyaW5nOwogICBAUGFyYW0oeyIxIiwgIjIifSkgaW50IG51bWJlcjsKICAgQFBhcmFtIEZvbyBmb287CiAKICAgQFBhcmFtKHsiMC4wMCIsICIxMjMuNDUifSkgQmlnRGVjaW1hbCBtb25leTsKICAgQFBhcmFtKHsiMW5zIiwgIjIgbWludXRlcyJ9KSBTaG9ydER1cmF0aW9uIGR1cmF0aW9uOwotICBAVm1QYXJhbSh7Ii1YbXgzMm0iLCAiLVhteDFnIn0pIFN0cmluZyBtZW1vcnlNYXg7CiAKICAgZW51bSBGb28gewogICAgIEZPTywgQkFSLCBCQVosIFFVWDsKQEAgLTQyLDEzICs0MywxMyBAQAogLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJJIHNob3VsZCBub3QgZG8gdGhpcy4iKTsKICAgfQogCi0gIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICBAQmVmb3JlRXhwZXJpbWVudCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgaWYgKHN0cmluZy5lcXVhbHMoImFiYyIpICYmIG51bWJlciA9PSAxKSB7CiAgICAgICB0aHJvdyBuZXcgU2tpcFRoaXNTY2VuYXJpb0V4Y2VwdGlvbigpOwogICAgIH0KICAgfQogCi0gIHB1YmxpYyBpbnQgdGltZVNvbWV0aGluZyhpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCBzb21ldGhpbmcoaW50IHJlcHMpIHsKICAgICBpbnQgZHVtbXkgPSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICBkdW1teSArPSBpOwpAQCAtNTYsNyArNTcsNyBAQAogICAgIHJldHVybiBkdW1teTsKICAgfQogCi0gIHB1YmxpYyBpbnQgdGltZVNvbWV0aGluZ0Vsc2UoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgc29tZXRoaW5nRWxzZShpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIGR1bW15IC09IGk7CkBAIC02NCwxMSArNjUsNyBAQAogICAgIHJldHVybiBkdW1teTsKICAgfQogCi0gIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICBAQWZ0ZXJFeHBlcmltZW50IHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIC8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGV5LCBJJ20gdGVhcmluZyB1cCB0aGUgam9pbnQuIik7CiAgIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgQ2FsaXBlck1haW4ubWFpbihEZW1vQmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Eb3VibGVUb1N0cmluZ0JlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Eb3VibGVUb1N0cmluZ0JlbmNobWFyay5qYXZhCmluZGV4IDI5MWVjODQuLmQyOGY5YjAgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvRG91YmxlVG9TdHJpbmdCZW5jaG1hcmsuamF2YQorKysgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0RvdWJsZVRvU3RyaW5nQmVuY2htYXJrLmphdmEKQEAgLTE2LDE3ICsxNiwxMyBAQAogCiBwYWNrYWdlIGV4YW1wbGVzOwogCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKiBNZWFzdXJlcyB0aGUgdmFyaW91cyB3YXlzIHRoZSBKREsgY29udmVydHMgZG91YmxlcyB0byBzdHJpbmdzLgogICovCi1wdWJsaWMgY2xhc3MgRG91YmxlVG9TdHJpbmdCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworcHVibGljIGNsYXNzIERvdWJsZVRvU3RyaW5nQmVuY2htYXJrIHsKICAgQFBhcmFtIE1ldGhvZCBtZXRob2Q7CiAKICAgcHVibGljIGVudW0gTWV0aG9kIHsKQEAgLTgzLDcgKzc5LDcgQEAKIAogICBAUGFyYW0gVmFsdWUgdmFsdWU7CiAKLSAgcHVibGljIGludCB0aW1lUHJpbWl0aXZlKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgaW50IHByaW1pdGl2ZShpbnQgcmVwcykgewogICAgIGRvdWJsZSBkID0gdmFsdWUudmFsdWU7CiAgICAgaW50IGR1bW15ID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewpAQCAtOTIsNyArODgsNyBAQAogICAgIHJldHVybiBkdW1teTsKICAgfQogCi0gIHB1YmxpYyBpbnQgdGltZVdyYXBwZXIoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgd3JhcHBlcihpbnQgcmVwcykgewogICAgIERvdWJsZSBkID0gdmFsdWUudmFsdWU7CiAgICAgaW50IGR1bW15ID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewpAQCAtMTAwLDggKzk2LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIGR1bW15OwogICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgUnVubmVyLm1haW4oRG91YmxlVG9TdHJpbmdCZW5jaG1hcmsuY2xhc3MsIGFyZ3MpOwotICB9CiB9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0RvdWJsZVRvU3RyaW5nQmVuY2htYXJrMi5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Eb3VibGVUb1N0cmluZ0JlbmNobWFyazIuamF2YQppbmRleCA4ZTZjNjlhLi4zYTZkYTViIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0RvdWJsZVRvU3RyaW5nQmVuY2htYXJrMi5qYXZhCisrKyBiL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvRG91YmxlVG9TdHJpbmdCZW5jaG1hcmsyLmphdmEKQEAgLTE2LDE0ICsxNiwxMyBAQAogCiBwYWNrYWdlIGV4YW1wbGVzOwogCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOwogCiAvKioKICAqIE1lYXN1cmVzIHRoZSB2YXJpb3VzIHdheXMgdGhlIEpESyBjb252ZXJ0cyBkb3VibGVzIHRvIHN0cmluZ3MuCiAgKi8KLXB1YmxpYyBjbGFzcyBEb3VibGVUb1N0cmluZ0JlbmNobWFyazIgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworcHVibGljIGNsYXNzIERvdWJsZVRvU3RyaW5nQmVuY2htYXJrMiB7CiAgIEBQYXJhbSBib29sZWFuIHVzZVdyYXBwZXI7CiAKICAgZW51bSBWYWx1ZSB7CkBAIC00MSw3ICs0MCw3IEBACiAKICAgQFBhcmFtIFZhbHVlIHZhbHVlOwogCi0gIHB1YmxpYyBpbnQgdGltZVRvU3RyaW5nKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgaW50IHRvU3RyaW5nKGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gMDsKICAgICBpZiAodXNlV3JhcHBlcikgewogICAgICAgRG91YmxlIGQgPSB2YWx1ZS5kOwpAQCAtNTcsNyArNTYsNyBAQAogICAgIHJldHVybiBkdW1teTsKICAgfQogCi0gIHB1YmxpYyBpbnQgdGltZVN0cmluZ1ZhbHVlT2YoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgc3RyaW5nVmFsdWVPZihpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDA7CiAgICAgaWYgKHVzZVdyYXBwZXIpIHsKICAgICAgIERvdWJsZSBkID0gdmFsdWUuZDsKQEAgLTczLDcgKzcyLDcgQEAKICAgICByZXR1cm4gZHVtbXk7CiAgIH0KIAotICBwdWJsaWMgaW50IHRpbWVTdHJpbmdGb3JtYXQoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgc3RyaW5nRm9ybWF0KGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gMDsKICAgICBpZiAodXNlV3JhcHBlcikgewogICAgICAgRG91YmxlIGQgPSB2YWx1ZS5kOwpAQCAtODksNyArODgsNyBAQAogICAgIHJldHVybiBkdW1teTsKICAgfQogCi0gIHB1YmxpYyBpbnQgdGltZVF1b3RlVHJpY2soaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgcXVvdGVUcmljayhpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDA7CiAgICAgaWYgKHVzZVdyYXBwZXIpIHsKICAgICAgIERvdWJsZSBkID0gdmFsdWUuZDsKQEAgLTEwNCw4ICsxMDMsNCBAQAogICAgIH0KICAgICByZXR1cm4gZHVtbXk7CiAgIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBSdW5uZXIubWFpbihEb3VibGVUb1N0cmluZ0JlbmNobWFyazIuY2xhc3MsIGFyZ3MpOwotICB9CiB9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0VudW1TZXRDb250YWluc0JlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9FbnVtU2V0Q29udGFpbnNCZW5jaG1hcmsuamF2YQppbmRleCBiMjMyNTE0Li4xMDY2MGE5IDEwMDY0NAotLS0gYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0VudW1TZXRDb250YWluc0JlbmNobWFyay5qYXZhCisrKyBiL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvRW51bVNldENvbnRhaW5zQmVuY2htYXJrLmphdmEKQEAgLTE2LDE2ICsxNiwxNyBAQAogCiBwYWNrYWdlIGV4YW1wbGVzOwogCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlZm9yZUV4cGVyaW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCiBpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBNZWFzdXJlcyBFbnVtU2V0I2NvbnRhaW5zKCkuCiAgKi8KLXB1YmxpYyBjbGFzcyBFbnVtU2V0Q29udGFpbnNCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworcHVibGljIGNsYXNzIEVudW1TZXRDb250YWluc0JlbmNobWFyayB7CiAKICAgQFBhcmFtIHByaXZhdGUgU2V0TWFrZXIgc2V0TWFrZXI7CiAKQEAgLTc1LDE4ICs3NiwxNCBAQAogICBwcml2YXRlIFNldDw/PiBzZXQ7CiAgIHByaXZhdGUgT2JqZWN0W10gdGVzdFZhbHVlczsKIAotICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgIEBCZWZvcmVFeHBlcmltZW50IHZvaWQgc2V0VXAoKSB7CiAgICAgdGhpcy5zZXQgPSBzZXRNYWtlci5uZXdTZXQoKTsKICAgICB0aGlzLnRlc3RWYWx1ZXMgPSBzZXRNYWtlci50ZXN0VmFsdWVzKCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB0aW1lQ29udGFpbnMoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayB2b2lkIGNvbnRhaW5zKGludCByZXBzKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIHNldC5jb250YWlucyh0ZXN0VmFsdWVzW2kgJSB0ZXN0VmFsdWVzLmxlbmd0aF0pOwogICAgIH0KICAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIFJ1bm5lci5tYWluKEVudW1TZXRDb250YWluc0JlbmNobWFyay5jbGFzcywgYXJncyk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvRXhwZW5zaXZlT2JqZWN0c0JlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9FeHBlbnNpdmVPYmplY3RzQmVuY2htYXJrLmphdmEKaW5kZXggYTExYjFiZC4uN2M0YmM3OSAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9FeHBlbnNpdmVPYmplY3RzQmVuY2htYXJrLmphdmEKKysrIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9FeHBlbnNpdmVPYmplY3RzQmVuY2htYXJrLmphdmEKQEAgLTE2LDkgKzE2LDcgQEAKIAogcGFja2FnZSBleGFtcGxlczsKIAotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5DYWxpcGVyTWFpbjsKLQoraW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CiBpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzOwogaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CkBAIC0yOCw0OSArMjYsNDMgQEAKICAqIEJlbmNobWFya3MgY3JlYXRpb24gYW5kIGNsb25pbmcgdmFyaW91cyBleHBlbnNpdmUgb2JqZWN0cy4KICAqLwogQFN1cHByZXNzV2FybmluZ3MoeyJSZXN1bHRPZk9iamVjdEFsbG9jYXRpb25JZ25vcmVkIn0pIC8vIFRPRE86IHNob3VsZCBmaXghCi1wdWJsaWMgY2xhc3MgRXhwZW5zaXZlT2JqZWN0c0JlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7Ci0gIHB1YmxpYyB2b2lkIHRpbWVOZXdEZWNpbWFsRm9ybWF0U3ltYm9scyhpbnQgcmVwcykgeworcHVibGljIGNsYXNzIEV4cGVuc2l2ZU9iamVjdHNCZW5jaG1hcmsgeworICBAQmVuY2htYXJrIHZvaWQgbmV3RGVjaW1hbEZvcm1hdFN5bWJvbHMoaW50IHJlcHMpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewogICAgICAgbmV3IERlY2ltYWxGb3JtYXRTeW1ib2xzKExvY2FsZS5VUyk7CiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgdGltZUNsb25lZERlY2ltYWxGb3JtYXRTeW1ib2xzKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgdm9pZCBjbG9uZWREZWNpbWFsRm9ybWF0U3ltYm9scyhpbnQgcmVwcykgewogICAgIERlY2ltYWxGb3JtYXRTeW1ib2xzIGRmcyA9IG5ldyBEZWNpbWFsRm9ybWF0U3ltYm9scyhMb2NhbGUuVVMpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CiAgICAgICBkZnMuY2xvbmUoKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCB0aW1lTmV3TnVtYmVyRm9ybWF0KGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgdm9pZCBuZXdOdW1iZXJGb3JtYXQoaW50IHJlcHMpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewogICAgICAgTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgdGltZUNsb25lZE51bWJlckZvcm1hdChpbnQgcmVwcykgeworICBAQmVuY2htYXJrIHZvaWQgY2xvbmVkTnVtYmVyRm9ybWF0KGludCByZXBzKSB7CiAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKExvY2FsZS5VUyk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKICAgICAgIG5mLmNsb25lKCk7CiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgdGltZU5ld1NpbXBsZURhdGVGb3JtYXQoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayB2b2lkIG5ld1NpbXBsZURhdGVGb3JtYXQoaW50IHJlcHMpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewogICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCB0aW1lQ2xvbmVkU2ltcGxlRGF0ZUZvcm1hdChpbnQgcmVwcykgeworICBAQmVuY2htYXJrIHZvaWQgY2xvbmVkU2ltcGxlRGF0ZUZvcm1hdChpbnQgcmVwcykgewogICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewogICAgICAgc2RmLmNsb25lKCk7CiAgICAgfQogICB9Ci0KLSAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZnJvbSBhbGwgZXhhbXBsZXMgd2hlbiBJREUgcGx1Z2lucyBhcmUgcmVhZHkKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQ2FsaXBlck1haW4ubWFpbihFeHBlbnNpdmVPYmplY3RzQmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKLS8vICAgIFJ1bm5lci5tYWluKEV4cGVuc2l2ZU9iamVjdHNCZW5jaG1hcmsuY2xhc3MsIGFyZ3MpOwotICB9CiB9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0Zvcm1hdHRlckJlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Gb3JtYXR0ZXJCZW5jaG1hcmsuamF2YQppbmRleCBiNGEwNTQxLi45M2VkOTM2IDEwMDY0NAotLS0gYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0Zvcm1hdHRlckJlbmNobWFyay5qYXZhCisrKyBiL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvRm9ybWF0dGVyQmVuY2htYXJrLmphdmEKQEAgLTE2LDM2ICsxNiwzNyBAQAogCiBwYWNrYWdlIGV4YW1wbGVzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CiBpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKIAogLyoqCiAgKiBDb21wYXJlcyBGb3JtYXR0ZXIgYWdhaW5zdCBoYW5kLXdyaXR0ZW4gU3RyaW5nQnVpbGRlciBjb2RlLgogICovCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGVyQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKLSAgcHVibGljIHZvaWQgdGltZUZvcm1hdHRlcl9Ob0Zvcm1hdHRpbmcoaW50IHJlcHMpIHsKK3B1YmxpYyBjbGFzcyBGb3JtYXR0ZXJCZW5jaG1hcmsgeworICBAQmVuY2htYXJrIHZvaWQgZm9ybWF0dGVyX05vRm9ybWF0dGluZyhpbnQgcmVwcykgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoKTsKICAgICAgIGYuZm9ybWF0KCJ0aGlzIGlzIGEgcmVhc29uYWJseSBzaG9ydCBzdHJpbmcgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IG5lZWQgYW55IGZvcm1hdHRpbmciKTsKKyAgICAgIGYuY2xvc2UoKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCB0aW1lU3RyaW5nQnVpbGRlcl9Ob0Zvcm1hdHRpbmcoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayB2b2lkIHN0cmluZ0J1aWxkZXJfTm9Gb3JtYXR0aW5nKGludCByZXBzKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgc2IuYXBwZW5kKCJ0aGlzIGlzIGEgcmVhc29uYWJseSBzaG9ydCBzdHJpbmcgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IG5lZWQgYW55IGZvcm1hdHRpbmciKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCB0aW1lRm9ybWF0dGVyX09uZUludChpbnQgcmVwcykgeworICBAQmVuY2htYXJrIHZvaWQgZm9ybWF0dGVyX09uZUludChpbnQgcmVwcykgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICBGb3JtYXR0ZXIgZiA9IG5ldyBGb3JtYXR0ZXIoKTsKICAgICAgIGYuZm9ybWF0KCJ0aGlzIGlzIGEgcmVhc29uYWJseSBzaG9ydCBzdHJpbmcgdGhhdCBoYXMgYW4gaW50ICVkIGluIGl0IiwgaSk7CisgICAgICBmLmNsb3NlKCk7CiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgdGltZVN0cmluZ0J1aWxkZXJfT25lSW50KGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgdm9pZCBzdHJpbmdCdWlsZGVyX09uZUludChpbnQgcmVwcykgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgIHNiLmFwcGVuZCgidGhpcyBpcyBhIHJlYXNvbmFibHkgc2hvcnQgc3RyaW5nIHRoYXQgaGFzIGFuIGludCAiKTsKQEAgLTU0LDE0ICs1NSwxNSBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIHRpbWVGb3JtYXR0ZXJfT25lU3RyaW5nKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgdm9pZCBmb3JtYXR0ZXJfT25lU3RyaW5nKGludCByZXBzKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcigpOwogICAgICAgZi5mb3JtYXQoInRoaXMgaXMgYSByZWFzb25hYmx5IHNob3J0IHN0cmluZyB0aGF0IGhhcyBhIHN0cmluZyAlcyBpbiBpdCIsICJoZWxsbyIpOworICAgICAgZi5jbG9zZSgpOwogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIHRpbWVTdHJpbmdCdWlsZGVyX09uZVN0cmluZyhpbnQgcmVwcykgeworICBAQmVuY2htYXJrIHZvaWQgc3RyaW5nQnVpbGRlcl9PbmVTdHJpbmcoaW50IHJlcHMpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewogICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICBzYi5hcHBlbmQoInRoaXMgaXMgYSByZWFzb25hYmx5IHNob3J0IHN0cmluZyB0aGF0IGhhcyBhIHN0cmluZyAiKTsKQEAgLTY5LDggKzcxLDQgQEAKICAgICAgIHNiLmFwcGVuZCgiIGluIGl0Iik7CiAgICAgfQogICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgUnVubmVyLm1haW4oRm9ybWF0dGVyQmVuY2htYXJrLmNsYXNzLCBhcmdzKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9JbnRNb2RCZW5jaG1hcmsuamF2YSBiL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvSW50TW9kQmVuY2htYXJrLmphdmEKaW5kZXggNTVhMTE5Yy4uYmVkNDE1ZiAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9JbnRNb2RCZW5jaG1hcmsuamF2YQorKysgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0ludE1vZEJlbmNobWFyay5qYXZhCkBAIC0xNiwxNyArMTYsMTYgQEAKIAogcGFja2FnZSBleGFtcGxlczsKIAotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5SdW5uZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOwogCiAvKioKICAqIE1lYXN1cmVzIHNldmVyYWwgY2FuZGlkYXRlIGltcGxlbWVudGF0aW9ucyBmb3IgbW9kKCkuCiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJTYW1lUGFyYW1ldGVyVmFsdWUiKQotcHVibGljIGNsYXNzIEludE1vZEJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CitwdWJsaWMgY2xhc3MgSW50TW9kQmVuY2htYXJrIHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE0gPSAoMSA8PCAxNikgLSAxOwogCi0gIHB1YmxpYyBpbnQgdGltZUNvbmRpdGlvbmFsKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgaW50IGNvbmRpdGlvbmFsKGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gNTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewogICAgICAgZHVtbXkgKz0gSW50ZWdlci5NQVhfVkFMVUUgKyBjb25kaXRpb25hbE1vZChkdW1teSwgTSk7CkBAIC0zOSw3ICszOCw3IEBACiAgICAgcmV0dXJuIHIgPCAwID8gciArIG0gOiByOwogICB9CiAKLSAgcHVibGljIGludCB0aW1lRG91YmxlUmVtYWluZGVyKGludCByZXBzKSB7CisgIEBCZW5jaG1hcmsgaW50IGRvdWJsZVJlbWFpbmRlcihpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDU7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIGR1bW15ICs9IEludGVnZXIuTUFYX1ZBTFVFICsgZG91YmxlUmVtYWluZGVyTW9kKGR1bW15LCBNKTsKQEAgLTUyLDcgKzUxLDcgQEAKICAgICByZXR1cm4gKGludCkgKChhICUgbSArIChsb25nKSBtKSAlIG0pOwogICB9CiAKLSAgcHVibGljIGludCB0aW1lUmlnaHRTaGlmdGluZ01vZChpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCByaWdodFNoaWZ0aW5nTW9kKGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gNTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewogICAgICAgZHVtbXkgKz0gSW50ZWdlci5NQVhfVkFMVUUgKyByaWdodFNoaWZ0aW5nTW9kKGR1bW15LCBNKTsKQEAgLTY2LDcgKzY1LDcgQEAKICAgICAgcmV0dXJuIChpbnQpIChyICsgKHIgPj4gNjMgJiBtKSk7CiAgIH0KIAotICBwdWJsaWMgaW50IHRpbWVMZWZ0U2hpZnRpbmdNb2QoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgbGVmdFNoaWZ0aW5nTW9kKGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gNTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewogICAgICAgZHVtbXkgKz0gSW50ZWdlci5NQVhfVkFMVUUgKyBsZWZ0U2hpZnRpbmdNb2QoZHVtbXksIE0pOwpAQCAtNzksMTYgKzc4LDExIEBACiAgICAgcmV0dXJuIChpbnQpICgoYSArICgobG9uZykgbSA8PCAzMikpICUgbSk7CiAgIH0KIAotICBwdWJsaWMgaW50IHRpbWVXcm9uZ01vZChpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCB3cm9uZ01vZChpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDU7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIGR1bW15ICs9IEludGVnZXIuTUFYX1ZBTFVFICsgZHVtbXkgJSBNOwogICAgIH0KICAgICByZXR1cm4gZHVtbXk7CiAgIH0KLQotICAvLyBUT0RPOiByZW1vdmUgdGhpcyBmcm9tIGFsbCBleGFtcGxlcyB3aGVuIElERSBwbHVnaW5zIGFyZSByZWFkeQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBSdW5uZXIubWFpbihJbnRNb2RCZW5jaG1hcmsuY2xhc3MsIGFyZ3MpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9MaXN0SXRlcmF0aW9uQmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0xpc3RJdGVyYXRpb25CZW5jaG1hcmsuamF2YQppbmRleCBhOGNmYjA1Li4wN2FlOGViIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0xpc3RJdGVyYXRpb25CZW5jaG1hcmsuamF2YQorKysgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0xpc3RJdGVyYXRpb25CZW5jaG1hcmsuamF2YQpAQCAtMTYsMTYgKzE2LDE3IEBACiAKIHBhY2thZ2UgZXhhbXBsZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVmb3JlRXhwZXJpbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOwogaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKIGltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqIE1lYXN1cmVzIGl0ZXJhdGluZyB0aHJvdWdoIGxpc3QgZWxlbWVudHMuCiAgKi8KLXB1YmxpYyBjbGFzcyBMaXN0SXRlcmF0aW9uQmVuY2htYXJrIGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKK3B1YmxpYyBjbGFzcyBMaXN0SXRlcmF0aW9uQmVuY2htYXJrIHsKIAogICBAUGFyYW0oeyIwIiwgIjEwIiwgIjEwMCIsICIxMDAwIn0pCiAgIHByaXZhdGUgaW50IGxlbmd0aDsKQEAgLTMzLDcgKzM0LDcgQEAKICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gbGlzdDsKICAgcHJpdmF0ZSBPYmplY3RbXSBhcnJheTsKIAotICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgIEBCZWZvcmVFeHBlcmltZW50IHZvaWQgc2V0VXAoKSB7CiAgICAgYXJyYXkgPSBuZXcgT2JqZWN0W2xlbmd0aF07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgYXJyYXlbaV0gPSBuZXcgT2JqZWN0KCk7CkBAIC01MCwyNCArNTEsMjMgQEAKICAgICB9OwogICB9CiAKLSAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KSAvLyBUT0RPOiBmaXgKLSAgcHVibGljIHZvaWQgdGltZUxpc3RJdGVyYXRpb24oaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgbGlzdEl0ZXJhdGlvbihpbnQgcmVwcykgeworICAgIGludCBkdW1teSA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogbGlzdCkgeworICAgICAgICBkdW1teSB8PSB2YWx1ZS5oYXNoQ29kZSgpOwogICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gZHVtbXk7CiAgIH0KIAotICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pIC8vIFRPRE86IGZpeAotICBwdWJsaWMgdm9pZCB0aW1lQXJyYXlJdGVyYXRpb24oaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgYXJyYXlJdGVyYXRpb24oaW50IHJlcHMpIHsKKyAgICBpbnQgZHVtbXkgPSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IGFycmF5KSB7CisgICAgICAgIGR1bW15IHw9IHZhbHVlLmhhc2hDb2RlKCk7CiAgICAgICB9CiAgICAgfQotICB9Ci0KLSAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZnJvbSBhbGwgZXhhbXBsZXMgd2hlbiBJREUgcGx1Z2lucyBhcmUgcmVhZHkKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgUnVubmVyLm1haW4oTGlzdEl0ZXJhdGlvbkJlbmNobWFyay5jbGFzcywgYXJncyk7CisgICAgcmV0dXJuIGR1bW15OwogICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9MaXN0TW9kaWZpY2F0aW9uQmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0xpc3RNb2RpZmljYXRpb25CZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQxNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9MaXN0TW9kaWZpY2F0aW9uQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZXhhbXBsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVmb3JlRXhwZXJpbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIE1lYXN1cmVzIHBlcmZvcm1hbmNlIG9mIGxpc3Qgb3BlcmF0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIExpc3RNb2RpZmljYXRpb25CZW5jaG1hcmsgeworCisgIHByaXZhdGUgZW51bSBFbGVtZW50IHsKKyAgICBJTlNUQU5DRSwKKyAgfQorICBwcml2YXRlIGVudW0gTGlzdEltcGwgeworICAgIEFycmF5IHsKKyAgICAgIEBPdmVycmlkZSBMaXN0PEVsZW1lbnQ+IGNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKKyAgICAgIH0KKyAgICB9LAorICAgIExpbmtlZCB7CisgICAgICBAT3ZlcnJpZGUgTGlzdDxFbGVtZW50PiBjcmVhdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdDxFbGVtZW50PigpOworICAgICAgfQorICAgIH07CisKKyAgICBhYnN0cmFjdCBMaXN0PEVsZW1lbnQ+IGNyZWF0ZSgpOworICB9CisKKyAgQFBhcmFtKHsiMTAiLCAiMTAwIiwgIjEwMDAiLCAiMTAwMDAifSkKKyAgcHJpdmF0ZSBpbnQgc2l6ZTsKKworICBAUGFyYW0oeyJBcnJheSIsICJMaW5rZWQifSkKKyAgcHJpdmF0ZSBMaXN0SW1wbCBpbXBsZW1lbnRhdGlvbjsKKworICBwcml2YXRlIExpc3Q8RWxlbWVudD4gbGlzdDsKKworICBAQmVmb3JlRXhwZXJpbWVudCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbGlzdCA9IGltcGxlbWVudGF0aW9uLmNyZWF0ZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBsaXN0LmFkZChFbGVtZW50LklOU1RBTkNFKTsKKyAgICB9CisgIH0KKworICBAQmVuY2htYXJrIHZvaWQgcG9wdWxhdGUoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7IHJlcCsrKSB7CisgICAgICBMaXN0PEVsZW1lbnQ+IGxpc3QgPSBpbXBsZW1lbnRhdGlvbi5jcmVhdGUoKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGxpc3QuYWRkKEVsZW1lbnQuSU5TVEFOQ0UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBCZW5jaG1hcmsgdm9pZCBpdGVyYXRpb24oaW50IHJlcHMpIHsKKyAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyByZXArKykgeworICAgICAgSXRlcmF0b3I8RWxlbWVudD4gaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7CisgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAQmVuY2htYXJrIHZvaWQgaGVhZEFkZFJlbW92ZShpbnQgcmVwcykgeworICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IHJlcHM7IHJlcCsrKSB7CisgICAgICBsaXN0LmFkZCgwLCBFbGVtZW50LklOU1RBTkNFKTsKKyAgICAgIGxpc3QucmVtb3ZlKDApOworICAgIH0KKyAgfQorCisgIEBCZW5jaG1hcmsgdm9pZCBtaWRkbGVBZGRSZW1vdmUoaW50IHJlcHMpIHsKKyAgICBpbnQgaW5kZXggPSBzaXplIC8gMjsKKyAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCByZXBzOyByZXArKykgeworICAgICAgbGlzdC5hZGQoaW5kZXgsIEVsZW1lbnQuSU5TVEFOQ0UpOworICAgICAgbGlzdC5yZW1vdmUoaW5kZXgpOworICAgIH0KKyAgfQorCisgIEBCZW5jaG1hcmsgdm9pZCB0YWlsQWRkUmVtb3ZlKGludCByZXBzKSB7CisgICAgaW50IGluZGV4ID0gc2l6ZSAtIDE7CisgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgcmVwczsgcmVwKyspIHsKKyAgICAgIGxpc3QuYWRkKEVsZW1lbnQuSU5TVEFOQ0UpOworICAgICAgbGlzdC5yZW1vdmUoaW5kZXgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Mb29waW5nQmFja3dhcmRzQmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0xvb3BpbmdCYWNrd2FyZHNCZW5jaG1hcmsuamF2YQppbmRleCAxZTNkMWFkLi5kMjNhMjhkIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0xvb3BpbmdCYWNrd2FyZHNCZW5jaG1hcmsuamF2YQorKysgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL0xvb3BpbmdCYWNrd2FyZHNCZW5jaG1hcmsuamF2YQpAQCAtMTYsMTcgKzE2LDE2IEBACiAKIHBhY2thZ2UgZXhhbXBsZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuQmVuY2htYXJrOwogaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUnVubmVyOwotaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CiAKIC8qKgogICogVGVzdGluZyB0aGUgb2xkIGNhbmFyZCB0aGF0IGxvb3BpbmcgYmFja3dhcmRzIGlzIGZhc3Rlci4KICAqLwotcHVibGljIGNsYXNzIExvb3BpbmdCYWNrd2FyZHNCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworcHVibGljIGNsYXNzIExvb3BpbmdCYWNrd2FyZHNCZW5jaG1hcmsgewogICBAUGFyYW0oeyIyIiwgIjIwIiwgIjIwMDAiLCAiMjAwMDAwMDAifSkgaW50IG1heDsKIAotICBwdWJsaWMgaW50IHRpbWVGb3J3YXJkcyhpbnQgcmVwcykgeworICBAQmVuY2htYXJrIGludCBmb3J3YXJkcyhpbnQgcmVwcykgewogICAgIGludCBkdW1teSA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWF4OyBqKyspIHsKQEAgLTM2LDcgKzM1LDcgQEAKICAgICByZXR1cm4gZHVtbXk7CiAgIH0KIAotICBwdWJsaWMgaW50IHRpbWVCYWNrd2FyZHMoaW50IHJlcHMpIHsKKyAgQEJlbmNobWFyayBpbnQgYmFja3dhcmRzKGludCByZXBzKSB7CiAgICAgaW50IGR1bW15ID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewogICAgICAgZm9yIChpbnQgaiA9IG1heCAtIDE7IGogPj0gMDsgai0tKSB7CkBAIC00NSw4ICs0NCw0IEBACiAgICAgfQogICAgIHJldHVybiBkdW1teTsKICAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIFJ1bm5lci5tYWluKExvb3BpbmdCYWNrd2FyZHNCZW5jaG1hcmsuY2xhc3MsIGFyZ3MpOwotICB9CiB9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL01lc3NhZ2VEaWdlc3RDcmVhdGlvbkJlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9NZXNzYWdlRGlnZXN0Q3JlYXRpb25CZW5jaG1hcmsuamF2YQppbmRleCBjOTQzN2JkLi42ODFkMTBlIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL01lc3NhZ2VEaWdlc3RDcmVhdGlvbkJlbmNobWFyay5qYXZhCisrKyBiL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvTWVzc2FnZURpZ2VzdENyZWF0aW9uQmVuY2htYXJrLmphdmEKQEAgLTE2LDI5ICsxNiwyNCBAQAogCiBwYWNrYWdlIGV4YW1wbGVzOwogCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogCiAvKioKICAqIFRpbWVzIGNyZWF0aW5nIG5ldyBNZXNzYWdlRGlnZXN0IGluc3RhbmNlcy4KICAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEaWdlc3RDcmVhdGlvbkJlbmNobWFyayBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CitwdWJsaWMgY2xhc3MgTWVzc2FnZURpZ2VzdENyZWF0aW9uQmVuY2htYXJrIHsKICAgLy8gQnkgZGVmYXVsdCwganVzdCB0aGUgImludGVyZXN0aW5nIG9uZXMiLiBBbHNvIGNvbnNpZGVyIEFkbGVyMzIgYW5kIENSQzMyLAogICAvLyBidXQgdGhlc2UgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZCBpbiBhbGwgcnVudGltZSBlbnZpcm9ubWVudHMuCiAgIEBQYXJhbSh7Ik1ENSIsICJTSEEtMSIsICJTSEEtMjU2IiwgIlNIQS01MTIifSkKICAgU3RyaW5nIGFsZ29yaXRobTsKIAotICBwdWJsaWMgdm9pZCB0aW1lKGludCByZXBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgQEJlbmNobWFyayB2b2lkIHRpbWUoaW50IHJlcHMpIHRocm93cyBFeGNlcHRpb24gewogICAgIC8vIENoYW5nZSB0aGlzIHRvIHVzZSBhIGR1bW15IGlmIHRoZSByZXN1bHRzIGxvb2sgc3VzcGljaW91cy4KICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgewogICAgICAgTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShhbGdvcml0aG0pOwogICAgIH0KICAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIFJ1bm5lci5tYWluKE1lc3NhZ2VEaWdlc3RDcmVhdGlvbkJlbmNobWFyay5jbGFzcywgYXJncyk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2NhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvVXBsb2FkUmVzdWx0cy5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Ob09wQmVuY2htYXJrLmphdmEKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIGNhbGlwZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2NhbGlwZXIvVXBsb2FkUmVzdWx0cy5qYXZhCmNvcHkgdG8gZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Ob09wQmVuY2htYXJrLmphdmEKaW5kZXggN2RhZTdhZi4uZmEyNDgwNSAxMDA2NDQKLS0tIGEvY2FsaXBlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvY2FsaXBlci9VcGxvYWRSZXN1bHRzLmphdmEKKysrIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9Ob09wQmVuY2htYXJrLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDE1ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZ29vZ2xlLmNhbGlwZXI7CitwYWNrYWdlIGV4YW1wbGVzOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CiAKIC8qKgotICogVXNhZ2U6IFVwbG9hZFJlc3VsdHMgPGZpbGVfb3JfZGlyPgorICogVGhpcyBpcyB0aGUgYWJzb2x1dGUgbWluaW1hbCBiZW5jaG1hcmsuIEl0IGRvZXMgbm90aGluZyBidXQgdGltZSB0aGUgcmVwIGxvb3AuCiAgKi8KLXB1YmxpYyBjbGFzcyBVcGxvYWRSZXN1bHRzIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIG5ldyBSdW5uZXIoKS51cGxvYWRSZXN1bHRzRmlsZU9yRGlyKG5ldyBGaWxlKGFyZ3NbMF0pKTsKK3B1YmxpYyBjbGFzcyBOb09wQmVuY2htYXJrIHsKKyAgQEJlbmNobWFyayBsb25nIGluY3JlbWVudChsb25nIHJlcHMpIHsKKyAgICBsb25nIHJlc3VsdCA9IDA7CisgICAgZm9yICg7IHJlc3VsdCA8IHJlcHM7IHJlc3VsdCsrKSB7fQorICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvU3RyaW5nQnVpbGRlckJlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9TdHJpbmdCdWlsZGVyQmVuY2htYXJrLmphdmEKaW5kZXggM2M4MzlkMy4uYzM5YjNiZSAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9TdHJpbmdCdWlsZGVyQmVuY2htYXJrLmphdmEKKysrIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9TdHJpbmdCdWlsZGVyQmVuY2htYXJrLmphdmEKQEAgLTE2LDExNyArMTYsMTc2IEBACiAKIHBhY2thZ2UgZXhhbXBsZXM7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkNoYXJhY3Rlci5NSU5fU1VSUk9HQVRFOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlJ1bm5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOwogCiAvKioKICAqIFRlc3RzIHRoZSBwZXJmb3JtYW5jZSBvZiB2YXJpb3VzIFN0cmluZ0J1aWxkZXIgbWV0aG9kcy4KICAqLwotcHVibGljIGNsYXNzIFN0cmluZ0J1aWxkZXJCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworcHVibGljIGNsYXNzIFN0cmluZ0J1aWxkZXJCZW5jaG1hcmsgewogCi0gICAgQFBhcmFtKHsiMSIsICIxMCIsICIxMDAifSkgcHJpdmF0ZSBpbnQgbGVuZ3RoOworICBAUGFyYW0oeyIxIiwgIjEwIiwgIjEwMCJ9KSBwcml2YXRlIGludCBsZW5ndGg7CiAKLSAgICBwdWJsaWMgdm9pZCB0aW1lQXBwZW5kQm9vbGVhbihpbnQgcmVwcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRydWUpOwotICAgICAgICAgICAgfQorICBAQmVuY2htYXJrIHZvaWQgYXBwZW5kQm9vbGVhbihpbnQgcmVwcykgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICBzYi5zZXRMZW5ndGgoMCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CisgICAgICAgIHNiLmFwcGVuZCh0cnVlKTsKKyAgICAgICAgc2IuYXBwZW5kKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAQmVuY2htYXJrIHZvaWQgYXBwZW5kQ2hhcihpbnQgcmVwcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKKyAgICAgICAgc2IuYXBwZW5kKCdjJyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQEJlbmNobWFyayB2b2lkIGFwcGVuZENoYXJBcnJheShpbnQgcmVwcykgeworICAgIGNoYXJbXSBjaGFycyA9ICJjaGFycyIudG9DaGFyQXJyYXkoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CisgICAgICAgIHNiLmFwcGVuZChjaGFycyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQEJlbmNobWFyayB2b2lkIGFwcGVuZENoYXJTZXF1ZW5jZShpbnQgcmVwcykgeworICAgIENoYXJTZXF1ZW5jZSBjcyA9ICJjaGFycyI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICBzYi5hcHBlbmQoY3MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBCZW5jaG1hcmsgdm9pZCBhcHBlbmREb3VibGUoaW50IHJlcHMpIHsKKyAgICBkb3VibGUgZCA9IDEuMjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CisgICAgICAgIHNiLmFwcGVuZChkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAQmVuY2htYXJrIHZvaWQgYXBwZW5kRmxvYXQoaW50IHJlcHMpIHsKKyAgICBmbG9hdCBmID0gMS4yZjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7CisgICAgICAgIHNiLmFwcGVuZChmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAQmVuY2htYXJrIHZvaWQgYXBwZW5kSW50KGludCByZXBzKSB7CisgICAgaW50IG4gPSAxMjM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICBzYi5hcHBlbmQobik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQEJlbmNobWFyayB2b2lkIGFwcGVuZExvbmcoaW50IHJlcHMpIHsKKyAgICBsb25nIGwgPSAxMjM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICBzYi5hcHBlbmQobCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQEJlbmNobWFyayB2b2lkIGFwcGVuZE9iamVjdChpbnQgcmVwcykgeworICAgIE9iamVjdCBvID0gbmV3IE9iamVjdCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKKyAgICAgICAgc2IuYXBwZW5kKG8pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBCZW5jaG1hcmsgdm9pZCBhcHBlbmRTdHJpbmcoaW50IHJlcHMpIHsKKyAgICBTdHJpbmcgcyA9ICJjaGFycyI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICBzYi5hcHBlbmQocyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQEJlbmNobWFyayB2b2lkIGFwcGVuZE51bGwoaW50IHJlcHMpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgeworICAgICAgc2Iuc2V0TGVuZ3RoKDApOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgeworICAgICAgICBzYi5hcHBlbmQoKFN0cmluZyludWxsKTsKKyAgICAgICAgc2IuYXBwZW5kKChTdHJpbmdCdWlsZGVyKW51bGwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKiBUaW1lcyAucmV2ZXJzZSgpIHdoZW4gbm8gc3Vycm9nYXRlcyBhcmUgcHJlc2VudC4gKi8KKyAgQEJlbmNobWFyayB2b2lkIHJldmVyc2VOb1N1cnJvZ2F0ZXMoaW50IHJlcHMpIHsKKyAgICBmaW5hbCBpbnQgbGVuZ3RoID0gTWF0aC5taW4odGhpcy5sZW5ndGgsIE1JTl9TVVJST0dBVEUpOworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKKyAgICAgIHNiLmFwcGVuZENvZGVQb2ludChqKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIHNiLnJldmVyc2UoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzYi5jb2RlUG9pbnRBdCgwKSA+IE1JTl9TVVJST0dBVEUpCisgICAgICAgIHRocm93IG5ldyBFcnJvcigpOworICAgIH0KKyAgfQorCisgIC8qKiBUaW1lcyAuY29kZVBvaW50QXQoaW50KSB3aGVuIG5vIHN1cnJvZ2F0ZXMgYXJlIHByZXNlbnQuICovCisgIEBCZW5jaG1hcmsgdm9pZCBjb2RlUG9pbnRBdE5vU3Vycm9nYXRlcyhpbnQgcmVwcykgeworICAgIGZpbmFsIGludCBsZW5ndGggPSBNYXRoLm1pbih0aGlzLmxlbmd0aCwgTUlOX1NVUlJPR0FURSk7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgc2IuYXBwZW5kQ29kZVBvaW50KGopOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBsZW5ndGggLSAxOyBrKyspIHsKKyAgICAgICAgICBpZiAoc2IuY29kZVBvaW50QXQoaykgPiBNSU5fU1VSUk9HQVRFKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9CisgIH0KIAotICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmRDaGFyKGludCByZXBzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ2MnKTsKLSAgICAgICAgICAgIH0KKyAgLyoqIFRpbWVzIC5jb2RlUG9pbnRCZWZvcmUoaW50KSB3aGVuIG5vIHN1cnJvZ2F0ZXMgYXJlIHByZXNlbnQuICovCisgIEBCZW5jaG1hcmsgdm9pZCBjb2RlUG9pbnRCZWZvcmVOb1N1cnJvZ2F0ZXMoaW50IHJlcHMpIHsKKyAgICBmaW5hbCBpbnQgbGVuZ3RoID0gTWF0aC5taW4odGhpcy5sZW5ndGgsIE1JTl9TVVJST0dBVEUpOworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKKyAgICAgIHNiLmFwcGVuZENvZGVQb2ludChqKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDwgbGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICBpZiAoc2IuY29kZVBvaW50QmVmb3JlKGspID4gTUlOX1NVUlJPR0FURSkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgICAgICB9CisgICAgICB9CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgdGltZUFwcGVuZENoYXJBcnJheShpbnQgcmVwcykgewotICAgICAgICBjaGFyW10gY2hhcnMgPSAiY2hhcnMiLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2hhcnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGltZUFwcGVuZENoYXJTZXF1ZW5jZShpbnQgcmVwcykgewotICAgICAgICBDaGFyU2VxdWVuY2UgY3MgPSAiY2hhcnMiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmREb3VibGUoaW50IHJlcHMpIHsKLSAgICAgICAgZG91YmxlIGQgPSAxLjI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0aW1lQXBwZW5kRmxvYXQoaW50IHJlcHMpIHsKLSAgICAgICAgZmxvYXQgZiA9IDEuMmY7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0aW1lQXBwZW5kSW50KGludCByZXBzKSB7Ci0gICAgICAgIGludCBuID0gMTIzOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKG4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGltZUFwcGVuZExvbmcoaW50IHJlcHMpIHsKLSAgICAgICAgbG9uZyBsID0gMTIzOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGltZUFwcGVuZE9iamVjdChpbnQgcmVwcykgewotICAgICAgICBPYmplY3QgbyA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRpbWVBcHBlbmRTdHJpbmcoaW50IHJlcHMpIHsKLSAgICAgICAgU3RyaW5nIHMgPSAiY2hhcnMiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZnJvbSBhbGwgZXhhbXBsZXMgd2hlbiBJREUgcGx1Z2lucyBhcmUgcmVhZHkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUnVubmVyLm1haW4oU3RyaW5nQnVpbGRlckJlbmNobWFyay5jbGFzcywgYXJncyk7Ci0gICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL1V0ZjhCZW5jaG1hcmsuamF2YSBiL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvVXRmOEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjRlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL2V4YW1wbGVzL1V0ZjhCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBleGFtcGxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZWZvcmVFeHBlcmltZW50OworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5CZW5jaG1hcms7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlBhcmFtOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogQmVuY2htYXJrIGZvciBvcGVyYXRpb25zIHdpdGggdGhlIFVURi04IGNoYXJzZXQuCisgKi8KK3B1YmxpYyBjbGFzcyBVdGY4QmVuY2htYXJrIHsKKworICBzdGF0aWMgZmluYWwgQ2hhcnNldCBVVEZfOCA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKKworICAvKioKKyAgICogVGhlIG1heGltdW0gY29kZSBwb2ludCB1c2VkIGluIGdlbmVyYXRlZCB0ZXh0LiAgRGlmZmVyZW50IHZhbHVlcworICAgKiBwcm92aWRlIHJlYXNvbmFibGUgbW9kZWxzIG9mIGRpZmZlcmVudCByZWFsLXdvcmxkIGh1bWFuIHRleHQuCisgICAqLworICBzdGF0aWMgY2xhc3MgTWF4Q29kZVBvaW50IHsKKyAgICBmaW5hbCBpbnQgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBpbnB1dCBzdHJpbmcgdG8gYSBjb2RlIHBvaW50LiAgQWNjZXB0cyByZWd1bGFyCisgICAgICogZGVjaW1hbCBudW1lcmFscywgaGV4IHN0cmluZ3MsIGFuZCBzb21lIHN5bWJvbGljIG5hbWVzCisgICAgICogbWVhbmluZ2Z1bCB0byBodW1hbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRlY29kZShTdHJpbmcgdXNlckZyaWVuZGx5KSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gSW50ZWdlci5kZWNvZGUodXNlckZyaWVuZGx5KTsKKyAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgIGlmICh1c2VyRnJpZW5kbHkubWF0Y2hlcygiKD9pKSg/OkFtZXJpY2FufEVuZ2xpc2h8QVNDSUkpIikpIHsKKyAgICAgICAgICAvLyAxLWJ5dGUgVVRGLTggc2VxdWVuY2VzIC0gIkFtZXJpY2FuIiBBU0NJSSB0ZXh0CisgICAgICAgICAgcmV0dXJuIDB4ODA7CisgICAgICAgIH0gZWxzZSBpZiAodXNlckZyaWVuZGx5Lm1hdGNoZXMoIig/aSkoPzpGcmVuY2h8TGF0aW58V2VzdGVybi4qRXVyb3BlYW4pIikpIHsKKyAgICAgICAgICAvLyBNb3N0bHkgMS1ieXRlIFVURi04IHNlcXVlbmNlcywgbWl4ZWQgd2l0aCBvY2Nhc2lvbmFsIDItYnl0ZQorICAgICAgICAgIC8vIHNlcXVlbmNlcyAtICJXZXN0ZXJuIEV1cm9wZWFuIiB0ZXh0CisgICAgICAgICAgcmV0dXJuIDB4OTA7CisgICAgICAgIH0gZWxzZSBpZiAodXNlckZyaWVuZGx5Lm1hdGNoZXMoIig/aSkoPzpCcmFuY2guKlByZWRpY3Rpb24uKkhvc3RpbGUpIikpIHsKKyAgICAgICAgICAvLyBEZWZlYXQgYnJhbmNoIHByZWRpY3RvciBmb3I6IGMgPCAweDgwIDsgYnJhbmNoIHRha2VuIDUwJSBvZiB0aGUgdGltZS4KKyAgICAgICAgICByZXR1cm4gMHgxMDA7CisgICAgICAgIH0gZWxzZSBpZiAodXNlckZyaWVuZGx5Lm1hdGNoZXMoIig/aSkoPzpHcmVla3xDeXJpbGxpY3xFdXJvcGVhbnxJU08uPzg4NTkpIikpIHsKKyAgICAgICAgICAvLyBNb3N0bHkgMi1ieXRlIFVURi04IHNlcXVlbmNlcyAtICJFdXJvcGVhbiIgdGV4dAorICAgICAgICAgIHJldHVybiAweDgwMDsKKyAgICAgICAgfSBlbHNlIGlmICh1c2VyRnJpZW5kbHkubWF0Y2hlcygiKD9pKSg/OkNoaW5lc2V8SGFufEFzaWFufEJNUCkiKSkgeworICAgICAgICAgIC8vIE1vc3RseSAzLWJ5dGUgVVRGLTggc2VxdWVuY2VzIC0gIkFzaWFuIiB0ZXh0CisgICAgICAgICAgcmV0dXJuIENoYXJhY3Rlci5NSU5fU1VQUExFTUVOVEFSWV9DT0RFX1BPSU5UOworICAgICAgICB9IGVsc2UgaWYgKHVzZXJGcmllbmRseS5tYXRjaGVzKCIoP2kpKD86Q3VuZWlmb3JtfHJhcmV8ZXhvdGljfHN1cHBsZW1lbnRhcnkuKikiKSkgeworICAgICAgICAgIC8vIE1vc3RseSA0LWJ5dGUgVVRGLTggc2VxdWVuY2VzIC0gInJhcmUgZXhvdGljIiB0ZXh0CisgICAgICAgICAgcmV0dXJuIENoYXJhY3Rlci5NQVhfQ09ERV9QT0lOVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBkZWNvZGUgY29kZXBvaW50ICIgKyB1c2VyRnJpZW5kbHkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNYXhDb2RlUG9pbnQgdmFsdWVPZihTdHJpbmcgdXNlckZyaWVuZGx5KSB7CisgICAgICByZXR1cm4gbmV3IE1heENvZGVQb2ludCh1c2VyRnJpZW5kbHkpOworICAgIH0KKworICAgIHByaXZhdGUgTWF4Q29kZVBvaW50KFN0cmluZyB1c2VyRnJpZW5kbHkpIHsKKyAgICAgIHZhbHVlID0gZGVjb2RlKHVzZXJGcmllbmRseSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRoZSBkZWZhdWx0IHZhbHVlcyBvZiBtYXhDb2RlUG9pbnQgYmVsb3cgcHJvdmlkZSBwcmV0dHkgZ29vZAorICAgKiBwZXJmb3JtYW5jZSBtb2RlbHMgb2YgZGlmZmVyZW50IGtpbmRzIG9mIGNvbW1vbiBodW1hbiB0ZXh0LgorICAgKiBAc2VlIE1heENvZGVQb2ludCNkZWNvZGUKKyAgICovCisgIEBQYXJhbSh7IjB4ODAiLCAiMHgxMDAiLCAiMHg4MDAiLCAiMHgxMDAwMCIsICIweDEwZmZmZiJ9KSBNYXhDb2RlUG9pbnQgbWF4Q29kZVBvaW50OworCisgIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX0NPVU5UID0gMSA8PCA3OworCisgIEBQYXJhbSh7IjY1NTM2In0pIGludCBjaGFyQ291bnQ7CisgIHByaXZhdGUgU3RyaW5nW10gc3RyaW5nczsKKworICAvKioKKyAgICogQ29tcHV0ZXMgYXJyYXlzIG9mIHZhbGlkIHVuaWNvZGUgU3RyaW5ncy4KKyAgICovCisgIEBCZWZvcmVFeHBlcmltZW50IHZvaWQgc2V0VXAoKSB7CisgICAgZmluYWwgbG9uZyBzZWVkID0gOTk7CisgICAgZmluYWwgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oc2VlZCk7CisgICAgc3RyaW5ncyA9IG5ldyBTdHJpbmdbU1RSSU5HX0NPVU5UXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFNUUklOR19DT1VOVDsgaSsrKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhckNvdW50OyBqKyspIHsKKyAgICAgICAgaW50IGNvZGVQb2ludDsKKyAgICAgICAgLy8gZGlzY2FyZCBpbGxlZ2FsIHN1cnJvZ2F0ZSAiY29kZXBvaW50cyIKKyAgICAgICAgZG8geworICAgICAgICAgIGNvZGVQb2ludCA9IHJuZC5uZXh0SW50KG1heENvZGVQb2ludC52YWx1ZSk7CisgICAgICAgIH0gd2hpbGUgKGlzU3Vycm9nYXRlKGNvZGVQb2ludCkpOworICAgICAgICBzYi5hcHBlbmRDb2RlUG9pbnQoY29kZVBvaW50KTsKKyAgICAgIH0KKyAgICAgIHN0cmluZ3NbaV0gPSBzYi50b1N0cmluZygpOworICAgIH0KKyAgICAvLyBUaGUgcmVwcyB3aWxsIGNvbnRpbnVlIHVudGlsIHRoZSBub24tZGV0ZXJtaW5pc20gZGV0ZWN0b3IgaXMgcGFjaWZpZWQhCisgICAgZ2V0Qnl0ZXMoMTAwKTsKKyAgfQorCisgIC8qKgorICAgKiBCZW5jaG1hcmtzIHtAbGluayBTdHJpbmcjZ2V0Qnl0ZXN9IG9uIHZhbGlkIHN0cmluZ3MgY29udGFpbmluZworICAgKiBwc2V1ZG8tcmFuZG9tbHktZ2VuZXJhdGVkIGNvZGVQb2ludHMgbGVzcyB0aGFuIHtAY29kZQorICAgKiBtYXhDb2RlUG9pbnR9LiAgQSBjb25zdGFudCBzZWVkIGlzIHVzZWQsIHNvIHNlcGFyYXRlIHJ1bnMgcGVyZm9ybQorICAgKiBpZGVudGljYWwgY29tcHV0YXRpb25zLgorICAgKi8KKyAgQEJlbmNobWFyayB2b2lkIGdldEJ5dGVzKGludCByZXBzKSB7CisgICAgZmluYWwgU3RyaW5nW10gc3RyaW5ncyA9IHRoaXMuc3RyaW5nczsKKyAgICBmaW5hbCBpbnQgbWFzayA9IFNUUklOR19DT1VOVCAtIDE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgIFN0cmluZyBzdHJpbmcgPSBzdHJpbmdzW2kgJiBtYXNrXTsKKyAgICAgIGJ5dGVbXSBieXRlcyA9IHN0cmluZy5nZXRCeXRlcyhVVEZfOCk7CisgICAgICBpZiAoYnl0ZXNbMF0gPT0gODYgJiYgYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gMV0gPT0gOTkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmxpa2VseSEgV2UncmUganVzdCBkZWZlYXRpbmcgdGhlIG9wdGltaXplciEiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiogQ2hhcmFjdGVyLmlzU3Vycm9nYXRlIHdhcyBhZGRlZCBpbiBKYXZhIFNFIDcuICovCisgIHByaXZhdGUgYm9vbGVhbiBpc1N1cnJvZ2F0ZShpbnQgYykgeworICAgIHJldHVybiAoQ2hhcmFjdGVyLk1JTl9ISUdIX1NVUlJPR0FURSA8PSBjICYmCisgICAgICAgICAgICBjIDw9IENoYXJhY3Rlci5NQVhfTE9XX1NVUlJPR0FURSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvVmFyYXJnc0JlbmNobWFyay5qYXZhIGIvZXhhbXBsZXMvc3JjL21haW4vamF2YS9leGFtcGxlcy9WYXJhcmdzQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlYjcyZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NyYy9tYWluL2phdmEvZXhhbXBsZXMvVmFyYXJnc0JlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGV4YW1wbGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlZm9yZUV4cGVyaW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLmFwaS5Ta2lwVGhpc1NjZW5hcmlvRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBCZW5jaG1hcmtzIHRoZSBvdmVyaGVhZCBjcmVhdGVkIGJ5IHVzaW5nIHZhcmFyZ3MgaW5zdGVhZCBvZiBwYXJhbWV0ZXIgZXhwYW5zaW9uLgorICoKKyAqIEBhdXRob3IgZ2FrQGdvb2dsZS5jb20gKEdyZWdvcnkgS2ljaykKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZhcmFyZ3NCZW5jaG1hcmsgeworICBlbnVtIFN0cmF0ZWd5IHsKKyAgICBWQVJBUkdTIHsKKyAgICAgIEBPdmVycmlkZSBsb25nIG9uZShsb25nIGEpIHsKKyAgICAgICAgcmV0dXJuIHZhcmFyZ3MoYSk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZSBsb25nIHR3byhsb25nIGEsIGxvbmcgYikgeworICAgICAgICByZXR1cm4gdmFyYXJncyhhLCBiKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlIGxvbmcgdGhyZWUobG9uZyBhLCBsb25nIGIsIGxvbmcgYykgeworICAgICAgICByZXR1cm4gdmFyYXJncyhhLCBiLCBjKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlIGxvbmcgZm91cihsb25nIGEsIGxvbmcgYiwgbG9uZyBjLCBsb25nIGQpIHsKKyAgICAgICAgcmV0dXJuIHZhcmFyZ3MoYSwgYiwgYywgZCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZSBsb25nIGZpdmUobG9uZyBhLCBsb25nIGIsIGxvbmcgYywgbG9uZyBkLCBsb25nIGUpIHsKKyAgICAgICAgcmV0dXJuIHZhcmFyZ3MoYSwgYiwgYywgZCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZSBsb25nIHNpeChsb25nIGEsIGxvbmcgYiwgbG9uZyBjLCBsb25nIGQsIGxvbmcgZSwgbG9uZyBmKSB7CisgICAgICAgIHJldHVybiB2YXJhcmdzKGEsIGIsIGMsIGQsIGUsIGYpOworICAgICAgfX0sCisgICAgRVhQQU5TSU9OIHsKKyAgICAgIEBPdmVycmlkZSBsb25nIG9uZShsb25nIGEpIHsKKyAgICAgICAgcmV0dXJuIFZhcmFyZ3NCZW5jaG1hcmsub25lKGEpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUgbG9uZyB0d28obG9uZyBhLCBsb25nIGIpIHsKKyAgICAgICAgcmV0dXJuIFZhcmFyZ3NCZW5jaG1hcmsudHdvKGEsIGIpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUgbG9uZyB0aHJlZShsb25nIGEsIGxvbmcgYiwgbG9uZyBjKSB7CisgICAgICAgIHJldHVybiBWYXJhcmdzQmVuY2htYXJrLnRocmVlKGEsIGIsIGMpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUgbG9uZyBmb3VyKGxvbmcgYSwgbG9uZyBiLCBsb25nIGMsIGxvbmcgZCkgeworICAgICAgICByZXR1cm4gVmFyYXJnc0JlbmNobWFyay5mb3VyKGEsIGIsIGMsIGQpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUgbG9uZyBmaXZlKGxvbmcgYSwgbG9uZyBiLCBsb25nIGMsIGxvbmcgZCwgbG9uZyBlKSB7CisgICAgICAgIHJldHVybiBWYXJhcmdzQmVuY2htYXJrLmZpdmUoYSwgYiwgYywgZCwgZSk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZSBsb25nIHNpeChsb25nIGEsIGxvbmcgYiwgbG9uZyBjLCBsb25nIGQsIGxvbmcgZSwgbG9uZyBmKSB7CisgICAgICAgICByZXR1cm4gVmFyYXJnc0JlbmNobWFyay5zaXgoYSwgYiwgYywgZCwgZSwgZik7CisgICAgICB9CisgICAgfTsKKworICAgIGFic3RyYWN0IGxvbmcgb25lKGxvbmcgYSk7CisKKyAgICBhYnN0cmFjdCBsb25nIHR3byhsb25nIGEsIGxvbmcgYik7CisKKyAgICBhYnN0cmFjdCBsb25nIHRocmVlKGxvbmcgYSwgbG9uZyBiLCBsb25nIGMpOworCisgICAgYWJzdHJhY3QgbG9uZyBmb3VyKGxvbmcgYSwgbG9uZyBiLCBsb25nIGMsIGxvbmcgZCk7CisKKyAgICBhYnN0cmFjdCBsb25nIGZpdmUobG9uZyBhLCBsb25nIGIsIGxvbmcgYywgbG9uZyBkLCBsb25nIGUpOworCisgICAgYWJzdHJhY3QgbG9uZyBzaXgobG9uZyBhLCBsb25nIGIsIGxvbmcgYywgbG9uZyBkLCBsb25nIGUsIGxvbmcgZik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBsb25nIHZhcmFyZ3MobG9uZy4uLiBsb25ncykgeworICAgIGxvbmcgcmVzdWx0ID0gMDsKKyAgICBmb3IgKGxvbmcgaSA6IGxvbmdzKSB7CisgICAgICByZXN1bHQgXj0gaTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGxvbmcgb25lKGxvbmcgYSkgeworICAgIHJldHVybiBhOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgbG9uZyB0d28obG9uZyBhLCBsb25nIGIpIHsKKyAgICByZXR1cm4gYSBeIGI7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBsb25nIHRocmVlKGxvbmcgYSwgbG9uZyBiLCBsb25nIGMpIHsKKyAgICByZXR1cm4gYSBeIGIgXiBjOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBmb3VyKGxvbmcgYSwgbG9uZyBiLCBsb25nIGMsIGxvbmcgZCkgeworICAgIHJldHVybiBhIF4gYiBeIGMgXiBkOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBmaXZlKGxvbmcgYSwgbG9uZyBiLCBsb25nIGMsIGxvbmcgZCwgbG9uZyBlKSB7CisgICAgcmV0dXJuIGEgXiBiIF4gYyBeIGQgXiBlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzaXgobG9uZyBhLCBsb25nIGIsIGxvbmcgYywgbG9uZyBkLCBsb25nIGUsIGxvbmcgZikgeworICAgIHJldHVybiBhIF4gYiBeIGMgXiBkIF4gZSBeIGY7CisgIH0KKworICBAUGFyYW0gcHJpdmF0ZSBTdHJhdGVneSBzdHJhdGVneTsKKyAgQFBhcmFtKHsiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYifSkgcHJpdmF0ZSBpbnQgYXJndW1lbnRzOworCisgIHByaXZhdGUgbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1syMDQ4XTsKKworICBAQmVmb3JlRXhwZXJpbWVudCB2b2lkIHNldFVwKCkgeworICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICBkYXRhW2ldID0gcmFuZG9tLm5leHRMb25nKCk7CisgICAgfQorICB9CisKKyAgQEJlbmNobWFyayBsb25nIGludm9jYXRpb24oaW50IHJlcHMpIHsKKyAgICBzd2l0Y2ggKGFyZ3VtZW50cykgeworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gb25lQXJndW1lbnQocmVwcyk7CisgICAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiB0d29Bcmd1bWVudHMocmVwcyk7CisgICAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiB0aHJlZUFyZ3VtZW50cyhyZXBzKTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgcmV0dXJuIGZvdXJBcmd1bWVudHMocmVwcyk7CisgICAgICBjYXNlIDU6CisgICAgICAgIHJldHVybiBmaXZlQXJndW1lbnRzKHJlcHMpOworICAgICAgY2FzZSA2OgorICAgICAgICByZXR1cm4gc2l4QXJndW1lbnRzKHJlcHMpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IFNraXBUaGlzU2NlbmFyaW9FeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGxvbmcgb25lQXJndW1lbnQoaW50IHJlcHMpIHsKKyAgICBsb25nIGR1bW15ID0gMDsKKyAgICBsb25nW10gZGF0YSA9IHRoaXMuZGF0YTsKKyAgICBpbnQgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICBkdW1teSArPSBzdHJhdGVneS5vbmUoZGF0YVtpICUgZGF0YUxlbmd0aF0pOworICAgIH0KKyAgICByZXR1cm4gZHVtbXk7CisgIH0KKworICBwcml2YXRlIGxvbmcgdHdvQXJndW1lbnRzKGludCByZXBzKSB7CisgICAgbG9uZyBkdW1teSA9IDA7CisgICAgbG9uZ1tdIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgaW50IGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgZHVtbXkgKz0gc3RyYXRlZ3kudHdvKGRhdGFbaSAlIGRhdGFMZW5ndGhdLCBkYXRhWyhpICsgMSkgJSBkYXRhTGVuZ3RoXSk7CisgICAgfQorICAgIHJldHVybiBkdW1teTsKKyAgfQorCisgIHByaXZhdGUgbG9uZyB0aHJlZUFyZ3VtZW50cyhpbnQgcmVwcykgeworICAgIGxvbmcgZHVtbXkgPSAwOworICAgIGxvbmdbXSBkYXRhID0gdGhpcy5kYXRhOworICAgIGludCBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgIGR1bW15ICs9IHN0cmF0ZWd5LnRocmVlKAorICAgICAgICAgIGRhdGFbaSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyAxKSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyAyKSAlIGRhdGFMZW5ndGhdKTsKKyAgICB9CisgICAgcmV0dXJuIGR1bW15OworICB9CisKKyAgcHJpdmF0ZSBsb25nIGZvdXJBcmd1bWVudHMoaW50IHJlcHMpIHsKKyAgICBsb25nIGR1bW15ID0gMDsKKyAgICBsb25nW10gZGF0YSA9IHRoaXMuZGF0YTsKKyAgICBpbnQgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICBkdW1teSArPSBzdHJhdGVneS5mb3VyKAorICAgICAgICAgIGRhdGFbaSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyAxKSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyAyKSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyAzKSAlIGRhdGFMZW5ndGhdKTsKKyAgICB9CisgICAgcmV0dXJuIGR1bW15OworICB9CisKKyAgcHJpdmF0ZSBsb25nIGZpdmVBcmd1bWVudHMoaW50IHJlcHMpIHsKKyAgICBsb25nIGR1bW15ID0gMDsKKyAgICBsb25nW10gZGF0YSA9IHRoaXMuZGF0YTsKKyAgICBpbnQgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICBkdW1teSArPSBzdHJhdGVneS5maXZlKAorICAgICAgICAgIGRhdGFbaSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyAxKSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyAyKSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyAzKSAlIGRhdGFMZW5ndGhdLAorICAgICAgICAgIGRhdGFbKGkgKyA0KSAlIGRhdGFMZW5ndGhdKTsKKyAgICB9CisgICAgcmV0dXJuIGR1bW15OworICB9CisKKyAgcHJpdmF0ZSBsb25nIHNpeEFyZ3VtZW50cyhpbnQgcmVwcykgeworICAgIGxvbmcgZHVtbXkgPSAwOworICAgIGxvbmdbXSBkYXRhID0gdGhpcy5kYXRhOworICAgIGludCBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgIGR1bW15ICs9IHN0cmF0ZWd5LnNpeCgKKyAgICAgICAgICBkYXRhW2kgJSBkYXRhTGVuZ3RoXSwKKyAgICAgICAgICBkYXRhWyhpICsgMSkgJSBkYXRhTGVuZ3RoXSwKKyAgICAgICAgICBkYXRhWyhpICsgMikgJSBkYXRhTGVuZ3RoXSwKKyAgICAgICAgICBkYXRhWyhpICsgMykgJSBkYXRhTGVuZ3RoXSwKKyAgICAgICAgICBkYXRhWyhpICsgNCkgJSBkYXRhTGVuZ3RoXSwKKyAgICAgICAgICBkYXRhWyhpICsgNSkgJSBkYXRhTGVuZ3RoXSk7CisgICAgfQorICAgIHJldHVybiBkdW1teTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXhwZWN0YXRpb25zL2tub3duZmFpbHVyZXMudHh0IGIvZXhwZWN0YXRpb25zL2tub3duZmFpbHVyZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYWFkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBlY3RhdGlvbnMva25vd25mYWlsdXJlcy50eHQKQEAgLTAsMCArMSw3NiBAQAorWworeworICBkZXNjcmlwdGlvbjogIk9iamVjdEdyYXBoTWVhc3VyZXIgZG9lc24ndCB3b3JrIG9uIEFuZHJvaWQiLAorICBuYW1lczogWworICAgICJjb20uZ29vZ2xlLmNhbGlwZXIubWVtb3J5Lk9iamVjdEdyYXBoTWVhc3VyZXJUZXN0IgorICBdCit9LAoreworICBkZXNjcmlwdGlvbjogIkxqYXZhL2xhbmcvbWFuYWdlbWVudC9NYW5hZ2VtZW50RmFjdG9yeTsgZG9lc24ndCBleGlzdCBvbiBBbmRyb2lkIiwKKyAgbmFtZXM6IFsKKyAgICAiY29tLmdvb2dsZS5jYWxpcGVyLmNvbmZpZy5DYWxpcGVyQ29uZmlnVGVzdCNnZXREZWZhdWx0Vm1Db25maWciLAorICAgICJjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLlN0cmVhbVNlcnZpY2VUZXN0IiwKKyAgICAiY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5Xb3JrZXJQcm9jZXNzVGVzdCIKKyAgXQorfSwKK3sKKyAgZGVzY3JpcHRpb246ICJAUnVuV2l0aChNb2NraXRvSlVuaXRSdW5uZXIpIGRvZXNuJ3Qgd29yayBpbiBWb2dhciIsCisgIG5hbWVzOiBbCisgICAgImNvbS5nb29nbGUuY2FsaXBlci5jb25maWcuQ2FsaXBlckNvbmZpZ0xvYWRlclRlc3QiLAorICAgICJjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLkxvZ2dpbmdDb25maWdMb2FkZXJUZXN0IiwKKyAgICAiY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5FeHBlcmltZW50aW5nUnVubmVyTW9kdWxlVGVzdCIKKyAgXQorfSwKK3sKKyAgZGVzY3JpcHRpb246ICJBc3N1bWVzIGl0IGlzIHJ1bm5pbmcgb24gYSBzdGFuZGFyZCBKYXZhIHBsYXRmb3JtIHdpdGggamF2YSBiaW5hcnkiLAorICBuYW1lczogWworICAgICJjb20uZ29vZ2xlLmNhbGlwZXIuY29uZmlnLlZtQ29uZmlnVGVzdCN0ZXN0RXhlY3V0YWJsZSIKKyAgXQorfSwKK3sKKyAgZGVzY3JpcHRpb246ICJBbGxvY2F0aW9uSW5zdHJ1bWVudCBkb2Vzbid0IHdvcmsgb24gQW5kcm9pZCIsCisgIG5hbWVzOiBbCisgICAgImNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuQWxsb2NhdGlvbkluc3RydW1lbnRUZXN0IiwKKyAgICAiY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5CYWRVc2VyQ29kZVRlc3QjdGVzdENvbXBsZXhOb25EZXRlcm1pbmlzdGljQWxsb2NhdGlvbl9ub1RyYWNrQWxsb2NhdGlvbnMiLAorICAgICJjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLkJhZFVzZXJDb2RlVGVzdCN0ZXN0Q29tcGxleE5vbkRldGVybWluaXN0aWNBbGxvY2F0aW9uX3RyYWNrQWxsb2NhdGlvbnMiLAorICAgICJjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLkJhZFVzZXJDb2RlVGVzdCN0ZXN0Tm9uRGV0ZXJtaW5pc3RpY0FsbG9jYXRpb25fbm9UcmFja0FsbG9jYXRpb25zIiwKKyAgICAiY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5CYWRVc2VyQ29kZVRlc3QjdGVzdE5vbkRldGVybWluaXN0aWNBbGxvY2F0aW9uX3RyYWNrQWxsb2NhdGlvbnMiLAorICAgICJjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLk1hbGZvcm1lZEJlbmNobWFya3NUZXN0I25vQmVuY2htYXJrTWV0aG9kcyIKKyAgXQorfSwKK3sKKyAgZGVzY3JpcHRpb246ICJBcmJpdHJhcnlNZWFzdXJlbWVudEluc3RydW1lbnQgZG9lc24ndCB3b3JrIG9uIEFuZHJvaWQiLAorICBuYW1lczogWworICAgICJjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLkFyYml0cmFyeU1lYXN1cm1lbnRJbnN0cnVtZW50VGVzdCIKKyAgXQorfSwKK3sKKyAgZGVzY3JpcHRpb246ICJBbmRyb2lkIG9ubHkgaGFzIDI1Nk0gaGVhcCIsCisgIG5hbWVzOiBbCisgICAgImNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVudGltZUluc3RydW1lbnRUZXN0I2djQmVmb3JlRWFjaE9wdGlvbklzSG9ub3JlZCIsCisgICAgImNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVudGltZUluc3RydW1lbnRUZXN0I2djQmVmb3JlRWFjaE9wdGlvbklzUmVhbGx5TmVjZXNzYXJ5IgorICBdCit9LAoreworICBkZXNjcmlwdGlvbjogIkNoZWNrcyBmb3IgYSBzcGVjaWZpYyBleGNlcHRpb24gbWVzc2FnZSB0aGF0IGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiBKVk0iLAorICBuYW1lczogWworICAgICJjb20uZ29vZ2xlLmNhbGlwZXIucnVubmVyLk1hbGZvcm1lZEJlbmNobWFya3NUZXN0I3VucGFyc2FibGVQYXJhbURlZmF1bHQiCisgIF0KK30sCit7CisgIGRlc2NyaXB0aW9uOiAiVW5rbm93biBjYXVzZSIsCisgIG5hbWVzOiBbCisgICAgImNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuU2VydmVyU29ja2V0U2VydmljZVRlc3QjZ2V0Q29ubmVjdGlvblN0b3BwZWRTZXJ2aWNlIiwKKyAgICAiY29tLmdvb2dsZS5jYWxpcGVyLnJ1bm5lci5CYWRVc2VyQ29kZVRlc3QjdGVzdEV4Y2VwdGlvbkluTWV0aG9kX25vdEluRHJ5UnVuIiwjCisgICAgImNvbS5nb29nbGUuY2FsaXBlci5ydW5uZXIuUnVudGltZUluc3RydW1lbnRUZXN0I21heFdhcm11cFdhbGxUaW1lT3B0aW9uSXNIb25vcmVkIgorICBdCit9LAoreworICBkZXNjcmlwdGlvbjogIlBvc3NpYmxlIHJhY2UgaW4gcGFyc2UgY29kZSB0aGF0IGNhdXNlcyBkcnlSdW4gdG8gYmUgdHJ1ZSB3aGVuIGl0IGlzIGZhbHNlLCBnb2VzIGF3YXkgdW5kZXIgZGVidWciLAorICBuYW1lczogWworICAgICJjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9ucy5QYXJzZWRPcHRpb25zVGVzdCN0ZXN0RGVmYXVsdHNfRG9Ob3RSZXF1aXJlQmVuY2htYXJrQ2xhc3NOYW1lIiwKKyAgICAiY29tLmdvb2dsZS5jYWxpcGVyLm9wdGlvbnMuUGFyc2VkT3B0aW9uc1Rlc3QjdGVzdERlZmF1bHRzX1JlcXVpcmVCZW5jaG1hcmtDbGFzc05hbWUiLAorICAgICJjb20uZ29vZ2xlLmNhbGlwZXIub3B0aW9ucy5QYXJzZWRPcHRpb25zVGVzdCN0ZXN0S2l0Y2hlblNpbmsiCisgIF0KK30KK10KZGlmZiAtLWdpdCBhL2xpYi9nc29uLTEuNy4xLmphciBiL2xpYi9nc29uLTEuNy4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1NDI3NC4uMDAwMDAwMAotLS0gYS9saWIvZ3Nvbi0xLjcuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ3Nvbi0yLjIuMi1zb3VyY2VzLmphciBiL2xpYi9nc29uLTIuMi4yLXNvdXJjZXMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzQzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ3Nvbi0yLjIuMi1zb3VyY2VzLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ3Nvbi0yLjIuMi5qYXIgYi9saWIvZ3Nvbi0yLjIuMi5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkYzY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nc29uLTIuMi4yLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ3Nvbi0xLjcuMS5qYXIudHh0IGIvbGliL2dzb24tMi4yLjIuamFyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2dzb24tMS43LjEuamFyLnR4dApyZW5hbWUgdG8gbGliL2dzb24tMi4yLjIuamFyLnR4dApkaWZmIC0tZ2l0IGEvbGliL2phdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXItMi4wLXNvdXJjZXMuamFyIGIvbGliL2phdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXItMi4wLXNvdXJjZXMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Y2M0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlci0yLjAtc291cmNlcy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2plcnNleS1jbGllbnQtMS4xMS1zb3VyY2VzLmphciBiL2xpYi9qZXJzZXktY2xpZW50LTEuMTEtc291cmNlcy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxNjRjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qZXJzZXktY2xpZW50LTEuMTEtc291cmNlcy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2plcnNleS1jbGllbnQtMS4xMS5qYXIgYi9saWIvamVyc2V5LWNsaWVudC0xLjExLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ4OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2plcnNleS1jbGllbnQtMS4xMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2plcnNleS1jbGllbnQtMS4xMS5qYXIudHh0IGIvbGliL2plcnNleS1jbGllbnQtMS4xMS5qYXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODFkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamVyc2V5LWNsaWVudC0xLjExLmphci50eHQKQEAgLTAsMCArMSw3MTIgQEAKK0NPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4xCisKKzEuIERlZmluaXRpb25zLgorCisgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yCisgICAgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCisKKyAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsCisgICAgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlCisgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KKworICAgIDEuMy4gIkNvdmVyZWQgU29mdHdhcmUiIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChiKQorICAgIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbAorICAgIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nCisgICAgcG9ydGlvbnMgdGhlcmVvZi4KKworICAgIDEuNC4gIkV4ZWN1dGFibGUiIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4KKyAgICBTb3VyY2UgQ29kZS4KKworICAgIDEuNS4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcworICAgIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgICAxLjYuICJMYXJnZXIgV29yayIgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IKKyAgICBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIDEuNy4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCisKKyAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQKKyAgICBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkKKyAgICBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uCisKKyAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YKKyAgICB0aGUgZm9sbG93aW5nOgorCisgICAgQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20gb3IKKyAgICBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yCisgICAgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKKworICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvcgorICAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKKworICAgIEMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICAgIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mCisgICAgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICAgMS4xMS4gIlBhdGVudCBDbGFpbXMiIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvciBoZXJlYWZ0ZXIKKyAgICBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzCisgICAgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KKworICAgIDEuMTIuICJTb3VyY2UgQ29kZSIgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlCisgICAgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICAgIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgorCisgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nCisgICAgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IKKyAgICBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZAorICAgIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMKKyAgICBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZQorICAgIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUKKyAgICBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzIuIExpY2Vuc2UgR3JhbnRzLgorCisgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCisKKyAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvCisgICAgdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieQorICAgIGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKKworICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspCisgICAgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwKKyAgICBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMKKyAgICB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyCisgICAgV29yazsgYW5kCisKKyAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZgorICAgIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlcgorICAgIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucworICAgIHRoZXJlb2YpLgorCisgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlCisgICAgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsCisgICAgU29mdHdhcmUgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6CisgICAgKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvcgorICAgIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsCisgICAgb3IgKGlpKSB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IKKyAgICBkZXZpY2VzLgorCisgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KKworICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8KKyAgICB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKKyAgICBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKKworICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspCisgICAgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLAorICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yCisgICAgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4gdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlcgorICAgIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisKKyAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YKKyAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluCisgICAgY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaAorICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3IKKyAgICBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEpIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvcgorICAgIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIpIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAorICAgIENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2gKKyAgICBjb21iaW5hdGlvbikuCisKKyAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbgorICAgIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUKKyAgICBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgorCisgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDoKKyAgICAoMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IKKyAgICBWZXJzaW9uOyAoMikgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucworICAgIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieQorICAgIHRoYXQgQ29udHJpYnV0b3Igd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlIENvbnRyaWJ1dG9yCisgICAgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5CisgICAgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAorICAgIENvbnRyaWJ1dG9yLgorCiszLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCisKKyAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KKworICAgIEFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGluCisgICAgRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0CisgICAgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMKKyAgICBMaWNlbnNlLiBZb3UgbXVzdCBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZQorICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlCisgICAgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUKKyAgICBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4KKyAgICBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCisgICAgMy4yLiBNb2RpZmljYXRpb25zLgorCisgICAgVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZQorICAgIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZQorICAgIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUKKyAgICBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgIDMuMy4gUmVxdWlyZWQgTm90aWNlcy4KKworICAgIFlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzCisgICAgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLiBZb3UgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIKKyAgICBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZAorICAgIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nCisgICAgYXR0cmlidXRpb24gdG8gYW55IENvbnRyaWJ1dG9yIG9yIHRoZSBJbml0aWFsIERldmVsb3Blci4KKworICAgIDMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KKworICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlCisgICAgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMKKyAgICBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkKKyAgICBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuIEhvd2V2ZXIsIHlvdQorICAgIG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwKKyAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkKKyAgICBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieQorICAgIFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQKKyAgICBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IKKyAgICBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IKKyAgICBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgorCisgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KKworICAgIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLAorICAgIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UKKyAgICBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZQorICAgIHJlY2lwaWVudCdzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybSBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluCisgICAgdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0KKyAgICB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkKKyAgICB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkKKyAgICB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZQorICAgIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieQorICAgIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zCisgICAgWW91IG9mZmVyLgorCisgICAgMy42LiBMYXJnZXIgV29ya3MuCisKKyAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIKKyAgICBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIKKyAgICBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlCisgICAgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4KKworNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCisKKyAgICA0LjEuIE5ldyBWZXJzaW9ucy4KKworICAgIE9yYWNsZSBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldworICAgIHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQorICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZQorICAgIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuCisKKyAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCisKKyAgICBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQKKyAgICBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyCisgICAgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsCisgICAgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tCisgICAgYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50CisgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQgbWFrZSB0aGUgQ292ZXJlZAorICAgIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIKKyAgICB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5CisgICAgYWxzbyBjaG9vc2UgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlCisgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlCisgICAgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCisKKyAgICA0LjMuIE1vZGlmaWVkIFZlcnNpb25zLgorCisgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZQorICAgIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZgorICAgIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0bworICAgIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycworICAgIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKSBvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0IHRoZSBsaWNlbnNlCisgICAgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgorCis1LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgorCisgICAgQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywKKyAgICBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GCisgICAgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLgorICAgIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKyAgICBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkKKyAgICBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUKKyAgICBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMKKyAgICBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8KKyAgICBVU0UgT0YgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMKKyAgICBESVNDTEFJTUVSLgorCis2LiBURVJNSU5BVElPTi4KKworICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlCisgICAgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZQorICAgIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMKKyAgICB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZgorICAgIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgorCisgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5CisgICAganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUKKyAgICBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzCisgICAgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUKKyAgICAobWVhbmluZyB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvcgorICAgIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyKQorICAgIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzCisgICAgZ3JhbnRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbAorICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpIGFuZCBhbGwKKyAgICBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uCisgICAgNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQKKyAgICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZgorICAgIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZQorICAgIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yCisgICAgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoIFBhcnRpY2lwYW50LgorCisgICAgNi4zLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSBhZ2FpbnN0IFBhcnRpY2lwYW50CisgICAgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMKKyAgICBhbnkgcGF0ZW50IHdoZXJlIHN1Y2ggY2xhaW0gaXMgcmVzb2x2ZWQgKHN1Y2ggYXMgYnkgbGljZW5zZSBvcgorICAgIHNldHRsZW1lbnQpIHByaW9yIHRvIHRoZSBpbml0aWF0aW9uIG9mIHBhdGVudCBpbmZyaW5nZW1lbnQgbGl0aWdhdGlvbiwKKyAgICB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcyBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQKKyAgICB1bmRlciBTZWN0aW9ucyAyLjEgb3IgMi4yIHNoYWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiBkZXRlcm1pbmluZyB0aGUKKyAgICBhbW91bnQgb3IgdmFsdWUgb2YgYW55IHBheW1lbnQgb3IgbGljZW5zZS4KKworICAgIDYuNC4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDYuMSBvciA2LjIgYWJvdmUsIGFsbAorICAgIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55CisgICAgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZAorICAgIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCisKKzcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgorCisgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQKKyAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMCisgICAgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVECisgICAgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZCisgICAgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICAgIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YKKyAgICBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwKKyAgICBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOCisgICAgSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GCisgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWQorICAgIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcKKyAgICBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04KKyAgICBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTgorICAgIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgorCis4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgorCisgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4KKyAgICA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKKyAgICBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiCnIDI1Mi4yMjctNzAxNChhKSgxKSkKKyAgICBhbmQgImNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZAorICAgIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQKKyAgICA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQKKyAgICBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoCisgICAgaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZAorICAgIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdAorICAgIGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzkuIE1JU0NFTExBTkVPVVMuCisKKyAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIKKyAgICBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwKKyAgICBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQKKyAgICBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlCisgICAganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbAorICAgIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcworICAgIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbidzIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLgorICAgIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZQorICAgIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUKKyAgICBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHdpdGggdGhlCisgICAgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0CisgICAgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mCisgICAgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mCisgICAgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdAorICAgIHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsCisgICAgbm90IGFwcGx5IHRvIHRoaXMgTGljZW5zZS4gWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IKKyAgICBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQKKyAgICB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdQorICAgIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCisKKzEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLgorCisgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcworICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgb3V0CisgICAgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrCisgICAgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaAorICAgIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3IKKyAgICBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KKworTk9USUNFIFBVUlNVQU5UIFRPIFNFQ1RJT04gOSBPRiBUSEUgQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04KK0xJQ0VOU0UgKENEREwpCisKK1RoZSBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgQ2FsaWZvcm5pYSAoZXhjbHVkaW5nIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zKS4gQW55CitsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24KK29mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlCitzdGF0ZSBjb3VydHMgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEKK0NvdW50eSwgQ2FsaWZvcm5pYS4KKworCisKKworVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKK0NvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gNTkgVGVtcGxlIFBsYWNlLAorU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzCitsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1ByZWFtYmxlCisKK1RoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0bworc2hhcmUgYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcworaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUgc29mdHdhcmUtLXRvCittYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuIFRoaXMgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQKK3RvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LiAoU29tZSBvdGhlciBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KKworV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4KK091ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlCitmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMKK3NlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Cit3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldworZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKK1RvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lCit0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UKK3Jlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4KK1lvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4KK0FuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKK0Fsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKK0ZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCitXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsCitpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUgcHJvZ3JhbQorcHJvcHJpZXRhcnkuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0CitiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCitUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKzAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYQorbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCit0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzCit0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucworZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcwordG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlcgordmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4KKyhIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtCisibW9kaWZpY2F0aW9uIi4pIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiBUaGUgYWN0IG9mIHJ1bm5pbmcKK3RoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtIGlzCitjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtCisoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4gV2hldGhlciB0aGF0CitpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlCitjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5CithbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlCithbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8KK3RoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIKK3JlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKzIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YKK2l0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZQorc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQKK3RoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCisgICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4gd2hvbGUKKyAgICBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkgcGFydCB0aGVyZW9mLAorICAgIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbgorICAgIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoIGludGVyYWN0aXZlIHVzZSBpbgorICAgIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbiBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuCisgICAgYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IKKyAgICBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZSBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkKKyAgICByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIKKyAgICBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMKKyAgICBpbnRlcmFjdGl2ZSBidXQgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yaworICAgIGJhc2VkIG9uIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZAorY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQgb24KK3RoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlCit3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEKK3N0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlciB0aGUKK3Njb3BlIG9mIHRoaXMgTGljZW5zZS4KKworMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsIHVuZGVyCitTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKzEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlCisgICAgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMgorICAgIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzLCB0bworICAgIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIgY29zdCBvZiBwaHlzaWNhbGx5CisgICAgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUKKyAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvCisgICAgZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAoVGhpcyBhbHRlcm5hdGl2ZSBpcyBhbGxvd2VkIG9ubHkKKyAgICBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluCisgICAgb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGgKKyAgICBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUKK21lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKK2NvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbAorZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMgdGhlCitleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcwordG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5Cit0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UKK2NvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlCithbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlCit0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbAorYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiBIb3dldmVyLCBwYXJ0aWVzCit3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwKK25vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluCitmdWxsIGNvbXBsaWFuY2UuCisKKzUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZCBhbGwKK2l0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUKK1Byb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKzYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucworb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uIFlvdSBhcmUgbm90CityZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0byB0aGlzIExpY2Vuc2UuCisKKzcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUKK3NvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kCithbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZAorbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobworcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91Citjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20KK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZAorYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiBNYW55IHBlb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMKK2NvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0CitzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0IHN5c3RlbTsgaXQgaXMgdXAgdG8KK3RoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvIGRpc3RyaWJ1dGUKK3NvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQKK2Nob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlCithIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZSBtYXkKK2FkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlCitjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcworbm90IHRodXMgZXhjbHVkZWQuIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUKK2xpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKzkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uCitudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlCithdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlCitzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlCit0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlCitzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKK05PIFdBUlJBTlRZCisKKzExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIKK0VYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFCitFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSAorWU9VLiBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTAorTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKzEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SCitEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0KKyhJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVECitJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GCitUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUgorT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKK0lmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlCit0ZXJtcy4KKworVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uIEl0IGlzIHNhZmVzdCB0bworYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkKK3RoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgT25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuCisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisgICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvciBHbm9tb3Zpc2lvbgorICAgIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4gVGhpcyBpcworICAgIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0IHVuZGVyIGNlcnRhaW4KKyAgICBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUKK2FwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcworeW91IHVzZSBtYXkgYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleQorY291bGQgZXZlbiBiZSBtb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgICAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICAgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgICAgc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk4OQorICAgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KK2ludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91CittYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zCit3aXRoIHRoZSBsaWJyYXJ5LiBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCisKKyMKKworIkNMQVNTUEFUSCIgRVhDRVBUSU9OIFRPIFRIRSBHUEwgVkVSU0lPTiAyCisKK0NlcnRhaW4gc291cmNlIGZpbGVzIGRpc3RyaWJ1dGVkIGJ5IE9yYWNsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCitjbGFyaWZpY2F0aW9uIGFuZCBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIFZlcnNpb24gMiwgYnV0IG9ubHkgd2hlcmUKK09yYWNsZSBoYXMgZXhwcmVzc2x5IGluY2x1ZGVkIGluIHRoZSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlJ3MgaGVhZGVyIHRoZQord29yZHMgIk9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlCisiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBMaWNlbnNlIGZpbGUgdGhhdAorYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIKKworTGlua2luZyB0aGlzIGxpYnJhcnkgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMKK21ha2luZyBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiBUaHVzLCB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgY292ZXIgdGhlIHdob2xlCitjb21iaW5hdGlvbi4KKworQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdQorcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMgdG8gcHJvZHVjZSBhbgorZXhlY3V0YWJsZSwgcmVnYXJkbGVzcyBvZiB0aGUgbGljZW5zZSB0ZXJtcyBvZiB0aGVzZSBpbmRlcGVuZGVudAorbW9kdWxlcywgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zCitvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKK21vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLiBBbgoraW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24KK3RoaXMgbGlicmFyeS4gSWYgeW91IG1vZGlmeSB0aGlzIGxpYnJhcnksIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uCit0byB5b3VyIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uIElmCit5b3UgZG8gbm90IHdpc2ggdG8gZG8gc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyCit2ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvbGliL2plcnNleS1jb3JlLTEuMTEtc291cmNlcy5qYXIgYi9saWIvamVyc2V5LWNvcmUtMS4xMS1zb3VyY2VzLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjg1ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2plcnNleS1jb3JlLTEuMTEtc291cmNlcy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2plcnNleS1jb3JlLTEuMTEuamFyIGIvbGliL2plcnNleS1jb3JlLTEuMTEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOWY3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamVyc2V5LWNvcmUtMS4xMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2plcnNleS1jb3JlLTEuMTEuamFyLnR4dCBiL2xpYi9qZXJzZXktY29yZS0xLjExLmphci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4MWQxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qZXJzZXktY29yZS0xLjExLmphci50eHQKQEAgLTAsMCArMSw3MTIgQEAKK0NPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4xCisKKzEuIERlZmluaXRpb25zLgorCisgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yCisgICAgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCisKKyAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsCisgICAgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlCisgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KKworICAgIDEuMy4gIkNvdmVyZWQgU29mdHdhcmUiIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChiKQorICAgIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbAorICAgIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nCisgICAgcG9ydGlvbnMgdGhlcmVvZi4KKworICAgIDEuNC4gIkV4ZWN1dGFibGUiIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4KKyAgICBTb3VyY2UgQ29kZS4KKworICAgIDEuNS4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcworICAgIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgICAxLjYuICJMYXJnZXIgV29yayIgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IKKyAgICBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIDEuNy4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCisKKyAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQKKyAgICBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkKKyAgICBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uCisKKyAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YKKyAgICB0aGUgZm9sbG93aW5nOgorCisgICAgQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20gb3IKKyAgICBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yCisgICAgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKKworICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvcgorICAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKKworICAgIEMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICAgIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mCisgICAgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICAgMS4xMS4gIlBhdGVudCBDbGFpbXMiIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvciBoZXJlYWZ0ZXIKKyAgICBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzCisgICAgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KKworICAgIDEuMTIuICJTb3VyY2UgQ29kZSIgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlCisgICAgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICAgIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgorCisgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nCisgICAgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IKKyAgICBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZAorICAgIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMKKyAgICBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZQorICAgIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUKKyAgICBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzIuIExpY2Vuc2UgR3JhbnRzLgorCisgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCisKKyAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvCisgICAgdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieQorICAgIGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKKworICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspCisgICAgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwKKyAgICBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMKKyAgICB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyCisgICAgV29yazsgYW5kCisKKyAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZgorICAgIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlcgorICAgIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucworICAgIHRoZXJlb2YpLgorCisgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlCisgICAgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsCisgICAgU29mdHdhcmUgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6CisgICAgKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvcgorICAgIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsCisgICAgb3IgKGlpKSB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IKKyAgICBkZXZpY2VzLgorCisgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4KKworICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8KKyAgICB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKKyAgICBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKKworICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspCisgICAgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLAorICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yCisgICAgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4gdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlcgorICAgIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisKKyAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YKKyAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluCisgICAgY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaAorICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3IKKyAgICBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEpIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvcgorICAgIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIpIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAorICAgIENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2gKKyAgICBjb21iaW5hdGlvbikuCisKKyAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbgorICAgIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUKKyAgICBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgorCisgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDoKKyAgICAoMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IKKyAgICBWZXJzaW9uOyAoMikgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucworICAgIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieQorICAgIHRoYXQgQ29udHJpYnV0b3Igd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlIENvbnRyaWJ1dG9yCisgICAgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5CisgICAgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAorICAgIENvbnRyaWJ1dG9yLgorCiszLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCisKKyAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KKworICAgIEFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGluCisgICAgRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0CisgICAgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMKKyAgICBMaWNlbnNlLiBZb3UgbXVzdCBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZQorICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlCisgICAgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUKKyAgICBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4KKyAgICBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCisgICAgMy4yLiBNb2RpZmljYXRpb25zLgorCisgICAgVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZQorICAgIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZQorICAgIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUKKyAgICBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgIDMuMy4gUmVxdWlyZWQgTm90aWNlcy4KKworICAgIFlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzCisgICAgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLiBZb3UgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIKKyAgICBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZAorICAgIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nCisgICAgYXR0cmlidXRpb24gdG8gYW55IENvbnRyaWJ1dG9yIG9yIHRoZSBJbml0aWFsIERldmVsb3Blci4KKworICAgIDMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KKworICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlCisgICAgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMKKyAgICBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkKKyAgICBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuIEhvd2V2ZXIsIHlvdQorICAgIG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwKKyAgICBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkKKyAgICBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieQorICAgIFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQKKyAgICBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IKKyAgICBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IKKyAgICBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgorCisgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KKworICAgIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLAorICAgIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UKKyAgICBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZQorICAgIHJlY2lwaWVudCdzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybSBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluCisgICAgdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0KKyAgICB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkKKyAgICB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkKKyAgICB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZQorICAgIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieQorICAgIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zCisgICAgWW91IG9mZmVyLgorCisgICAgMy42LiBMYXJnZXIgV29ya3MuCisKKyAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIKKyAgICBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIKKyAgICBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlCisgICAgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4KKworNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCisKKyAgICA0LjEuIE5ldyBWZXJzaW9ucy4KKworICAgIE9yYWNsZSBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldworICAgIHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQorICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZQorICAgIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuCisKKyAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCisKKyAgICBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQKKyAgICBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyCisgICAgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsCisgICAgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tCisgICAgYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50CisgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQgbWFrZSB0aGUgQ292ZXJlZAorICAgIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIKKyAgICB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5CisgICAgYWxzbyBjaG9vc2UgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlCisgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlCisgICAgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCisKKyAgICA0LjMuIE1vZGlmaWVkIFZlcnNpb25zLgorCisgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZQorICAgIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZgorICAgIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0bworICAgIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycworICAgIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKSBvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0IHRoZSBsaWNlbnNlCisgICAgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgorCis1LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgorCisgICAgQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywKKyAgICBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GCisgICAgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLgorICAgIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKKyAgICBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkKKyAgICBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUKKyAgICBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMKKyAgICBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8KKyAgICBVU0UgT0YgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMKKyAgICBESVNDTEFJTUVSLgorCis2LiBURVJNSU5BVElPTi4KKworICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlCisgICAgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZQorICAgIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMKKyAgICB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZgorICAgIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgorCisgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5CisgICAganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUKKyAgICBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzCisgICAgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUKKyAgICAobWVhbmluZyB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvcgorICAgIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyKQorICAgIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzCisgICAgZ3JhbnRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbAorICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpIGFuZCBhbGwKKyAgICBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uCisgICAgNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQKKyAgICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZgorICAgIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZQorICAgIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yCisgICAgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoIFBhcnRpY2lwYW50LgorCisgICAgNi4zLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSBhZ2FpbnN0IFBhcnRpY2lwYW50CisgICAgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMKKyAgICBhbnkgcGF0ZW50IHdoZXJlIHN1Y2ggY2xhaW0gaXMgcmVzb2x2ZWQgKHN1Y2ggYXMgYnkgbGljZW5zZSBvcgorICAgIHNldHRsZW1lbnQpIHByaW9yIHRvIHRoZSBpbml0aWF0aW9uIG9mIHBhdGVudCBpbmZyaW5nZW1lbnQgbGl0aWdhdGlvbiwKKyAgICB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcyBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQKKyAgICB1bmRlciBTZWN0aW9ucyAyLjEgb3IgMi4yIHNoYWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiBkZXRlcm1pbmluZyB0aGUKKyAgICBhbW91bnQgb3IgdmFsdWUgb2YgYW55IHBheW1lbnQgb3IgbGljZW5zZS4KKworICAgIDYuNC4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDYuMSBvciA2LjIgYWJvdmUsIGFsbAorICAgIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55CisgICAgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZAorICAgIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCisKKzcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgorCisgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQKKyAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMCisgICAgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVECisgICAgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZCisgICAgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICAgIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YKKyAgICBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwKKyAgICBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOCisgICAgSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GCisgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWQorICAgIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcKKyAgICBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04KKyAgICBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTgorICAgIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgorCis4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgorCisgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4KKyAgICA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKKyAgICBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiCnIDI1Mi4yMjctNzAxNChhKSgxKSkKKyAgICBhbmQgImNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZAorICAgIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQKKyAgICA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQKKyAgICBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoCisgICAgaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZAorICAgIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdAorICAgIGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzkuIE1JU0NFTExBTkVPVVMuCisKKyAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIKKyAgICBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwKKyAgICBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQKKyAgICBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlCisgICAganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbAorICAgIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcworICAgIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbidzIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLgorICAgIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZQorICAgIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUKKyAgICBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHdpdGggdGhlCisgICAgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0CisgICAgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mCisgICAgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mCisgICAgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdAorICAgIHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsCisgICAgbm90IGFwcGx5IHRvIHRoaXMgTGljZW5zZS4gWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IKKyAgICBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQKKyAgICB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdQorICAgIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCisKKzEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLgorCisgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcworICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgb3V0CisgICAgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrCisgICAgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaAorICAgIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3IKKyAgICBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KKworTk9USUNFIFBVUlNVQU5UIFRPIFNFQ1RJT04gOSBPRiBUSEUgQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04KK0xJQ0VOU0UgKENEREwpCisKK1RoZSBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQorU3RhdGUgb2YgQ2FsaWZvcm5pYSAoZXhjbHVkaW5nIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zKS4gQW55CitsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24KK29mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlCitzdGF0ZSBjb3VydHMgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEKK0NvdW50eSwgQ2FsaWZvcm5pYS4KKworCisKKworVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKK0NvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gNTkgVGVtcGxlIFBsYWNlLAorU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzCitsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1ByZWFtYmxlCisKK1RoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0bworc2hhcmUgYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcworaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUgc29mdHdhcmUtLXRvCittYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuIFRoaXMgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQKK3RvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LiAoU29tZSBvdGhlciBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KKworV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4KK091ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlCitmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMKK3NlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Cit3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldworZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKK1RvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lCit0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UKK3Jlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4KK1lvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4KK0FuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKK0Fsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKK0ZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCitXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsCitpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUgcHJvZ3JhbQorcHJvcHJpZXRhcnkuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0CitiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCitUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKzAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYQorbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCit0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzCit0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucworZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcwordG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlcgordmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4KKyhIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtCisibW9kaWZpY2F0aW9uIi4pIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiBUaGUgYWN0IG9mIHJ1bm5pbmcKK3RoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtIGlzCitjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtCisoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4gV2hldGhlciB0aGF0CitpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlCitjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5CithbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlCithbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8KK3RoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIKK3JlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKzIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YKK2l0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZQorc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQKK3RoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCisgICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4gd2hvbGUKKyAgICBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkgcGFydCB0aGVyZW9mLAorICAgIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbgorICAgIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoIGludGVyYWN0aXZlIHVzZSBpbgorICAgIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbiBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuCisgICAgYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IKKyAgICBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZSBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkKKyAgICByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIKKyAgICBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMKKyAgICBpbnRlcmFjdGl2ZSBidXQgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yaworICAgIGJhc2VkIG9uIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZAorY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQgb24KK3RoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlCit3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEKK3N0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlciB0aGUKK3Njb3BlIG9mIHRoaXMgTGljZW5zZS4KKworMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsIHVuZGVyCitTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKzEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlCisgICAgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMgorICAgIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzLCB0bworICAgIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIgY29zdCBvZiBwaHlzaWNhbGx5CisgICAgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUKKyAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvCisgICAgZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAoVGhpcyBhbHRlcm5hdGl2ZSBpcyBhbGxvd2VkIG9ubHkKKyAgICBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluCisgICAgb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGgKKyAgICBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUKK21lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKK2NvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbAorZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMgdGhlCitleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcwordG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5Cit0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UKK2NvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlCithbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlCit0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbAorYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiBIb3dldmVyLCBwYXJ0aWVzCit3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwKK25vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluCitmdWxsIGNvbXBsaWFuY2UuCisKKzUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZCBhbGwKK2l0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUKK1Byb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKzYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucworb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uIFlvdSBhcmUgbm90CityZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0byB0aGlzIExpY2Vuc2UuCisKKzcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUKK3NvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kCithbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZAorbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobworcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91Citjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20KK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZAorYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiBNYW55IHBlb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMKK2NvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0CitzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0IHN5c3RlbTsgaXQgaXMgdXAgdG8KK3RoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvIGRpc3RyaWJ1dGUKK3NvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQKK2Nob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlCithIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZSBtYXkKK2FkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlCitjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcworbm90IHRodXMgZXhjbHVkZWQuIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUKK2xpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKzkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uCitudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlCithdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlCitzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlCit0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlCitzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKK05PIFdBUlJBTlRZCisKKzExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIKK0VYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFCitFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSAorWU9VLiBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTAorTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKzEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SCitEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0KKyhJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVECitJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GCitUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUgorT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKK0lmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlCit0ZXJtcy4KKworVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uIEl0IGlzIHNhZmVzdCB0bworYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkKK3RoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgT25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuCisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsCisgICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvciBHbm9tb3Zpc2lvbgorICAgIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4gVGhpcyBpcworICAgIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0IHVuZGVyIGNlcnRhaW4KKyAgICBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUKK2FwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcworeW91IHVzZSBtYXkgYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleQorY291bGQgZXZlbiBiZSBtb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgICAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICAgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgICAgc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk4OQorICAgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KK2ludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91CittYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zCit3aXRoIHRoZSBsaWJyYXJ5LiBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCisKKyMKKworIkNMQVNTUEFUSCIgRVhDRVBUSU9OIFRPIFRIRSBHUEwgVkVSU0lPTiAyCisKK0NlcnRhaW4gc291cmNlIGZpbGVzIGRpc3RyaWJ1dGVkIGJ5IE9yYWNsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCitjbGFyaWZpY2F0aW9uIGFuZCBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIFZlcnNpb24gMiwgYnV0IG9ubHkgd2hlcmUKK09yYWNsZSBoYXMgZXhwcmVzc2x5IGluY2x1ZGVkIGluIHRoZSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlJ3MgaGVhZGVyIHRoZQord29yZHMgIk9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlCisiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBMaWNlbnNlIGZpbGUgdGhhdAorYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIKKworTGlua2luZyB0aGlzIGxpYnJhcnkgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMKK21ha2luZyBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiBUaHVzLCB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgY292ZXIgdGhlIHdob2xlCitjb21iaW5hdGlvbi4KKworQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdQorcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMgdG8gcHJvZHVjZSBhbgorZXhlY3V0YWJsZSwgcmVnYXJkbGVzcyBvZiB0aGUgbGljZW5zZSB0ZXJtcyBvZiB0aGVzZSBpbmRlcGVuZGVudAorbW9kdWxlcywgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zCitvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKK21vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLiBBbgoraW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24KK3RoaXMgbGlicmFyeS4gSWYgeW91IG1vZGlmeSB0aGlzIGxpYnJhcnksIHlvdSBtYXkgZXh0ZW5kIHRoaXMgZXhjZXB0aW9uCit0byB5b3VyIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uIElmCit5b3UgZG8gbm90IHdpc2ggdG8gZG8gc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyCit2ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvbGliL2pvZGEtdGltZS0yLjEtc291cmNlcy5qYXIgYi9saWIvam9kYS10aW1lLTIuMS1zb3VyY2VzLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGU0ZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pvZGEtdGltZS0yLjEtc291cmNlcy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2pvZGEtdGltZS0yLjEuamFyIGIvbGliL2pvZGEtdGltZS0yLjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYWNhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvam9kYS10aW1lLTIuMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2pvZGEtdGltZS0yLjEuamFyLnR4dCBiL2xpYi9qb2RhLXRpbWUtMi4xLmphci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwZjFkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qb2RhLXRpbWUtMi4xLmphci50eHQKQEAgLTAsMCArMSwyMDIgQEAKKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCisNCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCisNCisgICAxLiBEZWZpbml0aW9ucy4NCisNCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KKw0KKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KKw0KKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQorDQorICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQorDQorICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQorDQorICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCisNCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KKw0KKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQorICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQorDQorICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQorICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KKw0KKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQorDQorICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCisNCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQorICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQorICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KKw0KKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCisNCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KKw0KKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQorDQorICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQorICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQorDQorICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQorICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCisNCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQorICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQorDQorICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KKw0KKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQorDQorICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQorICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCisNCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KKw0KKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCisNCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCisNCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQorDQorICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQorDQorICAgQ29weXJpZ2h0IDIwMDgtMjAxMSBHb29nbGUgSW5jLg0KKw0KKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KZGlmZiAtLWdpdCBhL2xpYi9qc3IzMTEtYXBpLTEuMS4xLXNvdXJjZXMuamFyIGIvbGliL2pzcjMxMS1hcGktMS4xLjEtc291cmNlcy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkNWViOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc3IzMTEtYXBpLTEuMS4xLXNvdXJjZXMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9qc3IzMTEtYXBpLTEuMS4xLmphciBiL2xpYi9qc3IzMTEtYXBpLTEuMS4xLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhiYzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzcjMxMS1hcGktMS4xLjEuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9qc3IzMTEtYXBpLTEuMS4xLmphci50eHQgYi9saWIvanNyMzExLWFwaS0xLjEuMS5qYXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODFkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNyMzExLWFwaS0xLjEuMS5qYXIudHh0CkBAIC0wLDAgKzEsNzEyIEBACitDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMQorCisxLiBEZWZpbml0aW9ucy4KKworICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgY3JlYXRlcyBvcgorICAgIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgorCisgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbAorICAgIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZQorICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCisKKyAgICAxLjMuICJDb3ZlcmVkIFNvZnR3YXJlIiBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikKKyAgICBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzIGNvbnRhaW5pbmcgT3JpZ2luYWwKKyAgICBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZworICAgIHBvcnRpb25zIHRoZXJlb2YuCisKKyAgICAxLjQuICJFeGVjdXRhYmxlIiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuCisgICAgU291cmNlIENvZGUuCisKKyAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QgbWFrZXMKKyAgICBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICAgMS42LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIG9yCisgICAgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICAxLjcuICJMaWNlbnNlIiBtZWFucyB0aGlzIGRvY3VtZW50LgorCisgICAgMS44LiAiTGljZW5zYWJsZSIgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0gZXh0ZW50CisgICAgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3Igc3Vic2VxdWVudGx5CisgICAgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgorCisgICAgMS45LiAiTW9kaWZpY2F0aW9ucyIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgYW55IG9mCisgICAgdGhlIGZvbGxvd2luZzoKKworICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yCisgICAgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvcgorICAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbnM7CisKKyAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgb3IKKyAgICBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yCisKKyAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAgICB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgMS4xMC4gIk9yaWdpbmFsIFNvZnR3YXJlIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZgorICAgIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyCisgICAgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cworICAgIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCisKKyAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZQorICAgIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAgICBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KKworICAgIDEuMTMuICJZb3UiIChvciAiWW91ciIpIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZworICAgIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yCisgICAgbGVnYWwgZW50aXRpZXMsICJZb3UiIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQKKyAgICBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzCisgICAgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UKKyAgICB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlCisgICAgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisyLiBMaWNlbnNlIEdyYW50cy4KKworICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgorCisgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0bworICAgIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkKKyAgICBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6CisKKyAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKQorICAgIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksCisgICAgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zCisgICAgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLCBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlcgorICAgIFdvcms7IGFuZAorCisgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YKKyAgICBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIKKyAgICBmb3Igc2FsZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMKKyAgICB0aGVyZW9mKS4KKworICAgIChjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9ucyAyLjEoYSkgYW5kIChiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZQorICAgIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbAorICAgIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOgorICAgICgxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IKKyAgICBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLAorICAgIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yCisgICAgZGV2aWNlcy4KKworICAgIDIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCisKKyAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvCisgICAgdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCisgICAgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6CisKKyAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKQorICAgIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwKKyAgICBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvcgorICAgIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIKKyAgICBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAorCisgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIG9mCisgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbgorICAgIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2gKKyAgICBjb21iaW5hdGlvbiksIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGhhdmUgbWFkZSwgYW5kL29yCisgICAgb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IKKyAgICBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKKyAgICBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoCisgICAgY29tYmluYXRpb24pLgorCisgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24KKyAgICB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlCisgICAgTW9kaWZpY2F0aW9ucyBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KKworICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6CisgICAgKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yCisgICAgVmVyc2lvbjsgKDIpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkIHBhcnR5IG1vZGlmaWNhdGlvbnMKKyAgICBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkKKyAgICB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvcgorICAgIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieQorICAgIENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKKyAgICBDb250cmlidXRvci4KKworMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgorCisgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCisKKyAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbgorICAgIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdAorICAgIFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzCisgICAgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUKKyAgICBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZQorICAgIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlCisgICAgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluCisgICAgU291cmNlIENvZGUgZm9ybSBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKworICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4KKworICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUKKyAgICBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUKKyAgICBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlCisgICAgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuCisKKyAgICBZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zIHRoYXQgaWRlbnRpZmllcworICAgIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyCisgICAgYW55IGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQKKyAgICBTb2Z0d2FyZSwgb3IgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZworICAgIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCisKKyAgICAzLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCisKKyAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZQorICAgIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzCisgICAgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5CisgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLiBIb3dldmVyLCB5b3UKKyAgICBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsCisgICAgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55CisgICAgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkKKyAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kCisgICAgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yCisgICAgc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yCisgICAgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KKworICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCisKKyAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwKKyAgICB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91CisgICAgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlCisgICAgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUKKyAgICByZWNpcGllbnQncyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbgorICAgIHRoaXMgTGljZW5zZS4gSWYgWW91IGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtCisgICAgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55CisgICAgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5CisgICAgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUKKyAgICBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkKKyAgICB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcworICAgIFlvdSBvZmZlci4KKworICAgIDMuNi4gTGFyZ2VyIFdvcmtzLgorCisgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyCisgICAgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyCisgICAgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZQorICAgIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCisKKzQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgorCisgICAgNC4xLiBOZXcgVmVyc2lvbnMuCisKKyAgICBPcmFjbGUgaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKKyAgICB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEKKyAgICBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24gNC4zLCBubyBvbmUKKyAgICBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLgorCisgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgorCisgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkCisgICAgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlcgorICAgIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbAorICAgIERldmVsb3BlciBpbmNsdWRlcyBhIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbQorICAgIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudAorICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kIG1ha2UgdGhlIENvdmVyZWQKKyAgICBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyCisgICAgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heQorICAgIGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZQorICAgIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZQorICAgIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgorCisgICAgNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KKworICAgIFdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGxpY2Vuc2UKKyAgICBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YKKyAgICB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSkgcmVuYW1lIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8KKyAgICB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMKKyAgICBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZQorICAgIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4KKworNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KKworICAgIENPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsCisgICAgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRgorICAgIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4KKyAgICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECisgICAgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZCisgICAgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FCisgICAgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTCisgICAgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PCisgICAgVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTCisgICAgRElTQ0xBSU1FUi4KKworNi4gVEVSTUlOQVRJT04uCisKKyAgICA2LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZQorICAgIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUKKyAgICBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zCisgICAgd2hpY2gsIGJ5IHRoZWlyIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YKKyAgICB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KKworICAgIDYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXJhdG9yeQorICAgIGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYSBDb250cmlidXRvciAodGhlCisgICAgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcworICAgIHJlZmVycmVkIHRvIGFzICJQYXJ0aWNpcGFudCIpIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlCisgICAgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3IKKyAgICBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZSBJbml0aWFsIERldmVsb3BlcikKKyAgICBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cworICAgIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwKKyAgICBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KSBhbmQgYWxsCisgICAgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZSBzaGFsbCwgdXBvbgorICAgIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kCisgICAgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYKKyAgICB3aXRoaW4gc3VjaCA2MCBkYXkgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvcgorICAgIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KKworICAgIDYuMy4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gYWdhaW5zdCBQYXJ0aWNpcGFudAorICAgIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzCisgICAgYW55IHBhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzIGJ5IGxpY2Vuc2Ugb3IKKyAgICBzZXR0bGVtZW50KSBwcmlvciB0byB0aGUgaW5pdGlhdGlvbiBvZiBwYXRlbnQgaW5mcmluZ2VtZW50IGxpdGlnYXRpb24sCisgICAgdGhlbiB0aGUgcmVhc29uYWJsZSB2YWx1ZSBvZiB0aGUgbGljZW5zZXMgZ3JhbnRlZCBieSBzdWNoIFBhcnRpY2lwYW50CisgICAgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiBzaGFsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlCisgICAgYW1vdW50IG9yIHZhbHVlIG9mIGFueSBwYXltZW50IG9yIGxpY2Vuc2UuCisKKyAgICA2LjQuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yIGFib3ZlLCBhbGwKKyAgICBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueQorICAgIGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQKKyAgICB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgorCis3LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KKworICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCisgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTAorICAgIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRAorICAgIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWQorICAgIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAgICBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GCisgICAgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMCisgICAgT1RIRVIgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgorICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRgorICAgIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkKKyAgICBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXCisgICAgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OCisgICAgT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04KKyAgICBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KKworOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KKworICAgIFRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluCisgICAgNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mICJjb21tZXJjaWFsIGNvbXB1dGVyCisgICAgc29mdHdhcmUiIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4gpyAyNTIuMjI3LTcwMTQoYSkoMSkpCisgICAgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24iIGFzIHN1Y2ggdGVybXMgYXJlIHVzZWQKKyAgICBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kCisgICAgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50CisgICAgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aAorICAgIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQKKyAgICBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQKKyAgICBhZGRyZXNzZXMgR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIgc29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLgorCis5LiBNSVNDRUxMQU5FT1VTLgorCisgICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QgbWF0dGVyCisgICAgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsCisgICAgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0CisgICAgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZQorICAgIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwKKyAgICBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMKKyAgICBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaCBqdXJpc2RpY3Rpb24ncyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4KKyAgICBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUKKyAgICBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlCisgICAgc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZQorICAgIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydAorICAgIGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZgorICAgIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZgorICAgIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQKKyAgICB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbAorICAgIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yCisgICAgY29tcGxpYW5jZSB3aXRoIHRoZSBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kCisgICAgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UKKyAgICB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgorCisxMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KKworICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMKKyAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dAorICAgIG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8gd29yaworICAgIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2gKKyAgICByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yCisgICAgc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuCisKK05PVElDRSBQVVJTVUFOVCBUTyBTRUNUSU9OIDkgT0YgVEhFIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OCitMSUNFTlNFIChDRERMKQorCitUaGUgY29kZSByZWxlYXNlZCB1bmRlciB0aGUgQ0RETCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKK1N0YXRlIG9mIENhbGlmb3JuaWEgKGV4Y2x1ZGluZyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucykuIEFueQorbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uCitvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mIENhbGlmb3JuaWEgYW5kIHRoZQorc3RhdGUgY291cnRzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCB3aXRoIHZlbnVlIGx5aW5nIGluIFNhbnRhIENsYXJhCitDb3VudHksIENhbGlmb3JuaWEuCisKKworCisKK1RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCitDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIDU5IFRlbXBsZSBQbGFjZSwKK1N1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcworbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitQcmVhbWJsZQorCitUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8KK3NoYXJlIGFuZCBjaGFuZ2UgaXQuIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMKK2ludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10bworbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiBUaGlzIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kCit0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0byB1c2luZyBpdC4gKFNvbWUgb3RoZXIgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgWW91IGNhbiBhcHBseSBpdCB0byB5b3VyIHByb2dyYW1zLCB0b28uCisKK1doZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QgcHJpY2UuCitPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZQorZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzCitzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQord2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKK2ZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCitUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZQordG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuIFRoZXNlCityZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCitGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgeW91IGhhdmUuCitZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuCitBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKK1dlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCitBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCitGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgorV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlIHByb2dyYW0gd2lsbAoraW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0KK3Byb3ByaWV0YXJ5LiBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdAorYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKK1RFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCiswLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zIGEKK25vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlcgordGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gVGhlICJQcm9ncmFtIiwgYmVsb3csIHJlZmVycwordG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIgbWVhbnMKK2VpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6IHRoYXQgaXMKK3RvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LCBlaXRoZXIKK3ZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuCisoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybQorIm1vZGlmaWNhdGlvbiIuKSBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gVGhlIGFjdCBvZiBydW5uaW5nCit0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbSBpcworY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbQorKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuIFdoZXRoZXIgdGhhdAoraXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZQorY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseQorYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZQorYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvCit0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55IG90aGVyCityZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mCitpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK3N1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEgYWJvdmUsIHByb3ZpZGVkCit0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZworICAgIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluIHdob2xlCisgICAgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55IHBhcnQgdGhlcmVvZiwKKyAgICB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5IHdoZW4KKyAgICBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZSB1c2UgaW4KKyAgICB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4gYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbgorICAgIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yCisgICAgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5CisgICAgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyCisgICAgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzCisgICAgaW50ZXJhY3RpdmUgYnV0IGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLCBhbmQKK2NhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkIG9uCit0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlIGVudGlyZQord2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZiBhCitzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlCitzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKzMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LCB1bmRlcgorU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZQorICAgIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIKKyAgICBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8KKyAgICBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YgcGh5c2ljYWxseQorICAgIHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlCisgICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0bworICAgIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5CisgICAgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbgorICAgIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoCisgICAgU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZSBjb2RlCittZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sCitjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiBIb3dldmVyLCBhcyBhIHNwZWNpYWwKK2V4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzIHRoZQorZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MKK3RvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weQordGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlCitjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QgY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZQorYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKzQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuIEFueSBhdHRlbXB0IG90aGVyd2lzZQordG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMgdm9pZCwgYW5kIHdpbGwKK2F1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gSG93ZXZlciwgcGFydGllcword2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsCitub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbgorZnVsbCBjb21wbGlhbmNlLgorCis1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQgYWxsCitpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcgdGhlCitQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCis2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMKK29uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLiBZb3UgYXJlIG5vdAorcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLgorCis3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gSWYgeW91IGNhbm5vdCBkaXN0cmlidXRlCitzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZAorYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkgbm90CitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQKK25vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFsbCB0aG9zZSB3aG8KK3JlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4gdGhlIG9ubHkgd2F5IHlvdQorY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQKK2J5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gTWFueSBwZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzCitjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHRocm91Z2ggdGhhdAorc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdCBzeXN0ZW07IGl0IGlzIHVwIHRvCit0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZyB0byBkaXN0cmlidXRlCitzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90IGltcG9zZSB0aGF0CitjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0byBiZQorYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKzguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5CithZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZQorY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMKK25vdCB0aHVzIGV4Y2x1ZGVkLiBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlCitsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCis5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbgorbnVtYmVyIG9mIHRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKzEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZQorYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZQorc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZQordHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZQorc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCitOTyBXQVJSQU5UWQorCisxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSCitFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRQorRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEgKK1lPVS4gU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwKK05FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUgorREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNCisoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRAorSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRgorVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IKK09USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKK0hvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCitJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZQordGVybXMuCisKK1RvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiBJdCBpcyBzYWZlc3QgdG8KK2F0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkgY29udmV5Cit0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIE9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLgorICAgIENvcHlyaWdodCAoQykgPHllYXI+IDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorICAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IgR25vbW92aXNpb24KKyAgICBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuIFRoaXMgaXMKKyAgICBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdCB1bmRlciBjZXJ0YWluCisgICAgY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlCithcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gT2YgY291cnNlLCB0aGUgY29tbWFuZHMKK3lvdSB1c2UgbWF5IGJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkKK2NvdWxkIGV2ZW4gYmUgbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICAgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICAgIHNpZ25hdHVyZSBvZiBUeSBDb29uLCAxIEFwcmlsIDE5ODkKKyAgICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCitpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQorbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucword2l0aCB0aGUgbGlicmFyeS4gSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgorCisjCisKKyJDTEFTU1BBVEgiIEVYQ0VQVElPTiBUTyBUSEUgR1BMIFZFUlNJT04gMgorCitDZXJ0YWluIHNvdXJjZSBmaWxlcyBkaXN0cmlidXRlZCBieSBPcmFjbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBWZXJzaW9uIDIsIGJ1dCBvbmx5IHdoZXJlCitPcmFjbGUgaGFzIGV4cHJlc3NseSBpbmNsdWRlZCBpbiB0aGUgcGFydGljdWxhciBzb3VyY2UgZmlsZSdzIGhlYWRlciB0aGUKK3dvcmRzICJPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZQorIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgTGljZW5zZSBmaWxlIHRoYXQKK2FjY29tcGFuaWVkIHRoaXMgY29kZS4iCisKK0xpbmtpbmcgdGhpcyBsaWJyYXJ5IHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzCittYWtpbmcgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gVGh1cywgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIGNvdmVyIHRoZSB3aG9sZQorY29tYmluYXRpb24uCisKK0FzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIGxpYnJhcnkgZ2l2ZSB5b3UKK3Blcm1pc3Npb24gdG8gbGluayB0aGlzIGxpYnJhcnkgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzIHRvIHByb2R1Y2UgYW4KK2V4ZWN1dGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlc2UgaW5kZXBlbmRlbnQKK21vZHVsZXMsIGFuZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcworb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50Cittb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4gQW4KK2luZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uCit0aGlzIGxpYnJhcnkuIElmIHlvdSBtb2RpZnkgdGhpcyBsaWJyYXJ5LCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbgordG8geW91ciB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLiBJZgoreW91IGRvIG5vdCB3aXNoIHRvIGRvIHNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91cgordmVyc2lvbi4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL1R1dG9yaWFsLmphdmEgYi90dXRvcmlhbC9UdXRvcmlhbC5qYXZhCmluZGV4IDYyNWQzODcuLjAyNWE0ZDUgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL1R1dG9yaWFsLmphdmEKKysrIGIvdHV0b3JpYWwvVHV0b3JpYWwuamF2YQpAQCAtMTYsOCArMTYsOSBAQAogCiBwYWNrYWdlIHR1dG9yaWFsOwogCitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlZm9yZUV4cGVyaW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyazsKIGltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuUGFyYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyazsKIAogLyoqCiAgKiBDYWxpcGVyIHR1dG9yaWFsLiBUbyBydW4gdGhlIGV4YW1wbGUgYmVuY2htYXJrcyBpbiB0aGlzIGZpbGU6CkBAIC0zMSw3ICszMiw3IEBACiAgICAqCiAgICAqIE5vdGljZToKICAgICoKLSAgICogIC0gV2Ugd3JpdGUgYSBjbGFzcyB0aGF0IGV4dGVuZHMgY29tLmdvb2dsZS5jYWxpcGVyLlNpbXBsZUJlbmNobWFyay4KKyAgICogIC0gV2Ugd3JpdGUgYSBjbGFzcyB0aGF0IGV4dGVuZHMgY29tLmdvb2dsZS5jYWxpcGVyLkJlbmNobWFyay4KICAgICogIC0gSXQgY29udGFpbnMgYSBwdWJsaWMgaW5zdGFuY2UgbWV0aG9kIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggJ3RpbWUnIGFuZAogICAgKiAgICB3aGljaCBhY2NlcHRzIGEgc2luZ2xlICdpbnQgcmVwcycgcGFyYW1ldGVyLgogICAgKiAgLSBUaGUgYm9keSBvZiB0aGUgbWV0aG9kIHNpbXBseSBleGVjdXRlcyB0aGUgY29kZSB3ZSB3aXNoIHRvIG1lYXN1cmUsCkBAIC00OCw4ICs0OSw4IEBACiAgICAqICAgIC0tLS0tLS0tLSAgLS0tCiAgICAqICAgIE5hbm9UaW1lICAgMjMzCiAgICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlbmNobWFyazEgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgewotICAgIHB1YmxpYyB2b2lkIHRpbWVOYW5vVGltZShpbnQgcmVwcykgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlbmNobWFyazEgeworICAgIEBCZW5jaG1hcmsgdm9pZCB0aW1lTmFub1RpbWUoaW50IHJlcHMpIHsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICAgIFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgfQpAQCAtNjksMTMgKzcwLDEzIEBACiAgICAqICAgTmFub1RpbWUgICAgICAgICAgIDI0OAogICAgKiAgIEN1cnJlbnRUaW1lTWlsbGlzICAxMTgKICAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVuY2htYXJrMiBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7Ci0gICAgcHVibGljIHZvaWQgdGltZU5hbm9UaW1lKGludCByZXBzKSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVuY2htYXJrMiB7CisgICAgQEJlbmNobWFyayB2b2lkIHRpbWVOYW5vVGltZShpbnQgcmVwcykgewogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgICAgU3lzdGVtLm5hbm9UaW1lKCk7CiAgICAgICB9CiAgICAgfQotICAgIHB1YmxpYyB2b2lkIHRpbWVDdXJyZW50VGltZU1pbGxpcyhpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgdm9pZCB0aW1lQ3VycmVudFRpbWVNaWxsaXMoaW50IHJlcHMpIHsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgfQpAQCAtODYsMTEgKzg3LDExIEBACiAgICAqIExldCdzIHRyeSBpdGVyYXRpbmcgb3ZlciBhIGxhcmdlIGFycmF5LiBUaGlzIHNlZW1zIHNpbXBsZSBlbm91Z2gsIGJ1dAogICAgKiB0aGVyZSBpcyBhIHByb2JsZW0hCiAgICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlbmNobWFyazMgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlbmNobWFyazMgewogICAgIHByaXZhdGUgZmluYWwgaW50W10gYXJyYXkgPSBuZXcgaW50WzEwMDAwMDBdOwogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikgLy8gSURFQSB0cmllcyB0byB3YXJuIHVzIQotICAgIHB1YmxpYyB2b2lkIHRpbWVBcnJheUl0ZXJhdGlvbl9CQUQoaW50IHJlcHMpIHsKKyAgICBAQmVuY2htYXJrIHZvaWQgdGltZUFycmF5SXRlcmF0aW9uX0JBRChpbnQgcmVwcykgewogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgICAgZm9yIChpbnQgaWdub3JlTWUgOiBhcnJheSkge30KICAgICAgIH0KQEAgLTEyMywxMCArMTI0LDEwIEBACiAgICAqIFdpdGggdGhpcyBjaGFuZ2UsIENhbGlwZXIgc2hvdWxkIHJlcG9ydCBhIG11Y2ggbW9yZSByZWFsaXN0aWMgdmFsdWUsIG1vcmUKICAgICogb24gdGhlIG9yZGVyIG9mIGFuIGVudGlyZSBtaWxsaXNlY29uZC4KICAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVuY2htYXJrNCBleHRlbmRzIFNpbXBsZUJlbmNobWFyayB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVuY2htYXJrNCB7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBhcnJheSA9IG5ldyBpbnRbMTAwMDAwMF07CiAKLSAgICBwdWJsaWMgaW50IHRpbWVBcnJheUl0ZXJhdGlvbl9maXhlZChpbnQgcmVwcykgeworICAgIEBCZW5jaG1hcmsgaW50IHRpbWVBcnJheUl0ZXJhdGlvbl9maXhlZChpbnQgcmVwcykgewogICAgICAgaW50IGR1bW15ID0gMDsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CiAgICAgICAgIGZvciAoaW50IGRvTm90SWdub3JlTWUgOiBhcnJheSkgewpAQCAtMTY0LDE3ICsxNjUsMTcgQEAKICAgICogICBBcnJheUl0ZXJhdGlvbiAgMTAwMCAgNDc3IHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fAogICAgKgogICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBCZW5jaG1hcms1IGV4dGVuZHMgU2ltcGxlQmVuY2htYXJrIHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBCZW5jaG1hcms1IHsKICAgICBAUGFyYW0gaW50IHNpemU7IC8vIHNldCBhdXRvbWF0aWNhbGx5IGJ5IGZyYW1ld29yawogCiAgICAgcHJpdmF0ZSBpbnRbXSBhcnJheTsgLy8gc2V0IGJ5IHVzLCBpbiBzZXRVcCgpCiAKLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgQEJlZm9yZUV4cGVyaW1lbnQgdm9pZCBzZXRVcCgpIHsKICAgICAgIC8vIEBQYXJhbSB2YWx1ZXMgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuIGluamVjdGVkIGJ5IG5vdwogICAgICAgYXJyYXkgPSBuZXcgaW50W3NpemVdOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgdGltZUFycmF5SXRlcmF0aW9uKGludCByZXBzKSB7CisgICAgQEJlbmNobWFyayBpbnQgdGltZUFycmF5SXRlcmF0aW9uKGludCByZXBzKSB7CiAgICAgICBpbnQgZHVtbXkgPSAwOwogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKICAgICAgICAgZm9yIChpbnQgZG9Ob3RJZ25vcmVNZSA6IGFycmF5KSB7Cg==