ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKClZlcnNpb24gNy4xMy4xICg0IE1hcmNoIDIwMDUpCgpEYW5pZWwgKDQgTWFyY2ggMjAwNSkKLSBEYXZlIERyaWJpbiBtYWRlIGl0IHBvc3NpYmxlIHRvIHNldCBDVVJMT1BUX0NPT0tJRUZJTEUgdG8gIiIgdG8gYWN0aXZhdGUKICB0aGUgY29va2llICJlbmdpbmUiIHdpdGhvdXQgaGF2aW5nIHRvIHByb3ZpZGUgYW4gZW1wdHkgb3Igbm9uLWV4aXN0aW5nIGZpbGUuCgotIFJlbmUgUmViZSBmaXhlZCBhIC0jIGNyYXNoIHdoZW4gbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQgd2FzIHJldHJpZXZlZC4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNSkKLSBOVExNIGFuZCBmdHAta3JiNCBidWZmZXIgb3ZlcmZsb3cgZml4ZWQsIGFzIHJlcG9ydGVkIGhlcmU6CiAgaHR0cDovL3d3dy5zZWN1cml0eWZvY3VzLmNvbS9hcmNoaXZlLzEvMzkxMDQyIGFuZCB0aGUgQ0FOIHJlcG9ydCBoZXJlOgogIGh0dHA6Ly9jdmUubWl0cmUub3JnL2NnaS1iaW4vY3ZlbmFtZS5jZ2k/bmFtZT1DQU4tMjAwNS0wNDkwCgogIElmIHRoZXNlIHNlY3VyaXR5IGd1eXMgd2VyZSBzZXJpb3VzLCB3ZSdkIGJlZW4gbm90aWZpZWQgaW4gYWR2YW5jZSBhbmQgd2UKICBjb3VsZCd2ZSBzYXZlZCBhIGZldyBvZiB5b3UgYSBsaXR0bGUgc3VycHJpc2UsIGJ1dCBub3cgd2Ugd2VyZW4ndC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNSkKLSBSYWxwaCBNaXRjaGVsbCByZXBvcnRlZCBhIGZsYXcgd2hlbiB5b3UgdXNlZCBhIHByb3h5IHdpdGggYXV0aCwgYW5kIHlvdQogIHJlcXVlc3RlZCBkYXRhIGZyb20gYSBob3N0IGFuZCB0aGVuIGZvbGxvd2VkIGEgcmVkaXJlY3QgdG8gYW5vdGhlcgogIGhvc3QuIGxpYmN1cmwgdGhlbiBkaWRuJ3QgdXNlIHRoZSBwcm94eS1hdXRoIHByb3Blcmx5IGluIHRoZSBzZWNvbmQgcmVxdWVzdCwKICBkdWUgdG8gdGhlIGhvc3Qtb25seSBjaGVjayBmb3Igb3JpZ2luYWwgaG9zdCBuYW1lIHdyb25nbHkgYmVpbmcgZXh0ZW5kZWQgdG8KICB0aGUgcHJveHkgYXV0aCBhcyB3ZWxsLiBBZGRlZCB0ZXN0IGNhc2UgMjMzIHRvIHZlcmlmeSB0aGUgZmxhdyBhbmQgdGhhdCB0aGUKICBmaXggcmVtb3ZlZCB0aGUgcHJvYmxlbS4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNSkKLSBNaWtlIERvYmJzIHJlcG9ydGVkIGEgbWluZ3cgYnVpbGQgZmFpbHVyZSBkdWUgdG8gdGhlIGxhY2sgb2YKICBCVUlMRElOR19MSUJDVVJMIGJlaW5nIGRlZmluZWQgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0LiBOb3cgdGhpcyBpcyBkZWZpbmVkIGJ5CiAgY29uZmlndXJlIHdoZW4gbWluZ3cgaXMgdXNlZC4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNSkKLSBEYXZpZCBpbiBidWcgcmVwb3J0ICMxMTI0NTg4IGZvdW5kIGFuZCBmaXhlZCBhIHNvY2tldCBsZWFrIHdoZW4gbGliY3VybAogIGRpZG4ndCBjbG9zZSB0aGUgc29ja2V0IHByb3Blcmx5IHdoZW4gcmV0dXJuaW5nIGVycm9yIGR1ZSB0byBmYWlsaW5nCiAgbG9jYWxiaW5kCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDUpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAtUE9TVGluZyB1c2luZyAiYW55YXV0aCIKICB0aGF0IHBpY2tzIE5UTE0uIFRoYW5rcyB0byBEYXZpZCBCeXJvbiBsZXR0aW5nIG1lIHRlc3QgTlRMTSBhZ2FpbnN0IGhpcwogIHNlcnZlcnMsIEkgY291bGQgcXVpY2tseSByZXBlYXQgYW5kIGZpeCB0aGUgcHJvYmxlbS4gSXQgdHVybmVkIG91dCB0byBiZToKCiAgV2hlbiBsaWJjdXJsIFBPU1RzIHdpdGhvdXQga25vd2luZy91c2luZyBhbiBhdXRoZW50aWNhdGlvbiBhbmQgaXQgZ2V0cyBiYWNrCiAgYSBsaXN0IG9mIHR5cGVzIGZyb20gd2hpY2ggaXQgcGlja3MgTlRMTSwgaXQgbmVlZHMgdG8gZWl0aGVyIGNvbnRpbnVlCiAgc2VuZGluZyBpdHMgZGF0YSBpZiBpdCBrZWVwcyB0aGUgY29ubmVjdGlvbiBhbGl2ZSwgb3Igbm90IHNlbmQgdGhlIGRhdGEgYnV0CiAgY2xvc2UgdGhlIGNvbm5lY3Rpb24uIFRoZW4gZG8gdGhlIGZpcnN0IHN0ZXAgaW4gdGhlIE5UTE0gYXV0aC4gbGliY3VybAogIGRpZG4ndCBzZW5kIHRoZSBkYXRhIG5vciBjbG9zZSB0aGUgY29ubmVjdGlvbiBidXQgc2ltcGx5IHJlYWQgdGhlCiAgcmVzcG9uc2UtYm9keSBhbmQgdGhlbiBzZW50IHRoZSBmaXJzdCBuZWdvdGlhdGlvbiBzdGVwLiBXaGljaCB0aGVuIGZhaWxlZAogIG1pc2VyYWJseSBvZiBjb3Vyc2UuIFRoZSBmaXhlZCB2ZXJzaW9uIGZvcmNlcyBhIGNvbm5lY3Rpb24gaWYgdGhlcmUgaXMgbW9yZQogIHRoYW4gMjAwMCBieXRlcyBsZWZ0IHRvIHNlbmQuCgpEYW5pZWwgKDE0IEZlYnJ1YXJ5IDIwMDUpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKSBzbyBpdAogIHdhcyBuZXZlciB1c2VkLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA1KQotIFJlbW92ZWQgYWxsIHVzZXMgb2Ygc3RyZnRpbWUoKSBzaW5jZSBpdCB1c2VzIHRoZSBsb2NhbGlzZWQgdmVyc2lvbiBvZiB0aGUKICB3ZWVrIGRheSBuYW1lcyBhbmQgbW9udGggbmFtZXMgYW5kIHNlcnZlcnMgZG9uJ3QgbGlrZSB0aGF0LgoKRGFuaWVsICgxMCBGZWJydWFyeSAyMDA1KQotIE5vdyB0aGUgdGVzdCBzY3JpcHQgZGlzYWJsZXMgdmFsZ3JpbmQtdGVzdGluZyB3aGVuIHRoZSB0ZXN0IHN1aXRlIHJ1bnMgaWYKICBsaWJjdXJsIGlzIGJ1aWx0IHNoYXJlZC4gT3RoZXJ3aXNlIHZhbGdyaW5kIG9ubHkgdGVzdHMgdGhlIHNoZWxsIHRoYXQgcnVucwogIHRoZSB3cmFwcGVyLXNjcmlwdCBuYW1lZCAnY3VybCcgdGhhdCBpcyBhIGZyb250LWVuZCB0byBjdXJsIGluIHRoaXMgY2FzZS4KICBUaGlzIHNob3VsZCBhbHNvIGZpeCB0aGUgaHVnZSBhbW91bnQgb2YgcmVwb3J0cyBvZiBmYWxzZSBwb3NpdGl2ZXMgd2hlbgogIHZhbGdyaW5kIGhhcyBpZGVudGlmaWVkIGxlYWtzIGluIChiYSlzaCBhbmQgbm90IGluIGN1cmwgYW5kIHBlb3BsZSByZXBvcnQKICB0aGF0IGFzIGN1cmwgYnVncy4gQnVnIHJlcG9ydCAjMTExNjY3MiBpcyBvbmUgZXhhbXBsZS4KCiAgQWxzbywgdGhlIHZhbGdyaW5kIHJlcG9ydCBwYXJzZXIgaGFzIGJlZW4gYWRhcHRlZCB0byBjaGVjayB0aGF0IGF0IGxlYXN0IG9uZQogIG9mIHRoZSBzb3VyY2VzIGluIGEgc3RhY2sgc3RyYWNlIGlzIG9uZSBvZiAobGliKWN1cmwncyBzb3VyY2UgZmlsZXMgb3IKICBvdGhlcndpc2UgaXQgd2lsbCBub3QgY29uc2lkZXIgdGhlIHByb2JsZW0gdG8gY29uY2VybiAobGliKWN1cmwuCgotIE1hcnR5IEt1aHJ0IHN0cmVhbWxpbmVkIHRoZSBWTVMgYnVpbGQuCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwNSkKLSBEYXZpZCBCeXJvbiBmaXhlZCBoaXMgU1NMIHByb2JsZW1zLCBpbml0aWFsbHkgbWVudGlvbmVkIGhlcmU6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTAxLzAyNDAuaHRtbC4gSXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgdXNlCiAgU1NMX3BlbmRpbmcoKSBhcyB3ZSBzaG91bGQuCgotIENvbnZlcnRlZCBsb3RzIG9mIEZUUCBjb2RlIHRvIGEgc3RhdGVtYWNoaW5lLCBzbyB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UKICBkb2Vzbid0IGJsb2NrIHdoaWxlIGNvbW11bmljYXRpbmcgY29tbWFuZHMtcmVzcG9uc2VzIHdpdGggYW4gRlRQIHNlcnZlci4KCiAgSSd2ZSBhZGRlZCBhIGNvbW1lbnQgbGlrZSBCTE9DS0lORyBpbiB0aGUgY29kZSBvbiBhbGwgc3BvdHMgSSBjb3VsZCBmaW5kCiAgd2hlcmUgd2Ugc3RpbGwgaGF2ZSBibG9ja2luZyBvcGVyYXRpb25zLiBXaGVuIHdlIGNoYW5nZSBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgdG8gdXNlIHRoZSBtdWx0aSBpbnRlcmZhY2UsIHdlJ2xsIGFsc28gYmUgYWJsZSB0byBzaW1wbGlmeSB0aGUgY29kZSBzaW5jZQogIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgImludGVybmFsIGludGVyZmFjZSIuCgogIFdoaWxlIGRvaW5nIHRoaXMsIEkndmUgbm93IG1hZGUgQ1VSTEVfRlRQX0FDQ0VTU19ERU5JRUQgc2VwYXJhdGUgZnJvbSB0aGUKICBuZXcgQ1VSTEVfTE9HSU5fREVOSUVELiBUaGUgZmlyc3Qgb25lIGlzIG5vdyBhY2Nlc3MgZGVuaWVkIHRvIGEgZnVuY3Rpb24sCiAgbGlrZSBjaGFuZ2luZyBkaXJlY3Rvcnkgb3IgcmV0cmlldmluZyBhIGZpbGUsIHdoaWxlIHRoZSBzZWNvbmQgbWVhbnMgdGhhdCB3ZQogIHdlcmUgZGVuaWVkIGxvZ2luLgoKICBUaGUgQ1ZTIHRhZyAnYmVmb3JlX2Z0cF9zdGF0ZW1hY2hpbmUnIHdhcyBzZXQganVzdCBiZWZvcmUgdGhpcyB3ZW50IGluLCBpbgogIGNhc2Ugb2YgZnV0dXJlIG5lZWQuCgotIEdpc2xlIG1hZGUgdGhlIERJQ1QgY29kZSBzZW5kIENSTEYgYW5kIG5vdCBqdXN0IExGIGFzIHRoZSBzcGVjIHNheXMgc28uCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwNSkKLSBHaXNsZSBmaXhlZCBwcm9ibGVtcyB3aGVuIGxpYmN1cmwgcnVucyBvdXQgb2YgbWVtb3J5LCBhbmQgd29ya2VkIG9uIG1ha2luZwogIHN1cmUgdGhlIHByb3BlciBlcnJvciBjb2RlIGlzIHJldHVybmVkIGZvciB0aG9zZSBvY2NhdGlvbnMuCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwNSkKLSBNYXJ1a28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggaW5mbGF0ZSBkZWNvbXByZXNzaW5nIGV4YWN0bHkgNjRLCiAgY29udGVudHMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNSkKLSBFcmljIFZlcmduYXVkIGZvdW5kIGEgdXNlIG9mIGFuIHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgaW4gdGhlIGZ0cCB3aGVuIGRvaW5nCiAgUE9SVCBvbiBpcHY2LWVuYWJsZWQgaG9zdHMuCgotIERhdmlkIEJ5cm9uIHBvaW50ZWQgb3V0IHdlIGNvdWxkIHVzZSBCVUZTSVpFIHRvIHJlYWQgZGF0YSAoaW4KICBsaWIvdHJhbnNmZXIuYykgaW5zdGVhZCBvZiB1c2luZyBCVUZTSVpFIC0xLgoKVmVyc2lvbiA3LjEzLjAgKDEgRmVicnVhcnkgMjAwNSkKCkRhbmllbCAoMzEgSmFudWFyeSAyMDA1KQotIEFkZGVkIExhcnMgTmlsc3NvbidzIGh0bWx0aXRsZS5jYyBleGFtcGxlCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNSkKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgdGhlIERPIG9wZXJhdGlvbgogIGZhaWxlZCAoYXMgaW4gdGVzdCBjYXNlIDIwNSkuCgotIEZpeGVkIGEgdmFsZ3JpbmQgd2FybmluZyBmb3IgZmlsZTovLyBvcGVyYXRpb25zLgoKLSBGaXhlZCBhIHZhbGdyaW5kIHJlcG9ydCBpbiB0aGUgdXJsIGdsb2JiaW5nIGNvZGUgZm9yIHRoZSBjdXJsIGNvbW1hbmQgbGluZQogIHRvb2wuCgotIEJ1Z2ZpeGVkIHRoZSBwYXJzZXIgdGhhdCBzY2FucyB0aGUgdmFsZ3JpbmQgcmVwb3J0IG91dHB1dHMgKGluIHJ1bnRlc3RzLnBsKS4KICBJIG5vdGljZWQgdGhhdCBpdCBwcmV2aW91c2x5IGRpZG4ndCBkZXRlY3QgYW5kIHJlcG9ydCB0aGUgIkNvbmRpdGlvbmFsIGp1bXAKICBvciBtb3ZlIGRlcGVuZHMgb24gdW5pbml0aWFsaXNlZCB2YWx1ZShzKSIgZXJyb3IuIFdoZW4gSSBmaXhlZCB0aGlzLCBJCiAgY2F1Z2h0IGEgZmV3IGN1cmwgYnVncyB3aXRoIGl0LiBBbmQgdGhlbiBJIGhhZCB0byBzcGVuZCB0aW1lIHRvIG1ha2UgdGhlCiAgdGVzdCBzdWl0ZSBJR05PUkUgdGhlc2UgZXJyb3JzIHdoZW4gT3BlblNTTCBpcyB1c2VkIHNpbmNlIGl0IHByb2R1Y2UgbWFzc2l2ZQogIGFtb3VudHMgb2YgdmFsZ3JpbmQgd2FybmluZ3MgKGJ1dCBvbmx5IG9mIHRoZSAiQ29uZGl0aW9uYWwuLi4iIGtpbmQgaXQKICBzZWVtcykuIFNvLCBpZiBhIHRlc3QgdGhhdCByZXF1aXJlcyBTU0wgaXMgcnVuLCBpdCBpZ25vcmVzIHRoZQogICJDb25kaXRpb25hbC4uLiIgZXJyb3JzLCBhbmQgeW91J2xsIGdldCBhICJ2YWxncmluZCBQQVJUSUFMIiBvdXRwdXQgaW5zdGVhZAogIG9mICJ2YWxncmluZCBPSyIuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNSkKLSBVc2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLCBhbmQgZG9pbmcgYSByZXF1c3RlZCBhIHJlLXVzZWQgY29ubmVjdGlvbiB0aGF0CiAgZ2V0cyBjbG9zZWQganVzdCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50IGZhaWxlZCBhbmQgZGlkIG5vdCByZS1pc3N1ZQogIGEgcmVxdWVzdCBvbiBhIGZyZXNoIHJlY29ubmVjdCBsaWtlIHRoZSBlYXN5IGludGVyZmFjZSBkaWQuIE5vdyBpdCBkb2VzIQoKLSBEZWZpbmUgQ1VSTF9NVUxUSUVBU1kgd2hlbiBidWlsZGluZyBsaWJjdXJsIChsaWIvZWFzeS5jIHRvIGJlIGV4YWN0KSwgdG8gdXNlCiAgbXkgbmV3IGN1cmxfZWFzeV9wZXJmb3JtKCkgdGhhdCB1c2VzIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gcnVuIHRoZQogIHJlcXVlc3QuIEl0IGlzIGEgZ3JlYXQgdGVzdGJlZCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgSSBiZWxpZXZlIHdlCiAgc2hhbGwgZG8gaXQgdGhpcyB3YXkgZm9yIHJlYWwgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIGhhdmUgYSBzdWNjZXNzb3IgdG8KICBjdXJsX211bHRpX2Zkc2V0KCkuIEkndmUgdXNlZCB0aGlzIGFwcHJvYWNoIHRvIGRldGVjdCBhbmQgZml4IHNldmVyYWwgb2YgdGhlCiAgcmVjZW50IG11bHRpLWludGVyZmFjZXMgaXNzdWVzLgoKLSBBZGp1c3RlZCB0aGUgS05PV05fQlVHUyAjMTcgZml4IGEgYml0IG1vcmUgc2luY2UgdGhlIEZUUCBjb2RlIGFsc28gZGlkIHNvbWUKICBiYWQgYXNzdW1wdGlvbnMuCgotIG11bHRpIGludGVyZmFjZTogd2hlbiBhIHJlcXVlc3QgaXMgZGVuaWVkIGR1ZSB0byAiTWF4aW11bSByZWRpcmVjdHMKICBmb2xsb3dlZCIgbGliY3VybCBsZWFrZWQgdGhlIGxhc3QgTG9jYXRpb246IFVSTC4KCi0gQ29ubmVjdCBmYWlsdXJlcyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIG9mdGVuIHJldHVybmVkIGFzICJjb25uZWN0KCkKICB0aW1lZCBvdXQiIGV2ZW4gdGhvdWdoIHRoZSByZWFzb24gd2FzIGRpZmZlcmVudC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA1KQotIEtOT1dOX0JVR1MgIzE3IGZpeGVkLiBBIEROUyBjYWNoZSBlbnRyeSBtYXkgbm90IHJlbWFpbiBsb2NrZWQgYmV0d2VlbiB0d28KICBjdXJsX2Vhc3lfcGVyZm9ybSgpIGludm9rZXMuIEl0IHdhcyBwcmV2aW91c2x5IHVubG9ja2VkIGF0IGRpc2Nvbm5lY3QsIHdoaWNoCiAgY291bGQgbWVhbiB0aGF0IGl0IHJlbWFpbmVkIGxvY2tlZCBiZXR3ZWVuIG11bHRpcGxlIHRyYW5zZmVycy4gVGhlIEROUyBjYWNoZQogIG1heSBub3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGNhY2hlIGRvZXMsIGFzIHRoZXkgYXJlIHNlcGFyYXRlLgoKICBUbyBkZWFsIHdpdGggdGhlIGxhY2sgb2YgRE5TIChob3N0IGFkZHJlc3MpIGRhdGEgYXZhaWxhYmlsaXR5IGluIHJlLXVzZWQKICBjb25uZWN0aW9ucywgbGliY3VybCBub3cga2VlcHMgYSBjb3B5IG9mIHRoZSBJUCBhZHJlc3MgYXMgYSBzdHJpbmcsIHRvIGJlCiAgYWJsZSB0byBzaG93IGl0IGV2ZW4gb24gc3Vic2VxdWVudCByZXF1ZXN0cyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uLgoKICBUaGUgcHJvYmxlbSBjb3VsZCBiZSBtYWRlIHRvIGFwcGVhciB3aXRoIHRoaXMgc3R1bnQ6CgogIDEuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDIuIGFkZCBhbiBlYXN5IGhhbmRsZQogIDMuIGZldGNoIGEgVVJMIHRoYXQgaXMgcGVyc2lzdGVudCAobGVhdmVzIHRoZSBjb25uZWN0aW9uIGFsaXZlKQogIDQuIHJlbW92ZSB0aGUgZWFzeSBoYW5kbGUgZnJvbSB0aGUgbXVsdGkKICA1LiBraWxsIHRoZSBtdWx0aSBoYW5kbGUKICA2LiBjcmVhdGUgYSBtdWx0aSBoYW5kbGUKICA3LiBhZGQgdGhlIHNhbWUgZWFzeSBoYW5kbGUgdG8gdGhlIG5ldyBtdWx0aSBoYW5kbGUKICA4LiBmZXRjaCBhIFVSTCBmcm9tIHRoZSBzYW1lIHNlcnZlciBhcyBiZWZvcmUgKHJlLXVzaW5nIHRoZSBjb25uZWN0aW9uKQoKLSBTdGVwaGVuIE1vcmUgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX0ZUUFBPUlQgYW5kIHRoZSAtUCBvcHRpb24gZGlkbid0IHdvcmsKICB3aGVuIGJ1aWx0IGlwdjYtZW5hYmxlZC4gSSd2ZSBub3cgbWFkZSBhIGZpeCBmb3IgaXQuIFdyaXRpbmcgdGVzdCBjYXNlcyBmb3IKICBjdXN0b20gcG9ydCBob3N0cyB0dXJuZWQgdG9vIHRyaWNreSBzbyB1bmZvcnR1bmF0ZWx5IHRoZXJlJ3Mgbm9uZS4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDA1KQotIElhbiBGb3JkIGFza2VkIGFib3V0IHN1cHBvcnQgZm9yIHRoZSBGVFAgY29tbWFuZCBBQ0NULCBhbmQgSSBkaXNjb3ZlcmVkIGl0CiAgaXMgcHJlc2VudCBpbiBSRkM5NTkuLi4gc28gbm93IChsaWIpY3VybCBzdXBwb3J0cyBpdCBhcyB3ZWxsLiAtLWZ0cC1hY2NvdW50CiAgYW5kIENVUkxPUFRfRlRQX0FDQ09VTlQgc2V0IHRoZSBhY2NvdW50IHN0cmluZy4gKFRoZSBzZXJ2ZXIgbWF5IGFzayBmb3IgYW4KICBhY2NvdW50IHN0cmluZyBhZnRlciBQQVNTIGhhdmUgYmVlbiBzZW50IGF3YXkuIFRoZSBjbGllbnQgcmVzcG9uZHMKICB3aXRoICJBQ0NUIFthY2NvdW50IHN0cmluZ10iLikgQWRkZWQgdGVzdCBjYXNlIDIyOCBhbmQgMjI5IHRvIHZlcmlmeSB0aGUKICBmdW5jdGlvbmFsaXR5LiBVcGRhdGVkIHRoZSB0ZXN0IEZUUCBzZXJ2ZXIgdG8gc3VwcG9ydCBBQ0NUIHNvbWV3aGF0LgoKLSBEYXZpZCBTaGF3IGNvbnRyaWJ1dGVkIGEgZmFpcmx5IGNvbXBsZXRlIGFuZCBkZXRhaWxlZCBhdXRvY29uZiB0ZXN0IHlvdSBjYW4KICB1c2UgdG8gZGV0ZWN0IGxpYmN1cmwgYW5kIHNldHVwIHZhcmlhYmxlcyBmb3IgdGhlIHByb3RvY29scyB0aGUgaW5zdGFsbGVkCiAgbGliY3VybCBzdXBwb3J0czogZG9jcy9saWJjdXJsL2xpYmN1cmwubTQKCkRhbmllbCAoMjEgSmFudWFyeSAyMDA1KQotIE1ham9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlciBvdmVyaGF1bC4KCiAgVGhlc2UgZm91ciBvcHRpb25zIGFyZSBub3cgb2Jzb2xldGU6IENVUkxPUFRfU09VUkNFX0hPU1QsCiAgQ1VSTE9QVF9TT1VSQ0VfUEFUSCwgQ1VSTE9QVF9TT1VSQ0VfUE9SVCAodGhpcyBvcHRpb24gZGlkbid0IHdvcmsgYmVmb3JlKQogIGFuZCBDVVJMT1BUX1BBU1ZfSE9TVC4KCiAgVGhlc2UgdHdvIG9wdGlvbnMgYXJlIGFkZGVkOiBDVVJMT1BUX1NPVVJDRV9VUkwgYW5kIENVUkxPUFRfU09VUkNFX1FVT1RFLgoKICBUaGUgdGFyZ2V0LXNpZGUgZGlkbid0IHVzZSB0aGUgcHJvcGVyIHBhdGggd2l0aCBSRVRSLCBhbmQgdGh1cyB0aGlzIG9ubHkKICB3b3JrZWQgY29ycmVjdGx5IGluIHRoZSBsb2dpbiBwYXRoIChpLmUgd2l0aG91dCBkb2luZyBhbnkgQ1dEKS4gVGhlIHNvdXJjZS0KICBzaWRlIHN0aWxsIHVzZXMgYSB3cm9uZyBwYXRoLCBidXQgdGhlIGZpeCBmb3IgdGhpcyB3aWxsIG5lZWQgdG8gd2FpdC4gVmVyaWZ5CiAgdGhlIGZsYXcgYnkgdXNpbmcgYSBzb3VyY2UgVVJMIHdpdGggaW5jbHVkZWQgJVhYLWNvZGVzLgoKICBNYWRlIENVUkxPUFRfRlRQUE9SVCBjb250cm9sIHdlYXRoZXIgdGhlIHRhcmdldCBvcGVyYXRpb24gc2hvdWxkIHVzZSBQT1JUCiAgKG9yIG5vdCkuIFRoZSBvdGhlciBzaWRlIHRodXMgdXNlcyBwYXNzaXZlIChQQVNWKSBtb2RlLgoKICBVcGRhdGVkIHRoZSBmdHAzcmRwYXJ0eS5jIGV4YW1wbGUgc291cmNlIHRvIHVzZSB0aGUgdXBkYXRlZCBvcHRpb25zLgoKICBBZGRlZCBzdXBwb3J0IGZvciBhIHNlY29uZCBGVFAgc2VydmVyIGluIHRoZSB0ZXN0IHN1aXRlLiBOYW1lZC4uLiBmdHAyLgogIEFkZGVkIHRlc3QgY2FzZXMgMjMwLCAyMzEgYW5kIDIzMiBhcyBhIGZldyBmaXJzdCBiYXNpYyB0ZXN0cyBvZiB2ZXJ5IHNpbXBsZQogIDNyZCBwYXJ0eSB0cmFuc2ZlcnMuCgogIENoYW5nZWQgdGhlIGRlYnVnIG91dHB1dCB0byBpbmNsdWRlICd0YXJnZXQnIGFuZCAnc291cmNlJyB3aGVuIGEgM3JkIHBhcnR5CiAgaXMgYmVpbmcgbWFkZSwgdG8gbWFrZSBpdCBjbGVhcmVyIHdoYXQgY29tbWFuZHMvcmVzcG9uc2VzIGNhbWUgb24gd2hhdAogIGNvbm5lY3Rpb24uCgogIEFkZGVkIHRocmVlIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uczogLS0zcC11cmwsIC0tM3AtdXNlciBhbmQgLS0zcC1xdW90ZS4KCiAgRG9jdW1lbnRlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgcmVsYXRlZAogIHRvIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCiAgKFRlbXBvcmFyaWx5KSBkaXNhYmxlZCB0aGUgYWJpbGl0eSB0byByZS11c2UgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBmb3IgdGhlCiAgc291cmNlIGNvbm5lY3Rpb24uIFRoaXMgaXMgYmVjYXVzZSBpdCBuZWVkcyB0byBmb3JjZSBhIG5ldyBpbiBjYXNlIHRoZQogIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIHRoZSBzYW1lIGhvc3QsIGFuZCB0aGUgaG9zdCBuYW1lIGNoZWNrIGlzIHRyaWNraWVyIG5vdwogIHdoZW4gdGhlIHNvdXJjZSBpcyBpZGVudGlmaWVkIHdpdGggYSBmdWxsIFVSTCBpbnN0ZWFkIG9mIGEgcGxhaW4gaG9zdCBuYW1lCiAgbGlrZSBiZWZvcmUuCgogIFRPRE8gKHNob3J0LXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBxdW90ZSBzdXBwb3J0LiBUaGUgb3B0aW9ucyBhcmUKICB0aGVyZSwgd2UgbmVlZCB0byBhZGQgdGVzdCBjYXNlcyB0byB2ZXJpZnkgdGhlaXIgZnVuY3Rpb25hbGl0eS4KCiAgVE9ETyAobG9uZy10ZXJtKSBmb3IgM3JkIHBhcnR5IHRyYW5zZmVyczogSVB2NiBzdXBwb3J0IChFUFJUIGFuZCBFUFNWIGV0YykKICBhbmQgU1NML1RTTCBzdXBwb3J0LgoKRGFuaWVsICgyMCBKYW51YXJ5IDIwMDUpCi0gUGhpbGlwcGUgSGFtZWF1IGZvdW5kIG91dCB0aGF0IC1RICIrW2NvbW1hbmRdIiBkaWRuJ3Qgd29yaywgYWx0aG91Z2ggc29tZQogIGNvZGUgd2FzIHdyaXR0ZW4gZm9yIGl0LiBJIGZpeGVkIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMjI3IHRvIHZlcmlmeSBpdC4KICBUaGUgY3VybC4xIG1hbiBwYWdlIGRpZG4ndCBtZW50aW9uIHRoZSAnKycgc28gSSBhZGRlZCBpdC4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA1KQotIFN0ZXBoYW4gQmVyZ21hbm4gbWFkZSBsaWJjdXJsIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFUIGlmIGFuIEZUUCBVUkwKICBjb250YWlucyAlMGEgb3IgJTBkIGluIHRoZSB1c2VyLCBwYXNzd29yZCBvciBDV0QgcGFydHMuIChBIGZ1dHVyZSBmaXggd291bGQKICBpbmNsdWRlIGRvaW5nIGl0IGZvciAlMDAgYXMgd2VsbCAtIHNlZSBLTk9XTl9CVUdTIGZvciBkZXRhaWxzLikgVGVzdCBjYXNlCiAgMjI1IGFuZCAyMjYgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhpcwoKLSBTdGVwaGFuIEJlcmdtYW5uIHBvaW50ZWQgb3V0IHR3byBmbGF3cyBpbiBsaWJjdXJsIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlZDoKCiAgMSkgdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3RpbGwgcmVhZCBhbmQgdXNlZCB0byBzZXQgSFRUUCBwcm94eQoKICAyKSB5b3UgY291bGRuJ3QgZGlzYWJsZSBodHRwIHByb3h5IHdpdGggQ1VSTE9QVF9QUk9YWSAoc2luY2UgdGhlIG9wdGlvbiB3YXMKICAgICBkaXNhYmxlZCkuIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIGFwcHMgbWF5IHdhbnQgdG8gZGlzYWJsZSBIVFRQIHByb3h5CiAgICAgd2l0aG91dCBhY3R1YWxseSBrbm93aW5nIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIGRpc2FibGUgSFRUUCBvciBub3QuCgogIEJhc2VkIG9uIFN0ZXBoYW4ncyBwYXRjaCwgYm90aCB0aGVzZSBpc3N1ZXMgc2hvdWxkIG5vdyBiZSBmaXhlZC4KCkRhbmllbCAoMTggSmFudWFyeSAyMDA1KQotIENvZHkgSm9uZXMnIGVuaGFuY2VkIHZlcnNpb24gb2YgU2FtdWVsIETtYXogR2FyY+1hJ3MgTVNWQyBtYWtlZmlsZSBwYXRjaCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDUpCi0gQWxleCBha2EgV2luZEVhZ2xlIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBkb2luZyAiY3VybCAtdiBkaWN0aW9uYXJ5LmNvbSIsIGN1cmwKICBhc3N1bWVkIHRoaXMgdXNlZCB0aGUgRElDVCBwcm90b2NvbC4gV2hpbGUgZ3Vlc3NpbmcgcHJvdG9jb2xzIHdpbGwgcmVtYWluCiAgZnV6enksIEkndmUgbm93IG1hZGUgc3VyZSB0aGF0IHRoZSBob3N0IG5hbWVzIG11c3Qgc3RhcnQgd2l0aCAiW3Byb3RvY29sXS4iCiAgZm9yIHRoZW0gdG8gYmUgYSB2YWxpZCBndWVzc2FibGUgbmFtZS4gSSBhbHNvIHJlbW92ZWQgImh0dHBzIiBhcyBhIHByZWZpeAogIHRoYXQgaW5kaWNhdGVzIEhUVFBTLCBzaW5jZSB3ZSBoYXJkbHkgZXZlciBzZWUgYW55IGhvc3QgbmFtZXMgdXNpbmcgdGhhdC4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA1KQotIEluc3BpcmVkIGJ5IE1hcnRpam4gS29zdGVyJ3MgcGF0Y2ggYW5kIGV4YW1wbGUgc291cmNlIGF0CiAgaHR0cDovL3d3dy5ncmVlbmhpbGxzLmNvLnVrL21hay9nZW50b28vY3VybC1laW50ci1idWcuYywgSSBub3cgbWFkZSB0aGUKICBzZWxlY3QoKSBhbmQgcG9sbCgpIGNhbGxzIHByb3Blcmx5IGxvb3AgaWYgdGhleSByZXR1cm4gLTEgYW5kIGVycm5vIGlzCiAgRUlOVFIuIGdsaWJjIGRvY3MgZm9yIHRoaXMgaXMgZm91bmQgaGVyZToKICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliYy9tYW51YWwvaHRtbF9ub2RlL0ludGVycnVwdGVkLVByaW1pdGl2ZXMuaHRtbAoKICBUaGlzIGxhc3QgbGluayBzYXlzIEJTRCBkb2Vzbid0IGhhdmUgdGhpcyAiZWZmZWN0Ii4gV2lsbCB0aGVyZSBiZSBhIHByb2JsZW0KICBpZiB3ZSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseT8KCkRhbmllbCAoMTEgSmFudWFyeSAyMDA1KQotIERhbiBUb3JvcCBjbGVhbmVkIHVwIGEgZmV3IG5vIGxvbmdlciB1c2VkIHZhcmlhYmxlcyBmcm9tIERhdmlkIFBoaWxsaXBzJwogIHNlbGVjdCgpIG92ZXJoYXVsIGZpeC4KCi0gQ3lyaWxsIE9zdGVyd2FsZGVyIHBvc3RlZCBhIGRldGFpbGVkIGFuYWx5c2lzIGFib3V0IGEgYnVnIHRoYXQgb2NjdXJzIHdoZW4KICB1c2luZyBhIGN1c3RvbSBIb3N0OiBoZWFkZXIgYW5kIGN1cmwgZmFpbHMgdG8gc2VuZCBhIHJlcXVlc3Qgb24gYSByZS11c2VkCiAgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFuZCB0aHVzIGNyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBhbmQgcmVzZW5kcyBpdC4gSXQKICB0aGVuIHNlbnQgdHdvIEhvc3Q6IGhlYWRlcnMuIEN5cmlsbCdzIGFuYWx5c2lzIHdhcyBwb3N0ZWQgaGVyZToKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA1LTAxLzAwMjIuaHRtbAoKLSBCcnVjZSBNaXRjaGVuZXIgaWRlbnRpZmllZCAoYnVnIHJlcG9ydCAjMTA5OTY0MCkgdGhlIG5ldmVyLWVuZGluZyBTT0NLUzUKICBwcm9ibGVtIHdpdGggdGhlIHZlcnNpb24gYnl0ZSBhbmQgdGhlIGNoZWNrIGZvciBiYWQgdmVyc2lvbnMuIEJydWNlIGhhcyBsb3RzCiAgb2YgY2x1ZXMgb24gdGhpcywgYW5kIGJhc2VkIG9uIGhpcyBzdWdnZXN0aW9uIEkndmUgbm93IHJlbW92ZWQgdGhlIGNoZWNrIG9mCiAgdGhhdCBieXRlIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGFibGUgdG8gY29udGFpbiAxIG9yIDUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwNSkKLSBQYXZlbCBPcmVob3YgcmVwb3J0ZWQgbWVtb3J5IHByb2JsZW1zIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBpbiBidWcgcmVwb3J0CiAgIzEwOTg4NDMuIEluIHNob3J0LCBhIHNoYXJlZCBETlMgY2FjaGUgd2FzIHNldHVwIGZvciBhIG11bHRpIGhhbmRsZSBhbmQgd2hlbgogIHRoZSBzaGFyZWQgY2FjaGUgd2FzIGRlbGV0ZWQgYmVmb3JlIHRoZSBpbmRpdmlkdWFsIGVhc3kgaGFuZGxlcywgdGhlIGxhdHRlcgogIGNsZWFudXBzIGNhdXNlZCByZWFkL3dyaXRlcyB0byBhbHJlYWR5IGZyZWVkIG1lbW9yeS4KCi0gSHpoaWp1biByZXBvcnRlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBTU0wgY2VydGlmaWNhdGUgY29kZSwgdGhhdCBsZWFrZWQgdGhlCiAgcmVtb3RlIGNlcnRpZmljYXRlIG5hbWUgd2hlbiBpdCBkaWRuJ3QgbWF0Y2ggdGhlIHVzZWQgaG9zdCBuYW1lLgoKR2lzbGUgKDggSmFudWFyeSAyMDA1KQotIEFkZGVkIE1ha2VmaWxlLldhdGNvbSBmaWxlcyAoc3JjL2xpYikuIFVwZGF0ZWQgTWFrZWZpbGUuZGlzdC4KCkRhbmllbCAoNyBKYW51YXJ5IDIwMDUpCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc2NyaXB0J3MgdmFsZ3JpbmQgbG9nIHBhcnNlciB0byBhY3R1YWxseSB3b3JrISBBbHNvIGFkZGVkCiAgdGhlIGFiaWxpdHkgdG8gZGlzYWJsZSB0aGUgbG9nIHNjYW5uZXIgZm9yIHNwZWNpZmljIHRlc3QgY2FzZXMuIFRlc3QgY2FzZQogIDUwOSByZXN1bHRzIGluIG51bWVyb3VzIHByb2JsZW1zIGFuZCBsZWFrcyBpbiBPcGVuU1NMIGFuZCBoYXMgdG8gZ2V0IGl0CiAgZGlzYWJsZWQuCgpEYW5pZWwgKDYgSmFudWFyeSAyMDA1KQotIEZpeGVkIGEgc2luZ2xlLWJ5dGUgcmVhZCBvdXQgb2YgYm91bmRzIGluIHRlc3QgY2FzZSAzOSBpbiB0aGUgY3VybCB0b29sIGNvZGUKICAoaS5lIG5vdCBpbiB0aGUgbGlicmFyeSkuCgotIEJ1ZyByZXBvcnQgIzEwOTcwMTkgaWRlbnRpZmllZCBhIHByb2JsZW0gd2hlbiBkb2luZyAtZCAiZGF0YSIgd2l0aCAtRyBhbmQKICBzZW5kaW5nIGl0IHRvIHR3byBVUkxzIHdpdGgge30uIEFkZGVkIHRlc3QgMTk5IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICg0IEphbnVhcnkgMjAwNSkKLSBNYXJ0eSBLdWhydCBhZGp1c3RlZCBhIFZNUyBidWlsZCBzY3JpcHQgc2xpZ2h0bHkKCi0gS2FpIFNvbW1lcmZlbGQgYW5kIEdpc2xlIFZhbmVtIGZpeGVkIGxpYmN1cmwgdG8gYnVpbGQgd2l0aCBJUHY2IHN1cHBvcnQgb24KICBXaW4yMDAwLgoKRGFuaWVsICgyIEphbnVhcnkgMjAwNSkKLSBBbGV4IE5lYmxldHQgdXBkYXRlZCB0aGUgTVNWQyBtYWtlZmlsZXMgc2xpZ2h0bHkuCgpEYW5pZWwgKDI1IERlY2VtYmVyIDIwMDQpCi0gUmVtb3ZlZCBzcmMvY29uZmlnLmguaW4gZnJvbSBDVlMsIGl0IGlzIG5vdyBjb3BpZWQgZnJvbSB0aGUgKGdlbmVyYXRlZCkKICBsaWIvY29uZmlnLmguaW4gaW5zdGVhZCwgYXMgdGhleSBjYW4gdmVyeSB3ZWxsIGJlIHRoZSBzYW1lLiBUaGlzIHJlbW92ZXMgYQogICJtYW51YWwgaGFzc2xlIi4gWW91IG1heSB3YW50IHRvIHJlLXJ1biBidWlsZGNvbmYgbm93LgoKLSBXZXJuZXIgS29jaCBmaWxlZCBEZWJpYW4gYnVnIHJlcG9ydCAjMjg2Nzk0LCBtZW50aW9uaW5nIHRoYXQgY3VybCBjb250YWluZWQKICBub24tZnJlZSAoYnkgRGViaWFuJ3Mgdmlldykgc291cmNlIGNvZGUuIFRoaXMgd2FzIEFuZ3VzIE1hY2theSdzCiAgc3JjL2dldHBhc3MuYyBzb3VyY2UgY29kZS4gSSB0cmllZCB0byBjb250YWN0IGhpbSBhYm91dCBpdCB0byBxdWlja2x5IHNvbHZlCiAgdGhpcyBpc3N1ZSwgYnV0IGhpcyBlbWFpbCBhZGRyZXNzZXMgYm91bmNlIGFuZCBJIGdvdCBzb21lIHRpbWUgIm92ZXIiIGFuZAogIHJlaW1wbGVtZW50ZWQgdGhlIGZ1bmN0aW9uYWxpdHkgb25jZSBicm91Z2h0IGJ5IEFuZ3VzLiBXZSBubyBsb25nZXIgdXNlIGFueQogIG9mIEFuZ3VzJyBvcmlnaW5hbCBjb2RlIGFuZCB0aGUgbmV3IGZ1bmN0aW9uIGlzIG11Y2ggc2ltcGxlciAoSU1PKS4gSXNzdWUKICBzb2x2ZWQuCgpEYW5pZWwgKDI0IERlY2VtYmVyIDIwMDQpCi0gRGF2aWQgU2hhdyBhZGRlZCAtLXByb3RvY29scyB0byBjdXJsLWNvbmZpZywgc28gdGhhdCBpdCBub3cgbGlzdHMgYWxsCiAgcHJvdG9jb2xzIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIHN1cHBvcnQuIC0tZmVhdHVyZSBubyBsb25nZXIgbGlzdHMgZGlzYWJsZWQKICBwcm90b2NvbHMuCgpEYW5pZWwgKDIzIERlY2VtYmVyIDIwMDQpCi0gRGF2aWQgU2hhdyBmaXhlZCB0aGUgY29uZmlndXJlIC0tZGlzYWJsZS1bcHJvdG9jb2xdIHZhcmlhYmxlcyBzbyB0aGF0CiAgY3VybC1jb25maWcgLS1mZWF0dXJlIG5vdyB3b3JrcyBjb3JyZWN0bHkhCgpEYW5pZWwgKDIyIERlY2VtYmVyIDIwMDQpCi0gUnVuZSBLbGV2ZWxhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBmb3IgcmVjZWl2ZWQgY29va2llcyB3aXRoIHRoZQogIChyYXJlKSB2ZXJzaW9uIGF0dHJpYnV0ZSBzZXQuCgotIE1hcmNpbiBLb25pY2tpIHByb3ZpZGVkIHR3byBjb25maWd1cmUgZml4ZXMgYW5kIGEgc291cmNlIGZpeCB0byBtYWtlIGN1cmwKICBidWlsZCBvdXQtb2YtdGhlLWJveCBvbiBCZU9TLgoKRGFuaWVsICgyMSBEZWNlbWJlciAyMDA0KQotIEFkZGVkIHRlc3QgY2FzZSAyMTcgdGhhdCB2ZXJpZmllZCBDVVJMSU5GT19IVFRQX0NPTk5FQ1RDT0RFLCBhbmQgSSBtYWRlIHRoZQogIC13IG9wdGlvbiBzdXBwb3J0ICdodHRwX2Nvbm5lY3QnIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHZlcmlmeSEKCi0gRml4ZWQgbGliL3NlbGVjdC5jIGluY2x1ZGUgb3JkZXIgdG8gYnVpbGQgZmluZSBvbiBGcmVlQlNECgotIEZpeGVkIGZhaWxmKCkncyByZXVzZSBvZiB0aGUgdmFfbGlzdCB2YXJpYWJsZSB0aGF0IGNyYXNoZWQgb24gRnJlZUJTRC4KICBQb2ludGVkIG91dCBieSBQZXRlciBQZW50Y2hldi4KClZlcnNpb24gNy4xMi4zICgyMCBEZWNlbWJlciAyMDA0KQoKRGFuaWVsICgxOSBEZWNlbWJlciAyMDA0KQotIEkgaW52ZXN0aWdhdGVkIG91ciBQS0NTMTIgYnVpbGQgcHJvYmxlbSBvbiBTb2xhcmlzIDIuNyB3aXRoIE9wZW5TU0wgMC45LjdlLAogIGFuZCBpdCB0dXJuZWQgb3V0IHRvIGJlIHRoZSBmYXVsdCBvZiB0aGUgemxpYiAxLjEuNCBoZWFkZXJzIGRvaW5nIGEgdHlwZWRlZgogIG5hbWVkICdmcmVlX2Z1bmMnIGFuZCB0aGUgT3BlblNTTCBoZWFkZXJzIGhhdmUgYSBwcm90b3R5cGUgdGhhdCB1c2VzCiAgJ2ZyZWVfZnVuYycgaW4gb25lIG9mIGl0cyBhcmd1bWVudHMuIFRoaXMgaXMgd2h5IHRoZSBjb21waWxlIGVycm9ycyBvdXQuCgogIEluIG90aGVyIHdvcmRzLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIG9wZW5zc2wvcGtjczEyLmggaGVhZGVyIGJlZm9yZSB0aGUKICB6bGliLmggaGVhZGVyIGFuZCBpdCBidWlsZHMgZmluZS4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyBmb3IgdGhpcwogIGZpbGUgYW5kIGl0IHRoZW4gZ2V0cyBpbmNsdWRlZCBlYXJseSBpbiBsaWIvdXJsZGF0YS5oLgoKRGFuaWVsICgxOCBEZWNlbWJlciAyMDA0KQotIFNhbXVlbCBMaXN0b3BhZCBhZGRlZCBzdXBwb3J0IGZvciBQS0NTMTIgZm9ybWF0dGVkIGNlcnRpZmljYXRlcy4KCi0gU2FtdWVsIExpc3RvcGFkIGZpeGVkIC1FIHRvIHN1cHBvcnQgIkM6L3BhdGgiICh3aXRoIGZvcndhcmQgc2xhc2gpIGFzIHdlbGwuCgpEYW5pZWwgKDE2IERlY2VtYmVyIDIwMDQpCi0gR2lzbGUgZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgZGlyZWN0b3J5IHJlLXVzZSBmb3IgRlRQLgoKICBJIGFkZGVkIHRlc3QgY2FzZSAyMTUgYW5kIDIxNiB0byBiZXR0ZXIgdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBEaW5hciBpbiBidWcgcmVwb3J0ICMxMDg2MTIxLCBmb3VuZCBhIGZpbGUgaGFuZGxlIGxlYWsgd2hlbiBhIG11bHRpcGFydAogIGZvcm1wb3N0IChpbmNsdWRpbmcgYSBmaWxlIHVwbG9hZCBwYXJ0KSB3YXMgYWJvcnRlZCBiZWZvcmUgdGhlIHdob2xlIGZpbGUKICB3YXMgc2VudC4KCkRhbmllbCAoMTUgRGVjZW1iZXIgMjAwNCkKLSBUb20gTGVlIGZvdW5kIG91dCB0aGF0IGdsb2JiaW5nIG9mIHN0cmluZ3Mgd2l0aCBiYWNrc2xhc2hlcyBkaWRuJ3Qgd29yayBhcwogIHlvdSdkIGV4cGVjdC4gQmFja3NsYXNoZXMgYXJlIHN1Y2ggYSBjZW50cmFsIHBhcnQgb2Ygd2luZG93cyBmaWxlIG5hbWVzIHRoYXQKICBmb3JjaW5nIGJhY2tzbGFzaGVzIHRvIGhhdmUgdG8gYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaGVzIGlzIGEgYml0IHRvbwogIGF3a3dhcmQgdG8gdXNlcnMuIFN0YXJ0aW5nIG5vdywgeW91IG9ubHkgbmVlZCB0byBlc2NhcGUgZ2xvYmJpbmcgY2hhcmFjdGVycwogIHN1Y2ggYXMgdGhlIGZpdmUgbGV0dGVyczogIltde30sIi4gQWRkZWQgdGVzdCBjYXNlIDIxNCB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTQgRGVjZW1iZXIgMjAwNCkKLSBIYXJzaGFsIFByYWRoYW4gcGF0Y2hlZCBhIEhUVFAgcGVyc2lzdGVudCBjb25uZWN0aW9uIGZsYXc6IGlmIHRoZSB1c2VyIG5hbWUKICBhbmQvb3IgcGFzc3dvcmQgd2VyZSBtb2RpZmllZCBiZXR3ZWVuIHR3byByZXF1ZXN0cyBvbiBhIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uLCB0aGUgc2Vjb25kIHJlcXVlc3Qgd2VyZSBzdGlsbCBtYWRlIHdpdGggdGhlIGZpcnN0IHNldHVwIQoKICBJIGFkZGVkIHRlc3QgY2FzZSA1MTkgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDEzIERlY2VtYmVyIDIwMDQpCi0gR2lzbGUgYWRkZWQgQ1VSTElORk9fU1NMX0VOR0lORVMgdG8gY3VybF9lYXN5X2dldGluZm8oKSB0byBhbGxvdyBhbiBhcHAKICB0byBsaXN0IGFsbCBhdmFpbGFibGUgY3J5cHRvIEVOR0lORVMuCgotIEdpc2xlIGZpeGVkIGJ1ZyByZXBvcnQgIzEwODM1NDIsIHdoaWNoIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHJlc3VtaW5nCiAgbGFyZ2UgZmlsZSAoPjRHQikgZmlsZTovLyB0cmFuc2ZlcnMgb24gd2luZG93cy4KCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwNCkKLSBNYWRlIHRoZSB0ZXN0IHN1aXRlIEhUVFAgc2VydmVyIChzd3MpIGNhcGFibGUgb2YgdXNpbmcgSVB2NiwgYW5kIHRoZW4KICBleHRlbmRlZCB0aGUgdGVzdCBlbnZpcm9ubWVudCB0byBzdXBwb3J0IHRoYXQgYW5kIGFsc28gYWRkZWQgdGhyZWUgdGVzdAogIGNhc2VzICgyNDAsIDI0MSwgMjQyKSB0aGF0IHJ1biB0ZXN0cyB1c2luZyBJUHY2LiBUZXN0IDI0MiB1c2VzIGEgVVJMIHRoYXQKICBkaWRuJ3Qgd29yayBiZWZvcmUgdGhlIDEwIGRlYyBmaXggYnkgS2FpIFNvbW1lcmZlbGQuCgotIE1hZGUgYSBmYWlsZWQgZmlsZTovLyByZXN1bWUgb3V0cHV0IGFuIGVycm9yIG1lc3NhZ2UKCi0gQ29ycmVjdGVkIHRoZSBDVVJMRV9CQURfRE9XTkxPQURfUkVTVU1FIGVycm9yIG1lc3NhZ2UgaW4gbGliL3N0cmVycm9yLmMKCi0gRGFuIEZhbmRyaWNoOgoKICBzaW1wbGlmaWVkIGFuZCBjb25zb2xpZGF0ZWQgdGhlIFNTTCBjaGVja3MgaW4gY29uZmlndXJlIGFuZCB0aGUgdXNhZ2Ugb2YgdGhlCiAgZGVmaW5lcyBpbiBsaWIvc2V0dXAuaAoKICBwcm92aWRlZCBhIGZpcnN0IGxpYmN1cmwucGMuaW4gZmlsZSBmb3IgcGtnLWNvbmZpZyAoYnV0IHRoZSByZXN1bHQgaXMgbm90CiAgaW5zdGFsbGVkIGFueXdoZXJlIGF0IHRoaXMgcG9pbnQpCgogIGV4dGVuZGVkIHRoZSBjcm9zcyBjb21waWxlIHNlY3Rpb24gaW4gdGhlIGRvY3MvSU5TVEFMTCBmaWxlCgpEYW5pZWwgKDEwIERlY2VtYmVyIDIwMDQpCi0gV2hlbiBwcm92aWRpbmcgdXNlciBuYW1lIGluIHRoZSBVUkwgYW5kIGEgSVB2Ni1zdHlsZSBJUC1hZGRyZXNzIChsaWtlIGluCiAgImZ0cDovL3VzZXJAWzo6MV0vdG1wIiksIHRoZSBVUkwgcGFyc2VyIGRpZG4ndCBnZXQgdGhlIGhvc3QgZXh0cmFjdGVkCiAgcHJvcGVybHkuICBSZXBvcnRlZCBhbmQgZml4ZWQgYnkgS2FpIFNvbW1lcmZlbGQuCgpEYW5pZWwgKDkgRGVjZW1iZXIgMjAwNCkKLSBUb24gVm9vbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBmaXggdGhhdCBzaG91bGQgZml4IHRoZSBub3RvcmlvdXMgKG1vc3RseQogIHJlcG9ydGVkIG9uIFNvbGFyaXMpIHByb2JsZW0gd2hlcmUgdGhlIHNpemVfdCBjaGVjayBmYWlscyBkdWUgdG8gdGhlIFNTTAogIGxpYnMgYmVpbmcgZm91bmQgaW4gYSBkaXIgbm90IHNlYXJjaGVkIHRocm91Z2ggYnkgdGhlIHJ1bi10aW1lIGxpbmtlci4KICBwYXRjaC10cmFja2VyIGVudHJ5ICMxMDgxNzA3LgoKLSBCcnlhbiBIZW5kZXJzb24gcG9pbnRlZCBvdXQgaW4gYnVnIHJlcG9ydCAjMTA4MTc4OCB0aGF0IHRoZSBjdXJsLWNvbmZpZwogIC0tdmVybnVtIG91dHB1dCB3YXNuJ3QgemVybyBwcmVmaXhlZCBwcm9wZXJseSAoYXMgY2xhaW1lZCBpbiBkb2N1bWVudGF0aW9uKS4KICBUaGlzIGlzIGZpeGVkIGluIG1ha2V0Z3ogbm93LgoKRGFuaWVsICg4IERlY2VtYmVyIDIwMDQpCi0gTWF0dCBWZWVuc3RyYSB1cGRhdGVkIHRoZSBtYWNoLU8gZnJhbWV3b3JrIGZpbGVzIGZvciBNYWMgT1MgWC4KCi0gUmVuZSBCZXJuaGFyZHQgZm91bmQgYW5kIGZpeGVkIGEgYnVmZmVyIG92ZXJydW4gaW4gdGhlIE5UTE0gY29kZSwgd2hlcmUKICBsaWJjdXJsIGFsd2F5cyBhbmQgdW5jb25kaXRpb25hbGx5IG92ZXJ3cm90ZSBhIHN0YWNrLWJhc2VkIGFycmF5IHdpdGggMyB6ZXJvCiAgYnl0ZXMuIFRoaXMgaXMgbm90IGFuIGV4cGxvaXRhYmxlIGJ1ZmZlciBvdmVyZmxvdy4gTm8gbmVlZCB0byBnZXQgYWxhcm1lZC4KCkRhbmllbCAoNyBEZWNlbWJlciAyMDA0KQotIEZpeGVkIHNvIHRoYXQgdGhlIGZpbmFsIGVycm9yIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgdmVyYm9zZSBpbmZvICJzdHJlYW0iCiAgZXZlbiBpZiBubyBlcnJvcmJ1ZmZlciBpcyBzZXQuCgpEYW5pZWwgKDYgRGVjZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgdGhlIC0tZGlzYWJsZS1jb29raWVzIG9wdGlvbiB0byBjb25maWd1cmUgdG8gYnVpbGQKICBsaWJjdXJsIHdpdGhvdXQgY29va2llIHN1cHBvcnQuIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBidWlsZCBhCiAgbWluaW1hbGlzdGljIGxpYmN1cmwgd2l0aCBubyBjb29raWVzIHN1cHBvcnQgYXQgYWxsLiBMaWtlIGZvciBlbWJlZGRlZAogIHN5c3RlbXMgb3Igc2ltaWxhci4KCi0gUmljaGFyZCBBdHRlcmVyIGZpeGVkIGxpYmN1cmwncyB3YXkgb2YgZGVhbGluZyB3aXRoIHRoZSBFUFNWCiAgcmVzcG9uc2UuIFByZXZpb3VzbHksIGxpYmN1cmwgd291bGQgcmUtcmVzb2x2ZSB0aGUgaG9zdCBuYW1lIHdpdGggdGhlIG5ldwogIHBvcnQgbnVtYmVyIGFuZCBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhhdCwgd2hpbGUgaXQgc2hvdWxkIHVzZSB0aGUgSVAgZnJvbQogIHRoZSBjb250cm9sIGNoYW5uZWwuIFRoaXMgYnVnIG1hZGUgaXQgaGFyZCB0byBFUFNWIGZyb20gYW4gRlRQIHNlcnZlciB3aXRoCiAgbXVsdGlwbGUgSVAgYWRkcmVzc2VzIQoKRGFuaWVsICgzIERlY2VtYmVyIDIwMDQpCi0gQnVnIHJlcG9ydCAjMTA3ODA2Njogd2hlbiBhIGNodW5rZWQgdHJhbnNmZXIgd2FzIHByZS1tYXR1cmVseSBjbG9zZWQgZXhhY3RseQogIGF0IGEgY2h1bmsgYm91bmRhcnkgaXQgd2FzIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yIGFuZCB0aHVzIHdlbnQgdW5ub3RpY2VkLgogIEZpeGVkIGJ5IE1hdXJpY2UgQmFybnVtLgoKICBBZGRlZCB0ZXN0IGNhc2UgMjA3IHRvIHZlcmlmeS4KCkRhbmllbCAoMiBEZWNlbWJlciAyMDA0KQotIEZpeGVkIHRoZSBDT05ORUNUIGxvb3AgdG8gZGVmYXVsdCB0aW1lb3V0IHRvIDM2MDAgc2Vjb25kcy4KCiAgQWRkZWQgdGVzdCBjYXNlIDIwNiB0aGF0IG1ha2VzIENPTk5FQ1Qgd2l0aCBEaWdlc3QuCgogIEZpeGVkIGEgZmxhdyB0aGF0IHByZXBlbmRlZCAiKG5pbCkiIHRvIHRoZSBpbml0aWFsIENPTk5FQ1QgcnFldWVzdCdzIHVzZXItCiAgYWdlbnQgZmllbGQuCgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoJ3MgZml4IGZvciBsaWJ6IDEuMSBhbmQgImV4dHJhIGZpZWxkIiB1c2FnZSBpbiBhIGd6aXAgc3RyZWFtCgotIERhbiBhbHNvIGhlbHBlZCBtZSB3aXRoIGlucHV0IGRhdGEgdG8gY3JlYXRlIHRocmVlIG1vcmUgdGVzdCBjYXNlcyBmb3IgdGhlCiAgLS1jb21wcmVzc2VkIG9wdGlvbi4KCkRhbmllbCAoMjkgTm92ZW1iZXIgMjAwNCkKLSBJIGltcHJvdmVkIHRoZSB0ZXN0IHN1aXRlIHRvIGVuYWJsZSBiaW5hcnkgY29udGVudHMgaW4gdGhlIHRlc3RzIChieSBwcm92aW5nCiAgaXQgYmFzZTY0IGVuY29kZWQpLCBsaWtlIGZvciB0ZXN0aW5nIGRlY29tcHJlc3MgZXRjLiBBZGRlZCB0ZXN0IDIyMCBhbmQgMjIxCiAgZm9yIHRoaXMgcHVycG9zZS4gVGVzdHMgY2FuIG5vdyBhbHNvIGRlcGVuZCBvbiBsaWJ6IHRvIHJ1bi4KCi0gQXMgcmVwb3J0ZWQgYnkgUmVpbm91dCB2YW4gU2Nob3V3ZW4gaW4gTWFuZHJha2UncyBidWcgdHJhY2tlciBidWcgMTIyODUKICAoaHR0cDovL3FhLm1hbmRyYWtlc29mdC5jb20vc2hvd19idWcuY2dpP2lkPTEyMjg1KSwgd2hlbiBjb25uZWN0aW5nIHRvIGFuCiAgSVB2NiBob3N0IHdpdGggRlRQLCAtLWRpc2FibGUtZXBzdiAob3IgLS1kaXNhYmxlLWVwcnQpIGVmZmVjdGl2ZWx5IGRpc2FibGVzCiAgdGhlIGFiaWxpdHkgdG8gdHJhbnNmZXIgYSBmaWxlLiBOb3csIHdoZW4gY29ubmVjdGVkIHRvIGFuIEZUUCBzZXJ2ZXIgd2l0aAogIElQdjYsIHRoZXNlIEZUUCBjb21tYW5kcyBjYW4ndCBiZSBkaXNhYmxlZCBldmVuIGlmIGFza2VkIHRvIHdpdGggdGhlCiAgYXZhaWxhYmxlIGxpYmN1cmwgb3B0aW9ucy4KCkRhbmllbCAoMjYgTm92ZW1iZXIgMjAwNCkKLSBBcyByZXBvcnRlZCBpbiBNYW5kcmFrZSdzIGJ1ZyB0cmFja2VyIGJ1ZyAxMjI4OQogIChodHRwOi8vcWEubWFuZHJha2Vzb2Z0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTIyODkpLCBjdXJsIHdvdWxkIHByaW50IGEKICBuZXdsaW5lIHRvICJmaW5pc2giIHRoZSBwcm9ncmVzcyBtZXRlciBhZnRlciBlYWNoIHJlZGlyZWN0IGFuZCBub3Qgb25seQogIGFmdGVyIGEgY29tcGxldGVkIHRyYW5zZmVyLgoKRGFuaWVsICgyNSBOb3ZlbWJlciAyMDA0KQotIEZUUCBpbXByb3ZlbWVudHM6CgogIElmIEVQU1YsIEVQUlQgb3IgTFBSVCBpcyB0cmllZCBhbmQgZG9lc24ndCB3b3JrLCBpdCB3aWxsIG5vdCBiZSByZXRyaWVkIG9uCiAgdGhlIHNhbWUgc2VydmVyIGFnYWluIGV2ZW4gaWYgYSBmb2xsb3dpbmcgcmVxdWVzdCBpcyBtYWRlIHVzaW5nIGEgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24uCgogIElmIGEgc2Vjb25kIHJlcXVlc3QgaXMgbWFkZSB0byBhIHNlcnZlciwgcmVxdWVzdGluZyBhIGZpbGUgZnJvbSB0aGUgc2FtZQogIGRpcmVjdG9yeSBhcyB0aGUgcHJldmlvdXMgcmVxdWVzdCBvcGVyYXRlZCBvbiwgbGliY3VybCB3aWxsIG5vIGxvbmdlciBtYWtlCiAgdGhhdCBsb25nIHNlcmllcyBvZiBDV0QgY29tbWFuZHMganVzdCB0byBlbmQgdXAgb24gdGhlIHNhbWUgc3BvdC4gTm90ZSB0aGF0CiAgdGhpcyBpcyBvbmx5IGZvciAqZXhhY3RseSogdGhlIHNhbWUgZGlyLiBUaGVyZSBpcyBzdGlsbCByb29tIGZvciBpbXByb3ZlbWVudHMKICB0byBvcHRpbWl6ZSB0aGUgQ1dELXNlbmRpbmcgd2hlbiB0aGUgZGlycyBhcmUgb25seSBzbGlnaHRseSBkaWZmZXJlbnQuCgogIEFkZGVkIHRlc3QgMjEwLCAyMTEgYW5kIDIxMiB0byB2ZXJpZnkgdGhlc2UgY2hhbmdlcy4gSGFkIHRvIGltcHJvdmUgdGhlCiAgdGVzdCBzY3JpcHQgdG9vIGFuZCBhZGRlZCBhIG5ldyBwcmltaXRpdmUgdG8gdGhlIHRlc3QgZmlsZSBmb3JtYXQuCgpEYW5pZWwgKDI0IE5vdmVtYmVyIDIwMDQpCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3Qgc2VsZWN0IHByb3Blcmx5IHdoZW4gcnVuCiAgd2l0aCBNc3lzL01pbmd3IG9uIFdpbmRvd3MuCgpEYW5pZWwgKDIyIE5vdmVtYmVyIDIwMDQpCi0gTWFkZSBIVFRQIFBVVCBhbmQgUE9TVCByZXF1ZXN0cyBubyBsb25nZXIgdXNlIEhFQUQgd2hlbiBkb2luZyBtdWx0aS1wYXNzCiAgYXV0aCBuZWdvdGlhdGlvbiAoTlRMTSwgRGlnZXN0IGFuZCBOZWdvdGlhdGUpLCBidXQgaW5zdGVhZCB1c2UgdGhlIHJlcXVlc3QKICBrZXl3b3JkICJwcm9wZXJseSIuIERldGFpbHMgaW4gbGliL1JFQURNRS5odHRwYXV0aC4gVGhpcyBhbHNvIGludHJvZHVjZXMKICBDVVJMT1BUX0lPQ1RMRlVOQ1RJT04gYW5kIENVUkxPUFRfSU9DVExEQVRBLCB0byBiZSB1c2VkIGJ5IGFwcHMgdGhhdCB1c2UgdGhlCiAgImFueSIgYXV0aCBhbHRlcm5hdGl2ZSBhcyB0aGVuIGxpYmN1cmwgbWF5IG5lZWQgdG8gc2VuZCB0aGUgUFVUL1BPU1QgZGF0YQogIG1vcmUgdGhhbiBvbmNlIGFuZCB0aHVzIG1heSBuZWVkIHRvIGFzayB0aGUgYXBwIHRvICJyZXdpbmQiIHRoZSByZWFkIGRhdGEKICBzdHJlYW0gdG8gc3RhcnQuCgogIFNlZSBhbHNvIHRoZSBuZXcgZXhhbXBsZSB1c2luZyB0aGlzOiBkb2NzL2V4YW1wbGVzL2FueWF1dGhwdXQuYwoKLSBEYXZpZCBQaGlsbGlwcyBlbmhhbmNlZCB0ZXN0IDUxOC4gSSBtYWRlIGl0IGRlcGVuZCBvbiBhICJmZWF0dXJlIiBzbyB0aGF0CiAgc3lzdGVtcyB3aXRob3V0IGdldHJsaW1pdCgpIHdvbid0IGF0dGVtcHQgdG8gdGVzdCA1MTguIGNvbmZpZ3VyZSBub3cgY2hlY2tzCiAgZm9yIGdldHJsaW1pdCgpIGFuZCBzZXRybGltaXQoKSBmb3IgdGhpcyB0ZXN0IGNhc2UuCgpEYW5pZWwgKDE4IE5vdmVtYmVyIDIwMDQpCi0gRGF2aWQgUGhpbGxpcHMgZml4ZWQgbGliY3VybCB0byBub3QgY3Jhc2ggYW55bW9yZSB3aGVuIG1vcmUgdGhhbiBGRF9TRVRTSVpFCiAgZmlsZSBkZXNjcmlwdG9ycyBhcmUgaW4gdXNlLiBUZXN0IGNhc2UgNTE4IGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwNCkKLSBUbyB0ZXN0IG15IGZpeCBmb3IgdGhlIENVUkxJTkZPX1JFRElSRUNUX1RJTUUgYnVnLCBJIGFkZGVkIHRpbWVfcmVkaXJlY3QgYW5kCiAgbnVtX3JlZGlyZWN0cyBzdXBwb3J0IHRvIHRoZSAtdyB3cml0ZW91dCBvcHRpb24gZm9yIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4KCi0gV29qY2llY2ggWndpZWZrYSBmb3VuZCBvdXQgdGhhdCBDVVJMSU5GT19SRURJUkVDVF9USU1FIGRpZG4ndCB3b3JrIGFzCiAgZG9jdW1lbnRlZC4KCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwNCkKLSBHaXNsZSBWYW5lbSBtb2RpZ2llZCB0aGUgTVNWQyBhbmQgTmV0d2FyZSBtYWtlZmlsZXMgdG8gYnVpbGQgd2l0aG91dAogIGxpYmN1cmwuZGVmCgotIERhbiBGYW5kcmljaCBhZGRlZCB0aGUgLS1kaXNhYmxlLWNyeXB0by1hdXRoIG9wdGlvbiB0byBjb25maWd1cmUgdG8gYWxsb3cKICBsaWJjdXJsIHRvIGJ1aWxkIHdpdGhvdXQgRGlnZXN0IHN1cHBvcnQuIChJIGZpZ3VyZSBpdCBzaG91bGQgYWxzbyBleHBsaWNpdGx5CiAgZGlzYWJsZSBOZWdvdGlhdGUgYW5kIE5UTE0uKQoKLSAgICAgICAgICAgICAgICAgKioqIE1vZGlmaWVkIEJlaGF2aW91ciBBbGVydCAqKioKCiAgU2V0dGluZyBDVVJMT1BUX1BPU1RGSUVMRFMgdG8gTlVMTCB3aWxsIG5vIGxvbmdlciBkbyBhIEdFVC4KCiAgU2V0dGluZyBDVVJMT1BUX1BPU1RGSUVMRFMgdG8gIiIgd2lsbCBzZW5kIGEgemVybyBieXRlIFBPU1QgYW5kIHNldHRpbmcKICBDVVJMT1BUX1BPU1RGSUVMRFMgdG8gTlVMTCBhbmQgQ1VSTE9QVF9QT1NURklFTERTSVpFIHRvIHplcm8gd2lsbCBhbHNvIG1ha2UKICBhIHplcm8gYnl0ZSBQT1NULiBBZGRlZCB0ZXN0IGNhc2UgNTE1IHRvIHZlcmlmeSB0aGlzLgoKICBTZXR0aW5nIENVUkxPUFRfSFRUUFBPU1QgdG8gTlVMTCBtYWtlcyBhIHplcm8gYnl0ZSBwb3N0LiBBZGRlZCB0ZXN0IGNhc2UgNTE2CiAgdG8gdmVyaWZ5IHRoaXMuCgogIENVUkxPUFRfUE9TVEZJRUxEU0laRSBtdXN0IG5vdyBiZSBzZXQgdG8gLTEgdG8gc2lnbmFsICJ3ZSBkb24ndCBrbm93Ii4KICBTZXR0aW5nIGl0IHRvIHplcm8gc2ltcGx5IHNheXMgdGhpcyBpcyBhIHplcm8gYnl0ZSBQT1NULgoKICBXaGVuIHByb3ZpZGluZyBQT1NUIGRhdGEgd2l0aCBhIHJlYWQgY2FsbGJhY2ssIHNldHRpbmcgdGhlIHNpemUgdXAgZnJvbnQKICBpcyBub3cgbWFkZSB3aXRoIENVUkxPUFRfUE9TVEZJRUxEU0laRSBhbmQgbm90IHdpdGggQ1VSTE9QVF9JTkZJTEVTSVpFLgoKRGFuaWVsICgxMSBOb3ZlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCBhZGRlZCAtLWRpc2FibGUtdmVyYm9zZSB0byB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBhbGxvdyBidWlsZHMKICB3aXRob3V0IHZlcmJvc2Ugc3RyaW5ncyBpbiB0aGUgY29kZSwgdG8gc2F2ZSBzb21lIDEyS0Igc3BhY2UuIE1ha2VzIHNlbnNlCiAgb25seSBmb3Igc3lzdGVtcyB3aXRoIHZlcnkgbGl0dGxlIG1lbW9yeSByZXNvdXJjZXMuCgotIEplZmYgUGhpbGxpcHMgZm91bmQgb3V0IHRoYXQgYSBkYXRlIHN0cmluZyB3aXRoIGEgeWVhciBiZXlvbmQgMjAzOCBjb3VsZAogIGNyYXNoIHRoZSBuZXcgZGF0ZSBwYXJzZXIgb24gc3lzdGVtcyB3aXRoIDMyYml0IHRpbWVfdC4gV2Ugbm93IGNoZWNrIGZvcgogIHRoaXMgY2FzZSBhbmQgZGVhbCB3aXRoIGl0LgoKRGFuaWVsICgxMCBOb3ZlbWJlciAyMDA0KQotIEkgaW5zdGFsbGVkIEhlaW1kYWwgb24gbXkgRGViaWFuIGJveCAodXNpbmcgdGhlIGRlYmlhbiBwYWNrYWdlKSBhbmQgbm90aWNlZAogIHRoYXQgY29uZmlndXJlIC0td2l0aC1nc3NhcGkgZmFpbGVkIHRvIGNyZWF0ZSBhIG5pY2UgYnVpbGQuIEZpeGVkIG5vdy4KCkRhbmllbCAoOSBOb3ZlbWJlciAyMDA0KQotIEdpc2xlIFZhbmVtIG1hcmtlZCBhbGwgZXh0ZXJuYWwgZnVuY3Rpb24gY2FsbHMgd2l0aCBDVVJMX0VYVEVSTiBzbyB0aGF0IG5vdwogIHRoZSBXaW5kb3dzLCBOZXR3YXJlIGFuZCBvdGhlciBidWlsZHMgbm8gbG9uZ2VyIG5lZWQgbGliY3VybC5kZWYgb3Igc2ltaWxhcgogIGZpbGVzLgoKRGFuaWVsICg4IE5vdmVtYmVyIDIwMDQpCi0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBjaGVjayBmb3IgdGxkLmggaWYgbGliaWRuIHdhcyBkZXRlY3RlZCwgc2luY2UKICBsaWJpZG4gMC4zLlggZGlkbid0IGhhdmUgc3VjaCBhIGhlYWRlciBhbmQgd2UgZG9uJ3Qgd29yayB3aXRoIGFueXRoaW5nCiAgYmVmb3JlIGxpYmlkbiAwLjQuMSBhbnl3YXkhIFN1c2UgOS4xIGFwcGFyZW50bHkgc2hpcHMgd2l0aCBhIDAuMy5YIHZlcnNpb24KICBvZiBsaWJpZG4gd2hpY2ggbWFrZXMgdGhlIGN1cmwgNy4xMi4yIGJ1aWxkIGZhaWwuIEplYW4tUGhpbGlwcGUKICBCYXJyZXR0ZS1MYVBpZXJyZSBoZWxwZWQgcG9pbnRpbmcgdGhpcyBvdXQuCgotIElhbiBHdWxsaXZlciByZXBvcnRlZCBpbiBkZWJpYW4gYnVnIHJlcG9ydCAjMjc4NjkxOiBpZiBjdXJsIGlzIGludm9rZWQgaW4gYW4KICBlbnZpcm9ubWVudCB3aGVyZSBzdGRlcnIgaXMgY2xvc2VkIHRoZSAtdiBvdXRwdXQgd2lsbCBzdGlsbCBiZSBzZW50IHRvIGZpbGUKICBkZXNjcmlwdG9yIDIgd2hpY2ggdGhlbiBtaWdodCBiZSB0aGUgbmV0d29yayBzb2NrZXQgaGFuZGxlISBOb3cgd2UgaGF2ZSBhCiAgd2VpcmQgaGFjayBpbnN0ZWFkIHRoYXQgYXR0ZW1wdHMgdG8gbWFrZSBzdXJlIHRoYXQgZmlsZSBkZXNjcmlwdG9yIDIgaXMKICBvcGVuZWQgKHdpdGggYSBjYWxsIHRvIHBpcGUoKSkgYmVmb3JlIGxpYmN1cmwgaXMgY2FsbGVkIHRvIGRvIHRoZSB0cmFuc2Zlci4KICBjb25maWd1cmUgbm93IGNoZWNrcyBmb3IgcGlwZSgpIGFuZCBzeXN0ZW1zIHdpdGhvdXQgcGlwZSBkb24ndCBnZXQgdGhlIHdlaXJkCiAgaGFjayBkb25lLgoKRGFuaWVsICg1IE5vdmVtYmVyIDIwMDQpCi0gVGltIFNuZWRkb24gbWFkZSBsaWJjdXJsIHNlbmQgbm8gbW9yZSB0aGFuIDY0SyBpbiBhIHNpbmdsZSBmaXJzdCBjaHVuayB3aGVuCiAgZG9pbmcgYSBodWdlIFBPU1Qgb24gVk1TLCBhcyB0aGlzIGlzIGEgc3lzdGVtIGxpbWl0YXRpb24uIERlZmF1bHQgb24gZ2VuZXJhbAogIHN5c3RlbXMgaXMgMTAwSy4KCkRhbmllbCAoNCBOb3ZlbWJlciAyMDA0KQotIEFuZHJlcyBHYXJjaWEgbWFkZSBpdCBidWlsZCBvbiBtaW5ndyBhZ2FpbmEsIG15IC0tcmV0cnkgY29kZSBicm9rZSB0aGUgYnVpbGQuCgpEYW5pZWwgKDIgTm92ZW1iZXIgMjAwNCkKLSBBZGRlZCAtLXJldHJ5LW1heC10aW1lIHRoYXQgYWxsb3dzIGEgbWF4aW11bSB0aW1lIHRoYXQgbWF5IG5vdCBoYXZlIGJlZW4KICByZWFjaGVkIGZvciBhIHJldHJ5IHRvIGJlIG1hZGUuIElmIG5vdCBzZXQgdGhlcmUgaXMgbm8gbWF4aW11bSB0aW1lLCBvbmx5CiAgdGhlIGFtb3VudCBvZiByZXRyaWVzIHNldCB3aXRoIC0tcmV0cnkuCgotIFBhdWwgTm9sYW4gcHJvdmlkZWQgYSBwYXRjaCB0byBtYWtlIGxpYmN1cmwgYnVpbGQgbmljZWx5IG9uIFdpbmRvd3MgQ0UuCgpEYW5pZWwgKDEgTm92ZW1iZXIgMjAwNCkKLSBXaGVuIGNyb3NzLWNvbXBpbGluZywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvIHVzZQogIHBrZy1jb25maWcgb24gdGhlIGJ1aWxkIGhvc3QgaW4gb3JkZXIgdG8gZGV0ZWN0IE9wZW5TU0wgY29tcGlsZXIgb3B0aW9ucy4KCkRhbmllbCAoMjcgT2N0b2JlciAyMDA0KQotIERhbiBGYW5kcmljaDoKCiAgQW4gaW1wcm92ZW1lbnQgdG8gdGhlIGd6aXAgaGFuZGxpbmcgb2YgbGliY3VybC4gVGhlcmUgd2VyZSB0d28gcHJvYmxlbXMgd2l0aAogIHRoZSBvbGQgdmVyc2lvbjogaXQgd2FzIHBvc3NpYmxlIGZvciBhIG1hbGljaW91cyBnemlwIGZpbGUgdG8gY2F1c2UgbGliY3VybAogIHRvIGxlYWsgbWVtb3J5LCBhcyBhIGJ1ZmZlciB3YXMgbWFsbG9jZWQgdG8gaG9sZCB0aGUgaGVhZGVyIGFuZCBuZXZlciBmcmVlZAogIGlmIHRoZSBoZWFkZXIgZW5kZWQgd2l0aCBubyBmaWxlIGNvbnRlbnRzLiAgVGhlIHNlY29uZCBwcm9ibGVtIGlzIHRoYXQgdGhlCiAgNjQgS2lCIGRlY29tcHJlc3Npb24gYnVmZmVyIHdhcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCB3aGljaCBjYXVzZWQKICB1bmV4cGVjdGVkbHkgaGlnaCBzdGFjayB1c2FnZSBhbmQgb3ZlcmZsb3dlZCB0aGUgc3RhY2sgb24gc29tZSBzeXN0ZW1zCiAgKHNvbWVvbmUgY29tcGxhaW5lZCBhYm91dCB0aGF0IGluIHRoZSBtYWlsaW5nIGxpc3QgYWJvdXQgYSB5ZWFyIGFnbykuCgogIEJvdGggcHJvYmxlbXMgYXJlIGZpeGVkIGJ5IHRoaXMgcGF0Y2guIFRoZSBmaXJzdCBvbmUgaXMgZml4ZWQgd2hlbiBhIHJlY2VudAogICgxLjIpIHZlcnNpb24gb2YgemxpYiBpcyB1c2VkLCBhcyBpdCB0YWtlcyBjYXJlIG9mIGd6aXAgaGVhZGVyIHBhcnNpbmcKICBpdHNlbGYuICBBIGNoZWNrIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgaXMgZG9uZSBhdCBydW4tdGltZSBhbmQgbGliY3VybCB1c2VzCiAgdGhhdCBmZWF0dXJlIGlmIGl0J3MgcHJlc2VudC4gSSd2ZSBjcmVhdGVkIGEgZGVmaW5lIE9MRF9aTElCX1NVUFBPUlQgdGhhdAogIGNhbiBiZSBjb21tZW50ZWQgb3V0IHRvIHNhdmUgc29tZSBjb2RlIHNwYWNlIGlmIGxpYmN1cmwgaXMgZ3VhcmFudGVlZCB0byBiZQogIHVzaW5nIGEgMS4yIHZlcnNpb24gb2YgemxpYi4KCiAgVGhlIHNlY29uZCBwcm9ibGVtIGlzIHNvbHZlZCBieSBkeW5hbWljYWxseSBhbGxvY2F0aW5nIHRoZSBtZW1vcnkgYnVmZmVyCiAgaW5zdGVhZCBvZiBzdG9yaW5nIGl0IG9uIHRoZSBzdGFjay4gVGhlIGFsbG9jYXRpb24vZnJlZSBpcyBkb25lIGZvciBldmVyeQogIGluY29taW5nIHBhY2tldCwgd2hpY2ggaXMgc3Vib3B0aW1hbCwgYnV0IHNob3VsZCBiZSBkd2FyZmVkIGJ5IHRoZSBhY3R1YWwKICBkZWNvbXByZXNzaW9uIGNvbXB1dGF0aW9uLgoKICBJJ3ZlIGFsc28gZmFjdG9yZWQgb3V0IHNvbWUgY29tbW9uIGNvZGUgYmV0d2VlbiBkZWZsYXRlIGFuZCBnemlwIHRvIHJlZHVjZQogIHRoZSBjb2RlIGZvb3RwcmludCBzb21ld2hhdC4gIEkndmUgdGVzdGVkIHRoZSBnemlwIGNvZGUgb24gYSBmZXcgdGVzdCBmaWxlcwogIGFuZCBJIHRyaWVkIGRlZmxhdGUgdXNpbmcgdGhlIGZyZXNobWVhdC5uZXQgc2VydmVyLCBhbmQgaXQgYWxsIGxvb2tzIE9LLiBJCiAgZGlkbid0IHRyeSBydW5uaW5nIGl0IHdpdGggdmFsZ3JpbmQsIGhvd2V2ZXIuCgotIEFkZGVkIGEgLS1yZXRyeSBvcHRpb24gdG8gY3VybCB0aGF0IHRha2VzIGEgbnVtZXJpY2FsIG9wdGlvbiBmb3IgdGhlIG51bWJlcgogIG9mIHRpbWVzIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHJldHJpZWQuIEl0IGlzIHJldHJpZWQgaWYgYSB0cmFuc2llbnQgZXJyb3IKICBpcyBkZXRlY3RlZCBvciBpZiBhIHRpbWVvdXQgb2NjdXJyZWQuIEJ5IGRlZmF1bHQsIGl0IHdpbGwgZmlyc3Qgd2FpdCBvbmUKICBzZWNvbmQgYmV0d2VlbiB0aGUgcmV0cmllcyBhbmQgdGhlbiBkb3VibGUgdGhlIGRlbGF5IHRpbWUgYmV0d2VlbiBlYWNoIHJldHJ5CiAgdW50aWwgdGhlIGRlbGF5IHRpbWUgaXMgdGVuIG1pbnV0ZXMgd2hpY2ggdGhlbiB3aWxsIGJlIHRoZSBkZWxheSB0aW1lCiAgYmV0d2VlbiBhbGwgZm9ydGhjb21pbmcgcmV0cmllcy4gWW91IGNhbiBzZXQgYSBzdGF0aWMgZGVsYXkgdGltZSB3aXRoCiAgIi0tcmV0cnktZGVsYXkgW251bV0iIHdoZXJlIFtudW1dIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJldHdlZW4KICBlYWNoIHJldHJ5LgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDQpCi0gVG9tYXMgUG9zcGlzZWsgZmlsZWQgYnVnIHJlcG9ydCAjMTA1MzI4NyB0aGF0IHByb3ZlZCAtQyAtIGFuZCAtLWZhaWwgb24gYQogIGZpbGUgdGhhdCB3YXMgYWxyZWFkeSBjb21wbGV0ZWx5IGRvd25sb2FkZWQgY2F1c2VkIGFuIGVycm9yLCB3aGlsZSBpdAogIGRvZXNuJ3QgaWYgeW91IGRvbid0IHVzZSAtLWZhaWwhIEkgYWRkZWQgdGVzdCBjYXNlIDE5NCB0byB2ZXJpZnkgdGhlIGZpeC4KICBHcnJyLiBDVVJMT1BUX0ZBSUxPTkVSUk9SIGlzIG5vdyBhZGRlZCB0byB0aGUgbGlzdCBzdHVmZiB0byByZW1vdmUgaW4KICBsaWJjdXJsIHY4IGR1ZSB0byBhbGwgdGhlIGtsdWRnZXMgbmVlZGVkIHRvIHN1cHBvcnQgaXQuCgotIE1vaHVuIEJpc3dhcyBmb3VuZCBvdXQgdGhhdCBmb3JtcG9zdGluZyBhIHplcm8tYnl0ZSBmaWxlIGRpZG4ndCB3b3JrIHZlcnkKICBnb29kLiBJIGZpeGVkLgoKRGFuaWVsICgxOSBPY3RvYmVyIDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSBpdCBwb3NzaWJsZSB0byBtYWtlIEZUUCAzcmQgcGFydHkgdHJhbnNmZXJzCiAgd2l0aCBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYmVpbmcgdGhlIHNhbWUgaG9zdC4gSXQgY2FuIGJlIHVzZWZ1bCBpZgogIHlvdSB3YW50IHRvIG1vdmUgYSBmaWxlIG9uIGEgc2VydmVyIG9yIHNpbWlsYXIuCgotIEd1aWxsYXVtZSBBcmx1aXNvbiBhZGRlZCBDVVJMSU5GT19OVU1fQ09OTkVDVFMgdG8gYWxsb3cgYW4gYXBwIHRvIGZpZ3VyZQogIG91dCBob3cgbWFueSBuZXcgY29ubmVjdHMgYSBwcmV2aW91cyB0cmFuc2ZlciByZXF1aXJlZC4KCiAgSSBhZGRlZCAle251bV9jb25uZWN0c30gdG8gdGhlIGN1cmwgdG9vbCBhbmQgYWRkZWQgdGVzdCBjYXNlIDE5MiBhbmQgMTkzCiAgdG8gdmVyaWZ5IHRoZSBuZXcgY29kZS4KCkRhbmllbCAoMTggT2N0b2JlciAyMDA0KQotIFBldGVyIFd1bGxpbmdlciBwb2ludGVkIG91dCB0aGF0IGN1cmwgc2hvdWxkIGNhbGwgc2V0bG9jYWxlKCkgcHJvcGVybHkgdG8KICBpbml0aWF0ZSB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2Ugb3BlcmF0aW9ucywgdG8gbWFrZSB0aGUgSUROIHN0dWZmIHdvcmsKICBiZXR0ZXIuCgpWZXJzaW9uIDcuMTIuMiAoMTggT2N0b2JlciAyMDA0KQoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSB0aGUgQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUyBvcHRpb24gd29yawogIGZpbmUgZXZlbiBmb3IgdGhpcmQgcGFydHkgdHJhbnNmZXJzLgoKLSBydW5la2wgYXQgb3BvaW50LmNvbSBmb3VuZCBvdXQgKGFuZCBwcm92aWRlZCBhIGZpeCkgdGhhdCBsaWJjdXJsIGxlYWtlZAogIG1lbW9yeSBmb3IgY29va2llcyB3aXRoIHRoZSAibWF4LWFnZSIgZmllbGQgc2V0LgoKR2lzbGUgKDE2IE9jdG9iZXIgMjAwNCkKLSBJc3N1ZSA1MCBpbiBUT0RPLVJFTEVBU0U7IEFkZGVkIFRyYWlhbiBOaWNvbGVzY3UncyBwYXRjaGVzIGZvciB0aHJlYWRlZAogIHJlc29sdmVyIG9uIFdpbmRvd3MuIFBsdWdnZWQgc29tZSBwb3RlbnRpYWwgaGFuZGxlIGFuZCBtZW1vcnkgbGVha3MuCgpEYW5pZWwgKDE0IE9jdG9iZXIgMjAwNCkKLSBFcmljIFZlcmduYXVkIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgdHJlYXQgPy1sZXR0ZXJzIGluIHRoZSB1c2VyCiAgbmFtZSBhbmQgcGFzc3dvcmQgZmllbGRzIHByb3Blcmx5IGluIFVSTHMsIGxpa2UKICBmdHA6Ly91cz9lcjpwYXNzP3dvcmRAc2l0ZS5jb20vLiBBZGRlZCB0ZXN0IDE5MSB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTEgT2N0b2JlciAyMDA0KQotIGxpYmN1cmwgbm93IHVzZXMgU09fTk9TSUdQSVBFIGZvciBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBpdCAoTWFjIE9TIFggMTAuMiBvcgogIGxhdGVyIGlzIG9uZSkgdG8gaW5oaWJpdCB0aGUgU0lHUElQRSBzaWduYWwgd2hlbiB3cml0aW5nIHRvIGEgc29ja2V0IHdoaWxlCiAgdGhlIHBlZXIgZGllcy4gVGhlIHNhbWUgZWZmZWN0IGlzIHByb3ZpZGUgYnkgdGhlIE1TR19OT1NJR05BTCBwYXJhbWV0ZXIgdG8KICBzZW5kKCkgb24gb3RoZXIgc3lzdGVtcy4gQWxhbiBQaW5zdGVpbiB2ZXJpZmllZCB0aGUgZml4LgoKRGFuaWVsICgxMCBPY3RvYmVyIDIwMDQpCi0gU3lzdGVtcyB3aXRoIDY0Yml0IGxvbmdzIG5vIGxvbmdlciB1c2Ugc3RydG9sbCgpIG9yIG91ciBzdHJ0b2xsLSByZXBsYWNlbWVudAogIHRvIHBhcnNlIDY0IGJpdCBudW1iZXJzLiBzdHJ0b2woKSB3b3JrcyBmaW5lLiBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayB0bwogIGRldGVjdCBpZiBbY29uc3RhbnRdTEwgd29ya3MgYW5kIGlmIHNvLCB1c2UgdGhhdCBpbiB0aGUgc3RydG9sbCByZXBsYWNlbWVudAogIGNvZGUgdG8gd29yayBhcm91bmQgY29tcGlsZXIgd2FybmluZ3MgcmVwb3J0ZWQgYnkgQW5keSBDZWRpbG5pay4KCkdpc2xlICg2IE9jdG9iZXIgMjAwNCkKLSBGb3IgVVNFX0xJQklETiBidWlsZHM6IEFkZGVkIFRvcC1MZXZlbC1Eb21haW4gKFRMRCkgY2hlY2sgb2YgaG9zdC1uYW1lCiAgdXNlZCBpbiBmaXhfaG9zdG5hbWUoKS4gQ2hlY2tzIGlmIGNoYXJhY3RlcnMgaW4gJ2hvc3QtPm5hbWUnIChpbmRpcmVjdGx5CiAgdmlhICdhY2VfaG9zdG5hbWUnKSBhcmUgbGVnYWwgYWNjb3JkaW5nIHRvIHRoZSBUTEQgdGFibGVzIGluIGxpYmlkbi4KCkRhbmllbCAoNiBPY3RvYmVyIDIwMDQpCi0gQ2hpaC1DaHVuZyBDaGFuZyByZXBvcnRlZCB0aGF0IGlmIHlvdSB1c2UgQ1VSTE9QVF9SRVNVTUVfRlJPTSBhbmQgZW5hYmxlZAogIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIGxpYmN1cmwgcmVwb3J0ZWQgZXJyb3IgaWYgYSByZWRpcmVjdCBoYXBwZW5lZCBldmVuCiAgaWYgdGhlIG5ldyBVUkwgd291bGQgcHJvdmlkZSB0aGUgcmVzdW1lZCBmaWxlLiBUZXN0IGNhc2UgMTg4IGFkZGVkIHRvIHZlcmlmeQogIHRoZSBmaXggKHRvZ2V0aGVyIHdpdGggZXhpc3RpbmcgdGVzdCA5OSkuCgotIERhbiBGYW5kcmljaCBmaXhlZCBhIGNvbmZpZ3VyZSBmbGF3IGZvciBzeXN0ZW1zIHRoYXQgbmVlZCBib3RoIG5zbCBhbmQgc29ja2V0CiAgbGlicyB0byB1c2UgZ2V0aG9zdGJ5bmFtZSgpLgoKLSBSZW1vdmVkIHRhYnMgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBsb3RzIG9mIHNvdXJjZSBmaWxlcy4KCkRhbmllbCAoNSBPY3RvYmVyIDIwMDQpCi0gTWFkZSBjb25maWd1cmUgLS13aXRoLWxpYmlkbj1QQVRIIHRyeSB0aGUgZ2l2ZW4gUEFUSCBiZWZvcmUgdGhlIGRlZmF1bHQKICBwYXRocyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlLgoKLSBJZiBpZG5hX3N0cmVycm9yKCkgaXMgcHJlc2VudCBpbiBsaWJpZG4sIHdlIGNhbiB1c2UgdGhhdCBpbnN0ZWFkIG9mIG91cgogIGludGVybmFsIHJlcGxhY2VtZW50LiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBieSBTaW1vbiBpbiBsaWJpZG4gMC41LjYgYW5kCiAgaXMgZGV0ZWN0ZWQgYnkgY29uZmlndXJlLgoKLSBJdCBzZWVtcyBiYXNlbmFtZSgpIG9uIElSSVggaXMgaW4gdGhlIGxpYmdlbiBsaWJyYXJ5IGFuZCBzaW5jZSB3ZSBkb24ndCB1c2UKICB0aGF0LCBjb25maWd1cmUgZmluZHMgbGliZ2VuLmggYnV0IG5vdCBiYXNlbmFtZSBhbmQgdGhlbiB3ZSBnZXQgYSBjb21waWxlcgogIGVycm9yIGJlY2F1c2Ugb3VyIGJhc2VuYW1lKCkgcmVwbGFjZW1lbnQgZG9lc24ndCBtYXRjaCB0aGUgcHJvdG8gaW4KICBsaWJnZW4uaC4gU3RhcnRpbmcgbm93LCB3ZSBkb24ndCBpbmNsdWRlIHRoZSBmaWxlIGlmIGJhc2VuYW1lIHdhc24ndCBmb3VuZAogIGFzIHdlbGwuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA0KQotIENocmlzIGZvdW5kIGEgcmFjZSBjb25kaXRpb24gcmVzdWx0aW5nIGluIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIGFuZAogIHBvdGVudGlhbCBjcmFzaCwgaW4gdGhlIHdpbmRvd3MgdGhyZWFkZWQgbmFtZSByZXNvbHZlciBjb2RlLgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwNCkKLSBSZXBsYWNlZCB0aGUgdXNlIG9mIGlzc3BhY2UoKSBpbiBjb29raWUuYyB3aXRoIG91ciBvd24gdmVyc2lvbiBpbnN0ZWFkIHNpbmNlCiAgd2UgaGF2ZSBtb3N0IGRhdGEgYXMgJ2NoYXIgKicgYW5kIHRoYXQgbWFrZXMgdXMgcGFzcyBpbiBuZWdhdGl2ZSB2YWx1ZXMgaWYKICB0aGVyZSBpcyA4Yml0IGRhdGEgaW4gdGhlIHN0cmluZy4gQ2hhbmdpbmcgdG8gdW5zaWduZWQgY2F1c2VzIHRvbyBtdWNoCiAgd2FybmluZ3Mgb3IgdG9vIG1hbnkgcmVxdWlyZWQgdHlwZWNhc3RzIHRvIHRoZSBub3JtYWwgc3RyaW5nIGZ1bmN0aW9ucy4KICBIYXJzaGFsIFByYWRoYW4gaWRlbnRpZmllZCB0aGlzIHByb2JsZW0uCgpEYW5pZWwgKDIgT2N0b2JlciAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZvdW5kIGEgY2FzZSB3aGVyZSBsaWJjdXJsIGNvdWxkIHJlYWQgYWxyZWFkeSBmcmVlZAogIGRhdGEgd2hlbiBDVVJMT1BUX1ZFUkJPU0UgaXMgdXNlZCBhbmQgYSAodmVyeSkgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBJdAogIGhhcHBlbmVkIHdoZW4gdGhlIGRucyBjYWNoZSBlbnRyeSBmb3IgdGhlIGNvbm5lY3Rpb24gd2FzIHBydW5lZCB3aGlsZSB0aGUKICBjb25uZWN0aW9uIHdhcyBzdGlsbCBhbGl2ZSBhbmQgdGhlbiBhZ2FpbiByZS11c2VkLiBXZSB3b3JrZWQgdG9nZXRoZXIgb24KICB0aGlzIGZpeC4KCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgY29kZSB0aGF0IGRpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUgKGxpYmlkbgogIGJhc2VkKSBJRE4gY29udmVyc2lvbiBmYWlscy4gVGhpcyBpcyByZWFsbHkgZHVlIHRvIGEgbWlzc2luZyBzdWl0YWJsZQogIGZ1bmN0aW9uIGluIHRoZSBsaWJpZG4gQVBJIHRoYXQgSSBob3BlIHdlIGNhbiByZW1vdmUgb25jZSBsaWJpZG4gZ2V0cyBhCiAgZnVuY3Rpb24gbGlrZSB0aGlzLgoKRGFuaWVsICgxIE9jdG9iZXIgMjAwNCkKLSBBbGVrc2FuZGFyIE1pbGl2b2pldmljIHJlcG9ydGVkIGEgcHJvYmxlbSBpbiB0aGUgUmVkaGF0IGJ1Z3ppbGxhIChzZWUKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEzNDEzMykgYW5kIG5vdCB0bwogIGFueW9uZSBpbnZvbHZlZCBpbiB0aGUgY3VybCBwcm9qZWN0ISBUaGlzIGhhcHBlbnMgd2hlbiB5b3UgdHJ5IHRvIGN1cmwgYQogIGZpbGUgZnJvbSBhIHByb2Z0cGQgc2l0ZSB1c2luZyBTU0wuIEl0IHNlZW1zIHByb2Z0cGQgc2VuZHMgYSBzb21ld2hhdAogIHVub3J0aG9kb3ggcmVzcG9uc2UgY29kZSAoMjMyIGluc3RlYWQgb2YgMjMwKS4gSSByZWxheGVkIHRoZSByZXNwb25zZSBjb2RlCiAgY2hlY2sgdG8gZGVhbCB3aXRoIHRoaXMgYW5kIHNpbWlsYXIgY2FzZXMuCgotIEJhc2VkIG9uIEZlZG9yIEthcnBlbGV2aXRjaCdzIGZvcm1wb3N0IHBhdGggYmFzZW5hbWUgcGF0Y2gsIGZpbGUgcGFydHMgaW4KICBmb3JtcG9zdHMgbm8gbG9uZ2VyIGluY2x1ZGUgdGhlIHBhdGggcGFydC4gSWYgeW91IF9yZWFsbHlfIHdhbnQgdGhlbSwgeW91CiAgbXVzdCBwcm92aWRlIHlvdXIgcHJlZmVycmVkIGZ1bGwgZmlsZSBuYW1lIHdpdGggQ1VSTEZPUk1fRklMRU5BTUUuCgogIEFkZGVkIGRldGVjdGlvbiBmb3IgbGliZ2VuLmggYW5kIGJhc2VuYW1lKCkgdG8gY29uZmlndXJlLiBNeSBjdXN0b20KICBiYXNlbmFtZSgpIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQsIG1pZ2h0IGJlIGEgYml0IHRvbwogIG5haXZlLi4uCgogIFVwZGF0ZWQgNiB0ZXN0IGNhc2VzIHRvIG1ha2UgdGhlbSB3b3JrIHdpdGggdGhlIHN0cmlwcGVkIHBhdGhzLgoKRGFuaWVsICgzMCBTZXB0ZW1iZXIgMjAwNCkKLSBMYXJyeSBDYW1wYmVsbCBhZGRlZCBDVVJMSU5GT19PU19FUlJOTyB0byBjdXJsX2Vhc3lfZ2V0aW5mbygpIHRoYXQgYWxsb3dzIGFuCiAgYXBwIHRvIHJldHJpZXZlIHRoZSBlcnJubyB2YXJpYWJsZSBhZnRlciBhIChjb25uZWN0KSBmYWlsdXJlLiBJdCB3aWxsIG1ha2UKICBzZW5zZSB0byBwcm92aWRlIHRoaXMgZm9yIG1vcmUgZmFpbHVyZXMgaW4gYSBtb3JlIGdlbmVyaWMgd2F5LCBidXQgbGV0J3MKICBzdGFydCBsaWtlIHRoaXMuCgotIEf8bnRlciBLbmF1ZiBhbmQgQ2FzZXkgTydEb25uZWxsIHdvcmtlZCBvdXQgYW4gZXh0cmEgI2lmIGNvbmRpdGlvbiBmb3IgdGhlCiAgY3VybC9tdWx0aS5oIGhlYWRlciB0byB3b3JrIGJldHRlciBpbiB3aW5zb2NrLXVzaW5nIGFwcHMuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgbWFkZSBidWlsZGNvbmYgcnVuIGJldHRlciBvbiBNYWMgT1MgWCBieQogIHByb3Blcmx5IHVzaW5nIGdsaWJ0b29saXplIGluc3RlYWQgb2YgcGxhaW4gbGlidG9vbGl6ZS4gKFRoaXMgaXMgbWFkZSBpZgogIGdsaWJ0b29sIHdhcyBmb3VuZCBhbmQgdXNlZCBpbnN0ZWFkIG9mIHBsYWluIGxpYnRvb2wuKQoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCBjdXJsX2Vhc3lfcmVzZXQoKSBzbyB0aGF0IGl0IGRvZXNuJ3QgbWlzdGFraW5nbHkKICBlbmFibGUgdGhlIHByb2dyZXNzIG1ldGVyLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwNCkKLSAiTWVrb25pa3VtIiBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgYnVpbHQgY3VybCB3aXRob3V0IFNTTCBzdXBwb3J0LCBhbHRob3VnaAogIHlvdXIgY3VycmVudCBTU0wgaW5zdGFsbGF0aW9uIHN1cHBvcnRzIEVuZ2luZSwgdGhlIGNvbXBpbGUgZmFpbHMuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDA0KQotIFdoZW4gLS13aXRoLXNzbD1QQVRIIGlzIHVzZWQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGl0IG5vIGxvbmdlciB1c2VzCiAgcGtnLWNvbmZpZyB0byBmaWd1cmUgb3V0IGV4dHJhIGRldGFpbHMuIFRoYXQgaXMgbm93IG9ubHkgZG9uZSBpZiBubyBQQVRIIGlzCiAgaW5jbHVkZWQgb3IgaWYgU1NMIGlzIGNoZWNrZWQgZm9yIGJ5IGRlZmF1bHQgd2l0aG91dCB0aGUgLS13aXRoLXNzbCBvcHRpb24uCgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCB0aGF0IENVUkxPUFRfU1NMRU5HSU5FIGNvdWxkbid0IGV2ZW4gYmUgc2V0IHRvCiAgTlVMTCB3aGVuIG5vIGVuZ2luZSB3YXMgc3VwcG9ydGVkLiBJdCBjYW4gbm93LgoKRGFuaWVsICgyMiBTZXB0ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhyZWUgdGVzdCBjYXNlcyB0byBubyBsb25nZXIgdXNlICJsb2NhbGhvc3QiIGJ1dCBpbnN0ZWFkCiAgdXNlICIxMjcuMC4wLjEiIHRvIGF2b2lkIHJlcXVpcmluZyB0aGF0IGxvY2FsaG9zdCByZXNvbHZlcyBuaWNlbHkuCgotIEplYW4tQ2xhdWRlIENoYXV2ZSBmaXhlZCBhbiBMREFQIGNyYXNoIHdoZW4gbW9yZSB0aGFuIG9uZSByZWNvcmQgd2FzCiAgcmV0cmlldmVkLgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwNCkKLSBBbmRyZWFzIFJpZWtlIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IHdpdGhvdXQKICBhIHNlcnZpY2Ugb24gdGhlIHNwZWNpZmllZCBwb3J0LCBjdXJsX2Vhc3lfcGVyZm9ybSgpIGRpZG4ndCBwcm9wZXJseSBwcm92aWRlCiAgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgQ1VSTE9QVF9FUlJPUkJVRkZFUiBidWZmZXIuCgpEYW5pZWwgKDE2IFNlcHRlbWJlciAyMDA0KQotIERhbmllbCBhdCB0b3VjaHR1bmVzIHVzZXMgdGhlIEZUUCtTU0wgc2VydmVyICJCU0RGVFBELVNTTCBmcm9tCiAgaHR0cDovL2JzZGZ0cGQtc3NsLnNjLnJ1LyIgd2hpY2ggYWNjb3JkaW5nbHkgZG9lc24ndCBwcm9wZXJseSB3b3JrIHdpdGggY3VybAogIHdoZW4gIkFVVEggU1NMIiBpcyBpc3N1ZWQgKGFsdGhvdWdoIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgZmluZSBhbmQgZXZlcnl0aGluZykKICBidXQgcmVxdWlyZXMgdGhhdCBjdXJsIGlzc3VlcyAiQVVUSCBUTFMiIGluc3RlYWQuIFNlZQogIGh0dHA6Ly9jdXJsLmhheHguc2UvZmVlZGJhY2svZGlzcGxheS5jZ2k/aWQ9MTA5NTE5NDQ5Mzc2MDMmc3VwcG9ydD15ZXMKCiAgSW50cm9kdWNpbmcgQ1VSTE9QVF9GVFBTU0xBVVRIIHRoYXQgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzZWxlY3Qgd2hpY2gKICBvZiB0aGUgQVVUSCBzdHJpbmdzIHRvIGF0dGVtcHQgZmlyc3QuCgotIEFub255bW91cyBmaWxlZCBidWcgcmVwb3J0ICMxMDI5NDc4IHdoaWNoIGlkZW50aWZpZWQgYSBidWcgd2hlbiB5b3UgMSkgdXNlZAogIGEgVVJMIHdpdGhvdXQgcHJvcGVybHkgc2VwZXJhdGluZyB0aGUgaG9zdCBuYW1lIGFuZCB0aGUgcGFyYW1ldGVycyB3aXRoIGEKICBzbGFzaC4gMikgdGhlIFVSTCBoYWQgcGFyYW1ldGVycyB0byB0aGUgcmlnaHQgb2YgYSA/IHRoYXQgY29udGFpbnMgYSBzbGFzaAogIDMpIGN1cmwgd2FzIHRvbGQgdG8gZm9sbG93IExvY2F0aW9uOnMgNCkgdGhlIHJlcXVlc3QgZ290IGEgcmVzcG9uc2UgdGhhdAogIGNvbnRhaW5lZCBhIExvY2F0aW9uOiB0byByZWRpcmVjdCB0byAiL2RpciIuIGN1cmwgdGhlbiBhcHBlbmRlZCB0aGUgbmV3IHBhdGgKICBvbiB0aGUgd3JvbmcgcG9zaXRpb24gb2YgdGhlIG9yaWdpbmFsIFVSTC4KCiAgVGVzdCBjYXNlIDE4NyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyB3YXMgZml4ZWQgcHJvcGVybHkuCgpEYW5pZWwgKDExIFNlcHRlbWJlciAyMDA0KQotIEFkZGVkIHBhcnNlZGF0ZS5jIHRoYXQgY29udGFpbnMgYSByZXdyaXRlIG9mIHRoZSBkYXRlIHBhcnNlciBjdXJyZW50bHkKICBwcm92aWRlZCBieSBnZXRkYXRlLnkuIFRoZSBuZXcgb25lIGlzIE1VQ0ggc21hbGxlciBhbmQgd2lsbCBhbGxvdyB1cyB0byBydW4KICBhd2F5IGZyb20gdGhlIHlhY2MvYmlzb24ganVuZ2xlLiBJdCBpcyBhbHNvIHNsaWdodGx5IGxhY2tpbmcgaW4gZmVhdHVyZXMKICBjb21wYXJlZCB0byB0aGUgb2xkIG9uZSwgYnV0IGl0IHN1cHBvcnRzIHBhcnNpbmcgb2YgYWxsIGRhdGUgZm9ybWF0cyBIVFRQCiAgaW52b2x2ZXMgKGFuZCBhIGZhaXIgYnVuY2ggb2Ygb3RoZXJzKS4KCkRhbmllbCAoMTAgU2VwdGVtYmVyIDIwMDQpCi0gQXMgZm91bmQgb3V0IGJ5IEpvbmFzIEZvcnNtYW4sIGN1cmwgZGlkbid0IGFsbG93IC1GIHRvIHNldCBDb250ZW50LVR5cGUgb24KICB0ZXh0LXBhcnRzLiBTdGFydGluZyBub3csIHdlIGNhbiBkbyAtRiAibmFtZT1kYW5pZWw7dHlwZT10ZXh0L2V4dHJhIi4gQWRkZWQKICB0ZXN0IGNhc2UgMTg2IHRvIHZlcmlmeS4KCi0gQnVnIHJlcG9ydCAjMTAyNTk4Ni4gV2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjogd2l0aCBhIGN1c3RvbSBIb3N0OiBoZWFkZXIKICByZXBsYWNlbWVudCwgY3VybCBvbmx5IHJlcGxhY2VkIHRoZSBIb3N0OiBoZWFkZXIgb24gdGhlIGluaXRpYWwgcmVxdWVzdAogIGFuZCBkaWRuJ3QgcmVwbGFjZSBpdCBvbiB0aGUgZm9sbG93aW5nIG9uZXMuIFRoaXMgcmVzdWx0ZWQgaW4gcmVxdWVzdHMgd2l0aAogIHR3byBIb3N0OiBoZWFkZXJzLgoKICBOb3csIGN1cmwgY2hlY2tzIGlmIHRoZSBsb2NhdGlvbiBpcyBvbiB0aGUgc2FtZSBob3N0IGFzIHRoZSBpbml0aWFsIHJlcXVlc3QKICBhbmQgdGhlbiBjb250aW51ZXMgdG8gcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyLiBBbmQgd2hlbiBpdCBtb3ZlcyB0byBhbm90aGVyCiAgaG9zdCwgaXQgZG9lc24ndCByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIgYnV0IGl0IGFsc28gZG9lc24ndCBtYWtlIHRoZQogIHNlY29uZCBIb3N0OiBoZWFkZXIgZ2V0IHVzZWQgaW4gdGhlIHJlcXVlc3QuCgogIFRoaXMgY2hhbmdlIGlzIHZlcmlmaWVkIGJ5IHRoZSB0d28gbmV3IHRlc3QgY2FzZXMgMTg0IGFuZCAxODUuCgpEYW5pZWwgKDggU2VwdGVtYmVyIDIwMDQpCi0gTW9kaWZpZWQgdGhlIHRlc3Qgc3VpdGUgdG8gYmUgYWJsZSB0byB1c2UgYW5kIHJ1biB3aXRoIGN1c3RvbWl6ZWQgcG9ydAogIG51bWJlcnMuIFRoaXMgd2FzIGFsd2F5cyBpbnRlbmRlZCBidXQgbmV2ZXIgYmVmb3JlIHBvc3NpYmxlLiBOb3cgYSBzaW1wbGUKICBjaGFuZ2UgaW4gdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBjYW4gbWFrZSBhbGwgdGVzdHMgdXNlIGRpZmZlcmVudCBwb3J0cy4KICBUaGUgZGVmYXVsdCBwb3J0cyBpbiB1c2UgZnJvbSBub3cgb24gYXJlIDg5OTAgdG8gODk5My4KCkRhbmllbCAoMiBTZXB0ZW1iZXIgMjAwNCkKLSBNaW5vciBtb2RpZmljYXRpb24gb2YgYW4gU1NMLXJlbGF0ZWQgZXJyb3IgbWVzc2FnZS4KCkRhbmllbCAoMzEgQXVndXN0IDIwMDQpCi0gRGF2aWQgVGFyZW5kYXNoIGZvdW5kIG91dCB0aGF0IGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgpIHJldHVybmVkCiAgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGluc3RlYWQgb2YgQ1VSTE1fT0suCgpEYW5pZWwgKDMwIEF1Z3VzdCAyMDA0KQotIE1ha2UgIlByb3h5LUNvbm5lY3Rpb246IGNsb3NlIiBjbG9zZSB0aGUgY3VycmVudCBwcm94eSBjb25uZWN0aW9uLCBhcyBSb21hbgogIEtvaWZtYW4gZm91bmQgb3V0LgoKRGFuaWVsICgyNCBBdWd1c3QgMjAwNCkKLSBGaXhlZCBhIGdldGRhdGUgcHJvYmxlbSBieSBwb3N0LXJlcGxhY2luZyB0aGUgZ2V0ZGF0ZS5jIGZpbGUgYWZ0ZXIgdGhlCiAgYmlzb24veWFjYyBwcm9jZXNzIHRvIGFkZCB0aGUgZml4IEhhcnNoYWwgUHJhZGhhbiBzdWdnZXN0ZWQuIFRoZSBwcm9ibGVtCiAgY2F1c2VkIGEgY3Jhc2ggb24gV2luZG93cyB3aGVuIHBhcnNpbmcgc29tZSBkYXRlcy4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDQpCi0gUm9tYW4gS29pZm1hbiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgc2VuZCBFeHBlY3Q6IDEwMC1jb250aW51ZSBvbiBQT1NUcwogIGV2ZW4gd2hlbiB0b2xkIHRvIHVzZSBIVFRQIDEuMCwgd2hpY2ggaXMgbm90IGNvcnJlY3QuIFRlc3QgY2FzZSAxODAgYW5kCiAgMTgxIHZlcmlmeSB0aGlzLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMTgyIHRvIHZlcmlmeSB0aGF0IHplcm8gYnl0ZSB0cmFuc2ZlcnMgY2FsbCB0aGUgY2FsbGJhY2sKICBwcm9wZXJseS4KCkRhbmllbCAoMjAgQXVndXN0IDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSB0aGUgd3JpdGUgY2FsbGJhY2sgZ2V0IGNhbGxlZCBldmVuIHdoZW4gYSB6ZXJvCiAgYnl0ZSBmaWxlIGlzIGRvd25sb2FkZWQuCgpEYW5pZWwgKDE4IEF1Z3VzdCAyMDA0KQotIExpbmcgVGhpbyBwb2ludGVkIG91dCB0aGF0IHdoZW4gbGliY3VybCBpcyBidWlsdCBpcHY2LWVuYWJsZWQsIGl0IHN0aWxsIGRpZAogIHJldmVyc2UgRE5TIGxvb2t1cHMgd2hlbiBmZWQgd2l0aCBhIG51bWVyaWNhbCBJUC1hZGRyZXNzIChsaWtlCiAgaHR0cDovLzEyNy4wLjAuMS8pLCBhbHRob3VnaCBpdCBkb2Vzbid0IHdoZW4gYnVpbHQgaXB2Ni1kaXNhYmxlZC4gbGliY3VybAogIHNob3VsZCBuZXZlciBkbyByZXZlcnNlIGxvb2t1cHMuCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDA0KQotIEtqZXRpbCBKYWNvYnNlbiBub3RpY2VkIHRoYXQgd2hlbiB0cmFuc2ZlcnJpbmcgYSBmaWxlOi8vIFVSTCBwb2ludGluZyB0byBhbgogIGVtcHR5IGZpbGUsIGxpYmN1cmwgd291bGQgcmV0dXJuIHdpdGggdGhlIGZpbGUgc3RpbGwgb3Blbi4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBuZWVkcyB0byBkZWZpbmUKICBfVEhSRUFEX1NBRkUgZm9yIEFJWCBzeXN0ZW1zIHRvIG1ha2UgbGliY3VybCBidWlsdCByZWFsbHkgdGhyZWFkLXNhZmUuCgogIEFsc28gYWRkZWQgYSBjaGVjayBmb3IgdGhlIHhsYyBjb21waWxlciBvbiBBSVgsIGFuZCBpZiB0aGF0IGlzIGRldGVjdCB3ZSB1c2UKICB0aGUgLXF0aHJlYWRlZCBjb21waWxlciBvcHRpb24KCkRhbmllbCAoMTYgQXVndXN0IDIwMDQpCi0gbGliY3VybCBub3cgYWxsb3dzIGEgY3VzdG9tICJBY2NlcHQtRW5jb2Rpbmc6IiBoZWFkZXIgb3ZlcnJpZGUgdGhlCiAgaW50ZXJuYWxseSBzZXQgb25lIHRoYXQgZ2V0cyBzZXQgd2l0aCBDVVJMT1BUX0VOQ09ESU5HLiBQb2ludGVkIG91dCBieSBBbGV4LgoKLSBSb2xhbmQgS3Jpa2F2YSBmb3VuZCBhbmQgZml4ZWQgYSBjb29raWUgcHJvYmxlbSB3aGVuIHVzaW5nIGEgcHJveHkgKHRoZQogIHBhdGggbWF0Y2hpbmcgd2FzIHdyb25nKS4gSSBhZGRlZCB0ZXN0IGNhc2UgMTc5IHRvIHZlcmlmeSB0aGF0IHdlIG5vdyBkbwogIHJpZ2h0LgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwNCkKLSBDYXNleSBPJ0Rvbm5lbGwgZml4ZWQgc29tZSBNU1ZDIG1ha2VmaWxlIHRhcmdldHMgdG8gbGluayBwcm9wZXJseS4KCkRhbmllbCAoMTEgQXVndXN0IDIwMDQpCi0gY29uZmlndXJlIG5vdyBkZWZpbmVzIF9YT1BFTl9TT1VSQ0UgdG8gNTAwIG9uIHN5c3RlbXMgdGhhdCBuZWVkIGl0IHRvIGJ1aWxkCiAgd2FybmluZy1mcmVlICh0aGUgb25seSBrbm93biBvbmUgc28gZmFyIGlzIG5vbi1nY2MgYnVpbGRzIG9uIDY0Yml0IFNHSQogIElSSVgpLiAoUmV2ZXJ0ZWQgdGhpcyBjaGFuZ2UgbGF0ZXIgYXMgaXQgY2F1c2VkIGNvbXBpbGVyIGVycm9ycy4pCgotIHRoZSBGVFAgY29kZSBub3cgaW5jbHVkZXMgdGhlIHNlcnZlciByZXNwb25zZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZQogIHNlcnZlciBnaXZlcyBiYWNrIGEgNTMwIGFmdGVyIHRoZSBwYXNzd29yZCBpcyBwcm92aWRlZCwgYXMgaXQgaXNuJ3QKICBuZWNlc3NhcnkgYmVjYXVzZSBvZiBhIGJhZCB1c2VyIG5hbWUgb3IgcGFzc3dvcmQuCgpWZXJzaW9uIDcuMTIuMSAoMTAgQXVndXN0IDIwMDQpCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDA0KQotIEluIE9wZW5TU0wgMC45LjdkIGFuZCBlYXJsaWVyLCBBU04xX1NUUklOR190b19VVEY4IGZhaWxzIGlmIHRoZSBpbnB1dCBpcwogIGFscmVhZHkgVVRGLTggZW5jb2RlZC4gVGhpcyBtYWRlIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gZmFpbCBpZiB0aGUKICByZW1vdGUgc2VydmVyIHVzZWQgYSBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBuYW1lIFVURi04IGVuY29kZWQuCgogIFdvcmstYXJvdW5kIGJyb3VnaHQgYnkgQWxleGlzIFMuIEwuIENhcnZhbGhvLgoKRGFuaWVsICg5IEF1Z3VzdCAyMDA0KQotIEkgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGtyYjQgdG8gdXNlIC1sY29tX2VyciBhcyB3ZWxsLCBhcyBJIHN0YXJ0ZWQKICB0byBnZXQgbGluayBwcm9ibGVtcyB3aXRoIGl0IHVubGVzcyBJIGRpZCB0aGF0IG9uIG15IFNvbGFyaXMgMi43IGJveC4gSQogIGRvbid0IHVuZGVyc3RhbmQgd2h5IEkgc3RhcnRlZCB0byBnZXQgcHJvYmxlbXMgd2l0aCB0aGlzIG5vdyEKCkRhbmllbCAoNSBBdWd1c3QgMjAwNCkKLSBFbnJpY28gU2Nob2x6IGZpeGVkIHRoZSBIVFRQLU5lZ290aWF0ZSBzZXJ2aWNlIG5hbWUgdG8gYmUgdXBwZXJjYXNlIGFzCiAgcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjMTAwNDEwNQoKRGFuaWVsICg0IEF1Z3VzdCAyMDA0KQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGEgZml4IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBjb25uZWN0aW5nIHRvIGEgaG9zdAogIHVzaW5nIG11bHRpcGxlIElQIChiYWQpIGFkZHJlc3Nlcy4KCi0gRHlsYW4gU2FsaXNidXJ5IG1hZGUgbGliY3VybCBubyBsb25nZXIgYWNjZXB0IGNvb2tpZXMgc2V0IHRvIGEgVExEIG9ubHkgKGl0CiAgcHJldmlvdXNseSBhbGxvd2VkIHRoYXQgb24gdGhlIHNldmVuIHRocmVlLWxldHRlciBkb21haW5zKS4KCkRhbmllbCAoMzEgSnVseSAyMDA0KQotIEpvZWwgQ2hlbiByZXBvcnRlZCB0aGF0IHRoZSBkaWdlc3QgY29kZSBhc3N1bWVkIHF1b3RlcyBhcm91bmQgdGhlIGNvbnRlbnRzIGEKICBiaXQgdG9vIG11Y2guCgpEYW5pZWwgKDI4IEp1bHkgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCB0aGUgaG9zdCBuYW1lIHRvIGdldCBzZXR1cCBwcm9wZXJseSBldmVuIHdoZW4gYQogIGNvbm5lY3Rpb24gaXMgcmUtdXNlZCwgd2hlbiBhIHByb3h5IGlzIGluIHVzZS4gUHJldmlvdXNseSB0aGUgd3JvbmcgSG9zdDoKICBoZWFkZXIgY291bGQgZ2V0IHNlbnQgd2hlbiByZS11c2luZyBhIHByb3h5IGNvbm5lY3Rpb24gdG8gYSBkaWZmZXJlbnQgdGFyZ2V0CiAgaG9zdC4KCi0gRml4ZWQgQnJpYW4gQWtpbnMnIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggZHVwbGljYXRlIEhvc3Q6IGhlYWRlcnMgb24gcmUtdXNlZAogIGNvbm5lY3Rpb25zLiBJZiB5b3UgYXR0ZW1wdGVkIHRvIHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlciBpbiB0aGUgc2Vjb25kCiAgcmVxdWVzdCwgeW91IGdvdCB0d28gc3VjaCBoZWFkZXJzIQoKLSBzcmMvTWFrZWZpbGUuYW0gbm93IGluY2x1ZGVzIHRoZSBNYWtlZmlsZS5pbmMgZmlsZSB0byBnZXQgaW5mbyBhYm91dCBmaWxlcwoKRGFuaWVsICgyNiBKdWx5IDIwMDQpCi0gTWFkZSAiY3VybCBbVVJMXSAtbyBuYW1lIzIiIHdvcmsgYXMgZXhwZWN0ZWQuIElmIHRoZXJlJ3Mgbm8gZ2xvYmJpbmcgZm9yIHRoZQogICMtbnVtYmVyLCBpdCB3aWxsIHNpbXBseSBiZSB1c2VkIGFzICMyIGluIHRoZSBmaWxlIG5hbWUuCgotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIHRlc3Rpbmcgd2l0aCB2YWxncmluZCAyLjEueCBhbmQgYWRkZWQgdHdvIG1pc3NpbmcKICBuZXdsaW5lcyBpbiB0aGUgY29va2llIGluZm9ybWF0aW9uYWxzLgoKRGFuaWVsICgyNCBKdWx5IDIwMDQpCi0gSSBmaXhlZCB0aGUgYXV0b2J1aWxkcyB3aXRoIGFyZXMsIHNpbmNlIHRoZXkgbm93IG5lZWQgdG8gaGF2ZSBidWlsZGNvbmYgcnVuCiAgaW4gdGhlIGFyZXMgZGlyIGJlZm9yZSB0aGUgY29uZmlndXJlIHNjcmlwdCBpcyBydW4uCgotIEFkZGVkIENhc2V5IE8nRG9ubmVsbCdzIGN1cmxfZWFzeV9yZXNldCgpIGZ1bmN0aW9uLiBJdCBoYXMgYSBwcm90byBpbgogIGN1cmwvY3VybC5oIGJ1dCB3ZSBoYXZlIG5vIG1hbiBwYWdlIHlldC4KCkRhbmllbCAoMjAgSnVseSAyMDA0KQotIEFkZGVkIGJ1aWxkY29uZiBhbmQgYnVpbGRjb25mLmJhdCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlcywgc2luY2UgdGhleSBhcmUKICBoYW5keSBmb3IgcmVidWlsZGluZyBjdXJsIHdoZW4gdXNpbmcgYSBkYWlseSBzbmFwc2hvdCAoYW5kIG5vdCBhIHB1cmUgQ1ZTCiAgY2hlY2tvdXQpLgoKRGFuaWVsICgxNiBKdWx5IDIwMDQpCi0gQXMgc3VnZ2VzdGVkIGJ5IFRvYnkgUGV0ZXJzb24sIGxpYmN1cmwgbm93IGlnbm9yZXMgQ29udGVudC1MZW5ndGggZGF0YSBpZiB0aGUKICBnaXZlbiBzaXplIGlzIGEgbmVnYXRpdmUgbnVtYmVyLiBUZXN0IGNhc2UgMTc4IHZlcmlmaWVzIHRoaXMuCgpEYW5pZWwgKDE0IEp1bHkgMjAwNCkKLSBH/G50ZXIgS25hdWYgaGFzIG1hZGUgdGhlIE5ldHdhcmUgYnVpbGRzIGRvIHdpdGhvdXQgdGhlIGNvbmZpZy1uZXR3YXJlLmgKICBmaWxlcywgc28gdGhleSBhcmUgbm93IHJlbW92ZWQgZnJvbSB0aGUgZGlzdCBwYWNrYWdlcy4KCi0gR/xudGVyIEtuYXVmIG1hZGUgY3VybCBhbmQgbGliY3VybCBidWlsZCB3aXRoIEJvcmxhbmQgYWdhaW4uCgotIEFuZHJlcyBHYXJjaWEgZml4ZWQgdGhlIGNvbW1vbiB0ZXN0IDUwNSBmYWlsdXJlcyBvbiB3aW5kb3dzLgoKRGFuaWVsICg2IEp1bHkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIGZvdW5kIG91dCB3aHkgdGhlIHdpbmRvd3MgdGVzdHMgZmFpbGVkIG9uIGZpbGU6Ly8gInVwbG9hZHMiLgoKRGFuaWVsICgyIEp1bHkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIHJlcG9ydGVkIGEgY3VybF9zaGFyZV9jbGVhbnVwKCkgY3Jhc2ggdGhhdCBvY2N1cnMgd2hlbiBubwogIGxvY2svdW5sb2NrIGNhbGxiYWNrcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGUgc2hhcmUgaXMgY2xlYW5lZCB1cC4KCkRhbmllbCAoMSBKdWx5IDIwMDQpCi0gV2hlbiB1c2luZyBjdXJsIC0tdHJhY2Ugb3IgLS10cmFjZS1hc2NpaSwgbm8gdHJhY2UgbWVzc2FnZXMgdGhhdCB3ZXJlIHNlbnQKICBieSBjdXJsX2Vhc3lfY2xlYW51cCgpIHdlcmUgaW5jbHVkZWQgaW4gdGhlIHRyYWNlIGZpbGUuIFRoaXMgbWFkZSB0aGUKICBtZXNzYWdlICJDbG9zaW5nIGNvbm5lY3Rpb24gIzAiIG5ldmVyIGFwcGVhciBpbiB0cmFjZSBkdW1wcy4KCkRhbmllbCAoMzAgSnVuZSAyMDA0KQotIE5pZWxzIHZhbiBUb25nZXJlbiBmb3VuZCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9OT0JPRFkgdG8gVFJVRSBkb2Vzbid0IGRpc2FibGUKICBhIHByZXZpb3VzbHkgc2V0IFBPU1QgcmVxdWVzdCwgbWFraW5nIGEgdmVyeSBvZGQgcmVxdWVzdCBnZXQgc2VudCAodW5sZXNzCiAgeW91IGRpc2FibGVkIHRoZSBQT1NUKSBhIEhFQUQgcmVxdWVzdCB3aXRoIGEgUE9TVCByZXF1ZXN0LWJvZHkuIEkndmUgbm93CiAgbWFkZSBDVVJMT1BUX05PQk9EWSBlbmZvcmNlIGEgcHJvcGVyIEhFQUQuIEFkZGVkIHRlc3QgY2FzZSA1MTQgZm9yIHRoaXMuCgpEYW5pZWwgKDI5IEp1bmUgMjAwNCkKLSBH/G50ZXIgS25hdWYgbWFkZSB0aGUgdGVzdGN1cmwucGwgc2NyaXB0IGNhcGFibGUgb2YgdXNpbmcgYSBjdXN0b20gc2V0dXAKICBmaWxlIHRvIGVhc2llciBydW4gbXVsdGlwbGUgYXV0b2J1aWxkcyBvbiB0aGUgc2FtZSBzb3VyY2UgdHJlZS4KCi0gR2lzbGUgZml4ZWQgdGhlIGRqZ3BwIGJ1aWxkIGFuZCBmaXhlZCBhIG1lbW9yeSBwcm9ibGVtIGluIHNvbWUgb2YgdGhlCiAgcmVvcmdlZCBuYW1lIHJlc29sdmVkIGNvZGUuCgotIEZpeGVkIGNvZGUgdG8gYWxsb3cgY29ubmVjdHMgZG9uZSB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIHRvIGF0dGVtcHQgdGhlCiAgbmV4dCBJUCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBob3N0IHRoYXQgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgSVBzIGFuZCBhCiAgY29ubmVjdCBhdHRlbXB0IGZhaWxzLgoKRGFuaWVsICgyNyBKdW5lIDIwMDQpCi0gQmFzZWQgb24gUm9iIFN0YW56ZWwncyBidWcgcmVwb3J0ICM5Nzk0ODAsIEkgd3JvdGUgYSBjb25maWd1cmUgY2hlY2sgdGhhdAogIGNoZWNrcyBpZiBwb2xsKCkgY2FuIGJlIHVzZWQgdG8gd2FpdCBvbiBOVUxMIGFzIG90aGVyd2lzZSBzZWxlY3QoKSBzaG91bGQgYmUKICB1c2VkIHRvIGRvIGl0LiBUaGUgc2VsZWN0KCkgdXNhZ2Ugd2FzIGFsc28gZml4ZWQgYWNjb3JkaW5nIHRvIGhpcyByZXBvcnQuCgogIE1hYyBPUyBYIDEwLjMgc2F5cyAicG9sbCgpIGZ1bmN0aW9uYWxpdHkgZm9yIE1hYyBPUyBYIGlzIGltcGxlbWVudGVkIHZpYSBhbgogIGVtdWxhdGlvbiBsYXllciBvbiB0b3Agb2Ygc2VsZWN0KCksIG5vdCBpbiB0aGUga2VybmVsIGRpcmVjdGx5LiBJdCBpcwogIHJlY29tbWVuZGVkIHRoYXQgcHJvZ3JhbXMgcnVubmluZyB1bmRlciBPUyBYIDEwLjMgcHJlZmVyIHNlbGVjdCgpIG92ZXIKICBwb2xsKCkuIENvbmZpZ3VyZSBzY3JpcHRzIHNob3VsZCBsb29rIGZvciB0aGUgX1BPTExfRU1VTF9IXyBkZWZpbmUgKGluc3RlYWQKICBvZiBfUE9MTF9IXyBvciBfU1lTX1BPTExfSF8pIGFuZCBhdm9pZCBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgcG9sbCBpcyBub3QKICBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLiIKCiAgWWVzLCB3ZSBjYW4gcHJvYmFibHkgdXNlIHNlbGVjdCgpIG9uIG1vc3QgcGxhdGZvcm1zIGJ1dCB0b2RheSBJIHByZWZlcmVkIHRvCiAgbGVhdmUgdGhlIGNvZGUgdW5hbHRlcmVkLgoKRGFuaWVsICgyNCBKdW5lIDIwMDQpCi0gVGhlIHN0YW5kYXJkIGN1cmxfdmVyc2lvbigpIHN0cmluZyBub3cgb25seSBpbmNsdWRlcyB2ZXJzaW9uIGluZm8gYWJvdXQKICBpbnZvbHZlZCBsaWJyYXJpZXMgYW5kIG5vdCBhYm91dCBwYXJ0aWN1bGFyIGZlYXR1cmVzLiBUaHVzIGl0IHdpbGwgbm8gbG9uZ2VyCiAgaW5jbHVkZSBpbmZvIGFib3V0IGlwdjYgbm9yIEdTUy4gVGhhdCBpbmZvIGlzIG9mIGNvdXJzZSBzdGlsbCBhdmFpbGFibGUgaW4KICB0aGUgZmVhdHVyZSBiaXRtYXNrIGN1cmxfdmVyc2lvbl9pbmZvKCkgb2ZmZXJzLgoKLSBSZXBsYWNlZCBhbGwgb2NjdXJhbmNlcyBvZiBzcHJpbnRmKCkgd2l0aCBzbnByaW50ZigpLiBUaGlzIGlzIG1vc3RseSBiZWNhdXNlCiAgaXQgaXMgIkEgR29vZCBUaGluZyIgcmF0aGVyIHRoYW4gYWN0dWFsbHkgZml4aW5nIGFueSBrbm93biBwcm9ibGVtLiBUaGlzCiAgd2lsbCBoZWxwIHByZXZlbnRpbmcgZnV0dXJlIHBvc3NpYmxlIG1pc3Rha2VzIHRvIGNhdXNlIGJ1ZmZlciBvdmVyZmxvd3MuCgotIE1ham9yIHJlb3JnYW5pemF0aW9uIGluIHRoZSBob3N0IHJlc29sdmUgY29kZSAoYWdhaW4pLiBUaGlzIHRpbWUsIEkndmUKICBtb2RpZmllZCB0aGUgY29kZSB0byBub3cgYWx3YXlzIHVzZSBhIGxpbmtlZCBsaXN0IG9mIEN1cmxfYWRkcmluZm8gc3RydWN0cwogIHRvIHJldHVybiByZXNvbHZlZCBpbmZvIGluLCBubyBtYXR0ZXIgd2hhdCByZXNvbHZlciBtZXRob2Qgb3Igc3VwcG9ydCB0aGF0CiAgaXMgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybS4gSXQgbWFrZXMgaXQgYSBsb3QgZWFzaWVyIHRvIHdyaXRlIGNvZGUgdGhhdAogIHVzZXMgb3IgZGVwZW5kcyBvbiByZXNvbHZlZCBkYXRhLgoKICBJbnRlcm5hbGx5LCB0aGlzIG1lYW5zIGFtb25nc3Qgb3RoZXIgdGhpbmdzIHRoYXQgd2UgY2FuIHN0b3AgZG9pbmcgdGhlIHdlaXJkCiAgImluY3JlYXNlIGJ1ZmZlciBzaXplIHVudGlsIGl0IHdvcmtzIiB0cmljayB3aGVuIHJlc29sdmluZyBob3N0cyBvbgogIGlwdjQtb25seSB3aXRoIGdldGhvc3RieW5hbWVfcigpLCB3ZSBzdXBwb3J0IHNvY2tzIGV2ZW4gb24gbGliY3VybHMgYnVpbHQKICB3aXRoIGlwdjYgZW5hYmxlZCAoYnV0IG9ubHkgdG8gc29ja3Mgc2VydmVycyB0aGF0IHJlc29sdmUgdG8gYW4gaXB2NAogIGFkZHJlc3MpIGFuZCB3ZSBubyBsb25nZXIgZGVlcC1jb3B5IG9yIHJlbG9jYXRlIGhvc3RlbnQgc3RydWN0cyAod2UgY3JlYXRlCiAgQ3VybF9hZGRyaW5mbyBjaGFpbnMgaW5zdGVhZCkuCgogIFRoZSBuZXcgImhvc3RlbnQgdG8gQ3VybF9hZGRyaW5mbyIgY29udmVydGVyIGZ1bmN0aW9uIGlzIG5hbWVkIEN1cmxfaGUyYWkoKQogIGFuZCBpcyBzbGlnaHRseSBuYWl2ZSBhbmQgc2ltcGxlLCB5ZXQgSSBiZWxpZXZlIGl0IGlzIGZ1bmN0aW9uYWwgZW5vdWdoIHRvCiAgd29yayBmb3IgbGliY3VybC4KCkRhbmllbCAoMjIgSnVuZSAyMDA0KQotIERhdmlkIENvaGVuIHBvaW50ZWQgb3V0IHRoYXQgUkZDMjEwOSBzYXlzIGNsaWVudHMgc2hvdWxkIGFsbG93IGNvb2tpZXMgdG8KICBjb250YWluIGxlYXN0IDQwOTYgYnl0ZXMgd2hpbGUgbGliY3VybCBvbmx5IGFsbG93ZWQgMjA0Ny4gSSByYWlzZWQgdGhlIGxpbWl0CiAgdG8gNDk5OSBub3cgYW5kIG1hZGUgdGhlIHVzZWQgYnVmZmVyIGdldCBtYWxsb2MoKWVkIGluc3RlYWQgb2Ygc2ltcGx5CiAgYWxsb2NhdGVkIG9uIHN0YWNrIGFzIGJlZm9yZS4gRXh0ZW5kZWQgdGVzdCBjYXNlIDQ2IHRvIGluY2x1ZGUgYSBjb29raWUgd2l0aAogIHZlcnkgaHVnZSBjb250ZW50IHRvIHZlcmlmeSB0aGUgZml4LgoKLSBH/G50ZXIgS25hdWYgZml4ZWQgZ2V0ZGF0ZS55IHRvIHJlbW92ZSBhIGZldyB3YXJuaW5ncy4gSSByZW1vdmVkIHRoZQogIGlmZGVmJ2VkIHRlc3Qgd2UgbmV2ZXIgZXZlciB1c2UgYW55d2F5LgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgY2VydGlmaWNhdGUgd2lsZGNhcmQgY2hlY2tzIHRvIHN1cHBvcnQgYSAnKictbGV0dGVyCiAgYW55d2hlcmUgaW4gdGhlIHdpbGRjYXJkIHN0cmluZywgc3VwcG9ydCBtdWx0aXBsZSAnKictbGV0dGVycyBpbiB0aGUKICB3aWxkY2FyZCBhbmQgdG8gYWxsb3cgdGhlICcqJy1sZXR0ZXIgdG8gbWF0Y2ggYSBzdHJpbmcgdGhhdCBpbmNsdWRlcyBhIGRvdC4KCkRhbmllbCAoMjEgSnVuZSAyMDA0KQotIHRlc3RjdXJsLnNoIGlzIG5vdyByZW1vdmVkIGNvbXBsZXRlbHksIHRlc3RzL3Rlc3RjdXJsLnBsIGlzIHRoZSBzY3JpcHQgdG8KICB1c2Ugd2hlbiBhdXRvYnVpbGRpbmcgY3VybCEKCi0gS2pldGlsIEphY29ic2VuIGJyb3VnaHQgbXkgYXR0ZW50aW9uIHRvIHRoZSBmYWN0IHRoYXQgeW91IGNhbm5vdCBwcm9wZXJseQogIGFib3J0IGFuIHVwbG9hZCB3aXRoIHRoZSByZWFkZnVuY3Rpb24gY2FsbGJhY2ssIHNpbmNlIHJldHVybmluZyAwIG9yIC0xIG9ubHkKICBzdG9wcyB0aGUgdXBsb2FkIGFuZCBsaWJjdXJsIHdpbGwgY29udGludWUgd2FpdGluZyBmb3IgZG93bmxvYWRlZCBkYXRhIGFuZAogIHRoZSBzZXJ2ZXIgb2Z0ZW4gd2FpdHMgZm9yIHRoZSByZXN0IG9mIHRoZSB1cGxvYWQgZGF0YSB0byBhcnJpdmUuCgogIFRodXMsIEkndmUgbm93IGFkZGVkIHRoZSBhYmlsaXR5IGZvciByZWFkIGNhbGxiYWNrcyB0byByZXR1cm4KICBDVVJMX1JFQURGVU5DX0FCT1JUIHRvIGFib3J0IGFuIHVwbG9hZCBmcm9tIGEgcmVhZCBjYWxsYmFjay4gVGhpcyB3aWxsIHN0b3AKICB0aGUgdHJhbnNmZXIgaW1tZWRpYXRlbHkgd2l0aCBhIENVUkxFX0FCT1JURURfQllfQ0FMTEJBQ0sgcmV0dXJuIGNvZGUuCgogIFRlc3QgY2FzZSA1MTMgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IGl0IHdvcmtzLiBJIGhhZCB0byBpbXByb3ZlIHRoZSB0ZXN0CiAgSFRUUCBzZXJ2ZXIgdG9vIHRvIGR1bXAgdGhlIHJlcXVlc3QgdG8gYSBmaWxlIGV2ZW4gd2hlbiB0aGUgY2xpZW50CiAgZGlzY29ubmVjdHMgcHJlbWF0dXJlbHkuCgpEYW5pZWwgKDE5IEp1bmUgMjAwNCkKLSBMdWNhIEFsdGVhcyBwcm92aWRlZCBhIHRlc3QgY2FzZSB3aXRoIGEgZmFpbGluZyBjdXJsIG9wZXJhdGlvbjogd2hlbiB3ZSBQT1NUCiAgdG8gYSBzaXRlIHdpdGggLS1kaWdlc3QgKG9yIHNpbWlsYXIpIHNldCwgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYSAzMDIKICBMb2NhdGlvbjogdG8gdGhlICJhdXRocHJvYmUiIHJlcXVlc3QsIGl0IHdhcyBub3QgdHJlYXRlZCBjb3JyZWN0bHkuIFdlIHN0aWxsCiAgd2lsbCBiZWhhdmUgYmFkbHkgaWYgRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZCBmb3IgdGhpcyBjYXNlLCBidXQgSSdtIG5vdAogIGluIHRoZSBtb29kIHRvIGRpdmUgaW50byB0aGlzIHJpZ2h0IG5vdyBhbmQgd2lsbCBsZWF2ZSBpdCBhcy1pcyBmb3Igbm93LgogIFZlcmlmaWVkIG15IGZpeCB3aXRoIHRlc3QgY2FzZSAxNzcuCgpEYW5pZWwgKDE4IEp1bmUgMjAwNCkKLSBHaXNsZSBWYW5lbSdzIHBhdGNoIHRoYXQgcHJvdmlkZXMgbW9yZSBkZXRhaWxzIGZyb20gdGhlIFNTTCBsYXllcnMgKGlmIHlvdQogIHVzZSBhbiBPcGVuU1NMIHZlcnNpb24gdGhhdCBzdXBwb3J0cyBpdCkuIEl0IGFsc28gaW50cm9kdWNlcyB0d28gbmV3IHR5cGVzCiAgb2YgZGF0YSB0aGF0IGNhbiBiZSBzZW50IHRvIHRoZSBkZWJ1ZyBjYWxsYmFjazogQ1VSTElORk9fU1NMX0RBVEFfSU4gYW5kCiAgQ1VSTElORk9fU1NMX0RBVEFfT1VULgoKLSBXaXRoIERhdmlkIEJ5cm9uJ3MgdGVzdCBzZXJ2ZXIgSSBjb3VsZCByZXBlYXQgaGlzIHByb2JsZW0gYW5kIG1ha2Ugc3VyZSB0aGF0CiAgUE9TVGluZyBvdmVyIEhUVFBTOi8vIHdpdGggTlRMTSB3b3JrcyBmaW5lIG5vdy4gVGhlcmUgd2FzIGEgZ2VuZXJhbCBwcm9ibGVtCiAgd2l0aCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9uIHdpdGggbm9uLUdFVCBvcGVyYXRpb25zIHdpdGggQ09OTkVDVC4KCkRhbmllbCAoMTYgSnVuZSAyMDA0KQotIE1vZGlmaWVkIHRvIGtlZXAgdGhlIHVwbG9hZCBieXRlIGNvdW50ZXIgaW4gYW4gY3VybF9vZmZfdCwgbm90IGFuIGludCBhcwogIGJlZm9yZS4gMzJiaXRzIGlzIG5vdCBlbm91Z2guIFRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIGJ1ZyBKZWFuLUxvdWlzIExlbWFpcmUKICByZXBvcnRlZCB0aGF0IG1ha2VzIDJHQiBGVFAgdXBsb2FkcyB0byByZXBvcnQgZXJyb3IgKCJ1bmFsaWduZWQgZmlsZSBzaXplcyIpCiAgd2hlbiBjb21wbGV0ZWQuCgpEYW5pZWwgKDE1IEp1bmUgMjAwNCkKLSBMdWNhIEFsdGVhcyByZXBvcnRlZCBhIHByb2JsZW0gdGhhdCBJIGZpeGVkOiBpZiB5b3UgZGlkIGEgUE9TVCB3aXRoCiAgQ1VSTEFVVEhfRElHRVNUIHNldCBidXQgdGhlIHNlcnZlciBkaWRuJ3QgcmVxdWlyZSBhbnkgYXV0aGVudGljYXRpb24sCiAgbGliY3VybCB3b3VsZCByZXBlYXRlZGx5IHNlbmQgSEVBRCBsb3RzIG9mIHRpbWVzIHVudGlsIGl0IGdpdmVzIHVwLiBUaGlzIHdhcwogIGFjdHVhbGx5IHRoZSBjYXNlIGZvciBhbGwgbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbnMuIEFkZGVkIHRlc3QgY2FzZSAxNzQsCiAgMTc1IGFuZCAxNzYgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDE0IEp1bmUgMjAwNCkKLSBNdWx0aXBhcnQgZm9ybXBvc3RzIHVwbG9hZGluZyBmaWxlcyBubyBsb25nZXIgaW5zZXJ0cyB0aGUgZmlsZXMgdGhlbXNlbHZlcwogIGludG8gdGhlIGh1Z2UgcHJlYnVpbHQgY2h1bmsuIFRoaXMgZW5hYmxlcyBsaWJjdXJsIHRvIGZvcm1wb3N0IGZpbGVzIHRoYXQgaXMKICBsYXJnZXIgdGhhbiB0aGUgYW1vdW50IG9mIHN5c3RlbSBtZW1vcnkuIFdoZW4gdGhlIGZpbGUgZ2l2ZW4gaXMgcGFzc2VkIG9uCiAgc3RkaW4sIGxpYmN1cmwgc3RpbGwgdXNlcyB0aGUgb2xkIG1ldGhvZCBvZiByZWFkaW5nIHRoZSBmdWxsIGZpbGwgYmVmb3JlIHRoZQogIHVwbG9hZCB0YWtlcyBwbGFjZS4gVGhpcyBhcHByb2FjaCB3YXMgc2VsZWN0ZWQgaW4gb3JkZXIgdG8gbm90IGFsdGVyIHRoZQogIGJlaGF2aW9yIGZvciBleGlzdGluZyBhcHBsaWNhdGlvbnMsIGFzIHdoZW4gdXNpbmcgc3RkaW4gbGliY3VybCBjYW4ndCBrbm93CiAgdGhlIHNpemUgb2YgdGhlIHVwbG9hZCBhbmQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZyBjYW4gb25seSBiZSB1c2VkIG9uCiAgSFRUUCAxLjEgc2VydmVycy4KCkRhbmllbCAoMTMgSnVuZSAyMDA0KQotIEdpc2xlIGZvdW5kIG91dCB0aGF0IHdlIGRpZCB3aWxkY2FyZCBjZXJ0IG5hbWUgY2hlY2tzIHdyb25nLCBzbyB0aGF0IHBhcnRzCiAgb2YgdGhlIGNoZWNrIHdyb25nbHkgd2FzIGNhc2Ugc2Vuc2l0aXZlLgoKRGFuaWVsICgxMSBKdW5lIDIwMDQpCi0gVGltIFNuZWRkb24gYnJvdWdodCBhIG1pbm9yIFZNUyBmaXggdG8gbWFrZSBjdXJsIGJ1aWxkIHByb3Blcmx5IG9uIGhpcyBWTVMKICBtYWNoaW5lLiBIZSBhbHNvIGhhZCBzb21lIGludGVyZXN0aW5nIGxpYmN1cmwgcGF0Y2hlcy4uLiB0aGV5IG1pZ2h0IGJlIGFibGUKICB0byBkbyBpbiBhIHNsaWdodGx5IG5pY2VyIHdheS4gRGlzY3Vzc2lvbnMgYXJlIGluIHByb2dyZXNzLgoKRGFuaWVsICgxMCBKdW5lIDIwMDQpCi0gR2lzbGUgVmFuZW0gYnJvdWdodCBjb2RlIGNsZWFudXBzbSBiZXR0ZXIgdmVyYm9zZSBvdXRwdXQgYW5kIGJldHRlciBjb25uZWN0CiAgdGltZW91dCBoYW5kbGluZyB3aGVuIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhIGhvc3QgdGhhdCByZXNvbHZlcyB0bwogIG11bHRpcGxlIElQIGFkZHJlc3Nlcy4KCi0gU3RldmVuIEJhenlsIGFuZCBTZXNodWJhYnUgUGFzYW0gcG9pbnRlZCBvdXQgYSBidWcgb24gd2luMzIgd2hlbiBmcmVlaW5nIHRoZQogIHBhdGggYWZ0ZXIgYSBmaWxlOi8vIHRyYW5zZmVyLgoKRGFuaWVsICg5IEp1bmUgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlICdjb25maWd1cmUgLS1kaXNhYmxlLWh0dHAnIHdvcmsgdG8gYnVpbGQgbGliY3VybAogIHdpdGhvdXQgSFRUUCBzdXBwb3J0LiBJIGFkZGVkIGEgbmV3IHJldHVybiBjb2RlIGZvciBjdXJsX2Zvcm1hZGQoKSBpbiBjYXNlCiAgbGliY3VybCBpcyBidWlsdCB3aXRoIEhUVFAgZGlzYWJsZTogQ1VSTF9GT1JNQUREX0RJU0FCTEVELgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBwb2ludGVkIG91dCBhIG1pc3NpbmcgZmlsZSBpbiB0aGUgZ2VuZXJhdGVkCiAgY3VybGxpYi5kc3AgZmlsZSwgYW5kIG5vdyBwZW9wbGUgYnVpbGRpbmcgd2l0aCB0aGlzIHNob3VsZCBnZXQgYSBsaWJjdXJsLmxpYgogIGZpbGUgZ2VuZXJhdGVkIGFzIGl0IHVzZWQgdG8gZG8gYmVmb3JlIHdlIGdlbmVyYXRlZCB0aGlzIGZpbGUuCgpEYW5pZWwgKDggSnVuZSAyMDA0KQotIE1hcnR5IEt1aHJ0IGZpeGVkIGEgbWlub3IgYnVpbGQgcHJvYmxlbSBmb3IgVk1TLgoKRGFuaWVsICg3IEp1bmUgMjAwNCkKLSBSZXZlcnRlZCB0aGUgY29uZmlndXJlIGNoZWNrIGZyb20gdGhlIDR0aCBzaW5jZSBpdCBvYnZpb3VzbHkgZGlkbid0IHdvcmsuCiAgUmVtYWRlIGl0IGluIGEgZGlmZmVyZW50IG1hbm5lciB0aGF0IGhvcGVmdWxseSB3b3JrcyBiZXR0ZXIuCgpEYW5pZWwgKDQgSnVuZSAyMDA0KQotIEf8bnRlciBLbmF1ZiBicm91Z2h0IHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gTmV0V2FyZSBhZ2Fpbi4KCi0gTWFkZSB0aGUgY29uZmlndXJlIGNoZWNrcyBmb3Igc3RyZXJyb3JfcigpIG5vdCBleGl0IHRoZSBjb25maWd1cmUgc2NyaXB0CiAgd2hlbiBidWlsdCBmb3IgY3Jvc3MtY29tcGlsaW5nLgoKRGFuaWVsICgzIEp1bmUgMjAwNCkKLSBDaHJpcyBHYXVrcm9nZXIgcG9pbnRlZCBvdXQgdGhhdCAnbWFrZSB0ZXN0JyBhdHRlbXB0cyB0byBydW4gdGhlIHRlc3RzIGV2ZW4KICBpZiBjdXJsIGlzIGJ1aWx0IGNyb3NzLWNvbXBpbGVkLiBJJ3ZlIG5vdyBtYWRlIGl0IG91dHB1dCBhIHNob3J0IG1lc3NhZ2UKICBpbnN0ZWFkLCBzYXlpbmcgaXQgaXNuJ3QgcG9zc2libGUgdG8gZG8uCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IGJyb3VnaHQgRlRQIDNyZCBwYXJ0eSB0cmFuc2ZlciBzdXBwb3J0IHRvIGxpYmN1cmwuCiAgWW91IGNhbiBub3cgdXNlIGxpYmN1cmwgdG8gdHJhbnNmZXIgZmlsZXMgYmV0d2VlbiB0d28gcmVtb3RlIGhvc3RzIHVzaW5nCiAgRlRQLiBUaGVyZSBhcmUgYSBidW5jaCBvZiBuZXcgb3B0aW9ucyB0byBjb250cm9sIHRoaXMgd2l0aDoKICAgQ1VSTE9QVF9TT1VSQ0VfSE9TVAogICBDVVJMT1BUX1NPVVJDRV9VU0VSUFdECiAgIENVUkxPUFRfU09VUkNFX1BBVEgKICAgQ1VSTE9QVF9TT1VSQ0VfUE9SVAogICBDVVJMT1BUX1BBU1ZfSE9TVAogICBDVVJMT1BUX1NPVVJDRV9QUkVRVU9URQogICBDVVJMT1BUX1NPVVJDRV9QT1NUUVVPVEUKCiAgKFRoZXkgc3RpbGwgcmVtYWluIHRvIGJlIGRvY3VtZW50ZWQgcHJvcGVybHkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuCiAgcGFnZS4pCgogIFdoZW4gdXNpbmcgdGhpcywgdGhlIG9yZGluYXJ5IENVUkxPUFRfVVJMIHNwZWNpZmllcyB0aGUgdGFyZ2V0IFVSTCwgYW5kIHlvdQogIHNwZWNpZnkgdGhlIHNvdXJjZSBkYXRhIHdpdGggdGhlc2UgYWRkaXRpb25hbCBvcHRpb25zLiBmdHAzcmRwYXJ0eS5jIGlzIGEKICBuZXcgZXhhbXBsZSBzb3VyY2UgY29kZSBzaG93aW5nIGhvdyB0byB1c2UgdGhpcy4KCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBIVFRQIERpZ2VzdCBjb2RlIHRvIHVzZSB0aGUgcHJveHkgdXNlciBuYW1lIGFuZAogIHBhc3N3b3JkIHdoZW4gZG9pbmcgcHJveHkgYXV0aGVudGljYXRpb24sIGl0IHByZXZpb3VzbHkgYWx3YXlzIHVzZWQgdGhlIGhvc3QKICB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIQoKRGFuaWVsICgyIEp1bmUgMjAwNCkKLSBDVVJMT1BUX1VQTE9BRCBhbmQgQ1VSTE9QVF9QVVQgbm93IGRvIHRoZSBleGFjdCBzYW1lIHRoaW5nIGludGVybmFsbHksIHdoaWNoCiAgZml4ZXMgc29tZSBvbGQgY29uZnVzaW9ucyBvbiB3aGVuIHdoaWNoIG9mIHRoZXNlIHNob3VsZCBiZSB1c2VkIGFuZCB3aGF0IHRoZQogIGRpZmZlcmVuY2VzIGFyZS4KCi0gQXBwbGllZCBHaXNsZSdzIGZpeGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIHdpdGggbGNjLXdpbjMyCgpWZXJzaW9uIDcuMTIuMCAoMiBKdW5lIDIwMDQpCgpEYW5pZWwgKDEgSnVuZSAyMDA0KQotIEkgY2xhcmlmaWVkIHRoZSAtLWNyZWF0ZS1kaXJzIG9wdGlvbiBzb21ld2hhdCBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCi0gUmVuYXVkIER1aGF1dCBjb3JyZWN0ZWQgdGhlIGN1cmxfdW5lc2NhcGUgbWFuIHBhZ2UuCgotIERhdmlkIEJ5cm9uIG1vZGlmaWVkIG9uZSBvZiBNYXNzaW1pbGlhbm8gWmljY2FyZGkncyByZWNlbnQgTVNWQyBtYWtlZmlsZQogIGNoYW5nZXMgdG8gbm93IGFnYWluIHVzZSB0aGUgbW0gbGliIGJ5IGRlZmF1bHQuCgpEYW5pZWwgKDI2IE1heSAyMDA0KQotIE1vaHVuIEJpc3dhcyBhZGRlZCByZWxlYXNlLXpsaWIgYW5kIGRlYnVnLXpsaWIgdGFyZ2V0cyB0byB0aGUgTVNWQyBsaWJjdXJsCiAgTWFrZWZpbGUKCi0gRGF2aWQgQnlyb24gcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggcHJveHkgYXV0aGVudGljYXRpb24gd2hlbiBkb2luZyBDT05ORUNULAogIGxpa2Ugd2hlbiBhY2Nlc3NpbmcgSFRUUFMgc2l0ZXMgd2lodCBhIHByb3h5LiBUaGlzIHByb2JhYmx5IGJyb2tlIHdoZW4gSQogIHJld3JvdGUgdGhlIGF1dGggc3R1ZmYgcmVjZW50bHkuCgotIEkgYWRkZWQgZmlsZXVwbG9hZC5jIGluIHRoZSBleGFtcGxlcyBkaXJlY3RvcnksIHNob3dpbmcgaG93IGFuIHVwbG9hZCB0byBhCiAgZmlsZTovLyBVUkwgaXMgbWFkZS4KCkRhbmllbCAoMjUgTWF5IDIwMDQpCi0gTWFzc2ltaWxpYW5vIFppY2NhcmRpIHVwZGF0ZWQgdGhlIE1TVkMgbWFrZWZpbGVzLgoKRGFuaWVsICgyNCBNYXkgMjAwNCkKLSBsaWJjdXJsIG5vdyBzdXBwb3J0cyAidXBsb2FkaW5nIiB0byBmaWxlOi8vIFVSTHMuIFRlc3QgMjA0IGFuZCAyMDUgd2VyZQogIGFkZGVkIHRvIHZlcmlmeS4KCi0gU2ltb24gSm9zZWZzc29uIGFkZGVkIGEgaWRuX2ZyZWUoKSBmdW5jdGlvbiBpbiBsaWJpZG4gMC40LjUgYXMgYSByZWFjdGlvbiB0bwogIEdpc2xlJ3MgcHJldmlvdXMgbWFpbC4gV2Ugbm93IHVzZSB0aGlzIGZ1bmN0aW9uLCBhbmQgdGh1cyB3ZSByZXF1aXJlIGxpYmlkbgogIDAuNC41IG9yIGxhdGVyLiBObyBlYXJsaWVyIHZlcnNpb24gd2lsbCBkby4KCi0gUm9iZXJ0IEQuIFlvdW5nIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9DT09LSUVGSUxFIGFuZCBDVVJMT1BUX0NPT0tJRSBjb3VsZAogIG5vdCBiZSB1c2VkIGJvdGggaW4gb25lIHJlcXVlc3QuIEZpeGVkIGl0IGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTcyIHRvIHZlcmlmeS4KCkRhbmllbCAoMjEgTWF5IDIwMDQpCi0gV2hpbGUgdGFsa2luZyB0byBob3N0IGEuYi5jLCBsaWJjdXJsIGRpZCB3cm9uZ2x5IG5vdCBhY2NlcHQgY29va2llcyB0aGF0CiAgd2VyZSBzZXQgdG8gdGhlIGRvbWFpbiAuYS5iLmMgKHRoYXQgaXMgd2l0aCBhIGRvdCBwcmVmaXgpLiBUaGlzIGlzIG5vdyBmaXhlZAogIGFuZCB0ZXN0IGNhc2UgMTcxIHZlcmlmaWVzIGl0LgoKRGFuaWVsICgyMCBNYXkgMjAwNCkKLSBKZXNzZSBOb2xsZXIgcmVwb3J0ZWQgdGhhdCB0aGUgdXBsb2FkIHNwZWVkIGluZm8gcmVwb3J0ZWQgYnkgbGliY3VybCB3YXMKICB3cm9uZy4gVGhlIHNhbWUgd2FzIHRydWUgZm9yIHRoZSBkb3dubG9hZCBzcGVlZC4gRml4ZWQgbm93LgoKRGFuaWVsICgxOSBNYXkgMjAwNCkKLSBEYXZpZCBCeXJvbiBhZGRlZCB0ZXN0IGNhc2UgMTcwIC0gdGhpcyB1c2VkIHRvIGNyYXNoIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mCiAgY3VybC4KCkRhbmllbCAoMTcgTWF5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyJ3MgcGF0Y2ggdGhhdCBhZGRyZXNzZXMgdHdvIGZsYXdzIGluIHRoZSBwZWVyIGNlcnRpZmljYXRlCiAgbmFtZSB2ZXJpZmljYXRpb246CiAgbyB3aGVuIG11bHRpcGxlIGNvbW1vbiBuYW1lcyBhcmUgdXNlZCAoYXMgaW4gdGhlIGN1cmwgdGVzdHMpLCB0aGUgbGFzdCBuYW1lCiAgICBuZWVkcyB0byBiZSBzZWxlY3RlZC4KICBvIGFsbG93IGNvbXBhcmluZyB3aXRoIGVuY29kZWQgdmFsdWVzLCBhdCBsZWFzdCB3aXRoIEJNUCBhbmQgSVNPIGxhdGluMQogICAgZW5jb2RlZCBUNjFzdHJpbmdzLgoKLSBBbGwgMTkxIHRlc3QgY2FzZXMgcnVuIHRocm91Z2ggdGhlIHRvcnR1cmUgdGVzdCBPSyEgJ21ha2UgdGVzdC10b3J0dXJlJyBpcwogIG5vdyBhdmFpbGFibGUgaW4gdGhlIHJvb3QgbWFrZWZpbGUgKG9uIGNvbmZpZ3VyZS1iYXNlZCBlbnZpcm9ubWVudHMpLgoKRGFuaWVsICgxNCBNYXkgMjAwNCkKLSBXaXRoIGEgc2xpZ2h0bHkgbW9kaWZpZWQgZnRwc2VydmVyLnBsIEkndmUgbm93IHJ1biBhbG1vc3QgYWxsIHRlc3RzIHRocm91Z2gKICB3aXRoIHJ1bnRlc3RzLnBsIC10LiBUaGlzIGlzIGdvb2RuZXNzIQoKLSBTaW5jZSBJIGhhdmUgYmVlbiB1bmFibGUgdG8gY29udGFjdCB0aGUgQ1ZTIGFkbWlucyBmb3Igc2V2ZXJhbCBtb250aHMsIEkndmUKICBkZWNpZGVkIHRoYXQgdGhlIGN1cnJlbnQgQ1ZTIGhvc3Rpbmcgd2FzIG5vdCBnb29kIGVub3VnaC4gSSd2ZSBub3cgbW92ZWQgdGhlCiAgQ1ZTIHJlcG8gb25jZSBhZ2Fpbiwgc2VlIFJFQURNRSBmb3IgdXBkYXRlZCBjdnMgY2hlY2tvdXQgaW5zdHJ1Y3Rpb25zLgoKRGFuaWVsICgxMyBNYXkgMjAwNCkKLSBydW50ZXN0cy5wbCAtdCBub3cgcnVucyBmaW5lIGFsbCB0aGUgd2F5IHRvIHRlc3QgMTAwLiBJIGJlbGlldmUgdGVzdCBjYXNlCiAgMTAwIGZhaWxzIGJlY2F1c2Ugb2YgYW4gRlRQIHNlcnZlciBwcm9ibGVtLgoKRGFuaWVsICgxMiBNYXkgMjAwNCkKLSBHZW5lcmFsIGNsZWFudXBzIGFsbCBvdmVyIHRvIG1ha2UgbGliY3VybCBzdXJ2aXZlIGFuZCBkbyB3ZWxsIHdoZW4gYSBtZW1vcnkKICBmdW5jdGlvbiByZXR1cm5zIE5VTEwuIHJ1bnRlc3RzLnBsIC10IG5vdyB3b3JrcyBmaW5lIGZvciB0aGUgZmlyc3QgMjYgdGVzdAogIGNhc2VzLgoKRGFuaWVsICgxMSBNYXkgMjAwNCkKLSBTZXNodWJhYnUgUGFzYW0gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZXMgY3VybF9nbG9iYWxfaW5pdF9tZW0oKSAtCiAgbGlrZSBub3JtYWwgY3VybF9nbG9iYWxfaW5pdCgpIGJ1dCBhbGxvd3MgdGhlIGFwcCB0byByZXBsYWNlIGFsbCBtZW1vcnkKICBmdW5jdGlvbnMgd2l0aCBpdHMgb3duIHNldC4gSSBtb2RpZmllZCBpdCBzbGlnaHRseS4KCi0gQmFzZWQgb24gTHVjYSBBbHRlYXMnIGNvbW1lbnRzLCBJIG1vZGlmaWVkIHRoZSBjdXJsbGliLmRzcCBnZW5lcmF0aW9uIGNvZGUuCgpEYW5pZWwgKDEwIE1heSAyMDA0KQotIEdpc2xlIG1haWxlZCBTaW1vbiBKb3NlZnNzb24gKG9mIGxpYmlkbiBmYW1lKSBhYm91dCB0aGUgYmVuZWZpdHMgb2YgYQogIHNlcGFyYXRlIGZyZWUoKS1mdW5jdGlvbiBieSB0aGF0IGxpYiB0byBtYWtlIHN1cmUgdGhlIG1lbW9yeSBpcyBmcmVlZCBieSB0aGUKICBzYW1lIG1lbW9yeSBzdWJzeXN0ZW0gdGhhdCBhbGxvY2F0ZWQgaXQuIEhlIHJlc3BvbmRlZCBwb3NpdGl2ZWx5IGFuZCB0aGlzCiAgd2lsbCBsaWtlbHkgY2F1c2UgdXMgdG8gcmVxdWlyZSBhIG5ld2VyIHZlcnNpb24gb2YgbGliaWRuIGFzIHNvb24gYXMgU2ltb24KICByZWxlYXNlcyBvbmUgd2l0aCBzdWNoIGEgbGliaWRuX2ZyZWUoKSBmdW5jdGlvbi4KCi0gSmFtZXMgQnVyc2EgbWFkZSBydW50ZXN0cy5wbCdzIC10IG9wdGlvbiB3b3JrIGZvciBhbnkgZ2l2ZW4gdGVzdCBjYXNlLCBhbmQgSQogIGVkaXRlZCB0byBhbGxvdyAtZyB0b28uIE5vdCBldmVuIHRlc3QgY2FzZSAxIHdvcmtlZC4uLgoKLSBMdWNhIEFsdGVhIG1hZGUgdGhlIG5jPSBmaWVsZCBub3QgdXNlIHF1b3RlcyBpbiBvdXRnb2luZyBIVFRQIERpZ2VzdCBoZWFkZXJzLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgdGVzdCBzY3JpcHQgdGhhdCBtYWRlIGl0IGZhaWwgdG8KICByZWNvZ25pemUgb3VyIG93biBydW5uaW5nIEhUVFAgc2VydmVyLgoKRGFuaWVsICg3IE1heSAyMDA0KQotIEphbWVzIEJ1cnNhIGZpeGVkIHRoZSBtZW1hbmFseXplLnBsIHNjcmlwdCB0byBjb25kZXIgbWFsbG9jKDApIGFyZWFzIE9LIHRvCiAgZnJlZSgpIGFuZCBoZSBtYWRlIHR3byBmYWlsZWQtcmVzb2x2ZSBlcnJvciBtZXNzYWdlcyB1c2UgdGhlIG5ldyBkaXNwbGF5LQogIG5hbWUgaW5zdGVhZCBvZiB0aGUgaW50ZXJuYWxseS11c2VkIG5hbWUuCgotIEdpc2xlIFZhbmVtIHRyaWVkIGN1cmwgd2l0aAogIHd3dy5ldGRvbWVuZW5hdm5rYW5tYWtzaW1hbHRpbm5laG9sZGVzZWtzdGl0cmVib2tzdGF2ZXJzbGlrc29tZGV0dGUuY29tCiAgd2hpY2ggY2F1c2VkIHByb2JsZW1zLCBhbmQgSSBmaXhlZCB0aGUgc2luZ2xlIHplcm8gYnl0ZSBidWZmZXIgb3ZlcndyaXRlCiAgdGhhdCBvY2N1cnJlZCAoZHVlIHRvIGEgc3R1cGlkIHByb3RvY29sIGJ1ZmZlciBzaXplIGFuZCBwYXJzZXIpLgoKLSBNYWRlIHRoZSBsaWIvY3VybGxpYi5kc3AgZmlsZSBnZXQgZ2VuZXJhdGVkIGF1dG9tYXRpY2x5IHdoZW4gYSBkaXN0cmlidXRpb24KICBwYWNrYWdlIGlzIG1hZGUsIHdpdGggdGhlIG1zdmNwcm9qLiogZmlsZXMgYXMgdGVtcGxhdGVzIGFuZCBhbGwKICB3aW4zMi1zb3VyY2VzIGFkZGVkLiBJIHRoaW5rIHRoaXMgY2FuIGJlIG1hZGUgdG8gd29yayBiZXR0ZXIgdGhhbiB0aGUgYWx3YXlzCiAgbGFnZ2luZy1iZWhpbmQgcHJldmlvdXMgYXBwcm9hY2guIEknbSBub3Qgc3VyZSB0aGlzIGJ1aWxkcyBhIHdvcmtpbmcgcHJvamVjdAogIGZpbGUgcmlnaHQgbm93IHRob3VnaCEKCkRhbmllbCAoNiBNYXkgMjAwNCkKLSBNaWNoYWVsIEJlbmVkaWN0IGJyb3VnaHQgYSBmaXggdGhhdCBmaWxscyBpbiB0aGUgZXJyb3JidWZmZXIgcHJvcGVybHkgd2hlbgogIGFyZXMgZmFpbHMgdG8gcmVzb2x2ZSBhIG5hbWUgZm9yIGEgY2FzZSBub3QgcHJldmlvdXNseSBkZWFsdCB3aXRoIGxpa2UgdGhpcy4KCkRhbmllbCAoNSBNYXkgMjAwNCkKLSBKb2UgSGFscGluIGZpeGVkIHRoZSBhbm5veWluZyB0eXBlY2FzdCB3YXJuaW5nIGluIGxpYi9sZGFwLmMKCi0gR2lzbGUgVmFuZW0gZml4ZXM6CiAgbyBtZW1kZWJ1ZyB0byBub3QgYWNjZXNzIE5VTEwgb24gc2V2ZXJhbCBwbGFjZXMKICBvIGxpYmN1cmwuZGVmOyBjdXJsX2Zvcm1wYXJzZSBpcyBnb25lLgogIG8gcHJvZ3Jlc3MuYzsgZml4ZWQgdGhlIHBlcmNlbnQgdmFsdWVzIGJlaW5nIHRydW5jZWQgdG8gMC4KICBvIGlmMmlwLio7IGNvbnN0aWZpZWQgdGhlICdpbnRlcmZhY2UnIGFyZ3VtZW50LgoKLSBUb3IgQXJudHNlbiByZXBvcnRlZCB0aGF0IG1hbnkgb2YgaGlzIGF1dG9idWlsZHMgZnJvemUgYW5kIEkgZm91bmQgYW5kIGZpeGVkCiAgYSBwcm9ibGVtIGludHJvZHVjZWQgd2l0aCB0aGUgSFRUUCBhdXRoIG92ZXJoYXVsIHRoYXQgY291bGQgbGVhZCB0byBhCiAgbmV2ZXItZW5kaW5nIGludGVybmFsIHJlcXVlc3QtbG9vcCBkdWUgdG8gdW4taW5pdGlhbGl6ZWQgdmFyaWFibGVzIQoKLSBSZW1vdmVkIHNldmVyYWwgY29tcGlsZXIgd2FybmluZ3Mgb24gdmFyaW91cyBjb21waWxlcnMvcGxhdGZvcm1zLgoKRGFuaWVsICg0IE1heSAyMDA0KQotIGN1cmxfZm9ybXBhcnNlKCkgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaWJyYXJ5LiBJdCBoYXMgYmVlbiBtYXJrZWQgYW5kCiAgbWVudGlvbmVkIGFzIGRlcHJlY2F0ZWQgZm9yIHNldmVyYWwgeWVhcnMuCgpEYW5pZWwgKDMgTWF5IDIwMDQpCi0gUmV3cml0dGVuIEhUVFAgYXV0aGVudGljYXRpb24gY29kZS4gVGhlIHByZXZpb3VzIGNvZGUgY291bGQgbm90IHByb3Blcmx5CiAgZGVhbCB3aXRoIHRoZSBhZGRlZCB0ZXN0IGNhc2VzIDE2NywgMTY4IGFuZCAxNjkuIEkndmUgbm93IHJld3JpdHRlbiB0aGUgY29kZQogIHRvIGJldHRlciBzZXBhcmF0ZSBob3N0IGFuZCBwcm94eSBhdXRoZW50aWNhdGlvbiBhbmQgbm90IHJlLXVzZSB0aGUgc2FtZQogIHZhcmlhYmxlcyBhcyBtdWNoIGFzIGJlZm9yZSBhcyBpdCBwcm92ZWQgbm9uIHdvcmtpbmcgaW4gdGhlIG1vcmUgaW52b2x2ZWQKICBjYXNlcy4gQWxsIHRoZSBjdXJyZW50IHRlc3RzIHJ1biBPSyBub3csIGFuZCBzbyBkbyB0aGUgbmV3IG9uZXMuIFRoZSBjdXJsCiAgdG9vbCBnb3QgYSBuZXcgb3B0aW9uIG5hbWVkIC0tcHJveHktZGlnZXN0IHRvIGVuYWJsZSBIVFRQIERpZ2VzdAogIGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHByb3h5LiBJIGFsc28gbWFkZSB0aGUgbGlicmFyeSBzdXBwb3J0IGl0LgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBMREFQIGNvZGUgd29yayB3aXRoIHdsZGFwMzIuZGxsIGFzIHN1cHBsaWVkIHdpdGgKICBXaW4tOTgvTUUvMjAwMC9YUCwgc28gbm8gZXh0cmEgLmRsbHMgYXJlIHJlcXVpcmVkIHdoZW4gY3VybC9saWJjdXJsIGlzIHVzZWQKICBvbiB0aGVzZSBXaW5kb3dzIHZlcnNpb25zLgoKRGFuaWVsICgzMCBBcHJpbCAyMDA0KQotIHJ1bnRlc3RzLnBsIG5vdyBzY2FucyB0aGUgdmFsZ3JpbmQgbG9nIGZvciB2YWxncmluZC1kZXRlY3RlZCBtZW1vcnkgbGVha3MKICBhZnRlciBlYWNoIHRlc3QgY2FzZSBpZiB2YWxncmluZCB3YXMgZm91bmQgYW5kIHVzZWQuCgotIEkgbW9kaWZpZWQgdGhlIGFwcC1jb2RlIGluIGN1cmwgdG8gaW5jbHVkZSB0aGUgbmV3IGxpYi9jdXJseC5oIGFuZCBvbmx5CiAgYWNjZXNzIHRob3NlIGZ1bmN0aW9ucyB1c2luZyB0aGUgY3VybHhfLXByZWZpeCBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIGZ1dHVyZQogIHJlbW92YWwgb2Ygc2V2ZXJhbCBjdXJsXy1mdW5jdGlvbnMgZnJvbSB0aGUgcHVibGljIGxpYmN1cmwgQVBJLgoKLSBJbnRyb2R1Y2VkIGxpYi9jdXJseC5oIGFzIGEgc2luZ2xlIGhlYWRlciB0byBwcm92aWRlIHRoZSBjdXJseF8tZnVuY3Rpb25zCiAgdG8gYXBwcy4KCi0gQWRkZWQgbm90aWNlcyBpbiB0aGUgbWFuIHBhZ2VzIGZvciBjdXJsX2dldGVudiwgY3VybF9tcHJpbnRmLCBjdXJsX3N0cmVxdWFsCiAgYW5kIGN1cmxfc3RybmVxdWFsIHRoYXQgdGhleSBhcmUgc3ViamVjdCBmb3IgcmVtb3ZhbCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogIFNUT1AgVVNJTkcgVEhFU0UgRlVOQ1RJT05TLgoKLSBNaWhhaSBJb25lc2N1IG5vdGljZWQgaGUgY291bGRuJ3QgZG8gZm9ybXBvc3RzIHdpdGggd2hpdGVzcGFjZSBpbiB0aGUgZmlsZQogIG5hbWVzIGFuZCB5ZXMsIEkgYnJva2UgdGhhdCBvbiBBcHJpbCAyMy4gU2lnaC4gSSBmaXhlZCBpdCBub3cgYW5kIGFkZGVkCiAgdGVzdCBjYXNlIDE2NiB0byB2ZXJpZnkgaXQuCgotIEx1Y2EgQWx0ZWEgcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGxlZnQgZnJvbSB0aGUgRGlnZXN0IHBhdGNoIG9mIHllc3RlcmRheS4KCkRhbmllbCAoMjkgQXByaWwgMjAwNCkKLSBNYWRlIElETiBkb21haW5zIHdvcmsgd2hlbiBzZW5kaW5nIHJlcXVzdHMgb3ZlciBIVFRQIHByb3h5IGFzIHdlbGwuIEFkZGVkCiAgdGVzdCBjYXNlIDE2NSB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIEZpeGVkIGEgYnVnIGluIHRoZSBuZXcgaW50ZXJuYWwgaG9zdCBuYW1lIHNldHVwIHdoZW4gcmUtdXNpbmcgY29ubmVjdGlvbnMuCgotIEphbWVzIEJ1cnNhIGZvdW5kIG91dCB0aGF0IGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB3aXRoIGFyZXMtYnVpbHQgbGliY3VybAogIGNyZWF0ZWQgYSBiYWQgaGFuZGxlIHRoYXQgd291bGQgY3Jhc2ggaW4gdGhlIGZpcnN0IG5hbWUgcmVzb2x2ZSBhdHRlbXB0LiBUaGlzCiAgaXMgbm93IGZpeGVkIGFuZCB0ZXN0IGNhc2UgNTEyIHdhcyBhZGRlZCB0byB2ZXJpZnkgaXQuCgotIEx1Y2EgQWx0ZWEgcHJvdmlkZWQgYSBtYWpvciBIVFRQIERpZ2VzdCBjb2RlIGZpeCBhbmQgY2xlYW51cC4gV2Ugbm93IGZvbGxvdwogIHRoZSBEaWdlc3QgUkZDIGEgbG90IGJldHRlci4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgU1NMIGNvZGUgdXNlIEVSUl9lcnJvcl9zdHJpbmdfbigpIHdoZXJlIGFwcGxpY2FibGUuCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDQpCi0gSSByZW1vZGVsZWQgR2lzbGUncyBJRE4gY29kZSBzbGlnaHRseSBhbmQgbm93IHdlIGNvbnZlcnQgYm90aCB0aGUgaG9zdCBuYW1lCiAgYW5kIHByb3h5IG5hbWUgdG8gdGhlIEFDRSBlbmNvZGVkIHZlcnNpb24gdG8gdXNlIGludGVybmFsbHkgZm9yIHJlc29sdmVzIGFuZAogIGNvb2tpZXMgZXRjLiBUaGV5IGFyZSBub3cgdXNpbmcgb25lICdzdHJ1Y3QgaG9zdG5hbWUnIGVhY2ggdGhhdCBrZWVwIGJvdGgKICB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgdGhlIHBvc3NpYmx5IGVuY29kZWQgbmFtZS4gSUROIHJlc29sdmVzIHdvcmsgZm9yIG1lCiAgbm93IHVzaW5nIGlwdjYsIGlwdjQgYW5kIGFyZXMgcmVzb2x2aW5nLiBFdmVuIGNvb2tpZXMgb24gSUROIHNpdGVzIHNlZW0gdG8KICBkbyByaWdodC4gSSBnb3Qgc29tZSBmYWlsdXJlcyBhdCBmaXJzdCB3aGVuIENIQVJTRVQgd2Fzbid0IHNldCBhdCBhbGwgd2hpY2gKICBjb25mdXNlZCBsaWJpZG4gY29tcGxldGVseSBhbmQgaXQgZGVjaWRlZCBieSBlbmNvZGluZyBvZiBjaG9pY2Ugd2FzCiAgJ0FOU0lfWDMuNC0xOTY4Jy4uLgoKLSBtYWRlICdjb25maWd1cmUgLS13aXRob3V0LWxpYmlkbicgd29yawoKRGFuaWVsICgyNSBBcHJpbCAyMDA0KQotIEZpeGVkIHRoZSBzcmMvaHVnZWhlbHAuYyBmaWxlIHRvIGluY2x1ZGUgInNldHVwLmgiIGluc3RlYWQgb2YgImNvbmZpZy5oIiB0bwogIG1ha2UgdGhlIHByb2JsZW1zIHdpdGggVVNFX01BTlVBTCBvbiB3aW5kb3dzIGdvIGF3YXkuCgotIGNvbmZpZ3VyZSAtLXdpdGhvdXQtc3NsIGNvdWxkIHN0aWxsIHdyb25nbHkgaW5jbHVkZSBzb21lIE9wZW5TU0wgaW5mbyBpbiB0aGUKICBNYWtlZmlsZXMgaWYgcGtnLWNvbmZpZyBoYWQgaW5mbyBhYm91dCBPcGVuU1NMLiBCdWcgIzk0MTc2MiByZXBvcnRlZCBieQogIE1hcnRpbi4KCi0gU2luY2Ugd2UgY2FuIG5vdyBidWlsZCBhbmQgdXNlIHF1aXRlIGEgbGFyZ2Ugc2V0IG9mIDNyZCBwYXJ0eSBsaWJyYXJpZXMsIEkKICBkZWNpZGVkIEkgd291bGQgbWFrZSBjb25maWd1cmUgcHJvZHVjZSBhIHN1bW1hcnkgYXQgdGhlIGVuZCBzaG93aW5nIHdoYXQKICBsaWJyYXJpZXMgaXQgdXNlcyBhbmQgaWYgbm90LCB3aGF0IG9wdGlvbiB0byB1c2UgdG8gbWFrZSBpdCB1c2UgdGhhdC4gSSBhbHNvCiAgYWRkZWQgc29tZSBvdGhlciByYW5kb20gaW5mbyB0aGF0IGlzIG5pY2UgaW4gYSAiY29uZmlndXJlIHN1bW1hcnkiIG91dHB1dC4KCi0gQXBwbGllZCBUb21teVRhbSdzIHBhdGNoIHRoYXQgbm93IG1ha2UgY3VybCB3b3JrIHdpdGggdGVsbmV0IGFuZCBzdGRpbgogIHByb3Blcmx5IG9uIFdpbmRvd3MuCgotIFRoZSBjaGFuZ2VzIGZvciB0b2RheSBiZWxvdyB3ZXJlIG1hZGUgYnkgbWUgYW5kIEdpc2xlIFZhbmVtLgoKICBUaGUgZmlsZSBwcmV2aW91c2x5IGtub3duIGFzIGhvc3RpcC5jIGhhcyBub3cgdW5kZXJnb25lIGEgaHVnZSBjbGVhbnVwIGFuZAogIHNwbGl0OgoKICBob3N0aXAuYyBleHBsYWluZWQKICA9PT09PT09PT09PT09PT09PT0KCiAgVGhlIG1haW4gQ09NUElMRS1USU1FIERFRklORVMgdG8ga2VlcCBpbiBtaW5kIHdoZW4gcmVhZGluZyB0aGUgaG9zdCouYwogIHNvdXJjZSBmaWxlIGFyZSB0aGVzZToKCiAgQ1VSTFJFU19JUFY2IC0gdGhpcyBob3N0IGhhcyBnZXRhZGRyaW5mbygpIGFuZCBmYW1pbHksIGFuZCB0aHVzIHdlIHVzZQogIHRoYXQuIFRoZSBob3N0IG1heSBub3QgYmUgYWJsZSB0byByZXNvbHZlIElQdjYsIGJ1dCB3ZSBkb24ndCByZWFsbHkgaGF2ZSB0bwogIHRha2UgdGhhdCBpbnRvIGFjY291bnQuIEhvc3RzIHRoYXQgYXJlbid0IElQdjYtZW5hYmxlZCBoYXZlIENVUkxSRVNfSVBWNAogIGRlZmluZWQuCgogIENVUkxSRVNfQVJFUyAtIGlzIGRlZmluZWQgaWYgbGliY3VybCBpcyBidWlsdCB0byB1c2UgYy1hcmVzIGZvciBhc3luY2hyb25vdXMKICBuYW1lIHJlc29sdmVzLiBJdCBjYW5ub3QgaGF2ZSBFTkFCTEVfSVBWNiBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUsIGFzCiAgYy1hcmVzIGhhcyBubyBpcHY2IHN1cHBvcnQuIFRoaXMgY2FuIGJlIFdpbmRvd3Mgb3IgKm5peC4KCiAgQ1VSTFJFU19USFJFQURFRCAtIGlzIGRlZmluZWQgaWYgbGliY3VybCBpcyBidWlsdCB0byBydW4gdW5kZXIgKG5hdGl2ZSkKICBXaW5kb3dzLCBhbmQgdGhlbiB0aGUgbmFtZSByZXNvbHZlIHdpbGwgYmUgZG9uZSBpbiBhIG5ldyB0aHJlYWQsIGFuZCB0aGUKICBzdXBwb3J0ZWQgYXN5bmNoIEFQSSB3aWxsIGJlIHRoZSBzYW1lIGFzIGZvciBhcmVzLWJ1aWxkcy4KCiAgSWYgYW55IG9mIHRoZSB0d28gcHJldmlvdXMgYXJlIGRlZmluZWQsIENVUkxSRVNfQVNZTkNIIGlzIGRlZmluZWQgdG9vLiBJZgogIGxpYmN1cmwgaXMgbm90IGJ1aWx0IHRvIHVzZSBhbiBhc3luY2hyb25vdXMgcmVzb2x2ZXIsIENVUkxSRVNfU1lOQ0ggaXMKICBkZWZpbmVkLgoKICBUaGUgaG9zdCouYyBzb3VyY2VzIGZpbGVzIGFyZSBzcGxpdCB1cCBsaWtlIHRoaXM6CgogIGhvc3RpcC5jICAgLSBtZXRob2QtaW5kZXBlbmRlbnQgcmVzb2x2ZXIgZnVuY3Rpb25zIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucwogIGhvc3Rhc3luLmMgLSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVzCiAgaG9zdHN5bi5jICAtIGZ1bmN0aW9ucyBmb3Igc3luY2hyb25vdXMgbmFtZSByZXNvbHZlcwogIGhvc3RhcmVzLmMgLSBmdW5jdGlvbnMgZm9yIGFyZXMtdXNpbmcgbmFtZSByZXNvbHZlcwogIGhvc3R0aHJlLmMgLSBmdW5jdGlvbnMgZm9yIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXMKICBob3N0aXA0LmMgIC0gaXB2NC1zcGVjaWZpYyBmdW5jdGlvbnMKICBob3N0aXA2LmMgIC0gaXB2Ni1zcGVjaWZpYyBmdW5jdGlvbnMKCiAgVGhlIGhvc3RpcC5oIGlzIHRoZSBzaW5nbGUgdW5pdGVkIGhlYWRlciBmaWxlIGZvciBhbGwgdGhpcy4gSXQgZGVmaW5lcyB0aGUKICBDVVJMUkVTXyogZGVmaW5lcyBiYXNlZCBvbiB0aGUgY29uZmlnKi5oIGFuZCBzZXR1cC5oIGRlZmluZXMuCgotIEFkZGVkIGZ1bmN0aW9uIGhlYWRlciBjb21tZW50cyB0byBtYW55IGZ1bmN0aW9ucyBpbiBhbiBhdHRlbXB0IHRvIGJldHRlcgogIGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgdGhlbSBhbGwuCgotIGNvbmZpZ3VyZSAtLXdpdGgtbGliaWRuIGlzIG5vdyBzdXBwb3J0ZWQuIEl0IG1ha2VzIHRoZSBjb25maWd1cmUgc2NyaXB0CiAgY2hlY2sgZm9yIGxpYmlkbiBsaWJzIGFuZCBpbmNsdWRlIGZpbGVzIGluIHRoZSBwcmVmaXggcGF0aCBnaXZlbi4gSWYgeW91CiAgc2F5IC0td2l0aC1saWJpZG49L3Vzci9sb2NhbCwgaXQgd2lsbCBjaGVjayBmb3IgdGhlIGxpYiBpbiAvdXNyL2xvY2FsL2xpYgogIGFuZCB0aGUgaW5jbHVkZXMgaW4gL3Vzci9sb2NhbC9pbmNsdWRlIGV0Yy4KCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBhIHN0cnVjdCBhZ2VkIENVUkxWRVJTSU9OX1RISVJEIGluY2x1ZGluZwogIGxpYmlkbiB2ZXJzaW9uIGluZm8uIFRoZSBzdHJpbmcgY3VybF92ZXJzaW9uKCkgcmV0dXJucyBhbHNvIGluY2x1ZGVzIGxpYmlkbgogIHZlcnNpb24gaW5mbywgaWYgYXZhaWxhYmxlLgoKVmVyc2lvbiA3LjExLjIgKDI2IEFwcmlsIDIwMDQpCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDQpCi0gRXJ3aW4gQXV0aHJpZWQgcG9pbnRlZCBvdXQgdGhhdCBjb25maWd1cmUgLS1kaXNhYmxlLW1hbnVhbCBkaWRuJ3QgZG8gcmlnaHQKICBpZiB5b3UgYWxyZWFkeSBoYWQgYSBzcmMvaHVnZWhlbHAuYyBzb3VyY2UgZmlsZSBwcmVzZW50ICh3aGljaCBtb3N0IHBlb3BsZQogIGRvIEkgZ3Vlc3MpLiBJdCBub3cgdXNlcyB0aGUgVVNFX01BTlVBTCBkZWZpbmUgcHJvcGVybHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0gZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBkb2luZyAoZmFpbGluZykgV2luZG93cwogIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXMuCgotIEkgYWxzbyBhZGRlZCB0ZXN0IGNhc2UgMTYzIGp1c3QgdG8gbWFrZSBzdXJlIC1GICJ2YXI9PGZpbGUiIHdvcmtzIGZpbmUgYW5kCiAgY2FuIHBhc3Mgb24gY2hhcmFjdGVycyBzdWNoIGFzIG5ld2xpbmVzLCBjYXJyaWFnZS1yZXR1cm4gYW5kIHRhYnMuCgotIFdoZW4gd2UgYWRkZWQgdGVzdCBjYXNlIDE2MiB3aXRob3V0IGFkZGluZyB0aGUgbmVjZXNzYXJ5IHJlcXVpcmVtZW50IGZpZWxkCiAgaW4gdGhlIHRlc3QgbWV0YSBkYXRhIHdlIGNvdWxkIHNlZSB0aGF0IGN1cmwgZGlkbid0IGNvbXBsYWluIGlmIHlvdSB1c2VkCiAgLS1wcm94eS1udGxtIGV2ZW4gaWYgdGhlIHVuZGVybHlpbmcgbGliY3VybCBpdCB1c2VzIGhhcyBubyBOVExNIHN1cHBvcnQhIEkKICBub3cgbWFkZSBpdCBjaGVjayB0aGlzIGZpcnN0LCBhbmQgaXQgbm93IGV4aXN0cyB3aXRoIGEgInRoZSBpbnN0YWxsZWQKICBsaWJjdXJsIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IHRoaXMiIG1lc3NhZ2UgaWYgaXQgaGFwcGVucyBhZ2Fpbi4KCkRhbmllbCAoMjIgQXByaWwgMjAwNCkKLSBEYXZpZCBCeXJvbiBmb3VuZCBhbmQgZml4ZWQgYSBzbWFsbCBidWcgd2l0aCB0aGUgLS1mYWlsIGFuZCBhdXRoZW50aWNhdGlvbgogIHN0dWZmIGFkZGVkIGEgZmV3IHdlZWtzIGFnby4gIFR1cm5zIG91dCB0aGF0IGlmIHlvdSBzcGVjaWZ5IC0tcHJveHktbnRsbSBhbmQKICBjb21tdW5pY2F0ZSB3aXRoIGEgcHJveHkgdGhhdCByZXF1aXJlcyBiYXNpYyBhdXRoZW50aWNhdGlvbiwgdGhlIHByb3h5CiAgcHJvcGVybHkgcmV0dXJucyBhIDQwNywgYnV0IHRoZSBmYWlsdXJlIGRldGVjdGlvbiBjb2RlIGRvZXNuJ3QgcmVhbGl6ZSBpdAogIHNob3VsZCBnaXZlIHVwLCBzbyBjdXJsIHJldHVybnMgd2l0aCBleGl0IGNvZGUgMC4gVGVzdCBjYXNlIDE2MiBhZGRlZCB0bwogIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gYWxsb3cgbmV3bGluZXMgaW4gdGhlIGNvbnRlbnRzIHdoZW4gZG9pbmcgLUYgInZhcj1bY29udGVudHNdIgogIFJvYmVydCBNYXJsb3cgcmVwb3J0ZWQuCgotIElmIGEgdHJhbnNmZXIgaXMgZm91bmQgb3V0IHRvIGJlIG9ubHkgcGFydGlhbCwgbGliY3VybCB3aWxsIG5vdyB0cmVhdCB0aGF0CiAgYXMgYSBwcm9ibGVtIHNlcmlvdXMgZW5vdWdoIHRvIHNraXAgdGhlIGZpbmFsIFFVSVQgY29tbWFuZCBiZWZvcmUgY2xvc2luZwogIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uIFRvIGF2b2lkIHRoZSByaXNrIHRoYXQgaXQgd2lsbCAiaGFuZyIgd2FpdGluZyBmb3IKICB0aGUgUVVJVCByZXNwb25zZS4gQWRkZWQgdGVzdCBjYXNlIDE2MSB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMjEgQXByaWwgMjAwNCkKLSBNb2RpZmllZCB0aGUgaGV1cmlzdGljcyBmb3IgZGVhbGluZyB3aXRoIHRoZSB0ZXN0IDE2MCBzY2VuYXJpby4gV2hlbiBhCiAgY29ubmVjdGlvbiBpcyByZS11c2VkIGFuZCBub3RoaW5nIGF0IGFsbCBpcyByZWNlaXZlZCBmcm9tIGl0IChiZWNhdXNlIHRoZQogIHNlcnZlciBjbG9zZXMgdGhlIGNvbm5lY3Rpb24pLCB3ZSB3aWxsIG5vdyByZXRyeSB0aGUgcmVxdWVzdCBvbiBhIGZyZXNoIG5ldwogIGNvbm5lY3Rpb24uIFRoZSBwcmV2aW91cyBFQ09OTlJFU0VUIHN0dWZmIGZyb20gSmFudWFyeSAzMCB3YXMgcmVtb3ZlZCBhZ2FpbgogIGFzIGl0IGRpZG4ndCBkZXRlY3QgdGhlIHNpdHVhdGlvbiBnb29kIGVub3VnaC4KCkRhbmllbCAoMjAgQXByaWwgMjAwNCkKLSBBZGRlZCB0ZXN0IGNhc2UgMTYwIHRvIHZlcmlmeSB0aGF0IGN1cmwgd29ya3MgY29ycmVjdGx5IHdoZW4gaXQgZ2V0cyBhCiAgY29ubmVjdGlvbiByZXNldCB3aGVuIHRyeWluZyB0byByZS11c2UgYSBjb25uZWN0aW9uLiBJdCBzaG91bGQgdGhlbiBzaW1wbHkKICBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBhbmQgcmVzZW5kIHRoZSByZXF1ZXN0LgoKRGFuaWVsICgxOSBBcHJpbCAyMDA0KQotIE5vIG1vcmUgNTEyIGJ5dGUgbGltaXQgZm9yIGhvc3QgbmFtZSAoaW5jbHVzaW5nIG5hbWUgKyBwYXNzd29yZCkgaW4gbGliY3VybC4KICBBbiBhZGRlZCBib251cyBpcyB0aGF0IHdlIHVzZSBsZXNzIG1lbW9yeSBmb3IgdGhlIHR5cGljYWwgKHNob3J0ZXIgVVJMKQogIGNhc2UuCgotIENsZWFuZWQgdXAgdGhlIHNvdXJjZXMgdG8gYmV0dGVyIHVzZSB0aGUgdGVybXMgJ2hvc3RuYW1lJyBhbmQgJ3BhdGgnCiAgaW50ZXJuYWxseSB3aGVuIHJlZmVycmluZyB0byB0aGF0IGRhdGEuIFRoZSBidWZmZXJzIHVzZWQgZm9yIGtlZXAgdGhhdCBpbmZvCiAgaXMgY2FsbGVkICduYW1lYnVmZmVyJyBhbmQgJ3BhdGhidWZmZXInLiBNdWNoIGVhc2llciB0byByZWFkIGFuZCB1bmRlcnN0YW5kCiAgdGhhbiB0aGUgcHJldmlvdXMgbWVzcy4KCkRhbmllbCAoMTUgQXByaWwgMjAwNCkKLSBNb2RpZmllZCBydW50ZXN0cy5wbCBhZ2FpbiB0byByZW1vdmUgYWxsIGxvZyBmaWxlcyBpbiB0aGUgbG9nLyBkaXIgYmV0d2VlbgogIGVhY2ggdGVzdCwgYW5kIHRoZW4gbWFkZSAtcCBkaXNwbGF5IGFsbCBub24temVybyBieXRlIGZpbGVzIGluIHRoZSBsb2cgZGlyLgogIEl0IHNob3VsZCBtYWtlIHRoYXQgZGF0YSBtb3JlIHVzYWJsZSBhbmQgY29udGFpbiBsZXNzIHJ1YmJpc2guCgotIGZ0cHNlcnZlci5wbCBub3cgcHJvZHVjZXMgbG9nIGZpbGVzIG1vcmUgc2ltaWxhciB0byBob3cgdGhlIHN3cyBvbmVzIGxvb2sKICBhbmQgdGhleSBub3cgYWxzbyBjb250YWlucyBhIGJpdCBtb3JlIGRldGFpbHMgdG8gaGVscCBkZWJ1Z2dpbmcgZnRwCiAgcHJvYmxlbXMuCgotIFJlbW92ZWQgdGhlIGZpeGVkIG1heGltdW0gYW1vdW50IG9mIGRpciBsZXZlbHMgdGhlIEZUUCBjb2RlIHN1cHBvcnRlZC4KICBQcmV2aW91c2x5IHdlIGhhZCBhIGZpeGVkIGFycmF5IGZvciAxMDAgbGV2ZWxzLCBub3cgd2Ugc2F2ZSBzcGFjZSBpbiBlYWNoCiAgaGFuZGxlIGJ5IGFsbG9jYXRpbmcgb25seSBmb3IgYSBmZXcgbGV2ZWwgYnkgZGVmYXVsdCBhbmQgdGhlbiBlbmxhcmdpbmcgdGhhdAogIGluIGNhc2Ugb2YgbmVlZCAod2l0aCBubyBtYXhpbXVtIGRlcHRoKS4gQWRqdXN0ZWQgdGVzdCBjYXNlIDE0MiB0byB2ZXJpZnkKICB0aGF0IDE1MCBkaXIgbGV2ZWxzIHdvcmsgZmluZS4gIEFuIGFkZGVkIGJvbnVzIGlzIHRoYXQgd2UgdXNlIGxlc3MgbWVtb3J5CiAgZm9yIHRoZSB0eXBpY2FsIChub3QgdmVyeSBkZWVwKSBjYXNlLgoKRGFuaWVsICgxNCBBcHJpbCAyMDA0KQotIEFza2luZyBmb3IgQ1VSTF9JUFJFU09MVkVfVjYgd2hlbiBpcHY2IGFkZHJlc3NlcyBjYW4ndCBiZSByZXNvbHZlZCB3aWxsCiAgbm93IGNhdXNlIHRoZSByZXNvbHZlIGZ1bmN0aW9uIHRvIHJldHVybiBOVUxMIGltbWVkaWF0ZWx5LiBUaGlzIGZsYXcgd2FzCiAgcG9pbnRlZCBvdXQgYnkgR2lzbGUgVmFuZW0uCgotIEdpc2xlIFZhbmVtIG1hZGUgY3VybCAtNC8tNiBhY3R1YWxseSBzZXQgdGhlIGRlc2lyZWQgb3B0aW9uIHRvIGxpYmN1cmwuCgotIHJ1bnRlc3RzLnBsIG5vdyBoYXMgYSBuZXcgb3B0aW9uICgtcCkgdGhhdCB3aWxsIGRpc3BsYXkgImludGVyZXN0aW5nIiBsb2cKICBmaWxlcyB0byBzdGRvdXQgaW4gY2FzZSBvZiBhIHRlc3QgZmFpbHVyZS4gVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYmUKICB1c2VkIGluIHRoZSAnZnVsbC10ZXN0JyBtYWtlIHRhcmdldCB0aGF0IGlzIHVzZWQgYnkgdGhlIGF1dG9idWlsZCB0ZXN0cywgYXMKICB3ZSB0aGVuIGdldCBhIG11Y2ggYmV0dGVyIGNoYW5jZSB0byB1bmRlcnN0YW5kIChyZW1vdGUpIHRlc3QgZmFpbHVyZXMgYmFzZWQKICBvbiBhdXRvYnVpbGQgbG9ncyBhbG9uZS4KCkRhbmllbCAoMTMgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd29yayBhZ2FpbiBvbiBXaW5kb3dzIGV2ZW4gd2hlbiBidWlsdAogIHdpdGhvdXQgYXJlcy4gQmVmb3JlIHRoaXMsIHNlbGVjdCgpIHdvdWxkIHJldHVybiAtMSBkdXJpbmcgdGhlIG5hbWUgcmVzb2x2ZQogIHBoYXNlIHNpbmNlIGN1cmxfbXVsdGlfZmRzZXQoKSBkaWRuJ3QgcmV0dXJuIGFueSBmZF9zZXQgYXQgYWxsIHdoaWNoIHdhc24ndAogIGFwcHJlY2lhdGVkIQoKLSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgbm93IGR1cGxpY2F0ZXMgdGhlIHRjcF9ub2RlbGF5IGluZm8gYXMgd2VsbC4KCkRhbmllbCAoMTEgQXByaWwgMjAwNCkKLSBBcHBsaWVkIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggZm9yIHRoZSBNU1ZDIGxpYmN1cmwgbWFrZWZpbGUgZm9yIGJ1aWxkcyB3aXRoCiAgemxpYi4KCkRhbmllbCAoOSBBcHJpbCAyMDA0KQotIERpcmsgTWFuc2tlIGltcHJvdmVkIHRoZSB0aW1lciByZXNvbHV0aW9uIGZvciBDVVJMSU5GT18qX1RJTUUsIGl0IGNhbiBub3cKICBiZSBkb3duIHRvIHVzZWMgaWYgdGhlIHN5c3RlbSBzeXBwb3J0cyBpdC4KCkRhbmllbCAoNyBBcHJpbCAyMDA0KQotIEEgcmVxdWVzdCB0aGF0IHNlbmRzICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgYW5kIGdldHMgbm90aGluZyBidXQgYSBzaW5nbGUKICAxMDAgcmVzcG9uc2UgYmFjayB3aWxsIG5vdyByZXR1cm4gYSBDVVJMRV9HT1RfTk9USElORy4gVGVzdCAxNTggdmVyaWZpZXMuCgotIFRoZSBzdHJ0b29mZnQoKSBtYWNybyBpcyBub3cgbmFtZWQgY3VybHhfc3RydG9vZmZ0KCkgdG8gdXNlIHRoZSBjdXJseF8qCiAgYXBwcm9hY2ggZnVsbHkuCgpEYW5pZWwgKDYgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSdzIGZpeGVkIGJ1ZyAjOTI3OTc5IHJlcG9ydGVkIGJ5IE5hdGhhbiBPJ1N1bGxpdmFuLiBUaGUgcHJvYmxlbQogIG1hZGUgbGliY3VybCBvbiBXaW5kb3dzIGxlYWsgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGluIGVhY2ggbmFtZSByZXNvbHZlCiAgd2hlbiBub3QgdXNlZCBhcyBhIERMTC4KCi0gTmV3IGF1dGhlbnRpY2F0aW9uIGNvZGUgYWRkZWQsIHBhcnRpY3VsYXJseSBub3RpY2FibGUgd2hlbiBkb2luZyBQT1NUIG9yIFBVVAogIHdpdGggRGlnZXN0IG9yIE5UTE0uIGxpYmN1cmwgd2lsbCBub3cgdXNlIEhFQUQgdG8gbmVnb3RpYXRlIHRoZQogIGF1dGhlbnRpY2F0aW9uIGFuZCB3aGVuIGRvbmUgcGVyZm9ybSB0aGUgcmVxdWVzdGVkIFBPU1QuIFByZXZpb3VzbHkgbGliY3VybAogIHNlbnQgUE9TVCBpbW1lZGlhdGVseSBhbmQgZXhwZWN0ZWQgdGhlIHNlcnZlciB0byByZXBseSBhIGZpbmFsIHN0YXR1cyBjb2RlCiAgd2l0aCBhbiBlcnJvciBhbmQgdGhlbiBsaWJjdXJsIHdvdWxkIG5vdCBzZW5kIHRoZSByZXF1ZXN0LWJvZHkgYnV0IGluc3RlYWQKICBzZW5kIHRoZW4gbmV4dCByZXF1ZXN0IGluIHRoZSBzZXF1ZW5jZS4KCiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgZHVlIHRvIElJUzYgYmFyZmluZyBvbiBsaWJjdXJsIHdoZW4gd2UgYXR0ZW1wdAogIHRvIFBPU1Qgd2l0aCBOVExNIGF1dGhlbnRpY2F0aW9uLiBUaGUgcmVhc29uIGZvciB0aGUgcHJvYmxlbXMgaXMgZm91bmQgaW4KICBSRkMyNjE2IHNlY3Rpb24gOC4yLjMgcmVnYXJkaW5nIGhvdyBzZXJ2ZXJzIHNob3VsZCBkZWFsIHdpdGggdGhlIDEwMAogIGNvbnRpbnVlIHJlcXVlc3QtaGVhZGVyOgoKICAgICAgICBJZiBpdCByZXNwb25kcyB3aXRoIGEgZmluYWwgc3RhdHVzIGNvZGUsIGl0IE1BWSBjbG9zZSB0aGUgdHJhbnNwb3J0CiAgICAgICAgY29ubmVjdGlvbiBvciBpdCBNQVkgY29udGludWUgdG8gcmVhZCBhbmQgZGlzY2FyZCB0aGUgcmVzdCBvZiB0aGUKICAgICAgICByZXF1ZXN0LgoKICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBJSVMgY2xlYXJseSBkaWQgY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW4gdGhpcyBjYXNlLAogIHdoaWxlIHRoaXMgbmV3ZXIgdmVyc2lvbiBkZWNpZGVkIGl0IHNob3VsZCAicmVhZCBhbmQgZGlzY2FyZCIuIFRoYXQgd291bGQndmUKICBmb3JjZWQgdXMgdG8gc2VuZCB0aGUgd2hvbGUgUE9TVCAob3IgUFVUKSBkYXRhIG9ubHkgdG8gaGF2ZSBpdCBkaXNjYXJkZWQgYW5kCiAgdGhlbiBiZSBmb3JjZWQgdG8gc2VuZCBpdCBhZ2Fpbi4gVG8gYXZvaWQgdGhhdCBodWdlIHBlbmFsaXR5LCB3ZSBzd2l0Y2ggdG8KICB1c2luZyBIRUFEIHVudGlsIHdlIGFyZSBhdXRoZW50aWNhdGVkIGFuZCB0aGVuIHNlbmQgdGhlIFBPU1QuCgogIFRoZSBvbmx5IGFjdHVhbCBkcmF3YmFjayBJIGNhbiB0aGluayBvZiAoZXhjZXB0IGZvciB0aGUgb2RkIHNpdGVzIHRoYXQgbWlnaHQKICB0cmVhdCBIRUFEIGRpZmZlcmVudGx5IHRoYW4gdGhleSB3b3VsZCB0cmVhdCBQT1NUL1BVVCB3aGVuIGdpdmVuIHRoZSBzYW1lCiAgVVJMKSBpcyB0aGF0IGlmIHlvdSBkbyBQT1NUIHdpdGggQ1VSTEFVVEhfQU5ZIHNldCBhbmQgdGhlIHNpdGUgcmVxdWlyZXMgTk8KICBhdXRoZW50aWNhdGlvbiwgbGliY3VybCB3aWxsIHN0aWxsIHVzZSBhIEhFQUQgaW4gYSBmaXJzdCByb3VuZCBhbmQgdGhlbiBkbyBhCiAgUE9TVC4KCiAgSWYgeW91IGRvIGEgSEVBRCBvciBhIEdFVCBvbiBhIHNpdGUgdXNpbmcgQ1VSTEFVVEhfQU5ZLCBsaWJjdXJsIHdpbGwgc2VuZAogIGFuIHVuLWF1dGhlbnRpY2F0ZWQgcmVxdWVzdCBhdCBvbmNlLCB3aGljaCB0aGVuIGlzIHRoZSBvbmx5IHJlcXVlc3QgaWYgdGhlCiAgc2l0ZSByZXF1aXJlcyBubyBhdXRoLgoKICBBbGFuIFBpbnN0ZWluIGhlbHBlZCBtZSB3b3JrIG91dCB0aGUgcHJvdG9jb2wgZGV0YWlscyBieSBmaWd1cmluZyBvdXQgd2h5CiAgbGliY3VybCBmYWlsZWQgYW5kIHdoYXQgSUlTNiBleHBlY3RzLgoKLSBUaGUgLS1saW1pdC1yYXRlIGxvZ2ljIHdhcyBjb3JyZWN0ZWQgYW5kIG5vdyBpdCB3b3JrcyBhIGxvdCBiZXR0ZXIgZm9yCiAgaGlnaGVyIHNwZWVkcywgc3VjaCBhcyAnMTBtJyBvciBzaW1pbGFyLiBSZXBvcnRlZCBpbiBidWcgcmVwb3J0ICM5MzAyNDkuCgotIEludHJvZHVjaW5nIGN1cmx4X3R2bm93KCkgYW5kIGN1cmx4X3R2ZGlmZigpIHVzaW5nIHRoZSBuZXcgY3VybHhfKiBmYXNoaW9uLgogICNpbmNsdWRlICJ0aW1ldmFsLmgiIGZyb20gdGhlIGxpYiBkaXIgdG8gZ2V0IHRoZSBwcm90b3MgZXRjLiAgTm90ZSB0aGF0CiAgdGhlc2UgYXJlIE5PVCBwYXJ0IG9mIHRoZSBsaWJjdXJsIEFQSS4gVGhlIGN1cmwgYXBwIHNpbXBseSB1c2VzIHRoZSBzYW1lCiAgc291cmNlIGZpbGVzIGFzIHRoZSBsaWJyYXJ5IGRvZXMgYW5kIHRoZXJlZm9yZSB0aGUgZmlsZSBuZWVkcyB0byBiZSBjb21waWxlZAogIGFuZCBsaW5rZWQgd2l0aCBjdXJsIHRvbywgbm90IGp1c3Qgd2hlbiBjcmVhdGluZyBsaWJjdXJsLgoKLSBsaWIvc3RyZXJyb3IuYyBubyBsb25nZXIgdXNlcyBzeXNfbmVyciBvbiBub24td2luZG93cyBwbGF0Zm9ybXMgc2luY2UgaXQKICBpc24ndCBwb3J0YWJsZSBlbm91Z2gKCkRhbmllbCAoMiBBcHJpbCAyMDA0KQotIEluIHRoZSBjdXJsX3N0cm5xdWFsLjMgbWFuIHBhZ2UsIHdlIG5vdyBwcmVwZW5kIHRoZSBtYW4zIGRpciB0byB0aGUgZmlsZQogIG5hbWUgdG8gd29yayBiZXR0ZXIuIEFzIHBvaW50ZWQgb3V0IGJ5IFJvYmluIEtheS4KCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndyBtYWtlZmlsZXMuCgotIERpcmsgTWFuc2tlIGZpeGVkIGEgcHJvYmxlbSBJIHJlY2VudGx5IGFkZGVkIGluIHRoZSBwcm9ncmVzcyBtZXRlciBjb2RlIHRoYXQKICBicm9rZSBzdWJzZWNvbmQgcmVzb2x1dGlvbiBmb3IgQ1VSTElORk9fVE9UQUxfVElNRS4gSGUgYWxzbyBwb2ludGVkIG91dCBhCiAgbWlzdGFrZSBpbiB0aGUgY29kZSB0aGF0IHByb2R1Y2VzIHRoZSBmaW5hbCB1cGRhdGUgb2YgdGhlIHByb2dyZXNzIG1ldGVyCiAgdGhhdCB3b3VsZCBvZnRlbiBwcmV2ZW50IGl0IGZyb20gYWN0dWFsbHkgYmVpbmcgdXBkYXRlZCB0aGF0IGZpbmFsIHRpbWUuCgpEYW5pZWwgKDEgQXByaWwgMjAwNCkKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIG1lbW9yeSBsZWFrIHRoYXQgaGFwcGVuZWQgd2hlbiB3ZSB1c2UgYXJlcyBmb3IgbmFtZQogIHJlc29sdmVzIGFuZCBkZWNpZGVzIHRvIHRpbWUtb3V0IGJlZm9yZSBhcmVzIGRvZXMgaXQuIFRoaXMgZml4IHVzZXMgdGhlCiAgYnJhbmQgbmV3IGFyZXNfY2FuY2VsKCkgZnVuY3Rpb24gd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gYy1hcmVzIDEuMS4wLgoKICBXaGVuIHRvbGQgdG8gZW5hYmxlIGFyZXMsIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgZm9yIHByZXNlbmNlIG9mCiAgdGhlIGFyZXNfY2FuY2VsIGZ1bmN0aW9uIHRvIGFsZXJ0IHVzZXJzIGlmIHRoZXkgYXR0ZW1wdCB0byB1c2UgYSB0b28gb2xkCiAgYy1hcmVzIGxpYnJhcnkuCgpEYW5pZWwgKDMxIE1hcmNoIDIwMDQpCi0gUm95IFNoYW4gZml4ZWQgYSBmbGF3IHRoYXQgcHJldmVudGVkIGFyZXMgbmFtZSByZXNvbHZlIHRpbWVvdXRzIHRvIG9jY3VyIQoKLSBEaXJrIE1hbnNrZSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNvbHZlcyBmYXIgdG9vCiAgZWFzeSB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIHVzZSAoYy0pYXJlcyBmb3IgbmFtZSByZXNvbHZpbmcuCgotIEZ1cnRoZXIgRGlnZXN0IGZpeGluZyBhbmQgYSBzdWNjZXNzZnVsIHRlc3QgY2FzZSAxNTMgbm93IG1ha2VzIG1lIGJlbGlldmUKICBNaXR6IFdhcmsncyBwcm9ibGVtcyBhcmUgZml4ZWQuCgotIEFuZHJlcyBHYXJjaWEgZmlndXJlZCBvdXQgdGhhdCB0ZXN0IGNhc2UgNjMsIHdoaWxlIHdvcmtpbmcsIG9ubHkgcHJvdmVkIGEKICBmbGF3IGluIGxpYmN1cmwncyAnaHR0cF9wcm94eScgcGFyc2VyIHdoZW4gYSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGlzCiAgcHJvdmlkZWQuIFRoZSB1c2VyIG5hbWUgd2FzIG5vdCBleHRyYWN0ZWQgcHJvcGVybHkgKGFuZCAnaHR0cCcgd2FzIGFsd2F5cwogIHVzZWQgYXMgdXNlciBuYW1lKS4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBvdXIgaW9jdGxzb2NrZXQoKSB1c2FnZS4KCkRhbmllbCAoMzAgTWFyY2ggMjAwNCkKLSBKb2UgSGFscGluIGZhY2VkIHByb2JsZW1zIHdpdGggdGhlIGdldG5hbWVpbmZvKCkgYXJndW1lbnQgYWlfZmxhZ3MgYW5kIHRoZQogIHBhcnRpY3VsYXIgYml0IG5hbWVkICdOSV9XSVRIU0NPUEVJRCcgb24gU29sYXJpcyA5IGZvciBJbnRlbC4gIEkndmUgbm93CiAgd3JpdHRlbiBhIGNvbmZpZ3VyZSB0ZXN0IHRoYXQgY2hlY2tzIGZvciBhIHdvcmtpbmcgTklfV0lUSFNDT1BFSUQKICBpbXBsZW1lbmF0aW9uLiBObyBjb2RlIHVzZXMgdGhlIHJlc3VsdCBmcm9tIHRoaXMgdGVzdCB5ZXQsIGl0IGlzIHN0aWxsCiAgZXhwZXJpbWVudGFsLiBKYW1lcyBDYXJsc29uIHdyb3RlIGluIGNvbXAudW5peC5zb2xhcmlzOiAiSXQncyBhIGJ1ZwogICg1MDA2NjIzKSAtLSBpdCdzIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZG4ndCBiZSBpbiB0aGUgaGVhZGVyIGZpbGUuIgoKLSBJIHByb3ZpZGVkIE1pdHogV2FyayB3aXRoIGEgZmlyc3QgcGF0Y2ggaW4gb3JkZXIgdG8gZml4IGxpYmN1cmwncyBwcm9ibGVtcwogIHRvIHJlLW5lZ290aWF0ZSBEaWdlc3QgYXV0aGVudGljYXRpb24gKHdoZW4gJ3N0YWxlPXRydWUnIGlzIGluY2x1ZGVkIGluIHRoZQogIHJlc3BvbnNlIGhlYWRlcikuCgotIFJveSBTaGFuIGRpc2NvdmVyZWQgdGhhdCB0aGUgbXVsdGkgaW50ZXJmYWNlIGRpZG4ndCBwcm9wZXJseSB0aW1lb3V0IG5hbWUKICBsb29rdXBzIHdoaWNoIGNvdWxkIG1ha2UgaGFuZGxlcyBnZXQgc3R1Y2sgaW4gdGhhdCBzdGF0ZSBhbmQgdGh1cyBuZXZlciBnZXQKICBjb21wbGV0ZWQuIEkndmUgcHJvZHVjZWQgYSBmaXJzdCB0ZXN0IHBhdGNoIHRoYXQgYXR0ZW1wdHMgdG8gY29ycmVjdCB0aGlzLgoKLSBEYXZpZCBCeXJvbidzIHBhdGNoIHdhcyBhcHBwbGllZCB0byBtYWtlIENVUkxPUFRfRkFJTE9ORVJST1Igd29yayBuaWNlbHkKICBldmVuIHdpdGggYXV0aGVudGNhdGlvbnMgc3VjaCBhcyBOVExNIG9yIERpZ2VzdCBlbmFibGVkLiBUZXN0IGNhc2VzIDE1MCwgMTUxCiAgYW5kIDE1MiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjkgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSB1cGRhdGVkIGZpbGVzIGZvciB0aGUgZGpncHAvTVMtRE9TIGJ1aWxkLgoKLSBBbmRy6XMgR2FyY+1hIGhlbHBlZCBtZSB3b3JrIG91dCBhIGZpeCBmb3IgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCB0byBtYWtlCiAgdGhlIGZpbGU6Ly8gdGVzdHMgcnVuIGZpbmUgd2hlbiB0ZXN0ZWQgd2l0aCB0aGUgbWluZ3ctYnVpbHQgdmVyc2lvbiBvZiBjdXJsLgoKLSBGaXhlZCBhbiBpbmNsdWRlIGlzc3VlIHdpdGggbmV0aW5ldC90Y3AuaCBvbiBBSVgsIGJhc2VkIG9uIGlucHV0IGJ5IFRvci4KICBUaGlzIGFsc28gcmVxdWlyZWQgYSBtaW5vciBmaXggb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgotIFRoZSBwb3N0aXQyLmMgc291cmNlIGV4YW1wbGUgdXNlZCB0aGUgd3Jvbmcgc3RydWN0IG5hbWUgZm9yIHRoZSBwb3N0IGRhdGEuCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgaXB2NiBzdXBwb3J0IG9uIHdpbmRvd3MgYnkgbWFraW5nIHRoZSBjdXJsIGJ1aWxkIHRvIHVzZQogIHRoZSBjb3JyZWN0IGdldGFkZHJpbmZvKCkgZnVuY3Rpb24uCgpEYW5pZWwgKDI1IE1hcmNoIDIwMDQpCi0gSXQgdHVybmVkIG91dCB0aGF0IEFJWCwgZGVzcGl0ZSBoYXZpbmcgYSAidGhyZWFkLXNhZmUgbGliYyIsIGRvZXNuJ3Qgb2ZmZXIKICBhbGwgdHJhZGl0aW9uYWwgZnVuY3Rpb25zIHRocmVhZC1zYWZlLiBUaGlzIFVSTCBpcyBpbmZvcm1hdGl2ZSBvbiB0aGlzCiAgc3ViamVjdDoKCiAgICBodHRwOi8vcHVibGlibi5ib3VsZGVyLmlibS5jb20vZG9jX2xpbmsvZW5fVVMvYV9kb2NfbGliL2FpeHByZ2dkLyBcCiAgICBnZW5wcm9nYy90aHJlYWRfcXVpY2tfcmVmLmh0bQoKICBBcyBhIHJlc3VsdCBvZiB0aGlzLCB3ZSBub3cgY2hlY2sgZm9yIHRocmVlICpfcigpIGZ1bmN0aW9ucyBvbiByZWNlbnQgQUlYCiAgdmVyc2lvbnMgYXMgd2VsbCB0aGF0IHRoZSBVUkwgbWVudGlvbnMgYXJlbid0IHRocmVhZC1zYWZlIGluIEFJWCA1LjEuCgotIHJlbmFtZWQgY3VybF9zdHJlcnJvci5bY2hdIHRvIHN0cmVycm9yLltjaF0KCi0gSm9lIEhhbHBpbiBhZGRlZCBDVVJMT1BUX1RDUF9OT0RFTEFZIGFuZCAtLXRjcC1ub2RlbGF5IHRvIG1ha2UgaXQgcG9zc2libGUKICBmb3IgdXNlcnMgdG8gZGlzYWJsZSB0aGUgTmFnbGUgYWxnb3J0aGltLXVzYWdlLgoKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBzb21lIGludGVyZXN0aW5nIHN0cmVycm9yX3IoKSBrbm93bGVkZ2UuIGdsaWJjIGhhcyBpdHMKICBvd24gQVBJIHdoaWNoIGRpZmZlcnMgZnJvbSB0aGUgUE9TSVggb25lLiBEYW5pZWwgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB0byBkZXRlY3QgdGhlIHZlcnNpb24gaW4gdXNlLCBhbmQgdGhlIGNvZGUgbm93IHVzZXMgdGhlIG5ldyBkZWZpbmVzCiAgYWNjb3JkaW5nbHkuCgotIEZpeGVkIHNvbWUgYnVpbGQgZmxhd3Mgd2l0aCB0aGUgbmV3IGxpYi9jdXJsX3N0cmVycm9yLmMgc291cmNlIGZpbGUuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBmaXggdG8gcmVwbGFjZSB0aGUgYmFkIHVzZSBvZiBzdHJlcnJvcigpLiBUaGlzIGludHJvZHVjZXMKICBDdXJsX3N0cmVycm9yKCkgdGhhdCBhdHRlbXB0cyB0byBiZSB0aHJlYWQtc2FmZSBfYW5kXyB3b3JrcyBvbiBXaW5kb3dzIHRvbyEKCi0gVG9yIEFybnRzZW4gc3BlbGwtZml4ZWQgbG90cyBvZiBsaWJjdXJsIG1hbiBwYWdlcy4KCi0gVG9yIEFybnRzZW4gbWFkZSB0ZXN0Y3VybC5wbCB3b3JrIHdpdGggb2xkZXIgcGVybCA1IHZlcnNpb25zLCBhbmQgRGFuaWVsCiAgbWFkZSBpdCBub3QgdXNlIGNoZGlyIC4uIHRvIGdvIGJhY2ssIGFzIHRoYXQgaXNuJ3QgdmVyeSBnb29kIHdoZW4geW91J3ZlCiAgc2V0dXAgYSB0ZXN0ZGlyIGNvbnRhaW5pbmcgc3ltbGlua3MuCgotIEFkZGVkIGEgY2hlY2sgZm9yIHN0cmVycm9yX3IoKSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCkRhbmllbCAoMjMgTWFyY2ggMjAwNCkKLSBBZGRlZCBHcmVnIEhld2dpbGwncyB0ZXN0Y3VybC5wbCBzY3JpcHQgdG8gQ1ZTLiBXZSBoYXZlIG5vdCBtb3ZlZCBvdmVyIHRvCiAgdXNlIHRoaXMgc2NyaXB0IGZvciB0aGUgcmVhbCBkaXN0cmlidXRlZCB0ZXN0aW5nIGp1c3QgeWV0LCBidXQgaXQgaXMgb25seQogIGEgbWF0dGVyIG9mIHRpbWUuCgotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGNvZGUgdGhhdCBtYWtlcyBjdXJsIHJlcG9ydCBhIGJldHRlciBlcnJvciBtZXNzYWdlCiAgaWYgLS1pbnRlcmZhY2UgZmFpbHMgb24gd2luZG93cy4KCi0gVGhlIHJlZ3VsYXIgcHJvZ3Jlc3MgbWV0ZXIgaXMgbm93IGZpeGVkIHRvIG5ldmVyIHdyYXAgZHVlIHRvIGxvbmcgbGluZXMuIEFsbAogIGZpZWxkcyBhcmUgbm93IHN0YXRpYyBzaXplZC4gSWYgdGhlIHRpbWUgaW4gdGhlIHRpbWUgZmllbGRzIGdldCBhIHRpbWUgdmFsdWUKICB0aGF0IHdvdWxkIHJlcHJlc2VudCBhIHRpbWUgdGhhdCBpcyAxMDAgaG91cnMgb3IgbW9yZSAoaWYgbm90LCBpdCByZW1haW5zCiAgdXNpbmcgYSBISDpNTTpTUyBkaXNwbGF5KSwgaXQgc3dpdGNoZXMgZmlyc3QgdG8gYSAiTk5OZCBOTmgiIGRpc3BsYXkgKGZvcgogIGRheXMgYW5kIGhvdXJzKSBhbmQgaWYgdGhhdCBpc24ndCBlbm91Z2ggaXQgc3dpdGNoZXMgdG8gYSAiTk5OZCIgZGlzcGxheSBpZgogIGl0IGlzIG1vcmUgdGhhbiA5OTkgZGF5cy4KCiAgU2V2ZXJhbCBvZiB0aGUgY2FsY3VsYXRpb25zIHdlcmUgYWxzbyBtb3ZlZCB0byBmaXhlZC1wb2ludCBtYXRoIGluc3RlYWQgb2YKICB1c2luZyBkb3VibGVzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDA0KQotIEdsZW4gTmFrYW11cmEgbm90aWNlZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBkaWRuJ3Qgd29yayBhcyBpdAogIHVzZWQgdG8gZG8gaWYgQ1VSTE9QVF9OT0JPRFkgaXMgc2V0IFRSVUUuCgotIEtldmluIFJvdGggcGF0Y2hlZCB0aGUgY3lnd2luIHBhY2thZ2UgbWFrZWZpbGUgYW5kIFJFQURNRSB0byBhZGp1c3QgdG8KICBuZXcgY3lnd2luIHBhY2thZ2luZyBndWlkZWxpbmVzLgoKLSBFbmFibGVkICJOVCByZXNwb25zZXMiIGluIHRoZSBOVExNIGF1dGhlbnRpY2F0aW9uLiBEb2luZyB0aGlzIHNpbXBseSBtZWFucwogIHRoYXQgd2UgcHJvdmlkZSBhbiBleHRyYSBjaHVuayBvZiBkYXRhIGluIGVhY2ggInR5cGUtMyBtZXNzYWdlIi4gVGhlIG9ubHkKICByZWFzb24gZm9yIGRvaW5nIHRoaXMgaXMgdGhhdCBpdCBzZWVtcyB0aGF0IHVzaW5nIG9ubHkgdGhlICJMYW5tYW5hZ2VyIGhhc2giCiAgKGFzIHdlJ3ZlIGJlZW4gZG9pbmcgdW50aWwgbm93KSBkb2Vzbid0IHN1cHBvcnQgcGFzc3dvcmRzIGxvbmdlciB0aGFuIDE0CiAgY2hhcmFjdGVycyBhbmQgaXQgdHVybnMgb3V0IHRoZXJlIGFyZSB1c2VycyBvdXQgdGhlcmUgd2hvIHdhbnQgdG8gdXNlCiAgbGliY3VybCBhbmQgTlRMTSB3aXRoIHN1Y2ggcGFzc3dvcmRzISA7LSkgU2V2ZW4gTlRMTS1yZWxhdGVkIHRlc3QgY2FzZXMgd2VyZQogIHVwZGF0ZWQgYWNjb3JkaW5nbHkuIE1lbnRpb25lZCBhcyBpc3N1ZSAyOSBpbiBUT0RPLVJFTEVBU0UsIGJ1ZyByZXBvcnQKICAjOTE1NjA5CgotIE1vdmVkIHRoZSBnZW5lcmF0ZWQgbGliY3VybCB2ZXJzaW9uIGluZm8gdG8gYSBuZXcgaGVhZGVyIGZpbGUsIG5hbWVkCiAgY3VybC9jdXJsdmVyLmguIE5vdyBpbnRlcmVzdGVkIHBhcnRpZXMgY2FuIGluY2x1ZGUgT05MWSB2ZXJzaW9uIGluZm8sIHNob3VsZAogIGFueW9uZSB3YW50IHRoYXQgKGFuZCBpdCBzZWVtcyBhdCBsZWFzdCBzb21lIHdpbmRvd3MgcmVzb3VyY2UgZmlsZXMgd291bGQpLgogIE1lbnRpb25lZCBhcyBpc3N1ZSAyNyBpbiBUT0RPLVJFTEVBU0UuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDQpCi0gRml4ZWQgdGhlIHJvb3QgTWFrZWZpbGUgdG8gdXNlIHRhYnMgZm9yIHRoZSBuZXR3YXJlIHRhcmdldC4gR/xudGVyIEtuYXVmCiAgcG9pbnRlZCB0aGlzIG91dC4KCi0gTWFydHkgS3VocnQncyBWTVMgY2xlYW51cAoKLSBUaG9tYXMgU2Nod2luZ2UgbWFkZSBidWlsZGNvbmYgcmVjb2duaXplIEFDTE9DQUxfRkxBR1MgdG8gaW52b2tlIGFjbG9jYWwKICB3aXRoIHBhcnRpY3VsYXIgcHJlLWRldGVybWluZWQgb3B0aW9ucy4KClZlcnNpb24gNy4xMS4xICgxOSBNYXJjaCAyMDA0KQoKRGFuaWVsICgxOCBNYXJjaCAyMDA0KQotIFRvciBBcm50c2VuIGJyb3VnaHQgc29tZSBpbmZvIGFib3V0IFNHSSBJUklYOgoKICBJUklYIHN1cHBvcnRzIDMgZGlmZmVyZW50IGV4ZWN1dGFibGUvb2JqZWN0IGZvcm1hdHMsIC0zMiwgLW4zMiBhbmQgLTY0LgogIC1uMzIgaXMgZGVmYXVsdCAzMi1iaXQgZm9ybWF0LCAtMzIgaXMgdGhlICJvbGQiIDMyLWJpdCBmb3JtYXQsIGFuZCAtNjQgaXMKICB0aGUgNjQtYml0IGZvcm1hdC4gIExpYnJhcmllcyBmb3IgdGhlIGRpZmZlcmVudCBmb3JtYXRzIGFyZSBpbiBsaWIsIGxpYjMyCiAgYW5kIGxpYjY0IHJlc3BlY3RpdmVseS4KCiAgV2UndmUgbm93IGFkanVzdGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGFkYXB0IHRvIHRoaXMgd2hlbiBzY2FubmluZyBmb3IKICAzcmQgcGFydHkgbGlicywgc3VjaCBhcyBPcGVuU1NMLgoKRGFuaWVsICgxNyBNYXJjaCAyMDA0KQotIFdhdHogcG9pbnRlZCBvdXQgYSBmZXcgbWlzc2luZyBmaWxlcyBpbiB0aGUgTVNWQyBwcm9qZWN0IGRlc2NyaXB0aW9uIGZpbGUuCgotIEf8bnRlciBLbmF1ZiBicm91Z2h0IHBhdGNoZXMsIGNvZGUgYW5kIG1ha2VmaWxlcyB0byBidWlsZCBjdXJsIG9uIE5vdmVsbAogIE5ldFdhcmUuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDQpCi0gTG90cyBvZiBsaWJjdXJsIG1hbiBwYWdlcyB3ZXJlIHVwZGF0ZWQgdG8gY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG1hbgogIHBhZ2VzIHRoZSByZWNvZ25pemVkIHdheSBzbyB0aGF0IHRoZXkgYXBwZWFyIGFzIG5pY2UgaHlwZXJsaW5rcyBpbiB0aGUgSFRNTAogIHZlcnNpb25zLgoKLSBidWlsZGNvbmYgbm93IGNoZWNrcyB0aGUgbTQgdmVyc2lvbiB0b28sIHNpbmNlIGF1dG9jb25mIHJlcXVpcmVzIGEgR05VIG00CiAgdmVyc2lvbiB0byBidWlsZCBwcm9wZXIgY29uZmlndXJlIHNjcmlwdHMuCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDQpCi0gQWRkZWQgQ1VSTE9QVF9QT1NURklFTERTSVpFX0xBUkdFLCB0aGUgbGFyZ2UgZmlsZSB2ZXJzaW9uIG9mCiAgQ1VSTE9QVF9QT1NURklFTERTSVpFIHRvIGFsbG93IFBPU1RzIGxhcmdlciB0aGFuIDJHQi4KCi0gRGF2aWQgQnlyb24gZml4ZWQgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjYXNlL2NyYXNoLgoKRGFuaWVsICgxMCBNYXJjaCAyMDA0KQotIEplZmYgTGF3c29uIGZpeGVkIHRoZSBTU0wgY29ubmVjdGlvbiB0byBkZWFsIHdpdGggcmVjZWl2ZWQgc2lnbmFscyBkdXJpbmcgdGhlCiAgY29ubmVjdC4KCi0gQ2hhbmdlZCB0aGUgT1Mgc3RyaW5nIGZvciB3aW4zMiB0byBiZWNvbWUgImkzODYtcGMtd2luMzIiLgoKRGFuaWVsICg5IE1hcmNoIDIwMDQpCi0gQ2hhbmdlZCB0aGUgaW50ZXJuYWxzIHRvIHVzZSBjdXJsX3NvY2tldF90IGZvciBzb2NrZXQgdmFyaWFibGUgdHlwZS4gVGhpcwogIHNob3VsZCBlbmFibGUgdXMgdG8gYnVpbGQgd2l0aCBsZXNzIHdhcm5pbmdzIG9uIFdpbmRvd3MsIHdoZXJlIFNPQ0tFVCBpcwogIHVzZWQgd2hpY2ggaXMgYW4gdW5zaWduZWQgaW50LCB3aGlsZSBtb3N0IG90aGVyIHBsYXRmb3JtcyB1c2UgYSBtZXJlIGludC4KCi0gTW9kaWZpZWQgbGliL2NvbmZpZy13aW4zMi5oIHRvIGJ1aWxkIGZpbmUgb24gTVNWQyBhZ2Fpbi4KClZlcnNpb24gNy4xMS4xLXByZTEgKDggTWFyY2ggMjAwNCkKCkRhbmllbCAoOCBNYXJjaCAyMDA0KQotIE1pbm9yIGZpeCB0byBtYWtlIGN1cmwgQ1VSTF9WRVJTSU9OX0xBUkdFRklMRSBpcyBvbmx5IHNldCBpZiBjdXJsX29mZl90IGlzCiAgbGFyZ2VyIHRoYW4gNCBieXRlcy4KCkRhbmllbCAoNCBNYXJjaCAyMDA0KQotIEltcHJvdmVkIFBVVC9QT1NUIHdpdGggTlRMTS9EaWdlc3QgYXV0aGVudGljYXRpb24sIHRoZSBzbyBjYWxsZWQgaXNzdWUgMTIuCgotIE1vZGlmaWVkIHRoZSB0ZXN0IEhUVFAgc2VydmVyIGEgbG90IHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgY2hhbmdlcyBmb3IKICBQVVQvUE9TVCB3aXRoIE5UTE0vRGlnZXN0IGF1dGhlbnRpY2F0aW9uIChsaWtlIHRlc3QgY2FzZSA4OCkuIEFkZGVkIEFuZHLpcwogIEdhcmPtYSdzIHdpbjMyLWNoYW5nZXMuIEltcHJvdmVkIHRoZSBsb2dnaW5nLgoKLSBGaXhlZCB0aGUgZmlsZTotcmVsYXRlZCBwcm9ncmVzcy9nZXRpbmZvIHN0dWZmIGEgYml0IG1vcmUuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNCkKLSBJIGNvcnJlY3RlZCBhIHByb2JsZW0gd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246CiAgaGVhZGVyIG9yIHdoZW4gZG9pbmcgbXVsdGlwbGUtcmVxdWVzdCBhdXRoZW50aWNhdGlvbnMuIEEgc3Vic2VxdWVudCByZXF1ZXN0CiAgY291bGQgZXJyb25lb3VzbHkgcmUtdXNlIGEgcHJldmlvdXMgY29ubmVjdGlvbiB0aGF0IHdhcyBzZW50IHdpdGgKICBDb25uZWN0aW9uOiBjbG9zZS4gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHJlcG9ydGVkLgoKLSBBbmRy6XMgR2FyY+1hIHBhdGNoZWQgY3VybCB0byBwcmV2ZW50IHdhcm5pbmdzIHdoaWxlIGNvbXBpbGluZyB3aXRoIG1pbmd3LAogIG1haW5seSBiZWNhdXNlIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBoYXZlIGJvdGggV0lOMzIgYW5kIEhBVkVfQ09ORklHX0gKICBkZWZpbmVkLgoKLSBXaGVuIHRyYW5zZmVycmluZyBmaWxlcyBmcm9tIGEgZmlsZTogVVJMLCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIG90aGVyCiAgdHJhbnNmZXIgbWV0cmljcyB3ZXJlIG5vdCB1cGRhdGVkIHByb3Blcmx5LgoKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhICJ2ZXJzaW9uIHJlc291cmNlIiBmaWxlIHRvIHRoZSBjdXJsIGV4ZWN1dGFibGUgZm9yCiAgdGhlIHdpbmRvd3MgYnVpbGRzLgoKRGFuaWVsICgzIE1hcmNoIDIwMDQpCi0gRGF2aWQgQnlyb24ncyB3b3JrIG9uIG1ha2luZyBsaWJjdXJsIG9ubHkgcmVxdWlyZSB3aW5zb2NrIDEuMSBvbiBXaW5kb3dzCiAgbWFjaGluZXMuCgotIE1vcmUgdmFyaWFibGUgY2xlYW51cHMgYmFzZWQgb24gY29tcGlsZXIgd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IFRvciBBcm50c2VuJ3MKICBhdXRvYnVpbGRzIHdpdGggTUlQU1Byby4KCi0gSm9lIEhhbHBpbiBoZWxwZWQgdXMgZml4IHNvbWUgcGVkYW50aWMgY29tcGlsZXIgd2FybmluZ3Mgb24gRnJlZUJTRC4KCi0gQXBwbGllZCBUb20gQmF0ZXMnIHBhdGNoIHRvIGJ1aWxkIG9uIG5zci10YW5kZW0tbnNrLgoKLSBEYW4gRmFuZHJpY2ggY29ycmVjdGVkIHNvbWUgZmxhd3MgaW4gdGhlIGNvbmZpZ3VyZSBHU1MgZGV0ZWN0aW9uLgoKRGFuaWVsICgyIE1hcmNoIDIwMDQpCi0gRml4ZWQgdGhlIGxpYmN1cmwgY29kZSB0byB1c2UgRk9STUFUX09GRl9UIGZvciBwcmludGYoKSBmb3JtYXR0aW5nCiAgY3VybF9vZmZfdCB0eXBlcyBpbnRlcm5hbGx5LgoKRGFuaWVsICgxIE1hcmNoIDIwMDQpCi0gQWRkZWQgQ1VSTF9WRVJTSU9OX0xBUkdFRklMRSBhcyBhIGZlYXR1cmUtYml0IGluIHRoZSBjdXJsX3ZlcnNpb25faW5mbygpCiAgcmVzcG9uc2UsIHRoYXQgc2lnbmFscyBpZiB0aGlzIGxpYmN1cmwgc3VwcG9ydHMgPjJHQiBmaWxlcy4gY3VybCAtViBub3cKICBvdXRwdXRzICdMYXJnZWZpbGUnIGluIHRoZSBGZWF0dXJlczogZmllbGQgaWYgdGhpcyBpcyB0aGUgY2FzZS4gTW9zdCBzeXN0ZW1zCiAgYXJlIGxpa2VseSB0byBzdXBwb3J0IHRoaXMuCgotIFdlIG9mZmVyIGEgQ1VSTF9GT1JNQVRfT0ZGX1QgZGVmaW5lIGluIHRoZSBwdWJsaWMgaGVhZGVyLCB3aGljaCBjYW4gYmUgdXNlZAogIHRvIHByaW50ZigpIGN1cmxfb2ZmX3QgdmFyaWFibGVzLiBXZSBhbHNvIG1vZGlmaWVkIHRoZSBsaWJjdXJsIHNvdXJjZXMgdG8KICB1c2UgdGhpcyBkZWZpbmUgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgJU9kIGFwcHJvYWNoIChhbHRob3VnaCBJJ3ZlIGxlZnQgdGhlCiAgTy1mbGFnIGZ1bmN0aW9uYWwgaW4gdGhlIGNvZGUpLiBUaGlzIHNob3VsZCBhbHNvIHByZXZlbnQgY29tcGlsZXJzIHRvIHdhcm4KICBvbiB0aGUgaG9tZS1ncm93biBvcHRpb24uCgotIEZpeGVkIHRoZSByZXN1bWUtY2hlY2sgY29kZSB0byB0ZXN0IGZvciBhIHdvcmtpbmcgcmVzdW1lIGF0IHRoZSBlbmQgb2YgdGhlCiAgaGVhZGVycyBhbmQgbm90IGF0IHRoZSBmaXJzdCBib2R5LWJ5dGUuCgotIENVUkxPUFRfRE5TX1VTRV9HTE9CQUxfQ0FDSEUgaXMgbm93IGNvbnNpZGVyZWQgb2Jzb2xldGUuIFN0b3AgdXNpbmcgaXQuIElmCiAgeW91IG5lZWQgYSBnbG9iYWwgRE5TIGNhY2hlIGZvciB3aGF0ZXZlciByZWFzb24sIHVzZSB0aGUgc2hhcmUgaW50ZXJmYWNlIGFuZAogIHlvdSdsbCBnZXQgYSBnbG9iYWwgY2FjaGUgdGhhdCB3b3JrcyB0aGUgd2F5IGl0IHNob3VsZCB3b3JrLiBZb3UgY2FuIGV2ZW4KICBoYXZlIGFueSBudW1iZXIgb2YgZ2xvYmFsIGNhY2hlcywgYWxsIGF0IHlvdXIgY29tbWFuZC4gVGhpcyBpcyBub3cgYWxzbwogIG1lbnRpb25lZCBpbiB0aGUgZG9jcy4KCi0gTWFkZSB0aGUgKnByaW50ZiBjb2RlIHN1cHBvcnQgdGhlIHotZmxhZyB0byBlbmFibGUgc2l6ZV90IHByaW50ZigpIGluIGEKICBtYW5uZXIgc2ltaWxhciB0byBob3cgZ2xpYmMgYWxsb3dzIGl0LiBUbyBtYWtlIHByaW50ZmluZyBvZiB0aGlzIHdvcmsgb24KICBwbGF0Zm9ybXMgd2l0aCA2NGJpdCBzaXplX3QgYW5kIDMyYml0IGludHMuIElmIHRoZXJlIGV2ZW4gYXJlIGFueSEgOy0pCgotIENocmlzdG9waGVyIFIuIFBhbG1lciBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IENVUkxPUFRfRlJFU0hfQ09OTkVDVCBhbmQKICBDVVJMQVVUSF9OVExNIChvciBDVVJMQVVUSF9BTlkgYW5kIGxpYmN1cmwgdGhlbiBwaWNrZWQgTlRMTSksIGxpYmN1cmwgd291bGQKICBsb29wIHdpdGhvdXQgc3VjY2VlZGluZyB0byBhdXRoZW50aWNhdGUgZHVlIHRvIHRoZSBuZXcgY29ubmVjdGlvbiB0aGF0IHdhcwogIG1hZGUgZm9yIGFsbCByb3VuZC10cmlwcyBpbiB0aGUgYXV0aGVudGljYXRpb24uIE5vdywgdGhlIEZSRVNIX0NPTk5FQ1QgaXMKICByZW1hZGUgdG8gb25seSBtYXR0ZXIgZm9yIHRoZSBmaXJzdCBjb25uZWN0aW9uIG1hZGUgd2l0aCBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgYW5kIGFsbCB0aGUgcmVzdCB0aGF0IG1pZ2h0IGZvbGxvdyBkdWUgdG8gRk9MTE9XTE9DQVRJT04gb3IgSFRUUAogIGF1dGhlbnRpY2F0aW9uIGFyZSBub3cgaWdub3JpbmcgdGhhdCBvcHRpb24uCgotIEFkanVzdGVkIHRoZSBRVUlUIGNvZGUgc2xpZ2h0bHkgc2luY2UgaXQgY291bGQgY29yZS1kdW1wLgoKLSBDb3JyZWN0ZWQgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRvIHByb3ZpZGUgYSBjb3JyZWN0IHNpemUgdG8gdGhlCiAgJ3ZlcmlmaWVkc2VydmVyJyByZXF1ZXN0LgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDA0KQotIEpvZSBIYWxwaW4gbWFkZSB0aGUgRlRQIGNvZGUgc2VuZCBRVUlUIG9uIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gYmVmb3JlCiAgZGlzY29ubmVjdGluZyB0aGUgVENQIGNvbm5lY3Rpb24uIFRoaXMgaXMgd2hhdCBnb29kLWJlaGF2aW5nIGZ0cCBjbGllbnRzCiAgc2hvdWxkIGRvLgoKRGFuaWVsICgyNiBGZWJydWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIHVwZGF0ZWQgc2V2ZXJhbCBmaWxlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBNU1ZDIDYuIEhlCiAgYWxzbyBhZGRlZCB0aGUgJ2J1aWxkY29uZi5iYXQnIHRoYXQgd29ya3MgbGlrZSB0aGUgJ2J1aWxkY29uZiArIGNvbmZpZ3VyZScKICBjb21ibyBkb2VzIG9uIHVuaXhlcy4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgbWVtZGVidWcgc3R1ZmYgc3VwcG9ydCBjYWxsb2MoKSBhcyB3ZWxsLgoKLSBUb3IgQXJudHNlbiBwb2ludGVkIG91dCB0aGF0IHRlc3RjdXJsLnNoIG5lZWRlZCB0byByZW1vdmUgdGhlIGdlbmVyYXRlZAogIGZpbGVzIGluIG9yZGVyIHRvIGhhdmUgdGhlbSByZS1nZW5lcmF0ZWQgaW4gZWFjaCBidWlsZC4KCi0gQW5keSBTZXJwYSBmb3VuZCBvdXQgdGhhdCB0aGUgc2hhcmUgaW50ZXJmYWNlIGRpZCBub3QgZW5qb3kgbGlmZSB3aGVuIG5vdAogIGhhdmluZyB0aGUgbG9jayBhbmQgdW5sb2NrIGNhbGxiYWNrcyBzZXQsIGV2ZW4gdGhvdWdoIGRvY3VtZW50ZWQgdG8gYmUKICBPSy4gSXQgc3RpbGwgaXMgT0ssIGFuZCBub3cgdGhlIGNvZGUgd29uJ3Qgc2VnZmF1bHQgYW55bW9yZSEKCkRhbmllbCAoMjUgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdyZWcgSGV3Z2lsbCBJIG1vZGlmaWVkIGhvdyBsb25nIGxvbmcgaXMgdXNlZCBpbiB0aGUKICBtcHJpbnRmIGNvZGUsIGFzIHdlIGNhbiB1c2UgYSA2NGJpdCB0eXBlIHdpdGggTVNWQyB0aGF0IGlzIGEgbG9uZyBsb25nCiAgZXF1aXZhbGVudC4gVGhpcyBjb3JyZWN0cyBzb21lIHdlaXJkIGxhcmdlIGZpbGUgYmVoYXZpb3JzIG9uIHdpbmRvd3MuCgotIFRvciBBcm50c2VuIGhlbHBlZCBtZSB3b3JrIG91dCAtLWVuYWJsZS1kZWJ1ZyB0byB3b3JrIGJldHRlciB3aXRoIGRpZmZlcmVudAogIHZlcnNpb25zIG9mIHRoZSBnY2MgYW5kIGljYyBjb21waWxlcnMuCgotIEFkZGVkIENVUkxPUFRfU0hBUkUgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZS4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNCkKLSBBcHBsaWVkIHRoZSBmaW5hbCBwaWVjZXMgb2YgR2lzbGUgVmFuZW0ncyBwYXRjaCB0aGF0IGJyaW5ncyBhIHdvcmtpbmcgbmFtZQogIHJlc29sdmUgdGltZW91dCB0byB0aGUgd2luZG93cyB2ZXJzaW9ucyBvZiBjdXJsIQoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uJ3MgZml4IHRvIGFsbG93IHRoZSBzcGVlZC1saW1pdCBsb2dpYyB3b3JrIGV2ZW4gaWYgeW91IHNldAogIGxpbWl0LXJhdGUuIEl0IGRvZXMgd29yayBvbiB0aGUgZXhwZW5zZSBvZiB0aGUgcmF0ZSBsaW1pdGVyLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDA0KQotIGNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyB3aXRoIGdjYyBub3cgYWxzbyB0cmllcyB0byBkZXRlY3QgdGhlIGljYyBjb21waWxlcgogICh3aGljaCBzb21laG93IGdldHMgdHJlYXRlZCBhcyBpZiBpdCBpcyBhIGdjYykgdG8gc3RvcCB1c2luZyBhbGwgdGhlIGdjYwogIG9wdGlvbnMgd2l0aCBpdCwgYW5kIHdlIGFsc28gcHJvdmlkZSAtaXN5c3RlbSBvcHRpb25zIGZvciBlYWNoIGV4dHJhIC1JCiAgb3B0aW9uIHRoZSBjb25maWd1cmUgc2NyaXB0IGhhcyBmaWd1cmVkIG91dCAoZm9yIE9wZW5TU0wsIGtlcmJlcm9zLCB6bGliLAogIEhlaW1kYWwgZXRjKS4gVGhpcyBvZiBjb3Vyc2UgdG8gcHJldmVudCB3YXJuaW5ncyBvbiBoZWFkZXJzIHdlIGRvbid0IGhhdmUKICBjb250cm9sIG9mLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA0KQotIERvdWcgUG9ydGVyIG1hZGUgbGliY3VybCB1c2UgdGhlIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIHRoZQogIGdldHB3dWlkIHJlc3VsdHMgd2hlbiBsb29raW5nIGZvciAubmV0cmMgZmlsZXMuCgotIElmICdjb25maWd1cmUgLS1lbmFibGUtZGVidWcnIGlzIHVzZWQgd2l0aCBnY2MsIGl0IG5vdyBjaGVja3Mgd2hpY2ggZ2NjCiAgdmVyc2lvbiBpdCBpcyBhbmQgdXNlcyBhcyBwaWNreSBjb21waWxlciBvcHRpb25zIGFzIHBvc3NpYmxlIGZvciB0aGUKICBwYXJ0aWN1bGFyIHZlcnNpb24uCgotIENvZGUgdGhhdCBjYW4gYmUgdXNlZCBpbiBib3RoIHRoZSBsaWIgYW5kIGluIHRoZSBjdXJsIGFwcCBpcyBub3cgbWFkZSB0byB1c2UKICB0aGUgY3VybHhfIHByZWZpeC4gVGhlIGZpcnN0IGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZSBsaWtlIHRoaXMgaXMgdGhlCiAgY3VybHhfc3RydG9sbCgpIGZ1bmN0aW9uLiBUaGlzIGlzIG1hZGUgdG8gYWxsb3cgdGhlIGFwcCB0byB1c2UgZXhpc3RpbmcgY29kZSwKICBidXQgd2l0aG91dCBwb2xsdXRpbmcgdGhlIGxpYmN1cmwgQVBJLiBGdXJ0aGVyIGV4cGxhbmF0aW9ucyBwb3N0ZWQgaGVyZToKCiAgICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDQtMDIvMDIxNS5odG1sCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDQpCi0gRml4ZWQgYnVpbGRjb25mIHRvIG5vdCB1c2UgIndoaWNoIiBhcyBBSVggYW5kIFRydTY0IGhhdmUgd2hhdCBoYXZlIGJlZW4KICByZWZlcnJlZCB0byBhcyAiaG9ycmlibHkgYnJva2VuICd3aGljaCcgcHJvZ3JhbXMiLgoKLSBNYWRlIHN1cmUgZG5zIGNhY2hlIHRpbWVvdXQgc2V0IHRvIC0xIHJlYWxseSBtZWFucyBjYWNoaW5nIGZvcmV2ZXIuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDQpCi0gTWFkZSBpdCBwb3NzaWJseSB0byBidWlsZCBjLWFyZXMgd2l0aCB0aGUgbGliY3VybCBtZW1kZWJ1ZyBzeXN0ZW0gdG8gYmV0dGVyCiAgdHJhY2sgbWVtb3J5LgoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDA0KQotIFdoZW4gdXNpbmcgYXJlcywgd2Ugbm93IGluaXRpYWxpemUgdGhlIGFyZXMgJ2NoYW5uZWwnIGluIGN1cmxfZWFzeV9pbml0KCkKICBhbmQgcmUtdXNlIHRoYXQgc2FtZSBoYW5kbGUgZHVyaW5nIHRoZSBlbnRpcmUgY3VybCBoYW5kbGUncyBsaWZlLXRpbWUuIEl0CiAgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCgotIEZpeGVkIGEgcHJvYmxlbSB3aGVuIGRpc3BsYXlpbmcgdmVyYm9zZSBmb3IgaXB2Ni1lbmFibGVkIGxpYmN1cmxzIGFuZAogIHJlLXVzZWQgY29ubmVjdGlvbnMuIFByb2JsZW0gcmVwb3J0ZWQgYW5kIGZpeCB2ZXJpZmllZCBieSBHcmlnb3J5IEVudGluLgoKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgdmVyc2lvbi1jaGVjayBpbiB0aGUgU09DS1M1IGNvZGUuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDQpCi0gRml4ZWQgYSBjYXNlIHdoZXJlIGEgaG9zdCBjYWNoZSBlbnRyeSB3YXMgbm90IGZsYWdnZWQgaW4tdXNlIHByb3Blcmx5IHdoZW4gYQogIGNhY2hlZCBlbnRyeSB3YXMgdXNlZC4KCi0gQW5kculzIEdhcmPtYSdzIHBhdGNoIHRoYXQgY2hlY2tzIGZvciB3aW5tbSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxMyBGZWJydWFyeSAyMDA0KQotIEJlbiBHcmVlYXIncyBTT19CSU5EVE9ERVZJQ0UgcGF0Y2ggZm9yIHRoZSBiaW5kaW5nIG9mIHRoZSBsb2NhbCBlbmQgdG8gYQogIHNwZWNpZmljIG5ldHdvcmsgaW50ZXJmYWNlLgoKLSBHcmVnIEhld2dpbGwgZm91bmQgb3V0IHRoYXQgdGhlIHZhcmlhYmxlIGhvbGRpbmcgJ2NvbnRlbnRsZW5ndGgnIHdhc24ndCBiaWcKICBlbm91Z2ggdG8gaG9sZCBhIGxhcmdlIGZpbGUhCgotIFRvciBBcm50c2VuIGZpeGVkIGEgNjRiaXQtcmVsYXRlZCBwcm9ibGVtIGluIGRhdGUtcmVsYXRlZCBjb2RlIGluIHRoZSBmdHAKICBkZXBhcnRtZW50LCBhbmQgdGhlcmUgd2FzIGFub3RoZXIgcG90ZW50aWFsIHByb2JsZW0gaW4gdGhlIG5hbWUgcmVzb2x2ZSBjb2RlCiAgdG9vLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA0KQotIFJlbW92ZWQgYSBmZXcgdmFyaWFibGVzIHRoYXQgd2VyZSBvbmx5IHNldCBidXQgbmV2ZXIgdXNlZCwgYXMgc29tZSBjb21waWxlcnMKICB3YXJuIGFib3V0IHRoYXQgYW5kIHdlIGRvIG5vdCBsaWtlIGNvbXBpbGVyIHdhcm5pbmdzIQoKLSBSZW1vdmVkIHRoZSBuZWVkIGZvciBzeW1saW5rcyBpbiB0aGUgdGVzdHMvZGF0YSBkaXJlY3RvcnkgaWYgY3VybCBpcyBidWlsdAogIG91dHNpZGUgb2YgdGhlIHNvdXJjZSBkaXJlY3RvcnkgYW5kIHRoZSAnbWFrZSB0ZXN0JyBpcyB1c2VkLiBUaGlzIHdhcyBkb25lCiAgYnkgcHJvdmlkaW5nIGEgInNvdXJjZSBkaXIgcGF0aCIgdG8gdGhlIHNjcmlwdHMvc2VydmVycy4KCi0gTm93LCBpZiB0aGUgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBmaW5kIGFuIG5yb2ZmIHRvb2wgb3IgYW4gb3B0aW9uIHRvIG5yb2ZmCiAgdG8gdXNlIHRvIGNvbnZlcnQgbWFuIHBhZ2VzIHdpdGgsIGl0IHdpbGwgY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBidWlsdC1pbgogIG1hbnVhbC4KCi0gJ2NvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsJyBjb21wbGV0ZWx5IGRpc2FibGVzIHRoZSBidWlsdC1pbiBtYW51YWwgZnJvbQogIHRoZSBjdXJsIGNvbW1hbmQgdG9vbC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgYSBtaW5vciBzb3VyY2UgZWRpdCwgYW5kIG5vdwogIGhlIGhhcyBtYW5hZ2VkIHRvIGdldCBtc3lzL21pbmd3IHRvIHJ1biBjb25maWd1cmUgYW5kIHRoZW4gYnVpbGQhCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwNCkKLSBUaGUgZGVmYXVsdCBIVFRQIEFjY2VwdDogaGVhZGVyIHdhcyBtb2RpZmllZCB0byB0aGUgbXVjaCBzaW1wbGVyCiAgIkFjY2VwdDogKi8qIi4KCi0gUCBSIFNjaGFmZm5lciB1cGRhdGVkIHRoZSBjdXJsLXNzbCBzcGVjIGZpbGUgZm9yIFJQTXMuCgotIERvbWluaWNrIE1lZ2xpbyBicm91Z2h0IGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHNoYXJlIGludGVyZmFjZSdzIG1hbgogIHBhZ2VzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG1pc3NpbmcuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHdvcmstYXJvdW5kIGEgYnVnIGluIHRoZQogIEFJWDUgaW1wbGVtZW50YXRpb24gb2YgZ2V0YWRkcmluZm8oKS4gVGhpcyBtYWtlcyB0aGUgRlRQIFBPUlQgc3R1ZmYgd29yayBvbgogIGlwdjYtZW5hYmxlZCBBSVggYnVpbGRzLgoKLSBLZW4gUmFzdGF0dGVyIHByb3ZpZGVkIHBvcnRhYmlsaXR5IGZpeGVzIGZvciB0aGUgY3VybGd0ay5jIGV4YW1wbGUsIGFuZCBub3cKICBpdCBydW5zIG9uIHdpbmRvd3Mgd2l0aCBHVEsgYXMgd2VsbCEKCkRhbmllbCAoNiBGZWJydWFyeSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIGdldGhvc3RieW5hbWUoKSBmaW5lIHdoZW4gcnVuCiAgd2l0aCBtaW5ndyBvbiB3aW5kb3dzLgoKLSBNb2RpZmllZCB0aGUgbGRhcCBjb2RlIHRvIHVzZSBwcm9wZXIgZnVuY3Rpb24gcG9pbnRlcnMgYWxsIG92ZXIgKGluc3RlYWQgb2YKICBtaXhlZCBkYXRhIGFuZCBmdW5jdGlvbiBwb2ludGVycykgdG8gd29yay1hcm91bmQgdGhlIHBpY2t5IE1JUFNQcm8gY29tcGlsZXIKICB3YXJuaW5ncy4KCi0gQSBjdXN0b20gSG9zdDogaGVhZGVyIGlzIG9ubHkgY29uc2lkZXJlZCBpZiB0aGUgcmVxdWVzdCBpcyBub3QgbWFkZSBieQogIGZvbGxvd2luZyBhIGxvY2F0aW9uLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFRpbSBCYWtlci4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA0KQotIFRoZSBsaWJ6IHBhcnQgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IG9ubHkgc2V0IHRoZSB0d28gbGliei1yZWxhdGVkCiAgZGVmaW5lIEhBVkVfWkxJQl9IIGFuZCBIQVZFX0xJQlogaWYgYm90aCB0aGUgbGliIGFuZCB0aGUgaGVhZGVyIGlzIGZvdW5kLgogIElmIG9uZSBpcyBtaXNzaW5nLCBub25lIG9mIHRoZSBkZWZpbmVzIGlzIHNldC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgTWluZ3cgbWFrZWZpbGVzLgoKLSBMZW4gS3JhdXNlIHJlcG9ydGVkIHRoYXQgY3VybCA3LjkuWCBjb3VsZCBkbyB1cGxvYWRpbmcgZnJvbSBzdGRpbiB3aXRob3V0CiAgZG9pbmcgY2h1bmtlZCBlbmNvZGluZywgd2hpY2ggY3VycmVudCBjdXJsIGNhbm5vdCBkbyBldmVuIGlmIHlvdSBkaXNhYmxlCiAgdGhlIHRyYW5zZmVyLWVuY29kaW5nIGNodW5rZWQgaGVhZGVyLiBOb3cgaXQgY2FuIGFnYWluLCBhbmQgdGVzdCBjYXNlIDk4CiAgdmVyaWZpZXMgdGhpcyBmdW5jdGlvbmFsaXR5LgoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIHdlaXJkIGdldGFkZHJpbmZvKCkgdXNhZ2UgaW4gdGhlIEZUUCBjb2RlLCBwcmV2ZW50aW5nCiAgdGhlIGlwdjYtY29kZSBmb3IgUE9SVCB3b3JrIG9uIEFJWCA1LjIuIFdlIG5vdyBhbHNvIHByb3ZpZGUgKGJldHRlcikgZXJyb3IKICBtZXNzYWdlcyB3aGVuIGJhaWxpbmcgb3V0IGluIHRoZSB0aGF0IGZ1bmN0aW9uLgoKLSBUb3IgQXJudHNlbiBub3cgcHJvdmlkZXMgQUlYIGFuZCBJUklYICh1c2luZyBnY2MsIHhsYyBhbmQgdGhlIE1JUFNQcm8KICBjb21waWxlcnMpIGF1dG9tYXRlZCBidWlsZCBsb2dzIChodHRwOi8vY3VybC5oYXh4LnNlL2F1dG8vKSBhbmQgd2UndmUgZml4ZWQKICBudW1lcm91cyBtaW5vciBxdWlya3MgdG8gbWFrZSBsZXNzIHdhcm5pbmdzIGFwcGVhci4KCkRhbmllbCAoNCBGZWJydWFyeSAyMDA0KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lsYWQsIHdlIG5vdyB1c2UgdGhlIGN1c3RvbSB0aW1lb3V0cyB3aGVuIHdhaXRpbmcgZm9yIGEKICBzZXJ2ZXIgdG8gY29ubmVjdCB3aGVuIHVzaW5nIEZUUCBQT1JULiBQcmV2aW91c2x5IHdlIGFsd2F5cyB3YWl0ZWQgMTAKICBzZWNvbmRzLCBubyBtb3JlIG5vIGxlc3MuIFdlIG5vdyBhbHNvIGNoYW5nZWQgdGhlIGRlZmF1bHQgKGlmIG5vIHRpbWVvdXQgaXMKICBzZXQpIHRvIHdhaXQgNjAgc2Vjb25kcyBmb3IgdGhlIGNvbm5lY3QgYmVmb3JlIHdlIGZhaWwuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwNCkKLSBNb2RpZmllZCB0byBsaW5rIHdpdGggYy1hcmVzIGluc3RlYWQgb2YgYXJlcy4KCkRhbmllbCAoMiBGZWJydWFyeSAyMDA0KQotIEFkZGVkIGEgY29uZmlndXJlIHRlc3QgdG8gY2hlY2sgZm9yIHdoaWNoIG9wdGlvbiB0aGUgKGcpbnJvZmYgdG9vbCB3YW50cwogIHRvIGV4dHJhY3QgcGxhaW4gdGV4dCBmcm9tIHRoZSBtYW4gcGFnZXMuIFRvciBBcm50c2VuIHRvbGQgdXMgdGhlIEFJWAogIHZlcnNpb24gb2YgR05VIGducm9mZiBkb2Vzbid0IHN1cHBvcnQgLW1hbiEKCi0gQWRkZWQgYW4gdW5kZWYgb2YgYWNjZXB0IGluIG1lbWRlYnVnLmggdG8gbWFrZSBjdXJsIGJ1aWxkIHdpdGggLS1lbmFibGUtZGVidWcKICBvbiBBSVggNS4yIHdoaWNoIHNlZW1zIHRvIGhhdmUgYWNjZXB0IGRlZmluZWQuIFJlcG9ydGVkIGJ5IFRvciBBcm50c2VuLgoKLSBjdXJsX3ZlcnNpb24oKSBub3cgaW5jbHVkZXMgYy1hcmVzIHZlcnNpb24gaW5mbywgYW5kIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93CiAgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHZlcnNpb24gU0VDT05EIHRoYXQgYWxzbyBpbmNsdWRlcyB0aGF0IGluZm8uCgotIFdlIGFyZSBub3cgb2ZmaWNpYWxseSB1c2luZyBjLWFyZXMgZm9yIGFzeW5jaCBuYW1lIHJlc29sdmVzLiBjLWFyZXMgaXMgdGhlCiAgbmV3IGxpYnJhcnksIGJhc2VkIG9uIHRoZSBleGlzdGluZyBhcmVzIGJ1dCB3aXRoIGFuIGV4dGVuZGVkIGFuZCBzbGlnaHRseQogIG1vZGlmaWVkIEFQSS4KCi0gRGlyayBpbXByb3ZlZCB0aGUgYXJlcyB0aW1lb3V0IGNvZGUsIGFuZCBub3cgd2UgYWxzbyBpbmNsdWRlIHRoZSBhcmVzIGVycm9yCiAgc3RyaW5nIHdoZW4gd2UgZmFpbCB0byByZXNvbHZlIGEgbmFtZS4KCi0gQW5vdGhlciB0d2VhayB0byBtYWtlIHRlc3QgY2FzZSA5MSBydW4gZmluZS4gTm93IHdlIGhhdmUgYW5vdGhlciBiaXQgb24gYQogIGNvbm5lY3Rpb24gdGhhdCBpcyBzZXQgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBtYXJrZWQgZm9yICdyZXRyeScuIFRoYXQKICBtYWtlcyB0aGUgY29ubmVjdGlvbiBnZXQgY2xvc2VkIGFuZCByZS1vcGVuZWQgYW5kIHRoZSBIVFRQLWRvbmUgY29kZSBtdXN0CiAgbm90IGNvbXBsYWluIG9uIHRoZSBmYWN0IHRoYXQgbm8gZGF0YSB3YXMgcmVjZWl2ZWQuCgotIEJhc2VkIG9uIERpcmsgTWFuc2tlJ3MgcGF0Y2gsIEkgbW9kaWZpZWQgdGhlIG5hbWUgcmVzb2x2aW5nIHdpdGggYXJlcyB0bwogIGZlYXR1cmUgYSB0aW1lb3V0IGZvciByZWFsbHkgc2xvdyBsb29rdXBzLiBJdCBub3cgZGVmYXVsdHMgdG8gMzAwIHNlY29uZHMsCiAgYnV0IGlzIG5vdyBhZGp1c3RlZCB0byB0aGUgQ09OTkVDVFRJTUVPVVQvVElNT1VFIHRpbWVvdXRzIGlmIG9uZSBvZiB0aGVtCiAgaXMgc2V0LgoKLSBGaXhlZCB0aGUgaW5jbHVzaW9uIG9mIGNhLWJ1bmRsZS5oIHRvIHJlYWxseSB1c2UgdGhlIG9uZSBpbiB0aGUgYnVpbGQgZGlyCiAgYmVmb3JlIHRoZSBvbmUgaW4gdGhlIHNvdXJjZSBkaXIuIERvbWVuaWNvIEFuZHJlb2xpIGZvdW5kIG91dCBhbmQgcmVwb3J0ZWQuCgotIEFkZGVkIHRlc3QgY2FzZSA5NywgYSBzaW1wbGUgUE9TVCB3aXRoIGEgY3VzdG9tIENvbnRlbnQtVHlwZSBoZWFkZXIKICByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBvbmUuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNCkKLSBBZGRlZCBjb2RlIHRoYXQgYXR0ZW1wdHMgdG8gZml4IHRoZSB0ZXN0IDkxIGZhaWx1cmUuIEFzIGhhcyBiZWVuIGZpZ3VyZWQgb3V0CiAgYnkgUGF0cmljayBTbWl0aCwgdGhlIGVycm9yIGhhcHBlbnMgYmVjYXVzZSB3ZSByZS11c2UgYSBjb25uZWN0aW9uIHRoYXQgdGhlCiAgc2VydmVyIGlzIGp1c3QgYWJvdXQgdG8gY2xvc2UgYW5kIHdlIGV2ZW4gbWFuYWdlIHRvIHNlbmQgYXdheSB0aGUgcmVxdWVzdAogIHdpdGhvdXQgc2VlaW5nIGFuIGVycm9yLiBPbiB0aGUgZmlyc3QgcmVhZCBhdHRlbXB0IHdlIGdldCBhIEVDT05OUkVTRVQuCiAgU3RhcnRpbmcgbm93LCB3ZSBhdHRlbXB0IHRvIGRldGVjdCB0aGlzIGFuZCBpZiBzbywgd2UgcmV0cnkgdGhlIHJlcXVlc3Qgb24gYQogIGZyZXNoIGNvbm5lY3Rpb24uCgotIEkgYWRkZWQgdGVzdCBjYXNlIDUxMCB3aGljaCBpcyBhIGN1c3RvbSBwcm9ncmFtIHRoYXQgZG9lcyBhIFBPU1QgdXNpbmcgYQogIHJlYWQgY2FsbGJhY2ssIHdpdGggY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZy4KCi0gQWRqdXN0ZWQgb25lIG9mIHRoZSBNUEUvaVggY2hhbmdlcyBhcyBpdCBtYWRlIHRlc3QgY2FzZSA1MDQgZmFpbCBhbGwgb3Zlci4KCi0gQWRkZWQgLS1zb2NrcyBhcyBhIHJlY29nbml6ZWQgb3B0aW9uLiBJdCB3b3JrcyBqdXN0IGxpa2UgLS1wcm94eSBidXQgc2V0cyBhCiAgU09DS1M1IHByb3h5IHRvIHVzZS4gU09DS1M1IHN1cHBvcnQgaGFzIGJlZW4gYXZhaWxhYmxlIGluIGxpYmN1cmwgZm9yIGEKICB3aGlsZSwganVzdCBub3QgcHJvdmlkZWQgYnkgdGhlIGN1cmwgdG9vbC4gVGhpcyBkb2VzIG5vdCBjdXJyZW50bHkgd29yayBmb3IKICBJUHY2LWVuYWJsZWQgbGliY3VybHMuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNCkKLSBTdGFkbGVyIFN0ZXBoYW4gcG9pbnRlZCBvdXQgdGhhdCBzcmMvaHVnZWhlbHAuYyBpbmNsdWRlZCBjb25maWcuaCB3aXRob3V0CiAgY2hlY2tpbmcgdGhlIGRlZmluZSBpZiBpdHMgcHJlc2VudC4uLgoKLSBLZW4gSGlyc2NoIHByb3ZpZGVkIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gdGhlIE1QRS9pWCBvcGVyYXRpbmcKICBzeXN0ZW0uCgotIERhbiBGYW5kcmljaCBjb21waWxlZCBjdXJsIHdpdGggbG90cyBvZiBhZ2dyZXNzaXZlbHkgcGVkYW50aWMgY29tcGlsZXIKICBvcHRpb25zIGFuZCB0aHVzIGZvdW5kIGEgZmV3IG1pbm9yIGVycm9ycyBhbmQgZGlkIHNvbWUgZ2VuZXJhbCBjbGVhbnVwcyB0bwogIGF2b2lkIHRoZW0uCgotIERpcmsgTWFuc2tlIGZpeGVkIGEgZmxhdyBpbiBhcmVzIHRoYXQgcHJldmVudGVkIGl0IHRvIHVzZSBub24tYmxvY2tpbmcKICBzb2NrZXRzIHByb3Blcmx5LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDQpCi0gUmljaGFyZCBCcmFtYW50ZSBmaXhlZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kZWQgInVwbG9hZHMiIHRvIHNlbmQgYSBmaW5hbAogIENSTEYgY29tYm8gcHJvcGVybHkuCgpEYW5pZWwgKDI3IEphbnVhcnkgMjAwNCkKLSBNYWRlIHRoZSByZXNwb25zZS1oZWFkZXJzIGR1cmluZyBhIENPTk5FQ1QgcmVxdWVzdCB0byBhIHByb3h5IGdldCBwYXNzZWQgb24KICBhcyByZWd1bGFyIGhlYWRlcnMsIHNvIHRoZXkgYXBwZWFyIHdpdGggLWkvLUkgb3B0aW9ucyBhbmQgc2ltaWxhci4KCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHaXNsZSBWYW5lbSwgSSd2ZSBtYWRlIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5CiAgcHJvcGVybHkgc3dpdGNoIHRvIGEgR0ItZGlzcGxheSB3aGVuIG1vcmUgdGhhbiA5OTk5TUIgaGF2ZSBiZWVuIHRyYW5zZmVyZWQuCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBwb2ludGVkIG91dCBhIGN1cmxyYyBwYXJzZXIgcHJvYmxlbS9jcmFzaCB3aGVuIGFuIG9wdGlvbiB3aXRoIGEKICByZXF1aXJlZCBkaWRuJ3QgaGF2ZSBvbmUgYW5kIHdhcyBvbiB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZS4KCi0gTW9yZSBXaW5kb3dzIGZpeGVzIGZvciBsYXJnZSBmaWxlcy4gV2Ugbm93IGJ1aWxkIGFuZCBsaW5rIHdpdGgKICAuLi9saWIvc3RydG9vZmZ0LmMgaW4gdGhlIGFwcCBjb2RlIHNpbmNlIEN1cmxfc3RydG9sbCgpIGlzIG5vdCBhIHByb3ZpZGVkCiAgbGliY3VybCBmdW5jdGlvbi4uLiBQZXJoYXBzIHdlIHNob3VsZCBjb25zaWRlciBhICdjb21tb24nIGRpciBvciBzaW1pbGFyCiAgd2hlcmUgd2UgcHV0IHNvdXJjZSBjb2RlIHVzZWQgaW4gYm90aCB0aGUgbGliIGFuZCB0aGUgY2xpZW50LiBPciBwZXJoYXBzCiAgd2UnbGwganVzdCBtYWtlIHRoaXMgZnVuY3Rpb24gYXZhaWxhYmxlIGluIHRoZSBsaWJyYXJ5Li4uCgotIFZpbmNlbnQgQnJvbm5lciBmb3VuZCBvdXQgdGhlIHNvY2tzNSBjb2RlIGNyYXNoZWQgd2hlbiBubyB1c2VybmFtZSB3YXMKICBzZXQuCgotIFZpbmNlbnQgQnJvbm5lciBzcG90dGVkIGEgcHJvYmxlbSB3aXRoIHByb3h5IHVzZXJuYW1lL3Bhc3N3b3JkIHdoZW4gcmUtdXNpbmcKICBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4KCi0gRml4ZWQgdGhlIHByb2dyZXNzIG1ldGVyIGRpc3BsYXkgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDJeMzEgYnl0ZXMuIEdpc2xlCiAgVmFuZW0gcmVwb3J0ZWQuCgpEYW5pZWwgKDIyIEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYWRlIHN0cnRvbGwoKSBnZXQgdXNlZCB3aGVuIGN1cmwgaXMgYnVpbHQgd2l0aCB0aGUgbWluZ3cKICBjb21waWxlci4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIGNvbXByZXNzZWQgaGVscCB0ZXh0IGNvZGUgdG8gZGlzcGxheSBwcm9wZXJseS4KCi0gUmVtb3ZlZCB0aGUgJyNkZWZpbmUgSHR0cFBvc3QnIGZyb20gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSwgYXMgY3VybF9odHRwcG9zdAogIGlzIHRoZSBwcm9wZXIgbmFtZSBhbmQgaXQgaGFzIGJlZW4gZm9yIHF1aXRlIHNvbWUgdGltZSBub3cuIEZpeGVzIGFub3RoZXIKICBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCi0gQWRkZWQgJ2N1cmxfb2ZmX3QnIHR5cGVkZWYgaW4gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSwgdG8gYmUgdXNlZCB0byBwcm92aWRlCiAgbGFyZ2UgZmlsZSBzaXplcyB0byB0aGUgKl9MQVJHRSBvcHRpb25zLiBBZGp1c3RlZCB0aGUgY29kZSBhbGwgb3ZlciB0byB1c2UKICB0aGlzIHZhcmlhYmxlIHR5cGUgaW5zdGVhZCBvZiAnb2ZmX3QnLiBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUgbGFyZ2UKICBmaWxlIHN1cHBvcnQgd29yayBvbiBtb3JlIHBsYXRmb3Jtcy4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyB0aGUKICBzaXplIG9mIHRoZSBjdXJsX29mZl90IGluc3RlYWQgb2YgdGhlIHBsYWluIG9mZl90LgoKVmVyc2lvbiA3LjExLjAgKDIyIEphbnVhcnkgMjAwNCkKCkRhbmllbCAoMjEgSmFudWFyeSAyMDA0KQotIFJlbW92ZWQgdGhlIGRlZmluZXMgaW4gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSB3aXRoIFRJTUVDT05EXyBwcmVmaXhlcy4gVGhleQogIGhhdmUgYmVlbiBvYnNvbGV0ZSBzaW5jZSBBcHJpbCAyMm5kIDIwMDIsIGFuZCBpZiB0aGlzIGNhdXNlcyBhbnlvbmUgYW55CiAgcHJvYmxlbXMgbm93IGl0IGlzIHZlcnkgZWFzeSB0byBqdXN0IGFkZCBDVVJMXyB0byB0aGUgbmFtZXMuIFRoaXMgY29ycmVjdHMKICB0aGlzIG5hbWUgc3BhY2UgcG9sbHV0aW9uLgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24gY2xlYW5lZCB1cCBob3cgLS10cmFjZSB3aXRoIG5vIG9wdGlvbiB3YXMgdHJlYXRlZCwgYW5kIGFsc28KICBhcmd1bWVudHMgaW4gYSBjb25maWcgZmlsZSB3aXRob3V0IGEgcmVxdWlyZWQgcGFyYW1ldGVyIQoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBmZXcgaXNzdWVzIHdoZXJlIGNvbXBpbGVycyB3YXJuZWQgYWJvdXQgdmFyaWFibGVzCiAgcG9zc2libHkgYmVpbmcgdXNlZCB1bmFzc2lnbmVkLgoKLSBNaW5vciBJbnRlcml4IGJ1aWxkIHByb2JsZW0gZml4ZWQuCgpEYW5pZWwgKDE1IEphbnVhcnkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgc29tZSBuZWNlc3NhcnkgZXNjYXBpbmcgbmVlZGVkIGluIHRoZQogIGFjaW5jbHVkZS5tNCBmaWxlIHdoZW4gYXV0b21ha2UgMS44IG9yIGxhdGVyIGlzIHVzZWQuCgpEYW5pZWwgKDE0IEphbnVhcnkgMjAwNCkKLSBWaW5jZW50IEJyb25uZXIgZml4ZWQgdGhlIEN1cmxfcmVzb2x2KCkgcmV0dXJuIGNvZGUuIFRoaXMgZXh0ZW5kcyB0aGUgZml4CiAgU3RldmUgR3JlZW4gcHJvdmlkZWQgb24gZGVjZW1iZXIgMy4uLgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDQpCi0gTHVrZSBDYWxsIG1hZGUgdGhlIHdpbjMyIHZlcnNpb24gb2YgdGhlIHBhc3N3b3JkIHByb21wdGluZyBmdW5jdGlvbiBzdXBwb3J0CiAgYmFja3NwYWNlLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhlIGh1Z2VoZWxwIHNvdXJjZSBmaWxlIHRvIGNvbnRhaW4gYm90aCBhIGNvbXByZXNzZWQgYW5kCiAgYW4gdW5jb21wcmVzc2VkIHZlcnNpb24gaW4gdGhlIGRpc3RyaWJ1dGlvbiwgc28gdGhhdCBtb3JlIHBlb3BsZSBlYXNpZXIgY2FuCiAgYnVpbGQgY3VybCB3aXRoIHRoZSBjb21wcmVzc2VkIHZlcnNpb24uCgotIERpZWdvIENhc29ycmFuIGJyb3VnaHQgYW5vdGhlciBBbWlnYU9TIGJ1aWxkIHBhdGNoIGZvciBuYXRpdmUgQW1pZ2EgYnVpbGRzLgoKLSBNYXR0IFZlZW5zdHJhIHVwZGF0ZWQgdGhlIE1hYyBPUyBYIGZyYW1ld29yayBmaWxlcy4KCi0gQnJpYW4gUiBEdWZmeSBicm91Z2h0IGEgc2VjdGlvbiB0byB0aGUgSU5TVEFMTCBmaWxlIG9uIGhvdyB0byBidWlsZCBhCiAgU1NMLWVuYWJsZWQgY3VybCB1c2luZyB0aGUgZnJlZSBCb3JsYW5kIEMrKyBjb21waWxlci4gSGUgYWxzbyB1cGRhdGVkIHRoZQogIEJvcmxhbmQgbGliL01ha2VmaWxlLmIzMi4KCi0gSSBmaXhlZCB0aGUgdGVzdCBjYXNlIDUwOSB3aGljaCBJIGJyb2tlIHllc3RlcmRheS4gTm93IHRoZSBsaWJ0ZXN0IGFyZQogIGNvbXBpbGVkIHdpdGggYW4gaW5jbHVkZSBwYXRoIHRoYXQgcG9pbnRzIHRvIHRoZSBsaWJyYXJ5J3Mgc291cmNlIGRpciwgc28KICB0aGF0IHRoZSBsaWJ0ZXN0cyBjYW4gaW5jbHVkZSBmaWxlcyBmcm9tIHRoZSBzb3VyY2UgdHJlZS4gVGhpcyB3YXMgbWFkZSB0bwogIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoZSBVU0VfU1NMRUFZIGRlZmluZSBpbiB0aGUgbGlicmFyeSB0ZXN0IGZpbGVzLgoKRGFuaWVsICgxMiBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIGJyb3VnaHQgY29kZSB0aGF0IG5vdyBhbGxvd3MgYSBjYWxsYmFjayB0byBtb2RpZmllZCB0aGUgVVJMCiAgZXZlbiB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2UgaXMgdXNlZCwgYW5kIHRoZW4gbGliY3VybCB3aWxsIHNpbXVsYXRlIGEKICAiZm9sbG93IGxvY2F0aW9uIiB0byB0aGF0IG5ldyBVUkwuIFRlc3QgNTA5IHdhcyBhZGRlZCB0byB0ZXN0IHRoaXMgZmVhdHVyZS4KCi0gRXh0ZW5kZWQgdGhlIHRpbWUgd2UgcmV0cnkgc2VydmVycyBpbiB0aGUgdGVzdCBzY3JpcHQsIGFuZCBJIGFsc28gbWFkZSBpdAogIHJldHJ5IHRoZSBodHRwcyBhbmQgZnRwcyBzZXJ2ZXJzIGJlZm9yZSB0aGV5IGFyZSBjb25zaWRlcmVkIGJhZC4gSSBiZWxpZXZlCiAgdGhlIHByZXZpb3VzIGFwcHJvYWNoIGNvdWxkIHR1cm4gcHJvYmxlbWF0aWMgb24gcmVhbGx5IHNsb3cgaG9zdHMuCgpWZXJzaW9uIDcuMTEuMC1wcmUxICgxMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwNCkKLSBEb21pbmljayBNZWdsaW8gcG9pbnRlZCBvdXQgRlRQUyBzaG91bGQgdXNlIGRlZmF1bHQgcG9ydCA5OTAgYWNjb3JkaW5nIHRvCiAgSUFOQS4KCkRhbmllbCAoOCBKYW51YXJ5IDIwMDQpCi0gRml4ZWQgdGhlIFNQTkVHTyBjb25maWd1cmUgY2hlY2sgdG8gbm90IHVzZSAtUiBvciBvdGhlciBub24tcG9ydGFibGUgb3B0aW9ucwogIGluIHRoZSBMREZMQUdTLiBSZXBvcnRlZCBieSBQaWVycmUgaW4gYnVnIHJlcG9ydCAjODcyOTMwLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwNCkKLSBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYSBmaXggb24gb3VyIHpsaWIgdXNhZ2UuCgotIERhdmlkIEogTWV5ZXIncyBwYXRjaCB0aGF0IGludHJvZHVjZSBsYXJnZSBmaWxlIHN1cHBvcnQgdG8gbGliY3VybCB3YXMKICBhcHBsaWVkLiBOZXcgY3VybF9lYXN5X3NldG9wdCBvcHRpb25zIHRoYXQgYWNjZXB0ICdvZmZfdCcgYXJndW1lbnRzIGFyZToKCiAgSU5GSUxFU0laRV9MQVJHRQogIFJFU1VNRV9GUk9NX0xBUkdFCiAgTUFYRklMRVNJWkVfTEFSR0UKCkRhbmllbCAoNCBKYW51YXJ5IDIwMDQpCi0gQmFzZWQgb24gRG9taW5pY2sgTWVnbGlvJ3MgY29tbWVudHMsIEkgbWFkZSBvdXIgcHJpdmF0ZSB2ZXJzaW9uIG9mCiAgZ2V0dGltZW9mZGF5KCkgZGVjbGFyZWQgc3RhdGljLiBUaGlzIHdvdWxkIG90aGVyd2lzZSBjb2xsaWRlIHdpdGggdGhlIHNhbWUKICBmdW5jdGlvbiBpbiBvdGhlciBsaWJzIChsaWtlIGFyZXMgZm9yIGV4YW1wbGUpLgoKLSBBZGRlZCBEb21pbmljayBNZWdsaW8ncyBkZXNjcmlwdGlvbiBvbiBob3cgdG8gYnVpbGQgbGliY3VybCB3aXRoIGFyZXMKICBvbiB3aW4zMi4K