Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
7F620913595AC60AD23FC55B204BD947919600CE6D671786B7692709D0745E03
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
247,541,001
Requested gas limit
GAS USED
206,284,217
Gas consumed
FEE
247542ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CtqZCgoML3ZtLm1fYWRkcGtnEsiZCgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBKamQoKBHBvb2wSF2duby5sYW5kL3IvZ25vc3dhcC9wb29sGqRNCglSRUFETUUubWQSlk0jIFBvb2wKCkNvbmNlbnRyYXRlZCBsaXF1aWRpdHkgQU1NIHBvb2xzIHdpdGggdGljay1iYXNlZCBwcmljaW5nLgoKIyMgT3ZlcnZpZXcKClBvb2wgY29udHJhY3RzIGltcGxlbWVudCBVbmlzd2FwIFYzLXN0eWxlIGNvbmNlbnRyYXRlZCBsaXF1aWRpdHksIGFsbG93aW5nIExQcyB0byBwcm92aWRlIGxpcXVpZGl0eSB3aXRoaW4gY3VzdG9tIHByaWNlIHJhbmdlcyBmb3IgbWF4aW11bSBjYXBpdGFsIGVmZmljaWVuY3kuCgojIyBHbm93ZWIKClRoZSByb290IGBSZW5kZXIoIiIpYCBkZWxlZ2F0ZXMgdG8gdGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBhbmQgc2hvd3MgcmVhbG0gaWRlbnRpdHksIGhhbHQgZmxhZ3MsIHN0b3JlZCBwb29sIGNvdW50LCBjcmVhdGlvbiBhbmQgd2l0aGRyYXdhbCBmZWVzLCB0aGUgZm91ciBmZWUgdGllcnMgYW5kIHRpY2sgc3BhY2luZ3MsIGFuZCBzZXBhcmF0ZSB0b2tlbjAvdG9rZW4xIHByb3RvY29sLWZlZSBkZW5vbWluYXRvcnMuCgpHTlMgY3JlYXRpb24gZmVlcyB1c2Ugc2l4LWRlY2ltYWwgYmFzZSB1bml0czsgd2l0aGRyYXdhbCBmZWVzIHVzZSBiYXNpcyBwb2ludHMgYW5kIHN3YXAgZmVlIHRpZXJzIHVzZSBwaXBzLiBSZW5kZXJpbmcgcmVhZHMgc3RvcmVkIGNvdW50cyBhbmQgZml4ZWQgY29uZmlndXJhdGlvbiB3aXRob3V0IHRyYXZlcnNpbmcgcG9vbHMuIFVuc3VwcG9ydGVkIHBhdGhzIHJldHVybiBgNDA0YC4KCiMjIENvbmZpZ3VyYXRpb24KCi0gKipQb29sIENyZWF0aW9uIEZlZSoqOiAxMDAgR05TIChkZWZhdWx0KQotICoqUHJvdG9jb2wgRmVlKio6IERpc2FibGVkICgwKSBvciBhIGRlbm9taW5hdG9yIG9mIDQtMTAsIHJvdXRpbmcgMS80IHRvCiAgMS8xMCBvZiBzd2FwIGZlZXMgdG8gdGhlIHByb3RvY29sCi0gKipXaXRoZHJhd2FsIEZlZSoqOiAxJSBvbiBmZWUtYmVhcmluZyBjb2xsZWN0aW9uIChjb25maWd1cmFibGUpCi0gKipGZWUgVGllcnMqKjogMC4wMSUsIDAuMDUlLCAwLjMlLCAxJQotICoqVGljayBTcGFjaW5nKio6IEF1dG8tc2V0IGJ5IGZlZSB0aWVyCi0gKipNYXggTGlxdWlkaXR5IFBlciBUaWNrKio6IERlcGVuZHMgb24gdGljayBzcGFjaW5nOyB1c2UKICBgR2V0TWF4TGlxdWlkaXR5UGVyVGlja2AgcmF0aGVyIHRoYW4gYDJeMTI4IC0gMWAKCiMjIENvcmUgQ29uY2VwdHMKCiMjIyBDb25jZW50cmF0ZWQgTGlxdWlkaXR5CgpMaXF1aWRpdHkgcHJvdmlkZXJzIGNvbmNlbnRyYXRlIGNhcGl0YWwgd2l0aGluIGN1c3RvbSBwcmljZSByYW5nZXMgaW5zdGVhZCBvZiAwLeKIni4gVGhpcyBhbGxvd3MgTFBzIHRvIGFsbG9jYXRlIGNhcGl0YWwgd2hlcmUgaXQncyBtb3N0IGxpa2VseSB0byBnZW5lcmF0ZSBmZWVzIC0gbmVhciB0aGUgY3VycmVudCBwcmljZSBmb3Igdm9sYXRpbGUgcGFpcnMsIG9yIHdpdGhpbiB0aWdodCByYW5nZXMgZm9yIHN0YWJsZSBwYWlycy4gQ2FwaXRhbCBlZmZpY2llbmN5IGNhbiBpbXByb3ZlIGJ5IG9yZGVycyBvZiBtYWduaXR1ZGUgZGVwZW5kaW5nIG9uIHJhbmdlIHNlbGVjdGlvbiBhbmQgcGFpciB2b2xhdGlsaXR5LiBGb3IgbW9yZSBkZXRhaWxzLCBjaGVjayBvdXQgW0dub1N3YXAgRG9jc10oaHR0cHM6Ly9kb2NzLmdub3N3YXAuaW8vY29yZS1jb25jZXB0cy9hbW0vY29uY2VudHJhdGVkLWxpcXVpZGl0eSkuCgojIyMgVGljayBTeXN0ZW0KCi0gUHJpY2Ugc3BhY2UgZGl2aWRlZCBpbnRvIGRpc2NyZXRlIHRpY2tzICgwLjAxJSBhcGFydCkKLSBFYWNoIHRpY2sgcmVwcmVzZW50cyB+MC4wMSUgcHJpY2UgY2hhbmdlCi0gUG9zaXRpb25zIGRlZmluZWQgYnkgdXBwZXIvbG93ZXIgdGljayBib3VuZGFyaWVzCi0gTGlxdWlkaXR5IGFjdGl2YXRlZCBvbmx5IHdoZW4gcHJpY2UgaW4gcmFuZ2UKCiMjIEtleSBGdW5jdGlvbnMKCiMjIyBgQ3JlYXRlUG9vbGAKCkRlcGxveXMgYSBuZXcgdHJhZGluZyBwYWlyLgoKLSBSZXF1aXJlcyAxMDAgR05TIGNyZWF0aW9uIGZlZSBieSBkZWZhdWx0Ci0gVmFsaWQgZmVlIHRpZXIgcmVxdWlyZWQKLSBBY2NlcHRzIGVpdGhlciB0b2tlbiBwYXRoIG9yZGVyIGFuZCBjYW5vbmljYWxpemVzIHRva2VuMC90b2tlbjEKLSBJZiBwYXRocyBhcmUgcmV2ZXJzZWQsIHRoZSBpbml0aWFsIHNxdWFyZS1yb290IHByaWNlIGlzIGludmVydGVkCi0gSW5pdGlhbCBgc3FydFByaWNlWDk2YCBtdXN0IGJlIGluIGBbTUlOX1NRUlRfUkFUSU8sIE1BWF9TUVJUX1JBVElPKWAKLSBEb2VzIG5vdCBjb21wYXJlIHRoZSBpbml0aWFsIHByaWNlIHdpdGggYW4gb3JhY2xlIG9yIGV4dGVybmFsIG1hcmtldCBwcmljZQoKIyMjIGBNaW50YAoKQWRkcyBsaXF1aWRpdHkgdG8gcG9zaXRpb24gKGNhbGxlZCBieSBQb3NpdGlvbiBjb250cmFjdCkuCgotIENhbGN1bGF0ZXMgdG9rZW4gYW1vdW50cyBmcm9tIGxpcXVpZGl0eQotIFVwZGF0ZXMgdGljayBiaXRtYXAKLSBUcmFuc2ZlcnMgdG9rZW5zIGZyb20gb3duZXIKLSBSZXR1cm5zIGFjdHVhbCBhbW91bnRzIHVzZWQKCiMjIyBgQnVybmAKClJlbW92ZXMgbGlxdWlkaXR5IHdpdGhvdXQgY29sbGVjdGluZyB0b2tlbnMuCgotIFBvb2wtbGV2ZWwgb3BlcmF0aW9uOiBidXJuIGZpcnN0LCB0aGVuIGNvbGxlY3Qgb3dlZCB0b2tlbnMKLSBDYWxjdWxhdGVzIG93ZWQgcHJpbmNpcGFsCi0gVXBkYXRlcyBwb3NpdGlvbiBzdGF0ZQoKIyMjIGBDb2xsZWN0YAoKUGF5cyB0b2tlbnMgb3dlZCBieSBhIHBvb2wgcG9zaXRpb24gd2l0aG91dCBhIHdpdGhkcmF3YWwgZmVlLiBUaGlzIGZlZS1mcmVlCnBhdGggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcHJpbmNpcGFsIGFmdGVyIGBCdXJuYC4KCi0gVHJhbnNmZXJzIHRoZSByZXF1ZXN0ZWQgcG9ydGlvbiBvZiBgdG9rZW5zT3dlZGAKLSBVcGRhdGVzIGB0b2tlbnNPd2VkYAoKIyMjIGBDb2xsZWN0U3dhcEZlZWAKClBheXMgYWNjcnVlZCBzd2FwIGZlZXMgdGhyb3VnaCB0aGUgZmVlLWJlYXJpbmcgY29sbGVjdGlvbiBwYXRoLgoKLSBBcHBsaWVzIHRoZSBjb25maWd1cmVkIHdpdGhkcmF3YWwgZmVlCi0gUmV0dXJucyBncm9zcyBjb2xsZWN0ZWQgYW1vdW50cyBhbmQgdGhlIGZlZSB3aXRoaGVsZAotIGBQb3NpdGlvbi5EZWNyZWFzZUxpcXVpZGl0eWAgYW5kIGBQb3NpdGlvbi5Db2xsZWN0RmVlYCBpbnZva2UgdGhlIGFwcHJvcHJpYXRlCiAgcG9vbCBwYXRocyBpbnRlcm5hbGx5CgojIyMgYFN3YXBgCgpDb3JlIHN3YXAgZXhlY3V0aW9uIChjYWxsZWQgYnkgUm91dGVyKS4KCi0gSXRlcmF0ZXMgdGhyb3VnaCB0aWNrcwotIFVwZGF0ZXMgcHJpY2UgYW5kIGxpcXVpZGl0eQotIENhbGN1bGF0ZXMgZmVlcwotIE1haW50YWlucyBUV0FQIG9yYWNsZQoKIyMjIyBTd2FwIENhbGxiYWNrCgpUaGUgYFN3YXBgIGZ1bmN0aW9uIHVzZXMgYSBjYWxsYmFjayBwYXR0ZXJuIGZvciB0b2tlbiB0cmFuc2ZlcnMsIGZvbGxvd2luZyB0aGUgVW5pc3dhcCBWMyBmbGFzaCBzd2FwIGRlc2lnbi4KCioqQ2FsbGJhY2sgU2lnbmF0dXJlKio6CgpgYGBnbwpmdW5jIHN3YXBDYWxsYmFjayhjdXIgcmVhbG0sIGFtb3VudDBEZWx0YSwgYW1vdW50MURlbHRhIGludDY0LCBfICpwb29sLkNhbGxiYWNrTWFya2VyKSBlcnJvcgpgYGAKCioqRGVsdGEgQ29udmVudGlvbioqOgp8IERlbHRhIHwgTWVhbmluZyB8CnwtLS0tLS0tfC0tLS0tLS0tLXwKfCBQb3NpdGl2ZSAoYD4gMGApIHwgQW1vdW50IHRoZSBwb29sIG11c3QgUkVDRUlWRSAoaW5wdXQgdG9rZW4pIHwKfCBOZWdhdGl2ZSAoYDwgMGApIHwgQW1vdW50IHRoZSBwb29sIGhhcyBTRU5UIChvdXRwdXQgdG9rZW4pIHwKCioqU3dhcCBEaXJlY3Rpb24gRXhhbXBsZXMqKjoKCkZvciBgemVyb0Zvck9uZSA9IHRydWVgICh0b2tlbjAg4oaSIHRva2VuMSk6CgotIGBhbW91bnQwRGVsdGEgPiAwYDogUG9vbCByZWNlaXZlcyB0b2tlbjAgKGlucHV0KQotIGBhbW91bnQxRGVsdGEgPCAwYDogUG9vbCBzZW5kcyB0b2tlbjEgKG91dHB1dCkKCkZvciBgemVyb0Zvck9uZSA9IGZhbHNlYCAodG9rZW4xIOKGkiB0b2tlbjApOgoKLSBgYW1vdW50MERlbHRhIDwgMGA6IFBvb2wgc2VuZHMgdG9rZW4wIChvdXRwdXQpCi0gYGFtb3VudDFEZWx0YSA+IDBgOiBQb29sIHJlY2VpdmVzIHRva2VuMSAoaW5wdXQpCgoqKkNhbGxiYWNrIEltcGxlbWVudGF0aW9uIEV4YW1wbGUqKjoKCmBgYGdvCmZ1bmMgc3dhcENhbGxiYWNrKGN1ciByZWFsbSwgYW1vdW50MERlbHRhLCBhbW91bnQxRGVsdGEgaW50NjQsIF8gKnBvb2wuQ2FsbGJhY2tNYXJrZXIpIGVycm9yIHsKICAgIGNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKICAgIHBvb2xBZGRyIDo9IGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL2dub3N3YXAvcG9vbCIpCgogICAgLy8gU2VjdXJpdHkgY2hlY2s6IGVuc3VyZSB0aGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYnkgdGhlIGxlZ2l0aW1hdGUgcG9vbAogICAgaWYgY2FsbGVyICE9IHBvb2xBZGRyIHsKICAgICAgICByZXR1cm4gZXJyb3JzLk5ldygidW5hdXRob3JpemVkIGNhbGxlciIpCiAgICB9CgogICAgaWYgYW1vdW50MERlbHRhID4gMCB7CiAgICAgICAgLy8gVHJhbnNmZXIgdG9rZW4wIHRvIHBvb2wKICAgICAgICBjb21tb24uU2FmZUdSQzIwVHJhbnNmZXIoMCwgY3VyLCB0b2tlbjBQYXRoLCBwb29sQWRkciwgYW1vdW50MERlbHRhKQogICAgfQogICAgaWYgYW1vdW50MURlbHRhID4gMCB7CiAgICAgICAgLy8gVHJhbnNmZXIgdG9rZW4xIHRvIHBvb2wKICAgICAgICBjb21tb24uU2FmZUdSQzIwVHJhbnNmZXIoMCwgY3VyLCB0b2tlbjFQYXRoLCBwb29sQWRkciwgYW1vdW50MURlbHRhKQogICAgfQogICAgcmV0dXJuIG5pbAp9CmBgYAoKKipJbXBvcnRhbnQgTm90ZXMqKjoKCi0gQSBjdXN0b20gY2FsbGJhY2sgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBjYWxsZXIgaXMgdGhlIGxlZ2l0aW1hdGUgcG9vbC4KLSBJbiB0aGUgcm91dGVyIGZsb3csIHRoZSBzdXBwbGllZCBjbG9zdXJlIHBlcmZvcm1zIHRoYXQgcG9vbC1vcmlnaW4gY2hlY2sKICBiZWZvcmUgY2FsbGluZyBgcm91dGVyLlN3YXBDYWxsYmFja2A7IHRoZSBSb3V0ZXIgaW1wbGVtZW50YXRpb24gdGhlbiBjaGVja3MKICB0aGF0IGl0cyBjYWxsZXIgaXMgUm91dGVyIHYxLgotIFRoZSBjYWxsYmFjayBNVVNUIHRyYW5zZmVyIGF0IGxlYXN0IHRoZSBwb3NpdGl2ZSBkZWx0YSBhbW91bnQgdG8gdGhlIHBvb2wuCi0gUmV0dXJuIGBuaWxgIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIHRvIHJldmVydCB0aGUgc3dhcC4KLSBQb29sIHZhbGlkYXRlcyB0aGUgYmFsYW5jZSBpbmNyZWFzZSBhZnRlciBjYWxsYmFjayBleGVjdXRpb24uCgojIyBUZWNobmljYWwgRGV0YWlscwoKIyMjIFByaWNlIE1hdGgKCioqUTk2IEZvcm1hdCoqOiBQcmljZXMgc3RvcmVkIGFzIGBzcXJ0UHJpY2VYOTYgPSBzcXJ0KHByaWNlKSAqIDJeOTZgCgpgYGAKUHJpY2UgMToxICAg4oaSIHNxcnRQcmljZVg5NiA9IDc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2ClByaWNlIDE6NCAgIOKGkiBzcXJ0UHJpY2VYOTYgPSAzOTYxNDA4MTI1NzEzMjE2ODc5Njc3MTk3NTE2OApQcmljZSAxMDA6MSDihpIgc3FydFByaWNlWDk2ID0gNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYwCmBgYAoKKipUaWNrIHRvIFByaWNlKio6IGBwcmljZSA9IDEuMDAwMV50aWNrYAoKYGBgCnRpY2sgMCAgICAgPSBwcmljZSAxCnRpY2sgNjkzMiAgPSBwcmljZSB+Mgp0aWNrIC02OTMyID0gcHJpY2UgfjAuNQpgYGAKCioqUmFuZ2UgTGlxdWlkaXR5Kio6CgpMaXF1aWRpdHkgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSB0b2tlbiByZXF1aXJlZCBieSB0aGUgY3VycmVudCBwcmljZToKCi0gQmVsb3cgdGhlIHJhbmdlIChgY3VycmVudCA8IGxvd2VyYCk6IHRva2VuMCBvbmx5Ci0gSW4gdGhlIHJhbmdlIChgbG93ZXIgPD0gY3VycmVudCA8IHVwcGVyYCk6IGJvdGggdG9rZW4wIGFuZCB0b2tlbjEKLSBBYm92ZSB0aGUgcmFuZ2UgKGBjdXJyZW50ID49IHVwcGVyYCk6IHRva2VuMSBvbmx5CgpUaGUgaW50ZWdlciBmb3JtdWxhcyB1c2UgdGhlIHNxdWFyZS1yb290IHByaWNlcyBhbmQgcm91bmQgaW4gdGhlIGRpcmVjdGlvbgpyZXF1aXJlZCBieSB0aGUgbWludCBvciBidXJuIG9wZXJhdGlvbjsgdGhlcmUgaXMgbm8gc2luZ2xlIGBhbW91bnRgIGZvcm11bGEKdGhhdCBhcHBsaWVzIHRvIGFsbCB0aHJlZSBjYXNlcy4KCioqSW1wZXJtYW5lbnQgTG9zcyoqOgoKLSBOYXJyb3cgcmFuZ2U6IEhpZ2hlciBmZWVzLCBoaWdoZXIgSUwKLSBXaWRlIHJhbmdlOiBMb3dlciBmZWVzLCBsb3dlciBJTAotIFN0YWJsZSBwYWlyczogwrEwLjElIHJhbmdlcyBvcHRpbWFsCi0gVm9sYXRpbGUgcGFpcnM6IMKxMTAlKyByYW5nZXMgcmVjb21tZW5kZWQKCiMjIyBGZWUgTWVjaGFuaWNzCgoqKlN3YXAgRmVlcyoqOgoKLSBDaGFyZ2VkIG9uIGlucHV0IGFtb3VudAotIEFjY3VtdWxhdGVzIGFzIGZlZUdyb3d0aEdsb2JhbAotIERpc3RyaWJ1dGVkIHByby1yYXRhIHRvIGluLXJhbmdlIGxpcXVpZGl0eQoKKipGZWUgQ2FsY3VsYXRpb24qKjoKCmBgYApmZWVzID0gZmVlR3Jvd3RoSW5zaWRlICogbGlxdWlkaXR5CmZlZUdyb3d0aEluc2lkZSA9IGZlZUdyb3d0aEdsb2JhbCAtIGZlZUdyb3d0aE91dHNpZGUKYGBgCgoqKlByb3RvY29sIGZlZXMqKjoKCi0gYDBgIGRpc2FibGVzIHByb3RvY29sIGZlZSBjb2xsZWN0aW9uCi0gYDRgIHRocm91Z2ggYDEwYCBhcmUgZGVub21pbmF0b3JzOiBgNGAgcm91dGVzIDI1JSBhbmQgYDEwYCByb3V0ZXMgMTAlIG9mCiAgc3dhcCBmZWVzIHRvIHRoZSBwcm90b2NvbAotIEdvdmVybmFuY2UtbWFuYWdlZCBjb25maWd1cmF0aW9uIGFwcGxpZXMgdG8gdGhlIHBvb2wgc2V0LCBub3QgYW4gaW5kZXBlbmRlbnQKICBwZXJjZW50YWdlIHNlbGVjdGVkIG9uIGVhY2ggcG9vbAoKIyMgU2VjdXJpdHkKCiMjIyBSZWVudHJhbmN5IFByb3RlY3Rpb24KCi0gVGhlIGxpdmUgZ3VhcmQgaXMgdGhlIHBvb2wtd2lkZSBgVW5sb2NrZWRgIGtleSBpbiB0aGUgcG9vbCBLViBzdG9yZSwgbWFuYWdlZAogIGJ5IGBwb29sL3YxL2xvY2suZ25vYC4gYFNsb3QwLnVubG9ja2VkYCBpcyBhIHNlcGFyYXRlIHN0b3JlZCBmaWVsZCBhbmQgaXMgbm90CiAgdGhlIGd1YXJkOyBgR2V0U2xvdDBVbmxvY2tlZGAgcmVwb3J0cyB0aGF0IGZpZWxkLCBub3QgdGhlIGxpdmUgbG9jay4KLSBUaGUgbG9jayBpcyBub3Qgc3dhcC1zcGVjaWZpYy4gYENyZWF0ZVBvb2xgLCBgTWludGAsIGBCdXJuYCwgYENvbGxlY3RgLAogIGBDb2xsZWN0U3dhcEZlZWAsIGBDb2xsZWN0UHJvdG9jb2xgLCBgU2V0RmVlUHJvdG9jb2xgLCBgU2V0V2l0aGRyYXdhbEZlZWAsCiAgYFNldFBvb2xDcmVhdGlvbkZlZWAsIGBJbmNyZWFzZU9ic2VydmF0aW9uQ2FyZGluYWxpdHlOZXh0YCwKICBgU2V0U3dhcFN0YXJ0SG9va2AsIGBTZXRTd2FwRW5kSG9va2AsIGBTZXRUaWNrQ3Jvc3NIb29rYCwgYFN3YXBgLCBhbmQgdGhlCiAgcmVhZC1vbmx5IGBEcnlTd2FwYCBhbGwgYXNzZXJ0IHRoYXQgdGhlIHBvb2wgaXMgdW5sb2NrZWQgYmVmb3JlIGRvaW5nIGFueQogIHdvcmsuCi0gVGhlIHVubG9ja2VkIGFzc2VydGlvbiBpcyByZWFkLW9ubHkgYW5kIHJ1bnMgYmVmb3JlIHRoZSBhY2Nlc3MgY2hlY2tzLCBzbyBhCiAgY2FsbCB0aGF0IGFib3J0cyBvbiBhdXRob3JpemF0aW9uIGxlYXZlcyBubyBwZXJzaXN0ZWQgbG9jayBiZWhpbmQuCi0gU2V0dGxlbWVudCBvcmRlciBpcyBvcGVyYXRpb24tc3BlY2lmaWMgcmF0aGVyIHRoYW4gdW5pZm9ybWx5CiAgY2hlY2tzLWVmZmVjdHMtaW50ZXJhY3Rpb25zLiBgU3dhcGAgc2V0dGxlcyBvcHRpbWlzdGljYWxseSB0aHJvdWdoIHRoZQogIGNhbGxiYWNrIGFuZCB2ZXJpZmllcyB0aGUgcmVzdWx0aW5nIGJhbGFuY2UgaW5jcmVhc2UgYWZ0ZXJ3YXJkcywgd2hpbGUgYE1pbnRgCiAgcHVsbHMgdG9rZW5zIGJlZm9yZSBpdHMgZmluYWwgcG9vbCBzYXZlLiBSZXZpZXcgdGhlIHNwZWNpZmljIHBhdGggcmF0aGVyIHRoYW4KICBhc3N1bWluZyBldmVyeSB3cml0ZSBwcmVjZWRlcyBldmVyeSBleHRlcm5hbCBjYWxsLgoKIyMjIFByaWNlIE1hbmlwdWxhdGlvbgoKLSBUV0FQIG9yYWNsZSBwcm92aWRlcyB0aW1lLXdlaWdodGVkIG9ic2VydmF0aW9ucyBmb3IgbW9uaXRvcmluZzsgaXQgaXMgbm90IGFuCiAgYXV0b21hdGljIGluaXRpYWwtcHJpY2UgZ3VhcmQKLSBMYXJnZSBzd2FwcyBsaW1pdGVkIGJ5IGxpcXVpZGl0eQotIFNsaXBwYWdlIHByb3RlY3Rpb24gcmVxdWlyZWQKCiMjIyBQb29sIENyZWF0aW9uIEdyaWVmaW5nCgoqKklzc3VlKio6IGBDcmVhdGVQb29sYCB2YWxpZGF0ZXMgdGhlIGZlZSB0aWVyLCB0b2tlbiBjYW5vbmljYWxpemF0aW9uLCBhbmQKc3F1YXJlLXJvb3QgcHJpY2UgYm91bmRzLCBidXQgZG9lcyBub3QgY29tcGFyZSB0aGUgaW5pdGlhbCBwcmljZSB3aXRoIGFuCm9yYWNsZSBvciBleHRlcm5hbCBtYXJrZXQgcHJpY2UuIEEgcG9vbCBjYW4gdGhlcmVmb3JlIGJlIGNyZWF0ZWQgYXQgYW4KZWNvbm9taWNhbGx5IGluYXBwcm9wcmlhdGUgZXh0cmVtZSBwcmljZS4KCioqSW1wYWN0Kio6CgotIFBvb2wgbWF5IGJlIHRlbXBvcmFyaWx5IHVudXNhYmxlCi0gTm8gcmF0aW9uYWwgTFAgbWF5IHByb3ZpZGUgbGlxdWlkaXR5IGF0IGEgZGlzdG9ydGVkIHByaWNlCi0gUHJpY2UgY2Fubm90IHNlbGYtY29ycmVjdCB3aXRob3V0IGxpcXVpZGl0eQoKKipSZWNvdmVyeSBNZWNoYW5pc20qKjoKUmVjb3ZlcnkgcmVxdWlyZXMgY29vcmRpbmF0ZWQgbGlxdWlkaXR5IHByb3Zpc2lvbiBhbmQgc3dhcHMgdG8gbW92ZSB0aGUgcHJpY2UKdG93YXJkIGEgZGVzaXJlZCBtYXJrZXQgcmF0ZSwgZm9sbG93ZWQgYnkgbGlxdWlkaXR5IHJlbW92YWwuIFRoZSBwcm90b2NvbCBkb2VzCm5vdCBwZXJmb3JtIHRoaXMgY29ycmVjdGlvbiBhdXRvbWF0aWNhbGx5LCBhbmQgcHJvZml0YWJpbGl0eSBkZXBlbmRzIG9uIG1hcmtldApjb25kaXRpb25zLCBmZWVzLCBhbmQgc2xpcHBhZ2UuCgoqKkV4YW1wbGUgUmVjb3ZlcnkgU2VxdWVuY2UqKjoKClRoaXMgcHNldWRvY29kZSBhc3N1bWVzIHRoZSBpbnRlZ3JhdGluZyByZWFsbSBmdW5jdGlvbiBoYXMgYSBjdXJyZW50IGBjdXJgIHRva2VuLgoKYGBgCi8vIElsbHVzdHJhdGl2ZSBzZXF1ZW5jZTsgdGhlIGNhbGxlciBtdXN0IGNvbXBvc2UgYW5kIGV4ZWN1dGUgdGhlc2Ugb3BlcmF0aW9ucwoxLiBwb3NpdGlvbi5NaW50KGNyb3NzKGN1ciksIC4uLiwgZnVsbFJhbmdlLCBsYXJnZUFtb3VudCwgLi4uKSAgLy8gQWRkIGxpcXVpZGl0eQoyLiByb3V0ZXIuRXhhY3RJblN3YXBSb3V0ZShjcm9zcyhjdXIpLCAuLi4sIHRhcmdldFJvdXRlLCAuLi4pICAgIC8vIEZpeCBwcmljZSB2aWEgYXJiaXRyYWdlCjMuIHBvc2l0aW9uLkRlY3JlYXNlTGlxdWlkaXR5KGNyb3NzKGN1ciksIHBvc2l0aW9uSWQsIC4uLikgICAgICAgLy8gUmVtb3ZlIGxpcXVpZGl0eSBhbmQgY29sbGVjdCBwcmluY2lwYWwKNC4gcG9zaXRpb24uQ29sbGVjdEZlZShjcm9zcyhjdXIpLCBwb3NpdGlvbklkKSAgICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0IGFueSByZW1haW5pbmcgZmVlcwpgYGAKCioqUHJldmVudGlvbioqOgoKLSAxMDAgR05TIGNyZWF0aW9uIGZlZSBwcm92aWRlcyBkZXRlcnJlbnQKLSBDb25zaWRlciBpbXBsZW1lbnRpbmcgcHJpY2Ugb3JhY2xlIHZhbGlkYXRpb24gZm9yIGhpZ2gtdmFsdWUgcGFpcnMKLSBNb25pdG9yIHBvb2wgY3JlYXRpb24gZXZlbnRzIGZvciBzdXNwaWNpb3VzIGFjdGl2aXR5CgojIyMgUm91bmRpbmcKCi0gSW50ZWdlciBtYXRoIHJvdW5kcyBkaXJlY3Rpb25hbGx5IGZvciB0aGUgaW5wdXQvb3V0cHV0IGludmFyaWFudDsgbm90IGV2ZXJ5CiAgZGl2aXNpb24gcm91bmRzIGRvd24KLSBNaW5pbXVtIGxpcXVpZGl0eSBlbmZvcmNlZAotIEZ1bGwgcHJlY2lzaW9uIGZvciBhbW91bnRzChq/AgoKZXJyb3JzLmdubxKwAnBhY2thZ2UgcG9vbAoKY29uc3QgRXJyU3Bvb2ZlZFJlYWxtID0gInJsbSBkb2VzIG5vdCBtYXRjaCB0aGUgY3VycmVudCBjcm9zc2luZyBmcmFtZSIKCi8vIGVyclVwZ3JhZGVXaGlsZUxvY2tlZCBpcyByZXR1cm5lZCB3aGVuIFVwZ3JhZGVJbXBsIGlzIGludm9rZWQgd2hpbGUgdGhlCi8vIHBvb2wncyByZWVudHJhbmN5IGxvY2sgKFN0b3JlS2V5VW5sb2NrZWQpIGlzIGhlbGQuCmNvbnN0IGVyclVwZ3JhZGVXaGlsZUxvY2tlZCA9ICJjYW5ub3QgdXBncmFkZSBwb29sIGltcGxlbWVudGF0aW9uIHdoaWxlIHBvb2wgaXMgbG9ja2VkIgoamNoBCgpnZXR0ZXIuZ25vEojaAXBhY2thZ2UgcG9vbAoKaW1wb3J0ICgKCXJvdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvcm90cmVlL3YwIgopCgovLyBHZXRQb29scyByZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgZXZlcnkgcG9vbCwga2V5ZWQgYnkgcG9vbCBwYXRoLgovLyBSZWFkaW5nIGFuIGVudHJ5IHlpZWxkcyBhIGNsb25lLCBzbyB0aGUgdmlldyBjYW5ub3QgbXV0YXRlIHJlYWxtIHN0YXRlLgovLyBSZXR1cm5zOgovLyAgIC0gKnJvdHJlZS5SZWFkT25seVRyZWU6IFJlYWQtb25seSB0cmVlIGtleWVkIGJ5IGNhbm9uaWNhbCBwb29sIHBhdGg7IGVhY2gKLy8gICAgIGVudHJ5IGlzIGNsb25lZCBiZWZvcmUgaXQgaXMgZXhwb3NlZC4KZnVuYyBHZXRQb29scygpICpyb3RyZWUuUmVhZE9ubHlUcmVlIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvb2xzKCkKfQoKLy8gRXhpc3RzUG9vbFBhdGggY2hlY2tzIGlmIGEgcG9vbCBleGlzdHMgYXQgdGhlIGdpdmVuIHBhdGguCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB0byBjaGVjay4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiBhIHBvb2wgaXMgcmVnaXN0ZXJlZCBhdCBwb29sUGF0aDsgZmFsc2Ugb3RoZXJ3aXNlLgpmdW5jIEV4aXN0c1Bvb2xQYXRoKHBvb2xQYXRoIHN0cmluZykgYm9vbCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5FeGlzdHNQb29sUGF0aChwb29sUGF0aCkKfQoKLy8gR2V0QmFsYW5jZXMgcmV0dXJucyB0aGUgYmFsYW5jZXMgb2YgdGhlIHBvb2wuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSBiYWxhbmNlcyBhcmUgcmVhZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBDdXJyZW50IHRva2VuMCBiYWxhbmNlIGhlbGQgYnkgdGhlIHBvb2wsIGluIHRva2VuIGJhc2UgdW5pdHMuCi8vICAgLSBpbnQ2NDogQ3VycmVudCB0b2tlbjEgYmFsYW5jZSBoZWxkIGJ5IHRoZSBwb29sLCBpbiB0b2tlbiBiYXNlIHVuaXRzLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldEJhbGFuY2VzKHBvb2xQYXRoIHN0cmluZykgKGludDY0LCBpbnQ2NCwgZXJyb3IpIHsKCWJhbDAsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEJhbGFuY2VUb2tlbjAocG9vbFBhdGgpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgMCwgZXJyCgl9CgliYWwxLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRCYWxhbmNlVG9rZW4xKHBvb2xQYXRoKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIGVycgoJfQoJcmV0dXJuIGJhbDAsIGJhbDEsIG5pbAp9CgovLyBHZXRCYWxhbmNlVG9rZW4wIHJldHVybnMgdGhlIGJhbGFuY2Ugb2YgdG9rZW4wIGluIHRoZSBwb29sLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgdG8gcXVlcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogQ3VycmVudCB0b2tlbjAgYmFsYW5jZSBoZWxkIGJ5IHRoZSBwb29sLCBpbiB0b2tlbiBiYXNlIHVuaXRzLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldEJhbGFuY2VUb2tlbjAocG9vbFBhdGggc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRCYWxhbmNlVG9rZW4wKHBvb2xQYXRoKQp9CgovLyBHZXRCYWxhbmNlVG9rZW4xIHJldHVybnMgdGhlIGJhbGFuY2Ugb2YgdG9rZW4xIGluIHRoZSBwb29sLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgdG8gcXVlcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogQ3VycmVudCB0b2tlbjEgYmFsYW5jZSBoZWxkIGJ5IHRoZSBwb29sLCBpbiB0b2tlbiBiYXNlIHVuaXRzLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldEJhbGFuY2VUb2tlbjEocG9vbFBhdGggc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRCYWxhbmNlVG9rZW4xKHBvb2xQYXRoKQp9CgovLyBHZXRGZWUgcmV0dXJucyB0aGUgZmVlIHRpZXIgb2YgdGhlIHBvb2wuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSBmZWUgdGllciBpcyByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdWludDMyOiBDb25maWd1cmVkIGZlZSB0aWVyIGZvciB0aGUgcG9vbC4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYW4gZXhpc3RpbmcgcG9vbC4KZnVuYyBHZXRGZWUocG9vbFBhdGggc3RyaW5nKSAodWludDMyLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RmVlKHBvb2xQYXRoKQp9CgovLyBHZXRGZWVBbW91bnRUaWNrU3BhY2luZ3MgcmV0dXJucyBhbGwgZmVlIHRpZXIgdG8gdGljayBzcGFjaW5nIG1hcHBpbmdzLgovLyBSZXR1cm5zOgovLyAgIC0gbWFwW3VpbnQzMl1pbnQzMjogQ29weSBvZiB0aGUgY29uZmlndXJlZCBmZWUtdGllci10by10aWNrLXNwYWNpbmcgbWFwcGluZy4KZnVuYyBHZXRGZWVBbW91bnRUaWNrU3BhY2luZ3MoKSBtYXBbdWludDMyXWludDMyIHsKCXJldHVybiBjbG9uZUZlZUFtb3VudFRpY2tTcGFjaW5ncyhnZXRJbXBsZW1lbnRhdGlvbigpLkdldEZlZUFtb3VudFRpY2tTcGFjaW5ncygpKQp9CgovLyBHZXRGZWVBbW91bnRUaWNrU3BhY2luZyByZXR1cm5zIHRoZSB0aWNrIHNwYWNpbmcgZm9yIGEgZ2l2ZW4gZmVlIHRpZXIuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmZWU6IEZlZSB0aWVyIHdob3NlIHN1cHBvcnRlZCB0aWNrIHNwYWNpbmcgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3BhY2luZzogVGljayBzcGFjaW5nIGNvbmZpZ3VyZWQgZm9yIGZlZS4KLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIGZlZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZmVlIHRpZXJzLgpmdW5jIEdldEZlZUFtb3VudFRpY2tTcGFjaW5nKGZlZSB1aW50MzIpIChzcGFjaW5nIGludDMyLCBlcnIgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEZlZUFtb3VudFRpY2tTcGFjaW5nKGZlZSkKfQoKLy8gR2V0RmVlR3Jvd3RoR2xvYmFsMFgxMjggcmV0dXJucyB0aGUgZ2xvYmFsIGZlZSBncm93dGggZm9yIHRva2VuMC4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHRvIHF1ZXJ5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBUb2tlbjAgZ2xvYmFsIGZlZSBncm93dGgsIHNlcmlhbGl6ZWQgYXMgYSBiYXNlLTEwIFgxMjggYWNjdW11bGF0b3IuCi8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGFuIGV4aXN0aW5nIHBvb2wuCmZ1bmMgR2V0RmVlR3Jvd3RoR2xvYmFsMFgxMjgocG9vbFBhdGggc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgewoJZmVlR3Jvd3RoLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRGZWVHcm93dGhHbG9iYWwwWDEyOChwb29sUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgZXJyCgl9CglyZXR1cm4gZmVlR3Jvd3RoLlRvU3RyaW5nKCksIG5pbAp9CgovLyBHZXRGZWVHcm93dGhHbG9iYWwxWDEyOCByZXR1cm5zIHRoZSBnbG9iYWwgZmVlIGdyb3d0aCBmb3IgdG9rZW4xLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgdG8gcXVlcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFRva2VuMSBnbG9iYWwgZmVlIGdyb3d0aCwgc2VyaWFsaXplZCBhcyBhIGJhc2UtMTAgWDEyOCBhY2N1bXVsYXRvci4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYW4gZXhpc3RpbmcgcG9vbC4KZnVuYyBHZXRGZWVHcm93dGhHbG9iYWwxWDEyOChwb29sUGF0aCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7CglmZWVHcm93dGgsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEZlZUdyb3d0aEdsb2JhbDFYMTI4KHBvb2xQYXRoKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCXJldHVybiBmZWVHcm93dGguVG9TdHJpbmcoKSwgbmlsCn0KCi8vIEdldEZlZUdyb3d0aEdsb2JhbFgxMjggcmV0dXJucyB0aGUgZ2xvYmFsIGZlZSBncm93dGggZm9yIGJvdGggdG9rZW5zLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgdG8gcXVlcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFRva2VuMCBnbG9iYWwgZmVlIGdyb3d0aCwgc2VyaWFsaXplZCBhcyBhIGJhc2UtMTAgWDEyOCBhY2N1bXVsYXRvci4KLy8gICAtIHN0cmluZzogVG9rZW4xIGdsb2JhbCBmZWUgZ3Jvd3RoLCBzZXJpYWxpemVkIGFzIGEgYmFzZS0xMCBYMTI4IGFjY3VtdWxhdG9yLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldEZlZUdyb3d0aEdsb2JhbFgxMjgocG9vbFBhdGggc3RyaW5nKSAoc3RyaW5nLCBzdHJpbmcsIGVycm9yKSB7CglmZzAsIGZnMSwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0RmVlR3Jvd3RoR2xvYmFsWDEyOChwb29sUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgIiIsIGVycgoJfQoJcmV0dXJuIGZnMC5Ub1N0cmluZygpLCBmZzEuVG9TdHJpbmcoKSwgbmlsCn0KCi8vIEdldExpcXVpZGl0eSByZXR1cm5zIHRoZSBjdXJyZW50IGxpcXVpZGl0eSBpbiB0aGUgcG9vbC4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIGxpcXVpZGl0eSBpcyByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBDdXJyZW50IHBvb2wgbGlxdWlkaXR5LCBzZXJpYWxpemVkIGFzIGEgYmFzZS0xMCB1bnNpZ25lZCBpbnRlZ2VyLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldExpcXVpZGl0eShwb29sUGF0aCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7CglsaXF1aWRpdHksIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldExpcXVpZGl0eShwb29sUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgZXJyCgl9CglyZXR1cm4gbGlxdWlkaXR5LlRvU3RyaW5nKCksIG5pbAp9CgovLyBHZXRQb29sQ3JlYXRpb25GZWUgcmV0dXJucyB0aGUgY3VycmVudCBwb29sIGNyZWF0aW9uIGZlZS4KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBQb29sIGNyZWF0aW9uIGZlZSBjaGFyZ2VkIHdoZW4gYSBuZXcgcG9vbCBpcyBjcmVhdGVkLCBpbiBjb25maWd1cmVkCi8vICAgICBuYXRpdmUtdG9rZW4gYmFzZSB1bml0cy4KZnVuYyBHZXRQb29sQ3JlYXRpb25GZWUoKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb29sQ3JlYXRpb25GZWUoKQp9CgovLyBHZXRQb3NpdGlvbkZlZUdyb3d0aEluc2lkZTBMYXN0WDEyOCByZXR1cm5zIHRoZSBsYXN0IHJlY29yZGVkIGZlZSBncm93dGggaW5zaWRlIGZvciB0b2tlbjAuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSBwb3NpdGlvbi4KLy8gICAtIGtleTogUG9zaXRpb24ga2V5IGlkZW50aWZ5aW5nIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHBvb2wuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFBvc2l0aW9uJ3MgbGFzdCB0b2tlbjAgZmVlLWdyb3d0aC1pbnNpZGUgYWNjdW11bGF0b3IsIHNlcmlhbGl6ZWQKLy8gICAgIGFzIGEgYmFzZS0xMCBYMTI4IHZhbHVlLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgcG9vbCBvciBwb3NpdGlvbiBrZXkgY2Fubm90IGJlIGZvdW5kLgpmdW5jIEdldFBvc2l0aW9uRmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4KHBvb2xQYXRoLCBrZXkgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUwTGFzdFgxMjgocG9vbFBhdGgsIGtleSkKfQoKLy8gR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUxTGFzdFgxMjggcmV0dXJucyB0aGUgbGFzdCByZWNvcmRlZCBmZWUgZ3Jvd3RoIGluc2lkZSBmb3IgdG9rZW4xLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgcG9zaXRpb24uCi8vICAgLSBrZXk6IFBvc2l0aW9uIGtleSBpZGVudGlmeWluZyB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBwb29sLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBQb3NpdGlvbidzIGxhc3QgdG9rZW4xIGZlZS1ncm93dGgtaW5zaWRlIGFjY3VtdWxhdG9yLCBzZXJpYWxpemVkCi8vICAgICBhcyBhIGJhc2UtMTAgWDEyOCB2YWx1ZS4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgcG9zaXRpb24ga2V5IGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQb3NpdGlvbkZlZUdyb3d0aEluc2lkZTFMYXN0WDEyOChwb29sUGF0aCwga2V5IHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvc2l0aW9uRmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4KHBvb2xQYXRoLCBrZXkpCn0KCi8vIEdldFBvc2l0aW9uRmVlR3Jvd3RoSW5zaWRlTGFzdFgxMjggcmV0dXJucyB0aGUgbGFzdCByZWNvcmRlZCBmZWUgZ3Jvd3RoIGluc2lkZSBmb3IgYm90aCB0b2tlbnMuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSBwb3NpdGlvbi4KLy8gICAtIGtleTogUG9zaXRpb24ga2V5IGlkZW50aWZ5aW5nIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHBvb2wuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFBvc2l0aW9uJ3MgbGFzdCB0b2tlbjAgZmVlLWdyb3d0aC1pbnNpZGUgYWNjdW11bGF0b3IsIHNlcmlhbGl6ZWQKLy8gICAgIGFzIGEgYmFzZS0xMCBYMTI4IHZhbHVlLgovLyAgIC0gc3RyaW5nOiBQb3NpdGlvbidzIGxhc3QgdG9rZW4xIGZlZS1ncm93dGgtaW5zaWRlIGFjY3VtdWxhdG9yLCBzZXJpYWxpemVkCi8vICAgICBhcyBhIGJhc2UtMTAgWDEyOCB2YWx1ZS4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgcG9zaXRpb24ga2V5IGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQb3NpdGlvbkZlZUdyb3d0aEluc2lkZUxhc3RYMTI4KHBvb2xQYXRoLCBrZXkgc3RyaW5nKSAoc3RyaW5nLCBzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb3NpdGlvbkZlZUdyb3d0aEluc2lkZUxhc3RYMTI4KHBvb2xQYXRoLCBrZXkpCn0KCi8vIEdldFBvb2xQb3NpdGlvbnMgcmV0dXJucyBhIHJlYWQtb25seSB2aWV3IG9mIGEgcG9vbCdzIHBvc2l0aW9ucywga2V5ZWQgYnkKLy8gcG9zaXRpb24ga2V5LiBuaWwgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcG9vbCBkb2VzIG5vdCBleGlzdC4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIHBvc2l0aW9ucyBhcmUgcmVhZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpyb3RyZWUuUmVhZE9ubHlUcmVlOiBSZWFkLW9ubHkgdHJlZSBrZXllZCBieSBwb3NpdGlvbiBrZXk7IG5pbCB3aGVuIHRoZQovLyAgICAgcG9vbCBkb2VzIG5vdCBleGlzdC4KZnVuYyBHZXRQb29sUG9zaXRpb25zKHBvb2xQYXRoIHN0cmluZykgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9vbFBvc2l0aW9ucyhwb29sUGF0aCkKfQoKLy8gR2V0UG9zaXRpb25MaXF1aWRpdHkgcmV0dXJucyB0aGUgbGlxdWlkaXR5IG9mIGEgcG9zaXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSBwb3NpdGlvbi4KLy8gICAtIGtleTogUG9zaXRpb24ga2V5IGlkZW50aWZ5aW5nIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHBvb2wuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFBvc2l0aW9uIGxpcXVpZGl0eSwgc2VyaWFsaXplZCBhcyBhIGJhc2UtMTAgdW5zaWduZWQgaW50ZWdlci4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgcG9zaXRpb24ga2V5IGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQb3NpdGlvbkxpcXVpZGl0eShwb29sUGF0aCwga2V5IHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFBvc2l0aW9uTGlxdWlkaXR5KHBvb2xQYXRoLCBrZXkpCn0KCi8vIEdldFBvc2l0aW9uVG9rZW5zT3dlZDAgcmV0dXJucyB0aGUgYW1vdW50IG9mIHRva2VuMCBvd2VkIHRvIGEgcG9zaXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSBwb3NpdGlvbi4KLy8gICAtIGtleTogUG9zaXRpb24ga2V5IGlkZW50aWZ5aW5nIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHBvb2wuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogQW1vdW50IG9mIHRva2VuMCBvd2VkIHRvIHRoZSBwb3NpdGlvbiwgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgcG9zaXRpb24ga2V5IGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQb3NpdGlvblRva2Vuc093ZWQwKHBvb2xQYXRoLCBrZXkgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb3NpdGlvblRva2Vuc093ZWQwKHBvb2xQYXRoLCBrZXkpCn0KCi8vIEdldFBvc2l0aW9uVG9rZW5zT3dlZDEgcmV0dXJucyB0aGUgYW1vdW50IG9mIHRva2VuMSBvd2VkIHRvIGEgcG9zaXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSBwb3NpdGlvbi4KLy8gICAtIGtleTogUG9zaXRpb24ga2V5IGlkZW50aWZ5aW5nIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHBvb2wuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogQW1vdW50IG9mIHRva2VuMSBvd2VkIHRvIHRoZSBwb3NpdGlvbiwgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgcG9zaXRpb24ga2V5IGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQb3NpdGlvblRva2Vuc093ZWQxKHBvb2xQYXRoLCBrZXkgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb3NpdGlvblRva2Vuc093ZWQxKHBvb2xQYXRoLCBrZXkpCn0KCi8vIEdldFBvc2l0aW9uVG9rZW5zT3dlZEluZm9zIHJldHVybnMgdGhlIGFtb3VudCBvZiB0b2tlbnMgb3dlZCBmb3IgYm90aCB0b2tlbnMuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSBwb3NpdGlvbi4KLy8gICAtIGtleTogUG9zaXRpb24ga2V5IGlkZW50aWZ5aW5nIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHBvb2wuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogQW1vdW50IG9mIHRva2VuMCBvd2VkIHRvIHRoZSBwb3NpdGlvbiwgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIGludDY0OiBBbW91bnQgb2YgdG9rZW4xIG93ZWQgdG8gdGhlIHBvc2l0aW9uLCBpbiB0b2tlbiBiYXNlIHVuaXRzLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgcG9vbCBvciBwb3NpdGlvbiBrZXkgY2Fubm90IGJlIGZvdW5kLgpmdW5jIEdldFBvc2l0aW9uVG9rZW5zT3dlZChwb29sUGF0aCwga2V5IHN0cmluZykgKGludDY0LCBpbnQ2NCwgZXJyb3IpIHsKCXRva2Vuc093ZWQwLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQb3NpdGlvblRva2Vuc093ZWQwKHBvb2xQYXRoLCBrZXkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgMCwgZXJyCgl9Cgl0b2tlbnNPd2VkMSwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0UG9zaXRpb25Ub2tlbnNPd2VkMShwb29sUGF0aCwga2V5KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIGVycgoJfQoJcmV0dXJuIHRva2Vuc093ZWQwLCB0b2tlbnNPd2VkMSwgbmlsCn0KCi8vIEdldFByb3RvY29sRmVlc1Rva2VuMCByZXR1cm5zIGFjY3VtdWxhdGVkIHByb3RvY29sIGZlZXMgZm9yIHRva2VuMC4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIGZlZXMgYXJlIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogQWNjdW11bGF0ZWQgcHJvdG9jb2wgZmVlIGZvciB0b2tlbjAsIGluIHRva2VuIGJhc2UgdW5pdHMuCi8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGFuIGV4aXN0aW5nIHBvb2wuCmZ1bmMgR2V0UHJvdG9jb2xGZWVzVG9rZW4wKHBvb2xQYXRoIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvdG9jb2xGZWVzVG9rZW4wKHBvb2xQYXRoKQp9CgovLyBHZXRQcm90b2NvbEZlZXNUb2tlbjEgcmV0dXJucyBhY2N1bXVsYXRlZCBwcm90b2NvbCBmZWVzIGZvciB0b2tlbjEuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSBmZWVzIGFyZSByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IEFjY3VtdWxhdGVkIHByb3RvY29sIGZlZSBmb3IgdG9rZW4xLCBpbiB0b2tlbiBiYXNlIHVuaXRzLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldFByb3RvY29sRmVlc1Rva2VuMShwb29sUGF0aCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb3RvY29sRmVlc1Rva2VuMShwb29sUGF0aCkKfQoKLy8gR2V0UHJvdG9jb2xGZWVzVG9rZW5zIHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHByb3RvY29sIGZlZXMgZm9yIGJvdGggdG9rZW5zLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2UgZmVlcyBhcmUgcmVhZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBBY2N1bXVsYXRlZCBwcm90b2NvbCBmZWUgZm9yIHRva2VuMCwgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIGludDY0OiBBY2N1bXVsYXRlZCBwcm90b2NvbCBmZWUgZm9yIHRva2VuMSwgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYW4gZXhpc3RpbmcgcG9vbC4KZnVuYyBHZXRQcm90b2NvbEZlZXNUb2tlbnMocG9vbFBhdGggc3RyaW5nKSAoaW50NjQsIGludDY0LCBlcnJvcikgewoJZmVlczAsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb3RvY29sRmVlc1Rva2VuMChwb29sUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAwLCAwLCBlcnIKCX0KCWZlZXMxLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQcm90b2NvbEZlZXNUb2tlbjEocG9vbFBhdGgpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgMCwgZXJyCgl9CglyZXR1cm4gZmVlczAsIGZlZXMxLCBuaWwKfQoKLy8gR2V0U2xvdDBGZWVQcm90b2NvbCByZXR1cm5zIHRoZSBwcm90b2NvbCBmZWUgcmF0ZSBmcm9tIHNsb3QwLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgdG8gcXVlcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1aW50ODogUGFja2VkIHByb3RvY29sLWZlZSBkZW5vbWluYXRvciBjb25maWd1cmF0aW9uIGZyb20gc2xvdDA7IHRva2VuMAovLyAgICAgb2NjdXBpZXMgdGhlIGxvdyBuaWJibGUgYW5kIHRva2VuMSB0aGUgaGlnaCBuaWJibGUuCi8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGFuIGV4aXN0aW5nIHBvb2wuCmZ1bmMgR2V0U2xvdDBGZWVQcm90b2NvbChwb29sUGF0aCBzdHJpbmcpICh1aW50OCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFNsb3QwRmVlUHJvdG9jb2wocG9vbFBhdGgpCn0KCi8vIEdldFNsb3QwU3FydFByaWNlWDk2IHJldHVybnMgdGhlIGN1cnJlbnQgc3FydCBwcmljZSBmcm9tIHNsb3QwLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgdG8gcXVlcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IEN1cnJlbnQgc3F1YXJlLXJvb3QgcHJpY2UgaW4gUTY0Ljk2IGZpeGVkLXBvaW50IGZvcm0sIHNlcmlhbGl6ZWQKLy8gICAgIGFzIGEgYmFzZS0xMCB1bnNpZ25lZCBpbnRlZ2VyLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldFNsb3QwU3FydFByaWNlWDk2KHBvb2xQYXRoIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKCXNxcnRQcmljZVg5NiwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0U2xvdDBTcXJ0UHJpY2VYOTYocG9vbFBhdGgpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIGVycgoJfQoJcmV0dXJuIHNxcnRQcmljZVg5Ni5Ub1N0cmluZygpLCBuaWwKfQoKLy8gR2V0U2xvdDBUaWNrIHJldHVybnMgdGhlIGN1cnJlbnQgdGljayBmcm9tIHNsb3QwLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgdG8gcXVlcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQzMjogQ3VycmVudCBhY3RpdmUgdGljayBpbmRleCBzdG9yZWQgaW4gc2xvdDAuCi8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGFuIGV4aXN0aW5nIHBvb2wuCmZ1bmMgR2V0U2xvdDBUaWNrKHBvb2xQYXRoIHN0cmluZykgKGludDMyLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0U2xvdDBUaWNrKHBvb2xQYXRoKQp9CgovLyBHZXRTbG90MFVubG9ja2VkIHJlcG9ydHMgd2hldGhlciB0aGUgcG9vbCBpcyBjdXJyZW50bHkgdW5sb2NrZWQuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB0byBxdWVyeS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiB0aGUgcG9vbCBpcyBub3QgaG9sZGluZyBpdHMgcmVlbnRyYW5jeSBsb2NrOyBmYWxzZSB3aGVuCi8vICAgICB0aGUgcG9vbCBpcyBjdXJyZW50bHkgbG9ja2VkLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldFNsb3QwVW5sb2NrZWQocG9vbFBhdGggc3RyaW5nKSAoYm9vbCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFNsb3QwVW5sb2NrZWQocG9vbFBhdGgpCn0KCi8vIEdldFNsb3QwIHJldHVybnMgYSBzYWZlIGNvcHkgb2YgdGhlIHBvb2wncyBzbG90MCAoc3FydCBwcmljZSwgdGljaywKLy8gcHJvdG9jb2wgZmVlLCBsb2NrIHN0YXRlLCBhbmQgb3JhY2xlIGN1cnNvci9jYXBhY2l0eSBtZXRhZGF0YSkuCi8vIFRoZSBjbG9uZSBoYXBwZW5zIGhlcmUsIGF0IHRoZSBwcm94eSBib3VuZGFyeSwgc28gZXZlcnkgaW1wbGVtZW50YXRpb24KLy8gdmVyc2lvbiBjYW4gcmV0dXJuIGl0cyBpbnRlcm5hbCBTbG90MCBieSB2YWx1ZSB3aXRob3V0IGVhY2ggb25lIGhhdmluZyB0bwovLyByZW1lbWJlciB0byBkZWZlbmQgYWdhaW5zdCBjYWxsZXJzIG11dGF0aW5nIHRoZSBzaGFyZWQgc3FydFByaWNlWDk2LgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgdG8gcXVlcnkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBTbG90MDogQ29weSBvZiB0aGUgcG9vbCdzIHNsb3QwIHN0YXRlLCBpbmNsdWRpbmcgcHJpY2UsIHRpY2ssIHByb3RvY29sCi8vICAgICBmZWUsIGxvY2ssIGFuZCBvYnNlcnZhdGlvbiBtZXRhZGF0YTsgcGFuaWNzIGlmIHRoZSBwb29sIGlzIG1pc3NpbmcuCmZ1bmMgR2V0U2xvdDAocG9vbFBhdGggc3RyaW5nKSBTbG90MCB7CglzbG90MCA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFNsb3QwKHBvb2xQYXRoKQoJcmV0dXJuIHNsb3QwLkNsb25lKCkKfQoKLy8gR2V0T2JzZXJ2YXRpb25BdCByZXR1cm5zIGEgc2FmZSBjb3B5IG9mIHRoZSBvYnNlcnZhdGlvbiBzdG9yZWQgYXQgaW5kZXguCi8vIEFuIGluLXJhbmdlIGJ1dCB1bmluaXRpYWxpemVkIHNsb3QgcmV0dXJucyB0aGUgemVybyBvYnNlcnZhdGlvbiwgbWF0Y2hpbmcKLy8gVW5pc3dhcCBWMydzIGZpeGVkIG9ic2VydmF0aW9uLWFycmF5IGdldHRlci4KLy8KLy8gcmVmOiB1bmlzd2FwIHYzIElVbmlzd2FwVjNQb29sU3RhdGUub2JzZXJ2YXRpb25zKHVpbnQyNTYgaW5kZXgpCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSBvYnNlcnZhdGlvbi4KLy8gICAtIGluZGV4OiBaZXJvLWJhc2VkIG9ic2VydmF0aW9uLWFycmF5IGluZGV4OyB2YWx1ZXMgYXQgb3IgYWJvdmUgdGhlIGZpeGVkCi8vICAgICBjYXJkaW5hbGl0eSBib3VuZCByZXR1cm4gYW4gZXJyb3IuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBPYnNlcnZhdGlvbjogT2JzZXJ2YXRpb24gYXQgaW5kZXgsIG9yIHRoZSB6ZXJvIG9ic2VydmF0aW9uIHdoZW4gdGhlIHNsb3QKLy8gICAgIGlzIGluIHJhbmdlIGJ1dCBoYXMgbmV2ZXIgYmVlbiB3cml0dGVuLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgcG9vbCBpcyBtaXNzaW5nIG9yIGluZGV4IGlzIG91dCBvZiByYW5nZS4KZnVuYyBHZXRPYnNlcnZhdGlvbkF0KHBvb2xQYXRoIHN0cmluZywgaW5kZXggdWludDE2KSAoT2JzZXJ2YXRpb24sIGVycm9yKSB7CglvYnNlcnZhdGlvbiwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0T2JzZXJ2YXRpb25BdChwb29sUGF0aCwgaW5kZXgpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gT2JzZXJ2YXRpb257fSwgZXJyCgl9CgoJcmV0dXJuIG9ic2VydmF0aW9uLCBuaWwKfQoKLy8gT2JzZXJ2ZSByZXR1cm5zIHRoZSB0aWNrIGFuZCBzZWNvbmRzLXBlci1saXF1aWRpdHkgY3VtdWxhdGl2ZXMgZm9yIGVhY2gKLy8gcmVxdWVzdGVkIGxvb2tiYWNrLCBtYXRjaGluZyBVbmlzd2FwIFYzJ3Mgb2JzZXJ2ZSh1aW50MzJbXSBzZWNvbmRzQWdvcykuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCB3aG9zZSBvcmFjbGUgaGlzdG9yeSBpcyBxdWVyaWVkLgovLyAgIC0gc2Vjb25kc0Fnb3M6IExvb2tiYWNrIGludGVydmFscyBpbiBzZWNvbmRzOyBvbmUgY3VtdWxhdGl2ZSBwYWlyIGlzIHJldHVybmVkCi8vICAgICBmb3IgZWFjaCB2YWx1ZSwgaW4gdGhlIHNhbWUgb3JkZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBbXWludDY0OiBUaWNrIGN1bXVsYXRpdmUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCByZXF1ZXN0ZWQgbG9va2JhY2suCi8vICAgLSBbXXN0cmluZzogU2Vjb25kcy1wZXItbGlxdWlkaXR5IGN1bXVsYXRpdmUgWDEyOCB2YWx1ZXMsIHNlcmlhbGl6ZWQgYXMKLy8gICAgIGJhc2UtMTAgc3RyaW5ncywgY29ycmVzcG9uZGluZyB0byBlYWNoIGxvb2tiYWNrLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sIG9yIG9ic2VydmF0aW9uIGRhdGEgY2Fubm90IGJlIHJlYWQuCmZ1bmMgT2JzZXJ2ZShwb29sUGF0aCBzdHJpbmcsIHNlY29uZHNBZ29zIFtddWludDMyKSAoW11pbnQ2NCwgW11zdHJpbmcsIGVycm9yKSB7Cgl0aWNrQ3VtdWxhdGl2ZXMsIHNlY29uZHNQZXJMaXF1aWRpdHlDdW11bGF0aXZlWDEyOHMsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLk9ic2VydmUoCgkJcG9vbFBhdGgsCgkJY2xvbmVVaW50MzJTbGljZShzZWNvbmRzQWdvcyksCgkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBuaWwsIGVycgoJfQoKCXJldHVybiBjbG9uZUludDY0U2xpY2UodGlja0N1bXVsYXRpdmVzKSwgY2xvbmVTdHJpbmdTbGljZShzZWNvbmRzUGVyTGlxdWlkaXR5Q3VtdWxhdGl2ZVgxMjhzKSwgbmlsCn0KCi8vIFNuYXBzaG90Q3VtdWxhdGl2ZXNJbnNpZGUgcmV0dXJucyB0aGUgdGljaywgc2Vjb25kcy1wZXItbGlxdWlkaXR5LCBhbmQKLy8gc2Vjb25kcyBjdW11bGF0aXZlcyBhY2NydWVkIHdoaWxlIHRoZSBwb29sIHByaWNlIHdhcyBpbnNpZGUKLy8gW3RpY2tMb3dlciwgdGlja1VwcGVyKS4gQm90aCBib3VuZGFyeSB0aWNrcyBtdXN0IGJlIGluaXRpYWxpemVkLgovLwovLyBTbmFwc2hvdHMgYXJlIG9ubHkgY29tcGFyYWJsZSBhY3Jvc3MgYW4gaW50ZXJ2YWwgZHVyaW5nIHdoaWNoIGEgcG9zaXRpb24gaW4KLy8gdGhlIHJhbmdlIGV4aXN0ZWQsIG1hdGNoaW5nIFVuaXN3YXAgVjMncyBzbmFwc2hvdEN1bXVsYXRpdmVzSW5zaWRlLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggd2hvc2Ugb3JhY2xlIHNuYXBzaG90IGlzIHF1ZXJpZWQuCi8vICAgLSB0aWNrTG93ZXI6IExvd2VyIGluY2x1c2l2ZSB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbiByYW5nZS4KLy8gICAtIHRpY2tVcHBlcjogVXBwZXIgZXhjbHVzaXZlIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uIHJhbmdlOyBib3RoCi8vICAgICBib3VuZGFyeSB0aWNrcyBtdXN0IGJlIGluaXRpYWxpemVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IFRpY2sgY3VtdWxhdGl2ZSBhY2NydWVkIHdoaWxlIHRoZSBwcmljZSB3YXMgaW5zaWRlIHRoZSByYW5nZS4KLy8gICAtIHN0cmluZzogU2Vjb25kcy1wZXItbGlxdWlkaXR5LWluc2lkZSBYMTI4IGFjY3VtdWxhdG9yLCBzZXJpYWxpemVkIGFzIGEKLy8gICAgIGJhc2UtMTAgc3RyaW5nLgovLyAgIC0gdWludDMyOiBTZWNvbmRzIGFjY3J1ZWQgd2hpbGUgdGhlIHByaWNlIHdhcyBpbnNpZGUgdGhlIHJhbmdlLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgcG9vbCwgb2JzZXJ2YXRpb25zLCBvciBpbml0aWFsaXplZCBib3VuZGFyaWVzIGFyZQovLyAgICAgdW5hdmFpbGFibGUuCmZ1bmMgU25hcHNob3RDdW11bGF0aXZlc0luc2lkZSgKCXBvb2xQYXRoIHN0cmluZywKCXRpY2tMb3dlciBpbnQzMiwKCXRpY2tVcHBlciBpbnQzMiwKKSAoaW50NjQsIHN0cmluZywgdWludDMyLCBlcnJvcikgewoJdGlja0N1bXVsYXRpdmVJbnNpZGUsIHNlY29uZHNQZXJMaXF1aWRpdHlJbnNpZGVYMTI4LCBzZWNvbmRzSW5zaWRlLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5TbmFwc2hvdEN1bXVsYXRpdmVzSW5zaWRlKAoJCXBvb2xQYXRoLAoJCXRpY2tMb3dlciwKCQl0aWNrVXBwZXIsCgkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgIiIsIDAsIGVycgoJfQoKCXJldHVybiB0aWNrQ3VtdWxhdGl2ZUluc2lkZSwgc2Vjb25kc1BlckxpcXVpZGl0eUluc2lkZVgxMjguVG9TdHJpbmcoKSwgc2Vjb25kc0luc2lkZSwgbmlsCn0KCi8vIEdldFRpY2tDdW11bGF0aXZlT3V0c2lkZSByZXR1cm5zIHRoZSB0aWNrIGN1bXVsYXRpdmUgdmFsdWUgb3V0c2lkZSBhIHRpY2suCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSB0aWNrLgovLyAgIC0gdGljazogVGljayBpbmRleCB3aG9zZSBvdXRzaWRlIHRpY2sgY3VtdWxhdGl2ZSBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogVGljayBjdW11bGF0aXZlIHJlY29yZGVkIG91dHNpZGUgdGljay4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgdGljayBpcyBub3QgZm91bmQuCmZ1bmMgR2V0VGlja0N1bXVsYXRpdmVPdXRzaWRlKHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0VGlja0N1bXVsYXRpdmVPdXRzaWRlKHBvb2xQYXRoLCB0aWNrKQp9CgovLyBHZXRUaWNrRmVlR3Jvd3RoT3V0c2lkZTBYMTI4IHJldHVybnMgZmVlIGdyb3d0aCBvdXRzaWRlIGZvciB0b2tlbjAgYXQgYSB0aWNrLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgdGljay4KLy8gICAtIHRpY2s6IFRpY2sgaW5kZXggd2hvc2Ugb3V0c2lkZSBmZWUgZ3Jvd3RoIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogVG9rZW4wIGZlZSBncm93dGggb3V0c2lkZSB0aWNrLCBzZXJpYWxpemVkIGFzIGEgYmFzZS0xMCBYMTI4Ci8vICAgICBhY2N1bXVsYXRvci4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgdGljayBpcyBub3QgZm91bmQuCmZ1bmMgR2V0VGlja0ZlZUdyb3d0aE91dHNpZGUwWDEyOChwb29sUGF0aCBzdHJpbmcsIHRpY2sgaW50MzIpIChzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRUaWNrRmVlR3Jvd3RoT3V0c2lkZTBYMTI4KHBvb2xQYXRoLCB0aWNrKQp9CgovLyBHZXRUaWNrRmVlR3Jvd3RoT3V0c2lkZTFYMTI4IHJldHVybnMgZmVlIGdyb3d0aCBvdXRzaWRlIGZvciB0b2tlbjEgYXQgYSB0aWNrLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgdGljay4KLy8gICAtIHRpY2s6IFRpY2sgaW5kZXggd2hvc2Ugb3V0c2lkZSBmZWUgZ3Jvd3RoIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogVG9rZW4xIGZlZSBncm93dGggb3V0c2lkZSB0aWNrLCBzZXJpYWxpemVkIGFzIGEgYmFzZS0xMCBYMTI4Ci8vICAgICBhY2N1bXVsYXRvci4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgdGljayBpcyBub3QgZm91bmQuCmZ1bmMgR2V0VGlja0ZlZUdyb3d0aE91dHNpZGUxWDEyOChwb29sUGF0aCBzdHJpbmcsIHRpY2sgaW50MzIpIChzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRUaWNrRmVlR3Jvd3RoT3V0c2lkZTFYMTI4KHBvb2xQYXRoLCB0aWNrKQp9CgovLyBHZXRUaWNrRmVlR3Jvd3RoT3V0c2lkZVgxMjggcmV0dXJucyBmZWUgZ3Jvd3RoIG91dHNpZGUgZm9yIGJvdGggdG9rZW5zIGF0IGEgdGljay4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHRpY2suCi8vICAgLSB0aWNrOiBUaWNrIGluZGV4IHdob3NlIG91dHNpZGUgZmVlIGdyb3d0aCBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFRva2VuMCBmZWUgZ3Jvd3RoIG91dHNpZGUgdGljaywgc2VyaWFsaXplZCBhcyBhIGJhc2UtMTAgWDEyOAovLyAgICAgYWNjdW11bGF0b3IuCi8vICAgLSBzdHJpbmc6IFRva2VuMSBmZWUgZ3Jvd3RoIG91dHNpZGUgdGljaywgc2VyaWFsaXplZCBhcyBhIGJhc2UtMTAgWDEyOAovLyAgICAgYWNjdW11bGF0b3IuCi8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHRoZSBwb29sIG9yIHRpY2sgaXMgbm90IGZvdW5kLgpmdW5jIEdldFRpY2tGZWVHcm93dGhPdXRzaWRlWDEyOChwb29sUGF0aCBzdHJpbmcsIHRpY2sgaW50MzIpIChzdHJpbmcsIHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFRpY2tGZWVHcm93dGhPdXRzaWRlWDEyOChwb29sUGF0aCwgdGljaykKfQoKLy8gR2V0VGlja0luaXRpYWxpemVkIHJldHVybnMgd2hldGhlciBhIHRpY2sgaXMgaW5pdGlhbGl6ZWQuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSB0aWNrLgovLyAgIC0gdGljazogVGljayBpbmRleCB3aG9zZSBpbml0aWFsaXphdGlvbiBmbGFnIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGJvb2w6IFRydWUgd2hlbiB0aGUgdGljayBoYXMgaW5pdGlhbGl6ZWQgbGlxdWlkaXR5IGFuZCBvdXRzaWRlIGFjY3VtdWxhdG9ycy4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgdGljayBpcyBub3QgZm91bmQuCmZ1bmMgR2V0VGlja0luaXRpYWxpemVkKHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKGJvb2wsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRUaWNrSW5pdGlhbGl6ZWQocG9vbFBhdGgsIHRpY2spCn0KCi8vIEdldEluaXRpYWxpemVkVGlja3NJblJhbmdlIHJldHVybnMgaW5pdGlhbGl6ZWQgdGlja3Mgd2l0aGluIHRoZSBnaXZlbiByYW5nZS4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIHdob3NlIHRpY2tzIGFyZSBlbnVtZXJhdGVkLgovLyAgIC0gdGlja0xvd2VyOiBMb3dlciBpbmNsdXNpdmUgdGljayBib3VuZCBmb3IgZW51bWVyYXRpb24uCi8vICAgLSB0aWNrVXBwZXI6IFVwcGVyIGJvdW5kIGZvciBlbnVtZXJhdGlvbjsgdGlja3MgYXJlIHNlbGVjdGVkIHRocm91Z2ggdGhlCi8vICAgICBwb29sJ3MgcmFuZ2UgaXRlcmF0b3IuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBbXWludDMyOiBUaWNrIGluZGljZXMgdGhhdCBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlcXVlc3RlZCByYW5nZS4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYW4gZXhpc3RpbmcgcG9vbC4KZnVuYyBHZXRJbml0aWFsaXplZFRpY2tzSW5SYW5nZShwb29sUGF0aCBzdHJpbmcsIHRpY2tMb3dlciwgdGlja1VwcGVyIGludDMyKSAoW11pbnQzMiwgZXJyb3IpIHsKCXRpY2tzLCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRJbml0aWFsaXplZFRpY2tzSW5SYW5nZShwb29sUGF0aCwgdGlja0xvd2VyLCB0aWNrVXBwZXIpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCXJldHVybiBjbG9uZUludDMyU2xpY2UodGlja3MpLCBuaWwKfQoKLy8gR2V0VGlja0xpcXVpZGl0eUdyb3NzIHJldHVybnMgdGhlIHRvdGFsIGxpcXVpZGl0eSB0aGF0IHJlZmVyZW5jZXMgYSB0aWNrLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwb29sIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgdGljay4KLy8gICAtIHRpY2s6IFRpY2sgaW5kZXggd2hvc2UgZ3Jvc3MgbGlxdWlkaXR5IGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogR3Jvc3MgbGlxdWlkaXR5IHJlZmVyZW5jaW5nIHRoZSB0aWNrLCBzZXJpYWxpemVkIGFzIGEgYmFzZS0xMAovLyAgICAgdW5zaWduZWQgaW50ZWdlci4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgdGljayBpcyBub3QgZm91bmQuCmZ1bmMgR2V0VGlja0xpcXVpZGl0eUdyb3NzKHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFRpY2tMaXF1aWRpdHlHcm9zcyhwb29sUGF0aCwgdGljaykKfQoKLy8gR2V0VGlja0xpcXVpZGl0eU5ldCByZXR1cm5zIHRoZSBuZXQgbGlxdWlkaXR5IGNoYW5nZSBhdCBhIHRpY2suCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSB0aWNrLgovLyAgIC0gdGljazogVGljayBpbmRleCB3aG9zZSBuZXQgbGlxdWlkaXR5IGNoYW5nZSBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IFNpZ25lZCBuZXQgbGlxdWlkaXR5IGNoYW5nZSBhdCB0aGUgdGljaywgc2VyaWFsaXplZCBhcyBhIGJhc2UtMTAKLy8gICAgIGludGVnZXIuCi8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHRoZSBwb29sIG9yIHRpY2sgaXMgbm90IGZvdW5kLgpmdW5jIEdldFRpY2tMaXF1aWRpdHlOZXQocG9vbFBhdGggc3RyaW5nLCB0aWNrIGludDMyKSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0VGlja0xpcXVpZGl0eU5ldChwb29sUGF0aCwgdGljaykKfQoKLy8gR2V0VGlja1NlY29uZHNPdXRzaWRlIHJldHVybnMgc2Vjb25kcyBzcGVudCBvdXRzaWRlIGEgdGljay4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHRpY2suCi8vICAgLSB0aWNrOiBUaWNrIGluZGV4IHdob3NlIG91dHNpZGUgdGltZSBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1aW50MzI6IFNlY29uZHMgYWNjdW11bGF0ZWQgb3V0c2lkZSB0aGUgdGljay4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgdGljayBpcyBub3QgZm91bmQuCmZ1bmMgR2V0VGlja1NlY29uZHNPdXRzaWRlKHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKHVpbnQzMiwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFRpY2tTZWNvbmRzT3V0c2lkZShwb29sUGF0aCwgdGljaykKfQoKLy8gR2V0VGlja1NlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyOCByZXR1cm5zIHNlY29uZHMgcGVyIGxpcXVpZGl0eSBvdXRzaWRlIGEgdGljay4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHRpY2suCi8vICAgLSB0aWNrOiBUaWNrIGluZGV4IHdob3NlIG91dHNpZGUgYWNjdW11bGF0b3IgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBTZWNvbmRzLXBlci1saXF1aWRpdHkgb3V0c2lkZSB0aWNrIGluIFgxMjggcHJlY2lzaW9uLCBzZXJpYWxpemVkCi8vICAgICBhcyBhIGJhc2UtMTAgdW5zaWduZWQgaW50ZWdlci4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgdGljayBpcyBub3QgZm91bmQuCmZ1bmMgR2V0VGlja1NlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyOChwb29sUGF0aCBzdHJpbmcsIHRpY2sgaW50MzIpIChzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRUaWNrU2Vjb25kc1BlckxpcXVpZGl0eU91dHNpZGVYMTI4KHBvb2xQYXRoLCB0aWNrKQp9CgovLyBHZXRUaWNrU3BhY2luZyByZXR1cm5zIHRoZSB0aWNrIHNwYWNpbmcgb2YgdGhlIHBvb2wuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSBzcGFjaW5nIGlzIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQzMjogVGljayBzcGFjaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9vbCdzIGZlZSB0aWVyLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhbiBleGlzdGluZyBwb29sLgpmdW5jIEdldFRpY2tTcGFjaW5nKHBvb2xQYXRoIHN0cmluZykgKGludDMyLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0VGlja1NwYWNpbmcocG9vbFBhdGgpCn0KCi8vIEdldFRva2VuMFBhdGggcmV0dXJucyB0aGUgcGF0aCBvZiB0b2tlbjAgaW4gdGhlIHBvb2wuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB0byBxdWVyeS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogQ2Fub25pY2FsIHRva2VuMCBjb250cmFjdCBwYXRoIHN0b3JlZCBieSB0aGUgcG9vbC4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYW4gZXhpc3RpbmcgcG9vbC4KZnVuYyBHZXRUb2tlbjBQYXRoKHBvb2xQYXRoIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFRva2VuMFBhdGgocG9vbFBhdGgpCn0KCi8vIEdldFRva2VuMVBhdGggcmV0dXJucyB0aGUgcGF0aCBvZiB0b2tlbjEgaW4gdGhlIHBvb2wuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB0byBxdWVyeS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogQ2Fub25pY2FsIHRva2VuMSBjb250cmFjdCBwYXRoIHN0b3JlZCBieSB0aGUgcG9vbC4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYW4gZXhpc3RpbmcgcG9vbC4KZnVuYyBHZXRUb2tlbjFQYXRoKHBvb2xQYXRoIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFRva2VuMVBhdGgocG9vbFBhdGgpCn0KCi8vIEdldFdpdGhkcmF3YWxGZWUgcmV0dXJucyB0aGUgY3VycmVudCB3aXRoZHJhd2FsIGZlZSByYXRlLgovLyBSZXR1cm5zOgovLyAgIC0gdWludDY0OiBXaXRoZHJhd2FsIGZlZSByYXRlIGluIGJhc2lzIHBvaW50czsgemVybyBtZWFucyBubyB3aXRoZHJhd2FsCi8vICAgICBmZWUgaXMgY2hhcmdlZC4KZnVuYyBHZXRXaXRoZHJhd2FsRmVlKCkgdWludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFdpdGhkcmF3YWxGZWUoKQp9CgovLyBPcmFjbGVDb25zdWx0IHJldHVybnMgdGhlIGFyaXRobWV0aWMgbWVhbiB0aWNrIGFuZCBoYXJtb25pYyBtZWFuIGxpcXVpZGl0eQovLyBvdmVyIGEgbG9va2JhY2ssIGZvbGxvd2luZyBVbmlzd2FwIFYzIE9yYWNsZUxpYnJhcnkncyBjb25zdWx0IGNvbnZlbnRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCB3aG9zZSBvcmFjbGUgZGF0YSBpcyBxdWVyaWVkLgovLyAgIC0gc2Vjb25kc0FnbzogTG9va2JhY2sgZHVyYXRpb24gaW4gc2Vjb25kcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHRpbWUtd2VpZ2h0ZWQKLy8gICAgIHZhbHVlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDMyOiBBcml0aG1ldGljIG1lYW4gdGljayBvdmVyIHRoZSByZXF1ZXN0ZWQgbG9va2JhY2suCi8vICAgLSBzdHJpbmc6IEhhcm1vbmljIG1lYW4gbGlxdWlkaXR5IG92ZXIgdGhlIGxvb2tiYWNrLCBzZXJpYWxpemVkIGFzIGEgYmFzZS0xMAovLyAgICAgdW5zaWduZWQgaW50ZWdlci4KLy8gICAtIGVycm9yOiBOb24tbmlsIHdoZW4gdGhlIHBvb2wgb3IgcmVxdWlyZWQgb2JzZXJ2YXRpb24gaGlzdG9yeSBpcyB1bmF2YWlsYWJsZS4KZnVuYyBPcmFjbGVDb25zdWx0KHBvb2xQYXRoIHN0cmluZywgc2Vjb25kc0FnbyB1aW50MzIpIChpbnQzMiwgc3RyaW5nLCBlcnJvcikgewoJdGljaywgbGlxdWlkaXR5LCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5PcmFjbGVDb25zdWx0KHBvb2xQYXRoLCBzZWNvbmRzQWdvKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsICIiLCBlcnIKCX0KCXJldHVybiB0aWNrLCBsaXF1aWRpdHkuVG9TdHJpbmcoKSwgbmlsCn0KCi8vIFN0cnVjdHVyZSBnZXR0ZXJzCgovLyBHZXRUaWNrSW5mbyByZXR1cm5zIHRoZSB0aWNrIGluZm8gZm9yIGEgZ2l2ZW4gdGljay4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHRpY2suCi8vICAgLSB0aWNrOiBUaWNrIGluZGV4IHdob3NlIGNvbXBsZXRlIHN0YXRlIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFRpY2tJbmZvOiBTYWZlIGNvcHkgb2YgdGhlIHJlcXVlc3RlZCB0aWNrJ3MgbGlxdWlkaXR5IGFuZCBvcmFjbGUvZmVlCi8vICAgICBhY2N1bXVsYXRvciBmaWVsZHMuCi8vICAgLSBlcnJvcjogTm9uLW5pbCB3aGVuIHRoZSBwb29sIG9yIHRpY2sgaXMgbm90IGZvdW5kLgpmdW5jIEdldFRpY2tJbmZvKHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKFRpY2tJbmZvLCBlcnJvcikgewoJdGlja0luZm8sIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFRpY2tJbmZvKHBvb2xQYXRoLCB0aWNrKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIFRpY2tJbmZve30sIGVycgoJfQoKCXJldHVybiB0aWNrSW5mby5DbG9uZSgpLCBuaWwKfQoKLy8gR2V0VGlja0JpdG1hcHMgcmV0dXJucyB0aGUgdGljayBiaXRtYXAgZm9yIGEgZ2l2ZW4gd29yZCBwb3NpdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcG9vbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIGJpdG1hcC4KLy8gICAtIHdvcmRQb3M6IFNpZ25lZCBiaXRtYXAgd29yZCBwb3NpdGlvbiB0byByZWFkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBCaXRtYXAgd29yZCBzZXJpYWxpemVkIGFzIGEgYmFzZS0xMCB1bnNpZ25lZCBpbnRlZ2VyLgovLyAgIC0gZXJyb3I6IE5vbi1uaWwgd2hlbiB0aGUgcG9vbCBvciBiaXRtYXAgd29yZCBpcyBub3QgZm91bmQuCmZ1bmMgR2V0VGlja0JpdG1hcHMocG9vbFBhdGggc3RyaW5nLCB3b3JkUG9zIGludDE2KSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0VGlja0JpdG1hcHMocG9vbFBhdGgsIHdvcmRQb3MpCn0KCi8vIEdldFBlbmRpbmdQcm90b2NvbEZlZXMgcmV0dXJucyB0aGUgcGVuZGluZyBwcm90b2NvbCBmZWUgYW1vdW50IHBlciB0b2tlbiBwYXRoLgovLyBSZXR1cm5zOgovLyAgIC0gbWFwW3N0cmluZ11pbnQ2NDogQ29weSBvZiBwZW5kaW5nIHByb3RvY29sIGZlZXMga2V5ZWQgYnkgdG9rZW4gY29udHJhY3QgcGF0aCwKLy8gICAgIHdpdGggYW1vdW50cyBpbiB0b2tlbiBiYXNlIHVuaXRzLgpmdW5jIEdldFBlbmRpbmdQcm90b2NvbEZlZXMoKSBtYXBbc3RyaW5nXWludDY0IHsKCXJldHVybiBjbG9uZVN0cmluZ0ludDY0TWFwKGdldEltcGxlbWVudGF0aW9uKCkuR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpKQp9Chr0CwoQZ2V0dGVyX3V0aWxzLmdubxLfC3BhY2thZ2UgcG9vbAoKZnVuYyBjbG9uZUludDMyU2xpY2Uoc3JjIFtdaW50MzIpIFtdaW50MzIgewoJaWYgc3JjID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoKCWNsb25lZCA6PSBtYWtlKFtdaW50MzIsIGxlbihzcmMpKQoJY29weShjbG9uZWQsIHNyYykKCXJldHVybiBjbG9uZWQKfQoKZnVuYyBjbG9uZUludDY0U2xpY2Uoc3JjIFtdaW50NjQpIFtdaW50NjQgewoJaWYgc3JjID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoKCWNsb25lZCA6PSBtYWtlKFtdaW50NjQsIGxlbihzcmMpKQoJY29weShjbG9uZWQsIHNyYykKCXJldHVybiBjbG9uZWQKfQoKZnVuYyBjbG9uZVN0cmluZ1NsaWNlKHNyYyBbXXN0cmluZykgW11zdHJpbmcgewoJaWYgc3JjID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoKCWNsb25lZCA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oc3JjKSkKCWNvcHkoY2xvbmVkLCBzcmMpCglyZXR1cm4gY2xvbmVkCn0KCmZ1bmMgY2xvbmVVaW50MzJTbGljZShzcmMgW111aW50MzIpIFtddWludDMyIHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCgljbG9uZWQgOj0gbWFrZShbXXVpbnQzMiwgbGVuKHNyYykpCgljb3B5KGNsb25lZCwgc3JjKQoJcmV0dXJuIGNsb25lZAp9CgpmdW5jIGNsb25lRmVlQW1vdW50VGlja1NwYWNpbmdzKHNyYyBtYXBbdWludDMyXWludDMyKSBtYXBbdWludDMyXWludDMyIHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCgljbG9uZWQgOj0gbWFrZShtYXBbdWludDMyXWludDMyLCBsZW4oc3JjKSkKCWZvciBmZWUsIHNwYWNpbmcgOj0gcmFuZ2Ugc3JjIHsKCQljbG9uZWRbZmVlXSA9IHNwYWNpbmcKCX0KCglyZXR1cm4gY2xvbmVkCn0KCmZ1bmMgY2xvbmVTdHJpbmdJbnQ2NE1hcChzcmMgbWFwW3N0cmluZ11pbnQ2NCkgbWFwW3N0cmluZ11pbnQ2NCB7CglpZiBzcmMgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJY2xvbmVkIDo9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCwgbGVuKHNyYykpCglmb3IgaywgdiA6PSByYW5nZSBzcmMgewoJCWNsb25lZFtrXSA9IHYKCX0KCglyZXR1cm4gY2xvbmVkCn0KCi8vIE5ld0RlZmF1bHRQb3NpdGlvbkluZm8gcmV0dXJucyB0aGUgemVyby1hY2NvdW50aW5nIHBvc2l0aW9uIHN0YXRlIHVzZWQgZm9yIGEgbmV3IHBvb2wgcG9zaXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbmZvOiBQb3NpdGlvbiBpbmZvIHdpdGggemVybyBsaXF1aWRpdHksIHplcm8gZmVlLWdyb3d0aCBjaGVja3BvaW50cywgYW5kIG5vIHRva2VucyBvd2VkLgpmdW5jIE5ld0RlZmF1bHRQb3NpdGlvbkluZm8oKSBQb3NpdGlvbkluZm8gewoJcmV0dXJuIFBvc2l0aW9uSW5mb3sKCQlsaXF1aWRpdHk6ICAgICAgICAgICAgICAgICIwIiwKCQlmZWVHcm93dGhJbnNpZGUwTGFzdFgxMjg6ICIwIiwKCQlmZWVHcm93dGhJbnNpZGUxTGFzdFgxMjg6ICIwIiwKCQl0b2tlbnNPd2VkMDogICAgICAgICAgICAgIDAsCgkJdG9rZW5zT3dlZDE6ICAgICAgICAgICAgICAwLAoJfQp9Cho+Cgtnbm9tb2QudG9tbBIvbW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9wb29sIgpnbm8gPSAiMC45Igoa4SsKCm9yYWNsZS5nbm8S0itwYWNrYWdlIHBvb2wKCmltcG9ydCAoCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3V0aWxzL3YxIgoJImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgopCgp0eXBlIE9ic2VydmF0aW9uIHN0cnVjdCB7CglibG9ja1RpbWVzdGFtcCAgICAgICAgICAgICAgICAgICAgaW50NjQgIC8vIHRpbWVzdGFtcCBvZiB0aGUgb2JzZXJ2YXRpb24KCXRpY2tDdW11bGF0aXZlICAgICAgICAgICAgICAgICAgICBpbnQ2NCAgLy8gY3VtdWxhdGl2ZSB0aWNrIHVwIHRvIHRoaXMgdGltZXN0YW1wCglzZWNvbmRzUGVyTGlxdWlkaXR5Q3VtdWxhdGl2ZVgxMjggc3RyaW5nIC8vIGN1bXVsYXRpdmUgc2Vjb25kcyBwZXIgbGlxdWlkaXR5Cglpbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgIC8vIHdoZXRoZXIgdGhpcyBvYnNlcnZhdGlvbiBoYXMgYmVlbiBpbml0aWFsaXplZAp9CgovLyBPYnNlcnZhdGlvbiBnZXR0ZXIgbWV0aG9kcy4KLy8gQmxvY2tUaW1lc3RhbXAgcmV0dXJucyB0aGUgb2JzZXJ2YXRpb24ncyBibG9jayB0aW1lc3RhbXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBibG9ja1RpbWVzdGFtcDogVGltZXN0YW1wIGF0IHdoaWNoIHRoaXMgb2JzZXJ2YXRpb24gd2FzIHJlY29yZGVkLgpmdW5jIChvIE9ic2VydmF0aW9uKSBCbG9ja1RpbWVzdGFtcCgpIGludDY0IHsgcmV0dXJuIG8uYmxvY2tUaW1lc3RhbXAgfQoKLy8gVGlja0N1bXVsYXRpdmUgcmV0dXJucyB0aGUgc2lnbmVkIGN1bXVsYXRpdmUgdGljayByZWNvcmRlZCBieSB0aGUgb2JzZXJ2YXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWNrQ3VtdWxhdGl2ZTogQ3VtdWxhdGl2ZSB0aWNrIHZhbHVlIHRocm91Z2ggdGhlIG9ic2VydmF0aW9uIHRpbWVzdGFtcC4KZnVuYyAobyBPYnNlcnZhdGlvbikgVGlja0N1bXVsYXRpdmUoKSBpbnQ2NCB7IHJldHVybiBvLnRpY2tDdW11bGF0aXZlIH0KCi8vIFNlY29uZHNQZXJMaXF1aWRpdHlDdW11bGF0aXZlWDEyOCByZXR1cm5zIHRoZSBRMTI4LWVuY29kZWQgY3VtdWxhdGl2ZQovLyBzZWNvbmRzLXBlci1saXF1aWRpdHkgdmFsdWUgcmVjb3JkZWQgYnkgdGhlIG9ic2VydmF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc2Vjb25kc1BlckxpcXVpZGl0eUN1bXVsYXRpdmVYMTI4OiBEZWNpbWFsIHN0cmluZyBjb250YWluaW5nIHRoZSBjdW11bGF0aXZlIHZhbHVlIHNjYWxlZCBieSAyXjEyOC4KZnVuYyAobyBPYnNlcnZhdGlvbikgU2Vjb25kc1BlckxpcXVpZGl0eUN1bXVsYXRpdmVYMTI4KCkgc3RyaW5nIHsKCXJldHVybiBvLnNlY29uZHNQZXJMaXF1aWRpdHlDdW11bGF0aXZlWDEyOAp9CgovLyBJbml0aWFsaXplZCByZXBvcnRzIHdoZXRoZXIgdGhlIG9ic2VydmF0aW9uIGNvbnRhaW5zIGluaXRpYWxpemVkIG9yYWNsZSBkYXRhLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5pdGlhbGl6ZWQ6IFRydWUgd2hlbiB0aGUgb2JzZXJ2YXRpb24gc2xvdCBoYXMgYmVlbiBpbml0aWFsaXplZDsgZmFsc2UgZm9yIGFuIGVtcHR5IHNsb3QuCmZ1bmMgKG8gT2JzZXJ2YXRpb24pIEluaXRpYWxpemVkKCkgYm9vbCB7IHJldHVybiBvLmluaXRpYWxpemVkIH0KCi8vIE1ha2VPYnNlcnZhdGlvbiBjb25zdHJ1Y3RzIGFuIG9ic2VydmF0aW9uIGZyb20gaXRzIHN0b3JlZCBvcmFjbGUgYWNjdW11bGF0b3JzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYmxvY2tUaW1lc3RhbXA6IFRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIG9ic2VydmF0aW9uLgovLyAgIC0gdGlja0N1bXVsYXRpdmU6IFNpZ25lZCBjdW11bGF0aXZlIHRpY2sgYXQgYmxvY2tUaW1lc3RhbXAuCi8vICAgLSBzZWNvbmRzUGVyTGlxdWlkaXR5Q3VtdWxhdGl2ZVgxMjg6IERlY2ltYWwgUTEyOC1zY2FsZWQgY3VtdWxhdGl2ZSBzZWNvbmRzLXBlci1saXF1aWRpdHkgdmFsdWUuCi8vICAgLSBpbml0aWFsaXplZDogV2hldGhlciB0aGlzIG9ic2VydmF0aW9uIHNsb3QgaXMgaW5pdGlhbGl6ZWQgYW5kIHVzYWJsZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG9ic2VydmF0aW9uOiBPYnNlcnZhdGlvbiBjb250YWluaW5nIHRoZSBzdXBwbGllZCB0aW1lc3RhbXAsIGFjY3VtdWxhdG9ycywgYW5kIGluaXRpYWxpemF0aW9uIGZsYWcuCmZ1bmMgTWFrZU9ic2VydmF0aW9uKAoJYmxvY2tUaW1lc3RhbXAgaW50NjQsCgl0aWNrQ3VtdWxhdGl2ZSBpbnQ2NCwKCXNlY29uZHNQZXJMaXF1aWRpdHlDdW11bGF0aXZlWDEyOCBzdHJpbmcsCglpbml0aWFsaXplZCBib29sLAopIE9ic2VydmF0aW9uIHsKCXJldHVybiBPYnNlcnZhdGlvbnsKCQlibG9ja1RpbWVzdGFtcDogICAgICAgICAgICAgICAgICAgIGJsb2NrVGltZXN0YW1wLAoJCXRpY2tDdW11bGF0aXZlOiAgICAgICAgICAgICAgICAgICAgdGlja0N1bXVsYXRpdmUsCgkJc2Vjb25kc1BlckxpcXVpZGl0eUN1bXVsYXRpdmVYMTI4OiBzZWNvbmRzUGVyTGlxdWlkaXR5Q3VtdWxhdGl2ZVgxMjgsCgkJaW5pdGlhbGl6ZWQ6ICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCwKCX0KfQoKLy8gRGVmYXVsdE9ic2VydmF0aW9uIHJldHVybnMgdGhlIHplcm8sIHVuaW5pdGlhbGl6ZWQgb2JzZXJ2YXRpb24gdXNlZCBmb3IgYW4gZW1wdHkgc2xvdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG9ic2VydmF0aW9uOiBPYnNlcnZhdGlvbiB3aXRoIHplcm8gdGltZXN0YW1wIGFuZCBhY2N1bXVsYXRvcnMgYW5kIEluaXRpYWxpemVkIGZhbHNlLgpmdW5jIERlZmF1bHRPYnNlcnZhdGlvbigpIE9ic2VydmF0aW9uIHsKCXJldHVybiBNYWtlT2JzZXJ2YXRpb24oCgkJMCwKCQkwLAoJCSIwIiwKCQlmYWxzZSwKCSkKfQoKLy8gT2JzZXJ2YXRpb25UcmVlIGlzIGEgcG9vbC1sb2NhbCBvcmFjbGUgcmluZyBidWZmZXIga2V5ZWQgYnkgaW5kZXguCi8vIEl0IG93bnMgdGhlIEIrdHJlZSBrZXkgZW5jb2Rpbmcgc28gb3JhY2xlIGNvZGUgd29ya3Mgd2l0aCB1aW50MTYgaW5kaWNlcy4KdHlwZSBPYnNlcnZhdGlvblRyZWUgc3RydWN0IHsKCXRyZWUgKmJwdHJlZS5CUFRyZWUKfQoKLy8gTmV3T2JzZXJ2YXRpb25UcmVlIGNyZWF0ZXMgYW4gZW1wdHkgcG9vbC1sb2NhbCBvYnNlcnZhdGlvbiB0cmVlIGtleWVkIGJ5IHVpbnQxNiBpbmRleC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IEluaXRpYWxpemVkIG9ic2VydmF0aW9uIHRyZWUgcmVhZHkgZm9yIEdldCwgU2V0LCBhbmQgSGFzIG9wZXJhdGlvbnMuCmZ1bmMgTmV3T2JzZXJ2YXRpb25UcmVlKCkgKk9ic2VydmF0aW9uVHJlZSB7CglyZXR1cm4gJk9ic2VydmF0aW9uVHJlZXt0cmVlOiBicHRyZWUuTmV3QlBUcmVlTigzMil9Cn0KCi8vIEdldCBsb29rcyB1cCBhbiBvYnNlcnZhdGlvbiBieSBpdHMgY2lyY3VsYXItYnVmZmVyIGluZGV4LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5kZXg6IHVpbnQxNiBvYnNlcnZhdGlvbiBzbG90IHRvIHJlYWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBvYnNlcnZhdGlvbjogU3RvcmVkIG9ic2VydmF0aW9uIHdoZW4gdGhlIHRyZWUgY29udGFpbnMgYSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZTsgb3RoZXJ3aXNlIHRoZSB6ZXJvIG9ic2VydmF0aW9uLgovLyAgIC0gb2s6IFRydWUgd2hlbiBhIHN0b3JlZCB2YWx1ZSB3YXMgZm91bmQgYW5kIGRlY29kZWQgYXMgYW4gT2JzZXJ2YXRpb247IGZhbHNlIGZvciBuaWwvdW5pbml0aWFsaXplZCB0cmVlcywgbWlzc2luZyBzbG90cywgb3IgYSB0eXBlIG1pc21hdGNoLgpmdW5jICh0ICpPYnNlcnZhdGlvblRyZWUpIEdldChpbmRleCB1aW50MTYpIChPYnNlcnZhdGlvbiwgYm9vbCkgewoJaWYgdCA9PSBuaWwgfHwgdC50cmVlID09IG5pbCB7CgkJcmV0dXJuIE9ic2VydmF0aW9ue30sIGZhbHNlCgl9Cgl2YWx1ZSA6PSB0LnRyZWUuR2V0KHV0aWxzLkVuY29kZVVpbnQxNihpbmRleCkpCglpZiB2YWx1ZSA9PSBuaWwgewoJCXJldHVybiBPYnNlcnZhdGlvbnt9LCBmYWxzZQoJfQoJb2JzZXJ2YXRpb24sIG9rIDo9IHZhbHVlLihPYnNlcnZhdGlvbikKCXJldHVybiBvYnNlcnZhdGlvbiwgb2sKfQoKLy8gU2V0IHN0b3JlcyBhbiBvYnNlcnZhdGlvbiBhdCBhIGNpcmN1bGFyLWJ1ZmZlciBpbmRleC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGluZGV4OiB1aW50MTYgb2JzZXJ2YXRpb24gc2xvdCB0byB3cml0ZS4KLy8gICAtIG9ic2VydmF0aW9uOiBPYnNlcnZhdGlvbiB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCBpbmRleC4KZnVuYyAodCAqT2JzZXJ2YXRpb25UcmVlKSBTZXQoaW5kZXggdWludDE2LCBvYnNlcnZhdGlvbiBPYnNlcnZhdGlvbikgewoJaWYgdCA9PSBuaWwgfHwgdC50cmVlID09IG5pbCB7CgkJcGFuaWMoIm9ic2VydmF0aW9uIHRyZWUgaXMgbm90IGluaXRpYWxpemVkIikKCX0KCXQudHJlZS5TZXQodXRpbHMuRW5jb2RlVWludDE2KGluZGV4KSwgb2JzZXJ2YXRpb24pCn0KCi8vIEhhcyByZXBvcnRzIHdoZXRoZXIgYW4gb2JzZXJ2YXRpb24gc2xvdCBleGlzdHMgaW4gdGhlIHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpbmRleDogdWludDE2IG9ic2VydmF0aW9uIHNsb3QgdG8gdGVzdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBpbml0aWFsaXplZCB0cmVlIGNvbnRhaW5zIGluZGV4OyBmYWxzZSBmb3IgbmlsL3VuaW5pdGlhbGl6ZWQgdHJlZXMgb3IgYW4gYWJzZW50IHNsb3QuCmZ1bmMgKHQgKk9ic2VydmF0aW9uVHJlZSkgSGFzKGluZGV4IHVpbnQxNikgYm9vbCB7CglpZiB0ID09IG5pbCB8fCB0LnRyZWUgPT0gbmlsIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiB0LnRyZWUuSGFzKHV0aWxzLkVuY29kZVVpbnQxNihpbmRleCkpCn0KCi8vIE5ld09ic2VydmF0aW9uc1RyZWUgY3JlYXRlcyB0aGUgdG9wLWxldmVsIEIrdHJlZSB0aGF0IGluZGV4ZXMgcG9vbCBvYnNlcnZhdGlvbiB0cmVlcyBieSBwb29sIHBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBFbXB0eSBCK3RyZWUgc3VpdGFibGUgZm9yIHN0b3JpbmcgcG9vbC1wYXRoIG9ic2VydmF0aW9uIHRyZWVzLgpmdW5jIE5ld09ic2VydmF0aW9uc1RyZWUoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXR1cm4gYnB0cmVlLk5ld0JQVHJlZU4oMzIpCn0KCi8vIE5ld1Bvb2xPYnNlcnZhdGlvbnNUcmVlIGNyZWF0ZXMgYSBjaXJjdWxhciBvYnNlcnZhdGlvbiBidWZmZXIgd2l0aCBzbG90IHplcm8gaW5pdGlhbGl6ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXJyZW50VGltZTogVGltZXN0YW1wIGFzc2lnbmVkIHRvIHRoZSBpbml0aWFsIG9ic2VydmF0aW9uIGF0IGluZGV4IHplcm8uCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBPYnNlcnZhdGlvbiB0cmVlIGNvbnRhaW5pbmcgYW4gaW5pdGlhbGl6ZWQgemVyby1pbmRleCBvYnNlcnZhdGlvbiB3aXRoIHplcm8gY3VtdWxhdGl2ZSB2YWx1ZXMuCmZ1bmMgTmV3UG9vbE9ic2VydmF0aW9uc1RyZWUoY3VycmVudFRpbWUgaW50NjQpICpPYnNlcnZhdGlvblRyZWUgewoJb2JzZXJ2YXRpb25zIDo9IE5ld09ic2VydmF0aW9uVHJlZSgpCglvYnNlcnZhdGlvbnMuU2V0KDAsIE1ha2VPYnNlcnZhdGlvbigKCQljdXJyZW50VGltZSwKCQkwLAoJCSIwIiwKCQl0cnVlLAoJKSkKCXJldHVybiBvYnNlcnZhdGlvbnMKfQoau4wCCghwb29sLmdubxKtjAJwYWNrYWdlIHBvb2wKCmltcG9ydCAoCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgopCgovLyBQb29sIGRlc2NyaWJlcyBhIHNpbmdsZSBwb29sJ3Mgc3RhdGUuCi8vIEEgcG9vbCBpcyBpZGVudGlmaWVkIHdpdGggYSB1bmlxdWUga2V5ICh0b2tlbjAsIHRva2VuMSwgZmVlKSwgd2hlcmUgdG9rZW4wIDwgdG9rZW4xLgp0eXBlIFBvb2wgc3RydWN0IHsKCS8vIHRva2VuMC90b2tlbjEgcGF0aCBvZiB0aGUgcG9vbAoJdG9rZW4wUGF0aCAgICAgICAgICAgc3RyaW5nCgl0b2tlbjFQYXRoICAgICAgICAgICBzdHJpbmcKCWZlZSAgICAgICAgICAgICAgICAgIHVpbnQzMiAvLyBmZWUgdGllciBvZiB0aGUgcG9vbAoJdGlja1NwYWNpbmcgICAgICAgICAgaW50MzIgIC8vIHNwYWNpbmcgYmV0d2VlbiB0aWNrcwoJc2xvdDAgICAgICAgICAgICAgICAgU2xvdDAKCWJhbGFuY2VzICAgICAgICAgICAgIFRva2VuUGFpciAvLyBiYWxhbmNlcyBvZiB0aGUgcG9vbAoJcHJvdG9jb2xGZWVzICAgICAgICAgVG9rZW5QYWlyCglmZWVHcm93dGhHbG9iYWwwWDEyOCAqdTI1Ni5VaW50ICAgICAgIC8vIHVpbnQyNTYKCWZlZUdyb3d0aEdsb2JhbDFYMTI4ICp1MjU2LlVpbnQgICAgICAgLy8gdWludDI1NgoJbGlxdWlkaXR5ICAgICAgICAgICAgKnUyNTYuVWludCAgICAgICAvLyB0b3RhbCBhbW91bnQgb2YgYWN0aXZlIGxpcXVpZGl0eSBpbiB0aGUgcG9vbCAod2l0aGluIGN1cnJlbnQgdGljayByYW5nZSkKCXRpY2tzICAgICAgICAgICAgICAgICpicHRyZWUuQlBUcmVlICAgLy8gdGljayhpbnQzMikgLT4gVGlja0luZm8KCXRpY2tCaXRtYXBzICAgICAgICAgIG1hcFtpbnQxNl1zdHJpbmcgLy8gdGljayh3b3JkUG9zKShpbnQxNikgLT4gYml0TWFwKHRpY2tXb3JkIF4gbWFzaykoc3RyaW5nKQoJcG9zaXRpb25zICAgICAgICAgICAgKmJwdHJlZS5CUFRyZWUgICAvLyBtYXBzIGVuY29kZWQgbG93ZXIvdXBwZXIgdGljayBwYWlycyB0byBhZ2dyZWdhdGUgcG9vbCBhY2NvdW50aW5nCn0KCi8vIFBvb2wgR2V0dGVycyBtZXRob2RzCi8vIFBvb2xQYXRoIHJldHVybnMgdGhlIGNhbm9uaWNhbCBwb29sIHBhdGggZGVyaXZlZCBmcm9tIHRva2VuMCwgdG9rZW4xLCBhbmQgdGhlIGZlZSB0aWVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBwb29sIGlkZW50aWZpZXIgYXNzZW1ibGVkIGZyb20gdGhlIHBvb2wncyB0b2tlbiBwYXRocyBhbmQgZmVlLgpmdW5jIChwICpQb29sKSBQb29sUGF0aCgpIHN0cmluZyB7IHJldHVybiBHZXRQb29sUGF0aChwLnRva2VuMFBhdGgsIHAudG9rZW4xUGF0aCwgcC5mZWUpIH0KCi8vIFRva2VuMFBhdGggcmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgcG9vbCdzIHRva2VuMCBhc3NldC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogdG9rZW4wIHBhdGggc3RvcmVkIGluIHRoZSBwb29sLgpmdW5jIChwICpQb29sKSBUb2tlbjBQYXRoKCkgc3RyaW5nIHsgcmV0dXJuIHAudG9rZW4wUGF0aCB9CgovLyBUb2tlbjFQYXRoIHJldHVybnMgdGhlIHBhdGggb2YgdGhlIHBvb2wncyB0b2tlbjEgYXNzZXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IHRva2VuMSBwYXRoIHN0b3JlZCBpbiB0aGUgcG9vbC4KZnVuYyAocCAqUG9vbCkgVG9rZW4xUGF0aCgpIHN0cmluZyB7IHJldHVybiBwLnRva2VuMVBhdGggfQoKLy8gRmVlIHJldHVybnMgdGhlIHBvb2wncyBmZWUgdGllci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHVpbnQzMjogZmVlIHRpZXIgdXNlZCBieSBzd2FwcyBpbiB0aGlzIHBvb2wuCmZ1bmMgKHAgKlBvb2wpIEZlZSgpIHVpbnQzMiB7IHJldHVybiBwLmZlZSB9CgovLyBCYWxhbmNlcyByZXR1cm5zIHRoZSBwb29sJ3MgY3VycmVudCB0b2tlbiBiYWxhbmNlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFRva2VuUGFpcjogdG9rZW4wIGFuZCB0b2tlbjEgYmFsYW5jZXMgdHJhY2tlZCBieSB0aGUgcG9vbC4KZnVuYyAocCAqUG9vbCkgQmFsYW5jZXMoKSBUb2tlblBhaXIgeyByZXR1cm4gcC5iYWxhbmNlcyB9CgovLyBCYWxhbmNlVG9rZW4wIHJldHVybnMgdGhlIHBvb2wncyBjdXJyZW50IHRva2VuMCBiYWxhbmNlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRva2VuMCBiYWxhbmNlIGF2YWlsYWJsZSBpbiB0aGUgcG9vbC4KZnVuYyAocCAqUG9vbCkgQmFsYW5jZVRva2VuMCgpIGludDY0IHsgcmV0dXJuIHAuYmFsYW5jZXMudG9rZW4wIH0KCi8vIEJhbGFuY2VUb2tlbjEgcmV0dXJucyB0aGUgcG9vbCdzIGN1cnJlbnQgdG9rZW4xIGJhbGFuY2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG9rZW4xIGJhbGFuY2UgYXZhaWxhYmxlIGluIHRoZSBwb29sLgpmdW5jIChwICpQb29sKSBCYWxhbmNlVG9rZW4xKCkgaW50NjQgeyByZXR1cm4gcC5iYWxhbmNlcy50b2tlbjEgfQoKLy8gVGlja1NwYWNpbmcgcmV0dXJucyB0aGUgcGVybWl0dGVkIHNwYWNpbmcgYmV0d2VlbiBpbml0aWFsaXplZCB0aWNrcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDMyOiB0aWNrIHNwYWNpbmcgY29uZmlndXJlZCBmb3IgdGhlIHBvb2wuCmZ1bmMgKHAgKlBvb2wpIFRpY2tTcGFjaW5nKCkgaW50MzIgeyByZXR1cm4gcC50aWNrU3BhY2luZyB9CgovLyBTbG90MCByZXR1cm5zIHRoZSBwb29sJ3MgY3VycmVudCBwcmljZSwgdGljaywgbG9jaywgYW5kIG9yYWNsZSBjdXJzb3Igc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBTbG90MDogY3VycmVudCBzbG90MCBzdGF0ZSwgaW5jbHVkaW5nIHRoZSBwcmljZSBhbmQgb2JzZXJ2YXRpb24gbWV0YWRhdGEuCmZ1bmMgKHAgKlBvb2wpIFNsb3QwKCkgU2xvdDAgeyByZXR1cm4gcC5zbG90MCB9CgovLyBTbG90MFNxcnRQcmljZVg5NiByZXR1cm5zIHRoZSBjdXJyZW50IHNxdWFyZS1yb290IHByaWNlIGluIFE5NiBmaXhlZC1wb2ludCBmb3JtLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKnUyNTYuVWludDogc3RvcmVkIHNxcnQodG9rZW4xL3Rva2VuMCkgcHJpY2Ugc2NhbGVkIGJ5IDJeOTYuCmZ1bmMgKHAgKlBvb2wpIFNsb3QwU3FydFByaWNlWDk2KCkgKnUyNTYuVWludCB7IHJldHVybiBwLnNsb3QwLnNxcnRQcmljZVg5NiB9CgovLyBTbG90MFRpY2sgcmV0dXJucyB0aGUgY3VycmVudCBwb29sIHRpY2suCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQzMjogdGljayBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHBvb2wgcHJpY2UuCmZ1bmMgKHAgKlBvb2wpIFNsb3QwVGljaygpIGludDMyIHsgcmV0dXJuIHAuc2xvdDAudGljayB9CgovLyBTbG90MEZlZVByb3RvY29sIHJldHVybnMgdGhlIHBhY2tlZCBwcm90b2NvbC1mZWUgZGVub21pbmF0b3JzIGZyb20gc2xvdDAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1aW50ODogcGFja2VkIHRva2VuMC90b2tlbjEgcHJvdG9jb2wtZmVlIGRlbm9taW5hdG9yIGNvbmZpZ3VyYXRpb24uCmZ1bmMgKHAgKlBvb2wpIFNsb3QwRmVlUHJvdG9jb2woKSB1aW50OCB7IHJldHVybiBwLnNsb3QwLmZlZVByb3RvY29sIH0KCi8vIFNsb3QwVW5sb2NrZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBwb29sIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHJlZW50cmFudCBvcGVyYXRpb25zLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSBwb29sIGlzIHVubG9ja2VkOyBmYWxzZSB3aGlsZSBpdHMgc3dhcCBsb2NrIGlzIGhlbGQuCmZ1bmMgKHAgKlBvb2wpIFNsb3QwVW5sb2NrZWQoKSBib29sIHsgcmV0dXJuIHAuc2xvdDAudW5sb2NrZWQgfQoKLy8gRmVlR3Jvd3RoR2xvYmFsMFgxMjggcmV0dXJucyBjdW11bGF0aXZlIHRva2VuMCBmZWUgZ3Jvd3RoIHBlciB1bml0IG9mIGxpcXVpZGl0eS4KLy8KLy8gUmV0dXJuczoKLy8gICAtICp1MjU2LlVpbnQ6IHRva2VuMCBmZWUtZ3Jvd3RoIGFjY3VtdWxhdG9yIHNjYWxlZCBieSAyXjEyOC4KZnVuYyAocCAqUG9vbCkgRmVlR3Jvd3RoR2xvYmFsMFgxMjgoKSAqdTI1Ni5VaW50IHsgcmV0dXJuIHAuZmVlR3Jvd3RoR2xvYmFsMFgxMjggfQoKLy8gRmVlR3Jvd3RoR2xvYmFsMVgxMjggcmV0dXJucyBjdW11bGF0aXZlIHRva2VuMSBmZWUgZ3Jvd3RoIHBlciB1bml0IG9mIGxpcXVpZGl0eS4KLy8KLy8gUmV0dXJuczoKLy8gICAtICp1MjU2LlVpbnQ6IHRva2VuMSBmZWUtZ3Jvd3RoIGFjY3VtdWxhdG9yIHNjYWxlZCBieSAyXjEyOC4KZnVuYyAocCAqUG9vbCkgRmVlR3Jvd3RoR2xvYmFsMVgxMjgoKSAqdTI1Ni5VaW50IHsgcmV0dXJuIHAuZmVlR3Jvd3RoR2xvYmFsMVgxMjggfQoKLy8gUHJvdG9jb2xGZWVzIHJldHVybnMgcHJvdG9jb2wgZmVlcyBhY2NydWVkIGluIGJvdGggcG9vbCB0b2tlbnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBUb2tlblBhaXI6IHRva2VuMCBhbmQgdG9rZW4xIHByb3RvY29sLWZlZSBiYWxhbmNlcy4KZnVuYyAocCAqUG9vbCkgUHJvdG9jb2xGZWVzKCkgVG9rZW5QYWlyIHsgcmV0dXJuIHAucHJvdG9jb2xGZWVzIH0KCi8vIFByb3RvY29sRmVlc1Rva2VuMCByZXR1cm5zIHByb3RvY29sIGZlZXMgYWNjcnVlZCBpbiB0b2tlbjAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbnQ2NDogdG9rZW4wIGFtb3VudCByZXNlcnZlZCBhcyBwcm90b2NvbCBmZWVzLgpmdW5jIChwICpQb29sKSBQcm90b2NvbEZlZXNUb2tlbjAoKSBpbnQ2NCB7IHJldHVybiBwLnByb3RvY29sRmVlcy50b2tlbjAgfQoKLy8gUHJvdG9jb2xGZWVzVG9rZW4xIHJldHVybnMgcHJvdG9jb2wgZmVlcyBhY2NydWVkIGluIHRva2VuMS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB0b2tlbjEgYW1vdW50IHJlc2VydmVkIGFzIHByb3RvY29sIGZlZXMuCmZ1bmMgKHAgKlBvb2wpIFByb3RvY29sRmVlc1Rva2VuMSgpIGludDY0IHsgcmV0dXJuIHAucHJvdG9jb2xGZWVzLnRva2VuMSB9CgovLyBMaXF1aWRpdHkgcmV0dXJucyB0aGUgcG9vbCdzIGFjdGl2ZSBsaXF1aWRpdHkgZm9yIHRoZSBjdXJyZW50IHRpY2sgcmFuZ2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqdTI1Ni5VaW50OiBhY3RpdmUgbGlxdWlkaXR5IGFtb3VudC4KZnVuYyAocCAqUG9vbCkgTGlxdWlkaXR5KCkgKnUyNTYuVWludCB7IHJldHVybiBwLmxpcXVpZGl0eSB9CgovLyBUaWNrcyByZXR1cm5zIHRoZSB0cmVlIGNvbnRhaW5pbmcgdGljayBzdGF0ZSBrZXllZCBieSBlbmNvZGVkIHRpY2suCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqYnB0cmVlLkJQVHJlZTogcG9vbCB0aWNrIHN0b3JhZ2UgdHJlZS4KZnVuYyAocCAqUG9vbCkgVGlja3MoKSAqYnB0cmVlLkJQVHJlZSB7IHJldHVybiBwLnRpY2tzIH0KCi8vIFRpY2tCaXRtYXBzIHJldHVybnMgdGhlIG1hcCBvZiBpbml0aWFsaXplZC10aWNrIGJpdG1hcCB3b3Jkcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1hcFtpbnQxNl1zdHJpbmc6IGJpdG1hcCB3b3JkcyBrZXllZCBieSBzaWduZWQgd29yZCBwb3NpdGlvbi4KZnVuYyAocCAqUG9vbCkgVGlja0JpdG1hcHMoKSBtYXBbaW50MTZdc3RyaW5nIHsgcmV0dXJuIHAudGlja0JpdG1hcHMgfQoKLy8gUG9zaXRpb25zIHJldHVybnMgdGhlIHRyZWUgY29udGFpbmluZyBhZ2dyZWdhdGUgcG9zaXRpb24gc3RhdGUgYnkgcmFuZ2Uga2V5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IHBvb2wgcG9zaXRpb24gc3RvcmFnZSB0cmVlLgpmdW5jIChwICpQb29sKSBQb3NpdGlvbnMoKSAqYnB0cmVlLkJQVHJlZSB7IHJldHVybiBwLnBvc2l0aW9ucyB9CgovLyBHZXRQb3NpdGlvbiByZXR1cm5zIHRoZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBmb3Iga2V5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0ga2V5OiBlbmNvZGVkIGxvd2VyL3VwcGVyIHRpY2stcmFuZ2Uga2V5IHRvIGxvb2sgdXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBQb3NpdGlvbkluZm86IHN0b3JlZCBhZ2dyZWdhdGUgcG9zaXRpb24gZm9yIHRoZSBrZXkuCi8vICAgLSBlcnJvcjogbm9uLW5pbCB3aGVuIHRoZSBrZXkgaXMgYWJzZW50IG9yIGNvbnRhaW5zIGEgdmFsdWUgb2YgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHAgKlBvb2wpIEdldFBvc2l0aW9uKGtleSBzdHJpbmcpIChQb3NpdGlvbkluZm8sIGVycm9yKSB7CglpUG9zaXRpb25JbmZvIDo9IHAucG9zaXRpb25zLkdldChrZXkpCglpZiBpUG9zaXRpb25JbmZvID09IG5pbCB7CgkJcmV0dXJuIFBvc2l0aW9uSW5mb3t9LCB1Zm10LkVycm9yZigicG9zaXRpb24gJXMgbm90IGZvdW5kIiwga2V5KQoJfQoKCXBvc2l0aW9uSW5mbywgb2sgOj0gaVBvc2l0aW9uSW5mby4oUG9zaXRpb25JbmZvKQoJaWYgIW9rIHsKCQlyZXR1cm4gUG9zaXRpb25JbmZve30sIHVmbXQuRXJyb3JmKCJwb3NpdGlvbiAlcyBoYXMgaW52YWxpZCB0eXBlIiwga2V5KQoJfQoKCXJldHVybiBwb3NpdGlvbkluZm8sIG5pbAp9CgovLyBQb29sIFNldHRlcnMgbWV0aG9kcwovLyBTZXRUb2tlbjBQYXRoIHN0b3JlcyB0aGUgcGF0aCBvZiB0aGUgcG9vbCdzIHRva2VuMCBhc3NldC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuMFBhdGg6IHRva2VuMCBhc3NldCBwYXRoIHRvIHN0b3JlLgpmdW5jIChwICpQb29sKSBTZXRUb2tlbjBQYXRoKHRva2VuMFBhdGggc3RyaW5nKSB7CglwLnRva2VuMFBhdGggPSB0b2tlbjBQYXRoCn0KCi8vIFNldFRva2VuMVBhdGggc3RvcmVzIHRoZSBwYXRoIG9mIHRoZSBwb29sJ3MgdG9rZW4xIGFzc2V0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW4xUGF0aDogdG9rZW4xIGFzc2V0IHBhdGggdG8gc3RvcmUuCmZ1bmMgKHAgKlBvb2wpIFNldFRva2VuMVBhdGgodG9rZW4xUGF0aCBzdHJpbmcpIHsKCXAudG9rZW4xUGF0aCA9IHRva2VuMVBhdGgKfQoKLy8gU2V0RmVlIHN0b3JlcyB0aGUgcG9vbCdzIGZlZSB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZmVlOiBmZWUgdGllciB0byB1c2UgZm9yIHN3YXBzIGluIHRoaXMgcG9vbC4KZnVuYyAocCAqUG9vbCkgU2V0RmVlKGZlZSB1aW50MzIpIHsKCXAuZmVlID0gZmVlCn0KCi8vIFNldEJhbGFuY2VzIHJlcGxhY2VzIHRoZSBwb29sJ3MgdHJhY2tlZCBiYWxhbmNlcyBmb3IgYm90aCB0b2tlbnMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBiYWxhbmNlczogdG9rZW4wIGFuZCB0b2tlbjEgYmFsYW5jZXMgdG8gc3RvcmUuCmZ1bmMgKHAgKlBvb2wpIFNldEJhbGFuY2VzKGJhbGFuY2VzIFRva2VuUGFpcikgewoJcC5iYWxhbmNlcyA9IGJhbGFuY2VzCn0KCi8vIFNldEJhbGFuY2VUb2tlbjAgdXBkYXRlcyB0aGUgcG9vbCdzIHRyYWNrZWQgdG9rZW4wIGJhbGFuY2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlbjA6IG5ldyB0b2tlbjAgYmFsYW5jZS4KZnVuYyAocCAqUG9vbCkgU2V0QmFsYW5jZVRva2VuMCh0b2tlbjAgaW50NjQpIHsKCXAuYmFsYW5jZXMudG9rZW4wID0gdG9rZW4wCn0KCi8vIFNldEJhbGFuY2VUb2tlbjEgdXBkYXRlcyB0aGUgcG9vbCdzIHRyYWNrZWQgdG9rZW4xIGJhbGFuY2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlbjE6IG5ldyB0b2tlbjEgYmFsYW5jZS4KZnVuYyAocCAqUG9vbCkgU2V0QmFsYW5jZVRva2VuMSh0b2tlbjEgaW50NjQpIHsKCXAuYmFsYW5jZXMudG9rZW4xID0gdG9rZW4xCn0KCi8vIFNldFRpY2tTcGFjaW5nIHN0b3JlcyB0aGUgcGVybWl0dGVkIHNwYWNpbmcgYmV0d2VlbiBpbml0aWFsaXplZCB0aWNrcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpY2tTcGFjaW5nOiB0aWNrIHNwYWNpbmcgdG8gY29uZmlndXJlIGZvciB0aGUgcG9vbC4KZnVuYyAocCAqUG9vbCkgU2V0VGlja1NwYWNpbmcodGlja1NwYWNpbmcgaW50MzIpIHsKCXAudGlja1NwYWNpbmcgPSB0aWNrU3BhY2luZwp9CgovLyBTZXRTbG90MCByZXBsYWNlcyB0aGUgcG9vbCdzIGN1cnJlbnQgcHJpY2UsIHRpY2ssIGxvY2ssIGFuZCBvcmFjbGUgY3Vyc29yIHN0YXRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc2xvdDA6IHNsb3QwIHN0YXRlIHRvIHN0b3JlLgpmdW5jIChwICpQb29sKSBTZXRTbG90MChzbG90MCBTbG90MCkgewoJcC5zbG90MCA9IHNsb3QwCn0KCi8vIFNldEZlZUdyb3d0aEdsb2JhbDBYMTI4IHN0b3JlcyB0aGUgdG9rZW4wIGZlZS1ncm93dGggYWNjdW11bGF0b3IuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmZWVHcm93dGhHbG9iYWwwWDEyODogdG9rZW4wIGZlZSBncm93dGggcGVyIGxpcXVpZGl0eSB1bml0LCBzY2FsZWQgYnkgMl4xMjguCmZ1bmMgKHAgKlBvb2wpIFNldEZlZUdyb3d0aEdsb2JhbDBYMTI4KGZlZUdyb3d0aEdsb2JhbDBYMTI4ICp1MjU2LlVpbnQpIHsKCXAuZmVlR3Jvd3RoR2xvYmFsMFgxMjggPSB1MjU2Llplcm8oKS5TZXQoZmVlR3Jvd3RoR2xvYmFsMFgxMjgpCn0KCi8vIFNldEZlZUdyb3d0aEdsb2JhbDFYMTI4IHN0b3JlcyB0aGUgdG9rZW4xIGZlZS1ncm93dGggYWNjdW11bGF0b3IuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmZWVHcm93dGhHbG9iYWwxWDEyODogdG9rZW4xIGZlZSBncm93dGggcGVyIGxpcXVpZGl0eSB1bml0LCBzY2FsZWQgYnkgMl4xMjguCmZ1bmMgKHAgKlBvb2wpIFNldEZlZUdyb3d0aEdsb2JhbDFYMTI4KGZlZUdyb3d0aEdsb2JhbDFYMTI4ICp1MjU2LlVpbnQpIHsKCXAuZmVlR3Jvd3RoR2xvYmFsMVgxMjggPSB1MjU2Llplcm8oKS5TZXQoZmVlR3Jvd3RoR2xvYmFsMVgxMjgpCn0KCi8vIFNldFByb3RvY29sRmVlcyByZXBsYWNlcyB0aGUgcG9vbCdzIGFjY3J1ZWQgcHJvdG9jb2wgZmVlcyBmb3IgYm90aCB0b2tlbnMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm90b2NvbEZlZXM6IHRva2VuMCBhbmQgdG9rZW4xIHByb3RvY29sLWZlZSBiYWxhbmNlcyB0byBzdG9yZS4KZnVuYyAocCAqUG9vbCkgU2V0UHJvdG9jb2xGZWVzKHByb3RvY29sRmVlcyBUb2tlblBhaXIpIHsKCXAucHJvdG9jb2xGZWVzID0gcHJvdG9jb2xGZWVzCn0KCi8vIFNldFByb3RvY29sRmVlc1Rva2VuMCB1cGRhdGVzIHRoZSBwb29sJ3MgYWNjcnVlZCB0b2tlbjAgcHJvdG9jb2wgZmVlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuMDogbmV3IHRva2VuMCBwcm90b2NvbC1mZWUgYmFsYW5jZS4KZnVuYyAocCAqUG9vbCkgU2V0UHJvdG9jb2xGZWVzVG9rZW4wKHRva2VuMCBpbnQ2NCkgewoJcC5wcm90b2NvbEZlZXMudG9rZW4wID0gdG9rZW4wCn0KCi8vIFNldFByb3RvY29sRmVlc1Rva2VuMSB1cGRhdGVzIHRoZSBwb29sJ3MgYWNjcnVlZCB0b2tlbjEgcHJvdG9jb2wgZmVlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuMTogbmV3IHRva2VuMSBwcm90b2NvbC1mZWUgYmFsYW5jZS4KZnVuYyAocCAqUG9vbCkgU2V0UHJvdG9jb2xGZWVzVG9rZW4xKHRva2VuMSBpbnQ2NCkgewoJcC5wcm90b2NvbEZlZXMudG9rZW4xID0gdG9rZW4xCn0KCi8vIFNldExpcXVpZGl0eSBzdG9yZXMgdGhlIHBvb2wncyBhY3RpdmUgbGlxdWlkaXR5IGZvciB0aGUgY3VycmVudCB0aWNrIHJhbmdlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbGlxdWlkaXR5OiBhY3RpdmUgbGlxdWlkaXR5IGFtb3VudCB0byBzdG9yZS4KZnVuYyAocCAqUG9vbCkgU2V0TGlxdWlkaXR5KGxpcXVpZGl0eSAqdTI1Ni5VaW50KSB7CglwLmxpcXVpZGl0eSA9IHUyNTYuWmVybygpLlNldChsaXF1aWRpdHkpCn0KCi8vIFNldFRpY2tzIHJlcGxhY2VzIHRoZSB0cmVlIGNvbnRhaW5pbmcgcG9vbCB0aWNrIHN0YXRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGlja3M6IHRpY2sgc3RvcmFnZSB0cmVlIHRvIHVzZS4KZnVuYyAocCAqUG9vbCkgU2V0VGlja3ModGlja3MgKmJwdHJlZS5CUFRyZWUpIHsKCXAudGlja3MgPSB0aWNrcwp9CgovLyBTZXRUaWNrQml0bWFwIHN0b3JlcyBvbmUgaW5pdGlhbGl6ZWQtdGljayBiaXRtYXAgd29yZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHdvcmRQb3M6IHNpZ25lZCBiaXRtYXAgd29yZCBwb3NpdGlvbi4KLy8gICAtIHRpY2tCaXRtYXA6IGVuY29kZWQgYml0bWFwIGJpdHMgZm9yIHRoYXQgd29yZC4KZnVuYyAocCAqUG9vbCkgU2V0VGlja0JpdG1hcCh3b3JkUG9zIGludDE2LCB0aWNrQml0bWFwIHN0cmluZykgewoJcC50aWNrQml0bWFwc1t3b3JkUG9zXSA9IHRpY2tCaXRtYXAKfQoKLy8gRGVsZXRlVGlja0JpdG1hcCBkZWxldGVzIHRoZSB0aWNrIGJpdG1hcCBmb3IgdGhlIGdpdmVuIHdvcmQgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB3b3JkUG9zOiBzaWduZWQgYml0bWFwIHdvcmQgcG9zaXRpb24gdG8gcmVtb3ZlLgpmdW5jIChwICpQb29sKSBEZWxldGVUaWNrQml0bWFwKHdvcmRQb3MgaW50MTYpIHsKCWRlbGV0ZShwLnRpY2tCaXRtYXBzLCB3b3JkUG9zKQp9CgovLyBTZXRUaWNrQml0bWFwcyByZXBsYWNlcyB0aGUgbWFwIG9mIGluaXRpYWxpemVkLXRpY2sgYml0bWFwIHdvcmRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGlja0JpdG1hcHM6IGJpdG1hcCB3b3JkcyBrZXllZCBieSBzaWduZWQgd29yZCBwb3NpdGlvbi4KZnVuYyAocCAqUG9vbCkgU2V0VGlja0JpdG1hcHModGlja0JpdG1hcHMgbWFwW2ludDE2XXN0cmluZykgewoJcC50aWNrQml0bWFwcyA9IHRpY2tCaXRtYXBzCn0KCi8vIFNldFBvc2l0aW9ucyByZXBsYWNlcyB0aGUgdHJlZSBjb250YWluaW5nIGFnZ3JlZ2F0ZSBwb3NpdGlvbiBzdGF0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHBvc2l0aW9uczogcG9zaXRpb24gc3RvcmFnZSB0cmVlIHRvIHVzZS4KZnVuYyAocCAqUG9vbCkgU2V0UG9zaXRpb25zKHBvc2l0aW9ucyAqYnB0cmVlLkJQVHJlZSkgewoJcC5wb3NpdGlvbnMgPSBwb3NpdGlvbnMKfQoKLy8gU2V0UG9zaXRpb24gc3RvcmVzIHBvc2l0aW9uIGluZm9ybWF0aW9uIHVuZGVyIGFuIGVuY29kZWQgcmFuZ2Uga2V5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcG9zS2V5OiBlbmNvZGVkIGxvd2VyL3VwcGVyIHRpY2stcmFuZ2Uga2V5LgovLyAgIC0gcG9zaXRpb25JbmZvOiBhZ2dyZWdhdGUgcG9zaXRpb24gc3RhdGUgdG8gc3RvcmUuCmZ1bmMgKHAgKlBvb2wpIFNldFBvc2l0aW9uKHBvc0tleSBzdHJpbmcsIHBvc2l0aW9uSW5mbyBQb3NpdGlvbkluZm8pIHsKCXAucG9zaXRpb25zLlNldChwb3NLZXksIHBvc2l0aW9uSW5mbykKfQoKLy8gSGFzVGljayByZXBvcnRzIHdoZXRoZXIgYSB0aWNrIGVudHJ5IGV4aXN0cyBpbiB0aGUgcG9vbCdzIHRpY2sgdHJlZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpY2s6IHRpY2sgaW5kZXggdG8gY2hlY2suCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdGhlIGVuY29kZWQgdGljayBpcyBwcmVzZW50OyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgKHAgKlBvb2wpIEhhc1RpY2sodGljayBpbnQzMikgYm9vbCB7Cgl0aWNrS2V5IDo9IEVuY29kZVRpY2tLZXkodGljaykKCXJldHVybiBwLnRpY2tzLkhhcyh0aWNrS2V5KQp9CgovLyBHZXRUaWNrIHJldHVybnMgdGhlIHN0YXRlIHN0b3JlZCBmb3IgYSB0aWNrLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGljazogdGljayBpbmRleCB0byBsb29rIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gVGlja0luZm86IHN0b3JlZCB0aWNrIHN0YXRlLgovLyAgIC0gZXJyb3I6IG5vbi1uaWwgd2hlbiB0aGUgdGljayBpcyBhYnNlbnQ7IGEgcHJlc2VudCB2YWx1ZSBvZiB0aGUgd3JvbmcgdHlwZSBjYXVzZXMgYSBwYW5pYy4KZnVuYyAocCAqUG9vbCkgR2V0VGljayh0aWNrIGludDMyKSAoVGlja0luZm8sIGVycm9yKSB7Cgl0aWNrS2V5IDo9IEVuY29kZVRpY2tLZXkodGljaykKCglpVGlja0luZm8gOj0gcC50aWNrcy5HZXQodGlja0tleSkKCWlmIGlUaWNrSW5mbyA9PSBuaWwgewoJCXJldHVybiBUaWNrSW5mb3t9LCB1Zm10LkVycm9yZigidGljayAlZCBub3QgZm91bmQiLCB0aWNrKQoJfQoKCXRpY2tJbmZvLCBvayA6PSBpVGlja0luZm8uKFRpY2tJbmZvKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHRpY2tJbmZvIHRvIFRpY2tJbmZvOiAlVCIsIGlUaWNrSW5mbykpCgl9CgoJcmV0dXJuIHRpY2tJbmZvLCBuaWwKfQoKLy8gU2V0VGljayBzdG9yZXMgdGljayBzdGF0ZSB1bmRlciBpdHMgZW5jb2RlZCB0aWNrIGtleS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpY2s6IHRpY2sgaW5kZXggdG8gc3RvcmUuCi8vICAgLSB0aWNrSW5mbzogdGljayBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGluZGV4LgpmdW5jIChwICpQb29sKSBTZXRUaWNrKHRpY2sgaW50MzIsIHRpY2tJbmZvIFRpY2tJbmZvKSB7Cgl0aWNrS2V5IDo9IEVuY29kZVRpY2tLZXkodGljaykKCXAudGlja3MuU2V0KHRpY2tLZXksIHRpY2tJbmZvKQp9CgovLyBEZWxldGVUaWNrIHJlbW92ZXMgdGhlIHRpY2sgc3RhdGUgZm9yIHRoZSBnaXZlbiB0aWNrIGluZGV4LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGljazogdGljayBpbmRleCB0byByZW1vdmUuCmZ1bmMgKHAgKlBvb2wpIERlbGV0ZVRpY2sodGljayBpbnQzMikgewoJdGlja0tleSA6PSBFbmNvZGVUaWNrS2V5KHRpY2spCglwLnRpY2tzLlJlbW92ZSh0aWNrS2V5KQp9CgovLyBJdGVyYXRlVGlja3MgdmlzaXRzIHBvb2wgdGlja3MgaW4gdGhlIGluY2x1c2l2ZSByYW5nZSBbc3RhcnRUaWNrLCBlbmRUaWNrXS4KLy8gSXRlcmF0aW9uIHN0b3BzIHdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHN0YXJ0VGljazogZmlyc3QgdGljayBpbmRleCBpbiB0aGUgaW5jbHVzaXZlIHJhbmdlLgovLyAgIC0gZW5kVGljazogbGFzdCB0aWNrIGluZGV4IGluIHRoZSBpbmNsdXNpdmUgcmFuZ2UuCi8vICAgLSBmbjogY2FsbGJhY2sgcmVjZWl2aW5nIGVhY2ggZGVjb2RlZCB0aWNrIGFuZCBpdHMgc3RhdGU7IHJldHVybiB0cnVlIHRvIHN0b3AgaXRlcmF0aW9uLgpmdW5jIChwICpQb29sKSBJdGVyYXRlVGlja3Moc3RhcnRUaWNrIGludDMyLCBlbmRUaWNrIGludDMyLCBmbiBmdW5jKHRpY2sgaW50MzIsIHRpY2tJbmZvIFRpY2tJbmZvKSBib29sKSB7CglzdGFydFRpY2tLZXkgOj0gRW5jb2RlVGlja0tleShzdGFydFRpY2spCgllbmRUaWNrS2V5IDo9IEVuY29kZVRpY2tLZXkoZW5kVGljayArIDEpIC8vIGVuZFRpY2sgaW5jbHVzaXZlCgoJcC50aWNrcy5JdGVyYXRlKHN0YXJ0VGlja0tleSwgZW5kVGlja0tleSwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCXRpY2sgOj0gRGVjb2RlVGlja0tleShrZXkpCgoJCXRpY2tJbmZvLCBvayA6PSB2YWx1ZS4oVGlja0luZm8pCgkJaWYgIW9rIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoKCQlyZXR1cm4gZm4odGljaywgdGlja0luZm8pCgl9KQp9CgovLyBDbG9uZSBjb3BpZXMgYSBwb29sJ3Mgb3duIGZpZWxkcyBhbmQgbGVhdmVzIGl0cyBjb2xsZWN0aW9ucyBuaWw6IHRpY2tzLAovLyB0aWNrQml0bWFwcywgYW5kIHBvc2l0aW9ucyBhcmUgbm90IGNvcGllZC4gT3JhY2xlIG9ic2VydmF0aW9ucyBhcmUgc3RvcmVkCi8vIHNlcGFyYXRlbHkgZnJvbSBQb29sLgovLwovLyBUaGUgY29weSBpcyBzaGFsbG93IGJlY2F1c2UgdGhlIHJlYWQtb25seSBwb29sIHZpZXcgY2xvbmVzIGV2ZXJ5IGVudHJ5IGEKLy8gY2FsbGVyIHJlYWRzLCBzbyBjb3B5aW5nIHRoZSBjb2xsZWN0aW9ucyB3b3VsZCB3YWxrIHRoZSB3aG9sZSB0aWNrIHRyZWUgZm9yCi8vIGVhY2ggZW50cnkgb24gYSBwYWdlLiBSZWFkIHRoZW0gdGhyb3VnaCB0aGVpciBvd24gbG9va3VwcyBpbnN0ZWFkOgovLyBHZXRUaWNrSW5mbyAvIEdldEluaXRpYWxpemVkVGlja3NJblJhbmdlIGZvciB0aWNrcywgR2V0VGlja0JpdG1hcHMgZm9yIHRoZQovLyBiaXRtYXBzLCBHZXRQb29sUG9zaXRpb25zIGZvciBwb3NpdGlvbnMsIGFuZCBHZXRTbG90MCAvIEdldE9ic2VydmF0aW9uQXQgZm9yCi8vIG9yYWNsZSBtZXRhZGF0YSBhbmQgZW50cmllcy4gQSBjYWxsZXIgdGhhdCBuZWVkcyBhIHdvcmtpbmcgY29weSBvZiBhCi8vIGNvbGxlY3Rpb24gLS0gRHJ5U3dhcCBpcyB0aGUgb25seSBvbmUgLS0gYXNzZW1ibGVzIGl0IGZyb20gdGhvc2UgZ2V0dGVycy4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpQb29sOiBzaGFsbG93IHBvb2wgY29weSB3aXRoIHNjYWxhciBzdGF0ZSBhbmQgY2xvbmVkIG51bWVyaWMgdmFsdWVzOyBuaWwgd2hlbiB0aGUgcmVjZWl2ZXIgaXMgbmlsLgpmdW5jIChwICpQb29sKSBDbG9uZSgpICpQb29sIHsKCWlmIHAgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJcmV0dXJuICZQb29sewoJCXRva2VuMFBhdGg6ICAgICAgICAgICBwLnRva2VuMFBhdGgsCgkJdG9rZW4xUGF0aDogICAgICAgICAgIHAudG9rZW4xUGF0aCwKCQlmZWU6ICAgICAgICAgICAgICAgICAgcC5mZWUsCgkJdGlja1NwYWNpbmc6ICAgICAgICAgIHAudGlja1NwYWNpbmcsCgkJc2xvdDA6ICAgICAgICAgICAgICAgIHAuc2xvdDAuQ2xvbmUoKSwKCQliYWxhbmNlczogICAgICAgICAgICAgcC5iYWxhbmNlcywKCQlwcm90b2NvbEZlZXM6ICAgICAgICAgcC5wcm90b2NvbEZlZXMsCgkJZmVlR3Jvd3RoR2xvYmFsMFgxMjg6IHAuZmVlR3Jvd3RoR2xvYmFsMFgxMjguQ2xvbmUoKSwKCQlmZWVHcm93dGhHbG9iYWwxWDEyODogcC5mZWVHcm93dGhHbG9iYWwxWDEyOC5DbG9uZSgpLAoJCWxpcXVpZGl0eTogICAgICAgICAgICBwLmxpcXVpZGl0eS5DbG9uZSgpLAoJCXRpY2tzOiAgICAgICAgICAgICAgICBuaWwsCgkJdGlja0JpdG1hcHM6ICAgICAgICAgIG5pbCwKCQlwb3NpdGlvbnM6ICAgICAgICAgICAgbmlsLAoJfQp9CgovLyBOZXdQb29sIGNvbnN0cnVjdHMgYSBwb29sIHdpdGggdGhlIHN1cHBsaWVkIHRva2VuIHBhaXIsIGZlZSwgcHJpY2UsIGFuZCB0aWNrIGNvbmZpZ3VyYXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlbjBQYXRoOiBwYXRoIG9mIHRoZSBwb29sJ3MgdG9rZW4wIGFzc2V0LgovLyAgIC0gdG9rZW4xUGF0aDogcGF0aCBvZiB0aGUgcG9vbCdzIHRva2VuMSBhc3NldC4KLy8gICAtIGZlZTogZmVlIHRpZXIgdXNlZCBieSBzd2Fwcy4KLy8gICAtIHNxcnRQcmljZVg5NjogaW5pdGlhbCBzcXJ0KHRva2VuMS90b2tlbjApIHByaWNlIHNjYWxlZCBieSAyXjk2LgovLyAgIC0gdGlja1NwYWNpbmc6IHNwYWNpbmcgYmV0d2VlbiBpbml0aWFsaXplZCB0aWNrcy4KLy8gICAtIHRpY2s6IGluaXRpYWwgY3VycmVudCB0aWNrLgovLyAgIC0gc2xvdDBGZWVQcm90b2NvbDogcGFja2VkIHByb3RvY29sLWZlZSBkZW5vbWluYXRvciBjb25maWd1cmF0aW9uIGZvciBzbG90MC4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpQb29sOiBpbml0aWFsaXplZCBwb29sIHdpdGggZW1wdHkgYmFsYW5jZXMsIGZlZSBncm93dGgsIHRpY2tzLCBiaXRtYXBzLCBhbmQgcG9zaXRpb25zLgpmdW5jIE5ld1Bvb2woCgl0b2tlbjBQYXRoIHN0cmluZywKCXRva2VuMVBhdGggc3RyaW5nLAoJZmVlIHVpbnQzMiwKCXNxcnRQcmljZVg5NiAqdTI1Ni5VaW50LAoJdGlja1NwYWNpbmcgaW50MzIsCgl0aWNrIGludDMyLAoJc2xvdDBGZWVQcm90b2NvbCB1aW50OCwKKSAqUG9vbCB7CglzbG90MCA6PSBOZXdTbG90MChzcXJ0UHJpY2VYOTYsIHRpY2ssIHNsb3QwRmVlUHJvdG9jb2wsIHRydWUpCgoJcmV0dXJuICZQb29sewoJCXRva2VuMFBhdGg6ICAgICAgICAgICB0b2tlbjBQYXRoLAoJCXRva2VuMVBhdGg6ICAgICAgICAgICB0b2tlbjFQYXRoLAoJCWJhbGFuY2VzOiAgICAgICAgICAgICBOZXdUb2tlblBhaXIoKSwKCQlmZWU6ICAgICAgICAgICAgICAgICAgZmVlLAoJCXRpY2tTcGFjaW5nOiAgICAgICAgICB0aWNrU3BhY2luZywKCQlzbG90MDogICAgICAgICAgICAgICAgc2xvdDAsCgkJZmVlR3Jvd3RoR2xvYmFsMFgxMjg6IHUyNTYuWmVybygpLAoJCWZlZUdyb3d0aEdsb2JhbDFYMTI4OiB1MjU2Llplcm8oKSwKCQlwcm90b2NvbEZlZXM6ICAgICAgICAgTmV3VG9rZW5QYWlyKCksCgkJbGlxdWlkaXR5OiAgICAgICAgICAgIHUyNTYuWmVybygpLAoJCXRpY2tzOiAgICAgICAgICAgICAgICBicHRyZWUuTmV3QlBUcmVlTigzMiksCgkJdGlja0JpdG1hcHM6ICAgICAgICAgIG1ha2UobWFwW2ludDE2XXN0cmluZyksCgkJcG9zaXRpb25zOiAgICAgICAgICAgIGJwdHJlZS5OZXdCUFRyZWVOKDE2KSwKCX0KfQoKLy8gTmV3UG9vbHNUcmVlIGNyZWF0ZXMgdGhlIEJQVHJlZSB1c2VkIHRvIHN0b3JlIHBvb2xzIGJ5IHBvb2wgcGF0aC4KLy8KLy8gUmV0dXJuczoKLy8gICAtICpicHRyZWUuQlBUcmVlOiBlbXB0eSBwb29sIHN0b3JhZ2UgdHJlZSB3aXRoIGZhbm91dCAzMi4KZnVuYyBOZXdQb29sc1RyZWUoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXR1cm4gYnB0cmVlLk5ld0JQVHJlZU4oMzIpCn0KCi8vIE5ld1Bvb2xUaWNrc1RyZWUgY3JlYXRlcyBhIEJQVHJlZSBmb3Igc3RvcmluZyBwb29sIHRpY2sgaW5mbyAoZmFub3V0IDMyKSwKLy8gb3duZWQgYnkgdGhlIHBvb2wgZG9tYWluIHJlYWxtIHNvIGxlYWYtc2xvdCB3cml0ZXMgYXJlIG5vdCByZWFkb25seSB0YWludGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gKmJwdHJlZS5CUFRyZWU6IGVtcHR5IHRpY2sgc3RvcmFnZSB0cmVlIHdpdGggZmFub3V0IDMyLgpmdW5jIE5ld1Bvb2xUaWNrc1RyZWUoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXR1cm4gYnB0cmVlLk5ld0JQVHJlZU4oMzIpCn0KCi8vIE5ld1Bvb2xQb3NpdGlvbnNUcmVlIGNyZWF0ZXMgYSBCUFRyZWUgZm9yIHN0b3JpbmcgcG9vbCBwb3NpdGlvbiBpbmZvIChmYW5vdXQgMTYpLAovLyBvd25lZCBieSB0aGUgcG9vbCBkb21haW4gcmVhbG0gc28gbGVhZi1zbG90IHdyaXRlcyBhcmUgbm90IHJlYWRvbmx5IHRhaW50ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqYnB0cmVlLkJQVHJlZTogZW1wdHkgcG9zaXRpb24gc3RvcmFnZSB0cmVlIHdpdGggZmFub3V0IDE2LgpmdW5jIE5ld1Bvb2xQb3NpdGlvbnNUcmVlKCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIGJwdHJlZS5OZXdCUFRyZWVOKDE2KQp9Cgp0eXBlIFRva2VuUGFpciBzdHJ1Y3QgewoJdG9rZW4wLCB0b2tlbjEgaW50NjQKfQoKLy8gTmV3VG9rZW5QYWlyIGNyZWF0ZXMgYSB0b2tlbi1wYWlyIGJhbGFuY2UgdmFsdWUgaW5pdGlhbGl6ZWQgdG8gemVyby4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFRva2VuUGFpcjogemVybyB0b2tlbjAgYW5kIHRva2VuMSBiYWxhbmNlcy4KZnVuYyBOZXdUb2tlblBhaXIoKSBUb2tlblBhaXIgewoJcmV0dXJuIFRva2VuUGFpcnsKCQl0b2tlbjA6IDAsCgkJdG9rZW4xOiAwLAoJfQp9CgovLyBUb2tlbjAgcmV0dXJucyB0aGUgdG9rZW4wIGFtb3VudCBpbiB0aGUgcGFpci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBzdG9yZWQgdG9rZW4wIGFtb3VudC4KZnVuYyAocCAqVG9rZW5QYWlyKSBUb2tlbjAoKSBpbnQ2NCB7IHJldHVybiBwLnRva2VuMCB9CgovLyBUb2tlbjEgcmV0dXJucyB0aGUgdG9rZW4xIGFtb3VudCBpbiB0aGUgcGFpci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBzdG9yZWQgdG9rZW4xIGFtb3VudC4KZnVuYyAocCAqVG9rZW5QYWlyKSBUb2tlbjEoKSBpbnQ2NCB7IHJldHVybiBwLnRva2VuMSB9CgovLyBTZXRUb2tlbjAgdXBkYXRlcyB0aGUgdG9rZW4wIGFtb3VudCBpbiB0aGUgcGFpci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuMDogdG9rZW4wIGFtb3VudCB0byBzdG9yZS4KZnVuYyAocCAqVG9rZW5QYWlyKSBTZXRUb2tlbjAodG9rZW4wIGludDY0KSB7IHAudG9rZW4wID0gdG9rZW4wIH0KCi8vIFNldFRva2VuMSB1cGRhdGVzIHRoZSB0b2tlbjEgYW1vdW50IGluIHRoZSBwYWlyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW4xOiB0b2tlbjEgYW1vdW50IHRvIHN0b3JlLgpmdW5jIChwICpUb2tlblBhaXIpIFNldFRva2VuMSh0b2tlbjEgaW50NjQpIHsgcC50b2tlbjEgPSB0b2tlbjEgfQoKLy8gU2xvdDAgbWlycm9ycyBVbmlzd2FwIFYzJ3Mgc2xvdDAoKTogY3VycmVudCBwcmljZS90aWNrL3Byb3RvY29sLWZlZS9sb2NrCi8vIHN0YXRlIGFuZCB0aGUgb3JhY2xlIGN1cnNvci9jYXBhY2l0eSBtZXRhZGF0YS4KdHlwZSBTbG90MCBzdHJ1Y3QgewoJc3FydFByaWNlWDk2ICAgICAgICAgICAgICAgKnUyNTYuVWludCAvLyBjdXJyZW50IHByaWNlIG9mIHRoZSBwb29sIGFzIGEgc3FydCh0b2tlbjEvdG9rZW4wKSBROTYgdmFsdWUKCXRpY2sgICAgICAgICAgICAgICAgICAgICAgIGludDMyICAgICAgLy8gY3VycmVudCB0aWNrIG9mIHRoZSBwb29sLCBpLmUgYWNjb3JkaW5nIHRvIHRoZSBsYXN0IHRpY2sgdHJhbnNpdGlvbiB0aGF0IHdhcyBydW4KCWZlZVByb3RvY29sICAgICAgICAgICAgICAgIHVpbnQ4ICAgICAgLy8gcGFja2VkIHByb3RvY29sLWZlZSBkZW5vbWluYXRvcnM6IHRva2VuMCBsb3cgbmliYmxlLCB0b2tlbjEgaGlnaCBuaWJibGUKCXVubG9ja2VkICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgLy8gd2hldGhlciB0aGUgcG9vbCBpcyBjdXJyZW50bHkgbG9ja2VkIHRvIHJlZW50cmFuY3kKCW9ic2VydmF0aW9uSW5kZXggICAgICAgICAgIHVpbnQxNiAgICAgLy8gdGhlIGluZGV4IG9mIHRoZSBtb3N0LXJlY2VudGx5IHdyaXR0ZW4gb2JzZXJ2YXRpb24KCW9ic2VydmF0aW9uQ2FyZGluYWxpdHkgICAgIHVpbnQxNiAgICAgLy8gdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIHN0b3JlZAoJb2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQgdWludDE2ICAgICAvLyB0aGUgbmV4dCBtYXhpbXVtIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgdG8gc3RvcmUKfQoKLy8gU3FydFByaWNlWDk2IHJldHVybnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHNxcnQgcHJpY2UgaW4gUTk2IGZpeGVkLXBvaW50IGZvcm0uCi8vCi8vIFJldHVybnM6Ci8vICAgLSAqdTI1Ni5VaW50OiBjbG9uZWQgc3FydCh0b2tlbjEvdG9rZW4wKSBwcmljZSBzY2FsZWQgYnkgMl45Ni4KZnVuYyAocyAqU2xvdDApIFNxcnRQcmljZVg5NigpICp1MjU2LlVpbnQgeyByZXR1cm4gcy5zcXJ0UHJpY2VYOTYuQ2xvbmUoKSB9CgovLyBUaWNrIHJldHVybnMgdGhlIGN1cnJlbnQgcG9vbCB0aWNrIHJlY29yZGVkIGluIHNsb3QwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50MzI6IGN1cnJlbnQgdGljay4KZnVuYyAocyAqU2xvdDApIFRpY2soKSBpbnQzMiB7IHJldHVybiBzLnRpY2sgfQoKLy8gRmVlUHJvdG9jb2wgcmV0dXJucyB0aGUgcGFja2VkIHByb3RvY29sLWZlZSBkZW5vbWluYXRvcnMgaW4gc2xvdDAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1aW50ODogcGFja2VkIHRva2VuMC90b2tlbjEgcHJvdG9jb2wtZmVlIGRlbm9taW5hdG9yIGNvbmZpZ3VyYXRpb24uCmZ1bmMgKHMgKlNsb3QwKSBGZWVQcm90b2NvbCgpIHVpbnQ4IHsgcmV0dXJuIHMuZmVlUHJvdG9jb2wgfQoKLy8gVW5sb2NrZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBwb29sJ3MgcmVlbnRyYW5jeSBsb2NrIGlzIG9wZW4uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBib29sOiB0cnVlIHdoZW4gdW5sb2NrZWQgYW5kIGZhbHNlIHdoaWxlIHRoZSBwb29sIGlzIGxvY2tlZC4KZnVuYyAocyAqU2xvdDApIFVubG9ja2VkKCkgYm9vbCB7IHJldHVybiBzLnVubG9ja2VkIH0KCi8vIE9ic2VydmF0aW9uSW5kZXggcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1vc3QgcmVjZW50bHkgd3JpdHRlbiBvYnNlcnZhdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHVpbnQxNjogY3VycmVudCBvYnNlcnZhdGlvbiByaW5nLWJ1ZmZlciBpbmRleC4KZnVuYyAocyAqU2xvdDApIE9ic2VydmF0aW9uSW5kZXgoKSB1aW50MTYgeyByZXR1cm4gcy5vYnNlcnZhdGlvbkluZGV4IH0KCi8vIE9ic2VydmF0aW9uQ2FyZGluYWxpdHkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9uIHNsb3RzIGN1cnJlbnRseSBhdmFpbGFibGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1aW50MTY6IGN1cnJlbnQgb2JzZXJ2YXRpb24gY2FwYWNpdHkuCmZ1bmMgKHMgKlNsb3QwKSBPYnNlcnZhdGlvbkNhcmRpbmFsaXR5KCkgdWludDE2IHsgcmV0dXJuIHMub2JzZXJ2YXRpb25DYXJkaW5hbGl0eSB9CgovLyBPYnNlcnZhdGlvbkNhcmRpbmFsaXR5TmV4dCByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgZnV0dXJlIG9ic2VydmF0aW9uIGNhcGFjaXR5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gdWludDE2OiBuZXh0IG9ic2VydmF0aW9uIGNhcGFjaXR5IHRvIHVzZSB3aGVuIHRoZSByaW5nIGdyb3dzLgpmdW5jIChzICpTbG90MCkgT2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQoKSB1aW50MTYgeyByZXR1cm4gcy5vYnNlcnZhdGlvbkNhcmRpbmFsaXR5TmV4dCB9CgovLyBDbG9uZSByZXR1cm5zIGEgdmFsdWUtdHlwZSBjb3B5IG9mIFNsb3QwIHRoYXQgc2hhcmVzIG5vIG11dGFibGUgc3RhdGUgd2l0aAovLyB0aGUgb3JpZ2luYWwsIHNvIGNhbGxlcnMgY2Fubm90IHJlYWNoIGJhY2sgaW50byBwb29sIGludGVybmFscyB0aHJvdWdoIHRoZQovLyByZXR1cm5lZCBzcXJ0UHJpY2VYOTYgcG9pbnRlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIFNsb3QwOiB2YWx1ZSBjb3B5IHdpdGggYSBjbG9uZWQgc3FydC1wcmljZSBwb2ludGVyLgpmdW5jIChzICpTbG90MCkgQ2xvbmUoKSBTbG90MCB7CglyZXR1cm4gU2xvdDB7CgkJc3FydFByaWNlWDk2OiAgICAgICAgICAgICAgIHMuc3FydFByaWNlWDk2LkNsb25lKCksCgkJdGljazogICAgICAgICAgICAgICAgICAgICAgIHMudGljaywKCQlmZWVQcm90b2NvbDogICAgICAgICAgICAgICAgcy5mZWVQcm90b2NvbCwKCQl1bmxvY2tlZDogICAgICAgICAgICAgICAgICAgcy51bmxvY2tlZCwKCQlvYnNlcnZhdGlvbkluZGV4OiAgICAgICAgICAgcy5vYnNlcnZhdGlvbkluZGV4LAoJCW9ic2VydmF0aW9uQ2FyZGluYWxpdHk6ICAgICBzLm9ic2VydmF0aW9uQ2FyZGluYWxpdHksCgkJb2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQ6IHMub2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQsCgl9Cn0KCi8vIFNldFNxcnRQcmljZVg5NiB1cGRhdGVzIHRoZSBzbG90MCBzcXJ0IHByaWNlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc3FydFByaWNlWDk2OiBzcXJ0KHRva2VuMS90b2tlbjApIHByaWNlIHNjYWxlZCBieSAyXjk2OyBpdCBpcyBjbG9uZWQgYmVmb3JlIHN0b3JhZ2UuCmZ1bmMgKHMgKlNsb3QwKSBTZXRTcXJ0UHJpY2VYOTYoc3FydFByaWNlWDk2ICp1MjU2LlVpbnQpIHsgcy5zcXJ0UHJpY2VYOTYgPSBzcXJ0UHJpY2VYOTYuQ2xvbmUoKSB9CgovLyBTZXRUaWNrIHVwZGF0ZXMgdGhlIGN1cnJlbnQgc2xvdDAgdGljay4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpY2s6IGN1cnJlbnQgcG9vbCB0aWNrIHRvIHN0b3JlLgpmdW5jIChzICpTbG90MCkgU2V0VGljayh0aWNrIGludDMyKSB7IHMudGljayA9IHRpY2sgfQoKLy8gU2V0RmVlUHJvdG9jb2wgdXBkYXRlcyB0aGUgcGFja2VkIHNsb3QwIHByb3RvY29sLWZlZSBkZW5vbWluYXRvcnMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmZWVQcm90b2NvbDogcGFja2VkIHRva2VuMC90b2tlbjEgcHJvdG9jb2wtZmVlIGRlbm9taW5hdG9yIGNvbmZpZ3VyYXRpb24uCmZ1bmMgKHMgKlNsb3QwKSBTZXRGZWVQcm90b2NvbChmZWVQcm90b2NvbCB1aW50OCkgeyBzLmZlZVByb3RvY29sID0gZmVlUHJvdG9jb2wgfQoKLy8gU2V0VW5sb2NrZWQgdXBkYXRlcyB0aGUgc2xvdDAgcmVlbnRyYW5jeS1sb2NrIHN0YXRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdW5sb2NrZWQ6IHRydWUgdG8gbWFyayB0aGUgcG9vbCB1bmxvY2tlZCwgZmFsc2UgdG8gbWFyayBpdCBsb2NrZWQuCmZ1bmMgKHMgKlNsb3QwKSBTZXRVbmxvY2tlZCh1bmxvY2tlZCBib29sKSB7IHMudW5sb2NrZWQgPSB1bmxvY2tlZCB9CgovLyBTZXRPYnNlcnZhdGlvbkluZGV4IHVwZGF0ZXMgdGhlIGluZGV4IG9mIHRoZSBtb3N0IHJlY2VudGx5IHdyaXR0ZW4gb2JzZXJ2YXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBvYnNlcnZhdGlvbkluZGV4OiBvYnNlcnZhdGlvbiByaW5nLWJ1ZmZlciBpbmRleCB0byBzdG9yZS4KZnVuYyAocyAqU2xvdDApIFNldE9ic2VydmF0aW9uSW5kZXgob2JzZXJ2YXRpb25JbmRleCB1aW50MTYpIHsKCXMub2JzZXJ2YXRpb25JbmRleCA9IG9ic2VydmF0aW9uSW5kZXgKfQoKLy8gU2V0T2JzZXJ2YXRpb25DYXJkaW5hbGl0eSB1cGRhdGVzIHRoZSBjdXJyZW50IG9ic2VydmF0aW9uIGNhcGFjaXR5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gb2JzZXJ2YXRpb25DYXJkaW5hbGl0eTogY3VycmVudCBudW1iZXIgb2Ygb2JzZXJ2YXRpb24gc2xvdHMgYXZhaWxhYmxlLgpmdW5jIChzICpTbG90MCkgU2V0T2JzZXJ2YXRpb25DYXJkaW5hbGl0eShvYnNlcnZhdGlvbkNhcmRpbmFsaXR5IHVpbnQxNikgewoJcy5vYnNlcnZhdGlvbkNhcmRpbmFsaXR5ID0gb2JzZXJ2YXRpb25DYXJkaW5hbGl0eQp9CgovLyBTZXRPYnNlcnZhdGlvbkNhcmRpbmFsaXR5TmV4dCB1cGRhdGVzIHRoZSByZXF1ZXN0ZWQgZnV0dXJlIG9ic2VydmF0aW9uIGNhcGFjaXR5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gb2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQ6IG5leHQgY2FwYWNpdHkgdG8gdXNlIHdoZW4gdGhlIHJpbmcgZ3Jvd3MuCmZ1bmMgKHMgKlNsb3QwKSBTZXRPYnNlcnZhdGlvbkNhcmRpbmFsaXR5TmV4dChvYnNlcnZhdGlvbkNhcmRpbmFsaXR5TmV4dCB1aW50MTYpIHsKCXMub2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQgPSBvYnNlcnZhdGlvbkNhcmRpbmFsaXR5TmV4dAp9CgovLyBOZXdTbG90MCBjb25zdHJ1Y3RzIHNsb3QwIHdpdGggdGhlIHN1cHBsaWVkIHByaWNlLCB0aWNrLCBwcm90b2NvbCBmZWUsIGFuZCBsb2NrIHN0YXRlLgovLyBPYnNlcnZhdGlvbiBtZXRhZGF0YSBzdGFydHMgd2l0aCBpbmRleCB6ZXJvIGFuZCBjYXJkaW5hbGl0eSBvbmUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzcXJ0UHJpY2VYOTY6IGluaXRpYWwgc3FydCh0b2tlbjEvdG9rZW4wKSBwcmljZSBzY2FsZWQgYnkgMl45Ni4KLy8gICAtIHRpY2s6IGluaXRpYWwgY3VycmVudCBwb29sIHRpY2suCi8vICAgLSBmZWVQcm90b2NvbDogcGFja2VkIHRva2VuMC90b2tlbjEgcHJvdG9jb2wtZmVlIGRlbm9taW5hdG9yIGNvbmZpZ3VyYXRpb24uCi8vICAgLSB1bmxvY2tlZDogaW5pdGlhbCByZWVudHJhbmN5LWxvY2sgc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBTbG90MDogaW5pdGlhbGl6ZWQgc2xvdDAgdmFsdWUgd2l0aCBvbmUgb2JzZXJ2YXRpb24gc2xvdC4KZnVuYyBOZXdTbG90MCgKCXNxcnRQcmljZVg5NiAqdTI1Ni5VaW50LAoJdGljayBpbnQzMiwKCWZlZVByb3RvY29sIHVpbnQ4LAoJdW5sb2NrZWQgYm9vbCwKKSBTbG90MCB7CglyZXR1cm4gU2xvdDB7CgkJc3FydFByaWNlWDk2OiAgICAgICAgICAgICAgIHNxcnRQcmljZVg5Ni5DbG9uZSgpLAoJCXRpY2s6ICAgICAgICAgICAgICAgICAgICAgICB0aWNrLAoJCWZlZVByb3RvY29sOiAgICAgICAgICAgICAgICBmZWVQcm90b2NvbCwKCQl1bmxvY2tlZDogICAgICAgICAgICAgICAgICAgdW5sb2NrZWQsCgkJb2JzZXJ2YXRpb25JbmRleDogICAgICAgICAgIDAsCgkJb2JzZXJ2YXRpb25DYXJkaW5hbGl0eTogICAgIDEsCgkJb2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQ6IDEsCgl9Cn0KCi8vIFRpY2tJbmZvIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHRpY2sgaW4gdGhlIHBvb2wuCi8vIFRJY2tzIHJlcHJlc2VudCBkaXNjcmV0ZSBwcmljZSBwb2ludHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBib3VuZGFyaWVzIGZvciBwb3NpdGlvbnMuCnR5cGUgVGlja0luZm8gc3RydWN0IHsKCWxpcXVpZGl0eUdyb3NzIHN0cmluZyAvLyB0b3RhbCBwb3NpdGlvbiBsaXF1aWRpdHkgdGhhdCByZWZlcmVuY2VzIHRoaXMgdGljawoJbGlxdWlkaXR5TmV0ICAgc3RyaW5nIC8vIGFtb3VudCBvZiBuZXQgbGlxdWlkaXR5IGFkZGVkIChzdWJ0cmFjdGVkKSB3aGVuIHRpY2sgaXMgY3Jvc3NlZCBmcm9tIGxlZnQgdG8gcmlnaHQgKHJpZ2h0IHRvIGxlZnQpCgoJLy8gZmVlIGdyb3d0aCBwZXIgdW5pdCBvZiBsaXF1aWRpdHkgb24gdGhlIF9vdGhlcl8gc2lkZSBvZiB0aGlzIHRpY2sgKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHRpY2spCgkvLyBvbmx5IGhhcyByZWxhdGl2ZSBtZWFuaW5nLCBub3QgYWJzb2x1dGUg4oCUIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHdoZW4gdGhlIHRpY2sgaXMgaW5pdGlhbGl6ZWQKCWZlZUdyb3d0aE91dHNpZGUwWDEyOCBzdHJpbmcKCWZlZUdyb3d0aE91dHNpZGUxWDEyOCBzdHJpbmcKCgl0aWNrQ3VtdWxhdGl2ZU91dHNpZGUgaW50NjQgLy8gY3VtdWxhdGl2ZSB0aWNrIHZhbHVlIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSB0aWNrCgoJLy8gdGhlIHNlY29uZHMgcGVyIHVuaXQgb2YgbGlxdWlkaXR5IG9uIHRoZSBfb3RoZXJfIHNpZGUgb2YgdGhpcyB0aWNrIChyZWxhdGl2ZSB0byB0aGUgY3VycmVudCB0aWNrKQoJLy8gb25seSBoYXMgcmVsYXRpdmUgbWVhbmluZywgbm90IGFic29sdXRlIOKAlCB0aGUgdmFsdWUgZGVwZW5kcyBvbiB3aGVuIHRoZSB0aWNrIGlzIGluaXRpYWxpemVkCglzZWNvbmRzUGVyTGlxdWlkaXR5T3V0c2lkZVgxMjggc3RyaW5nCgoJLy8gdGhlIHNlY29uZHMgc3BlbnQgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIHRpY2sgKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHRpY2spCgkvLyBvbmx5IGhhcyByZWxhdGl2ZSBtZWFuaW5nLCBub3QgYWJzb2x1dGUg4oCUIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHdoZW4gdGhlIHRpY2sgaXMgaW5pdGlhbGl6ZWQKCXNlY29uZHNPdXRzaWRlIHVpbnQzMgoKCWluaXRpYWxpemVkIGJvb2wgLy8gd2hldGhlciB0aGUgdGljayBpcyBpbml0aWFsaXplZAp9CgovLyBUaWNrSW5mbyBHZXR0ZXJzIG1ldGhvZHMKLy8gTGlxdWlkaXR5R3Jvc3MgcmV0dXJucyB0b3RhbCBwb3NpdGlvbiBsaXF1aWRpdHkgcmVmZXJlbmNpbmcgdGhpcyB0aWNrLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBncm9zcyBsaXF1aWRpdHkgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgpmdW5jICh0ICpUaWNrSW5mbykgTGlxdWlkaXR5R3Jvc3MoKSBzdHJpbmcgeyByZXR1cm4gdC5saXF1aWRpdHlHcm9zcyB9CgovLyBMaXF1aWRpdHlOZXQgcmV0dXJucyBuZXQgbGlxdWlkaXR5IGFwcGxpZWQgd2hlbiB0aGlzIHRpY2sgaXMgY3Jvc3NlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogc2lnbmVkIG5ldCBsaXF1aWRpdHkgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgpmdW5jICh0ICpUaWNrSW5mbykgTGlxdWlkaXR5TmV0KCkgc3RyaW5nIHsgcmV0dXJuIHQubGlxdWlkaXR5TmV0IH0KCi8vIEZlZUdyb3d0aE91dHNpZGUwWDEyOCByZXR1cm5zIHRva2VuMCBmZWUgZ3Jvd3RoIG9uIHRoZSBzaWRlIG9mIHRoaXMgdGljayBvcHBvc2l0ZSB0aGUgY3VycmVudCB0aWNrLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiB0b2tlbjAgb3V0c2lkZSBmZWUtZ3Jvd3RoIGFjY3VtdWxhdG9yIHNjYWxlZCBieSAyXjEyOC4KZnVuYyAodCAqVGlja0luZm8pIEZlZUdyb3d0aE91dHNpZGUwWDEyOCgpIHN0cmluZyB7IHJldHVybiB0LmZlZUdyb3d0aE91dHNpZGUwWDEyOCB9CgovLyBGZWVHcm93dGhPdXRzaWRlMVgxMjggcmV0dXJucyB0b2tlbjEgZmVlIGdyb3d0aCBvbiB0aGUgc2lkZSBvZiB0aGlzIHRpY2sgb3Bwb3NpdGUgdGhlIGN1cnJlbnQgdGljay4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0cmluZzogdG9rZW4xIG91dHNpZGUgZmVlLWdyb3d0aCBhY2N1bXVsYXRvciBzY2FsZWQgYnkgMl4xMjguCmZ1bmMgKHQgKlRpY2tJbmZvKSBGZWVHcm93dGhPdXRzaWRlMVgxMjgoKSBzdHJpbmcgeyByZXR1cm4gdC5mZWVHcm93dGhPdXRzaWRlMVgxMjggfQoKLy8gU2Vjb25kc1BlckxpcXVpZGl0eU91dHNpZGVYMTI4IHJldHVybnMgc2Vjb25kcyBwZXIgbGlxdWlkaXR5IG91dHNpZGUgdGhpcyB0aWNrLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiBvdXRzaWRlIHNlY29uZHMtcGVyLWxpcXVpZGl0eSBhY2N1bXVsYXRvciBzY2FsZWQgYnkgMl4xMjguCmZ1bmMgKHQgKlRpY2tJbmZvKSBTZWNvbmRzUGVyTGlxdWlkaXR5T3V0c2lkZVgxMjgoKSBzdHJpbmcgewoJcmV0dXJuIHQuc2Vjb25kc1BlckxpcXVpZGl0eU91dHNpZGVYMTI4Cn0KCi8vIFNlY29uZHNPdXRzaWRlIHJldHVybnMgdGhlIHRpbWUgc3BlbnQgb24gdGhlIHNpZGUgb2YgdGhpcyB0aWNrIG9wcG9zaXRlIHRoZSBjdXJyZW50IHRpY2suCi8vCi8vIFJldHVybnM6Ci8vICAgLSB1aW50MzI6IHNlY29uZHMgYWNjdW11bGF0ZWQgb3V0c2lkZSB0aGUgdGljay4KZnVuYyAodCAqVGlja0luZm8pIFNlY29uZHNPdXRzaWRlKCkgdWludDMyIHsgcmV0dXJuIHQuc2Vjb25kc091dHNpZGUgfQoKLy8gSW5pdGlhbGl6ZWQgcmVwb3J0cyB3aGV0aGVyIHRoaXMgdGljayBoYXMgYWN0aXZlIGluaXRpYWxpemVkIHN0YXRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYm9vbDogdHJ1ZSB3aGVuIHRoZSB0aWNrIGlzIGluaXRpYWxpemVkOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgKHQgKlRpY2tJbmZvKSBJbml0aWFsaXplZCgpIGJvb2wgeyByZXR1cm4gdC5pbml0aWFsaXplZCB9CgovLyBUaWNrQ3VtdWxhdGl2ZU91dHNpZGUgcmV0dXJucyBjdW11bGF0aXZlIHRpY2sgdmFsdWUgb24gdGhlIHNpZGUgb3Bwb3NpdGUgdGhlIGN1cnJlbnQgdGljay4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiBvdXRzaWRlIGN1bXVsYXRpdmUgdGljayB2YWx1ZS4KZnVuYyAodCAqVGlja0luZm8pIFRpY2tDdW11bGF0aXZlT3V0c2lkZSgpIGludDY0IHsgcmV0dXJuIHQudGlja0N1bXVsYXRpdmVPdXRzaWRlIH0KCi8vIFRpY2tJbmZvIFNldHRlcnMgbWV0aG9kcwovLyBTZXRMaXF1aWRpdHlHcm9zcyBzdG9yZXMgdG90YWwgcG9zaXRpb24gbGlxdWlkaXR5IHJlZmVyZW5jaW5nIHRoaXMgdGljay4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGxpcXVpZGl0eUdyb3NzOiBncm9zcyBsaXF1aWRpdHkgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgpmdW5jICh0ICpUaWNrSW5mbykgU2V0TGlxdWlkaXR5R3Jvc3MobGlxdWlkaXR5R3Jvc3Mgc3RyaW5nKSB7Cgl0LmxpcXVpZGl0eUdyb3NzID0gbGlxdWlkaXR5R3Jvc3MKfQoKLy8gU2V0TGlxdWlkaXR5TmV0IHN0b3JlcyB0aGUgbmV0IGxpcXVpZGl0eSBjaGFuZ2UgYXBwbGllZCB3aGVuIGNyb3NzaW5nIHRoaXMgdGljay4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGxpcXVpZGl0eU5ldDogc2lnbmVkIG5ldCBsaXF1aWRpdHkgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgpmdW5jICh0ICpUaWNrSW5mbykgU2V0TGlxdWlkaXR5TmV0KGxpcXVpZGl0eU5ldCBzdHJpbmcpIHsKCXQubGlxdWlkaXR5TmV0ID0gbGlxdWlkaXR5TmV0Cn0KCi8vIFNldEZlZUdyb3d0aE91dHNpZGUwWDEyOCBzdG9yZXMgdG9rZW4wIG91dHNpZGUgZmVlIGdyb3d0aCBmb3IgdGhpcyB0aWNrLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZmVlR3Jvd3RoT3V0c2lkZTBYMTI4OiB0b2tlbjAgb3V0c2lkZSBmZWUgZ3Jvd3RoIHNjYWxlZCBieSAyXjEyOCwgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgpmdW5jICh0ICpUaWNrSW5mbykgU2V0RmVlR3Jvd3RoT3V0c2lkZTBYMTI4KGZlZUdyb3d0aE91dHNpZGUwWDEyOCBzdHJpbmcpIHsKCXQuZmVlR3Jvd3RoT3V0c2lkZTBYMTI4ID0gZmVlR3Jvd3RoT3V0c2lkZTBYMTI4Cn0KCi8vIFNldEZlZUdyb3d0aE91dHNpZGUxWDEyOCBzdG9yZXMgdG9rZW4xIG91dHNpZGUgZmVlIGdyb3d0aCBmb3IgdGhpcyB0aWNrLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZmVlR3Jvd3RoT3V0c2lkZTFYMTI4OiB0b2tlbjEgb3V0c2lkZSBmZWUgZ3Jvd3RoIHNjYWxlZCBieSAyXjEyOCwgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgpmdW5jICh0ICpUaWNrSW5mbykgU2V0RmVlR3Jvd3RoT3V0c2lkZTFYMTI4KGZlZUdyb3d0aE91dHNpZGUxWDEyOCBzdHJpbmcpIHsKCXQuZmVlR3Jvd3RoT3V0c2lkZTFYMTI4ID0gZmVlR3Jvd3RoT3V0c2lkZTFYMTI4Cn0KCi8vIFNldFNlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyOCBzdG9yZXMgb3V0c2lkZSBzZWNvbmRzLXBlci1saXF1aWRpdHkgZ3Jvd3RoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gc2Vjb25kc1BlckxpcXVpZGl0eU91dHNpZGVYMTI4OiBvdXRzaWRlIHNlY29uZHMgcGVyIGxpcXVpZGl0eSBzY2FsZWQgYnkgMl4xMjgsIGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZy4KZnVuYyAodCAqVGlja0luZm8pIFNldFNlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyOChzZWNvbmRzUGVyTGlxdWlkaXR5T3V0c2lkZVgxMjggc3RyaW5nKSB7Cgl0LnNlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyOCA9IHNlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyOAp9CgovLyBTZXRTZWNvbmRzT3V0c2lkZSBzdG9yZXMgdGhlIHNlY29uZHMgYWNjdW11bGF0ZWQgb3V0c2lkZSB0aGlzIHRpY2suCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBzZWNvbmRzT3V0c2lkZTogZWxhcHNlZCBzZWNvbmRzIG91dHNpZGUgdGhlIHRpY2suCmZ1bmMgKHQgKlRpY2tJbmZvKSBTZXRTZWNvbmRzT3V0c2lkZShzZWNvbmRzT3V0c2lkZSB1aW50MzIpIHsKCXQuc2Vjb25kc091dHNpZGUgPSBzZWNvbmRzT3V0c2lkZQp9CgovLyBTZXRJbml0aWFsaXplZCB1cGRhdGVzIHdoZXRoZXIgdGhpcyB0aWNrIGlzIGluaXRpYWxpemVkLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gaW5pdGlhbGl6ZWQ6IHRydWUgdG8gbWFyayB0aGUgdGljayBpbml0aWFsaXplZCwgZmFsc2Ugb3RoZXJ3aXNlLgpmdW5jICh0ICpUaWNrSW5mbykgU2V0SW5pdGlhbGl6ZWQoaW5pdGlhbGl6ZWQgYm9vbCkgewoJdC5pbml0aWFsaXplZCA9IGluaXRpYWxpemVkCn0KCi8vIFNldFRpY2tDdW11bGF0aXZlT3V0c2lkZSBzdG9yZXMgY3VtdWxhdGl2ZSB0aWNrIHZhbHVlIG91dHNpZGUgdGhpcyB0aWNrLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGlja0N1bXVsYXRpdmVPdXRzaWRlOiBjdW11bGF0aXZlIHRpY2sgdmFsdWUgb24gdGhlIG9wcG9zaXRlIHNpZGUuCmZ1bmMgKHQgKlRpY2tJbmZvKSBTZXRUaWNrQ3VtdWxhdGl2ZU91dHNpZGUodGlja0N1bXVsYXRpdmVPdXRzaWRlIGludDY0KSB7Cgl0LnRpY2tDdW11bGF0aXZlT3V0c2lkZSA9IHRpY2tDdW11bGF0aXZlT3V0c2lkZQp9CgovLyBDbG9uZSByZXR1cm5zIGFuIGluZGVwZW5kZW50IHZhbHVlIGNvcHkgb2YgdGhpcyB0aWNrJ3Mgc3RvcmVkIHN0YXRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gVGlja0luZm86IGNvcGllZCBsaXF1aWRpdHksIGZlZS1ncm93dGgsIHRpbWUsIGFuZCBpbml0aWFsaXphdGlvbiBmaWVsZHMuCmZ1bmMgKHQgKlRpY2tJbmZvKSBDbG9uZSgpIFRpY2tJbmZvIHsKCXJldHVybiBUaWNrSW5mb3sKCQlmZWVHcm93dGhPdXRzaWRlMFgxMjg6ICAgICAgICAgIHQuZmVlR3Jvd3RoT3V0c2lkZTBYMTI4LAoJCWZlZUdyb3d0aE91dHNpZGUxWDEyODogICAgICAgICAgdC5mZWVHcm93dGhPdXRzaWRlMVgxMjgsCgkJbGlxdWlkaXR5R3Jvc3M6ICAgICAgICAgICAgICAgICB0LmxpcXVpZGl0eUdyb3NzLAoJCWxpcXVpZGl0eU5ldDogICAgICAgICAgICAgICAgICAgdC5saXF1aWRpdHlOZXQsCgkJdGlja0N1bXVsYXRpdmVPdXRzaWRlOiAgICAgICAgICB0LnRpY2tDdW11bGF0aXZlT3V0c2lkZSwKCQlzZWNvbmRzUGVyTGlxdWlkaXR5T3V0c2lkZVgxMjg6IHQuc2Vjb25kc1BlckxpcXVpZGl0eU91dHNpZGVYMTI4LAoJCXNlY29uZHNPdXRzaWRlOiAgICAgICAgICAgICAgICAgdC5zZWNvbmRzT3V0c2lkZSwKCQlpbml0aWFsaXplZDogICAgICAgICAgICAgICAgICAgIHQuaW5pdGlhbGl6ZWQsCgl9Cn0KCi8vIE5ld1RpY2tJbmZvIGNyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCB0aWNrIHN0YXRlIHdpdGggemVybyBhY2N1bXVsYXRvcnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBUaWNrSW5mbzogZGVmYXVsdCB0aWNrIHN0YXRlIHdpdGggYWxsIG51bWVyaWMgZmllbGRzIHplcm8gYW5kIEluaXRpYWxpemVkIGZhbHNlLgpmdW5jIE5ld1RpY2tJbmZvKCkgVGlja0luZm8gewoJcmV0dXJuIFRpY2tJbmZvewoJCWxpcXVpZGl0eUdyb3NzOiAgICAgICAgICAgICAgICAgIjAiLAoJCWxpcXVpZGl0eU5ldDogICAgICAgICAgICAgICAgICAgIjAiLAoJCWZlZUdyb3d0aE91dHNpZGUwWDEyODogICAgICAgICAgIjAiLAoJCWZlZUdyb3d0aE91dHNpZGUxWDEyODogICAgICAgICAgIjAiLAoJCXNlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyODogIjAiLAoJCXNlY29uZHNPdXRzaWRlOiAgICAgICAgICAgICAgICAgMCwKCQlpbml0aWFsaXplZDogICAgICAgICAgICAgICAgICAgIGZhbHNlLAoJCXRpY2tDdW11bGF0aXZlT3V0c2lkZTogICAgICAgICAgMCwKCX0KfQoKLy8gUG9zaXRpb25JbmZvIHN0b3JlcyBhZ2dyZWdhdGUgbGlxdWlkaXR5LCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnRzLCBhbmQgdG9rZW5zCi8vIG93ZWQgZm9yIG9uZSBwb29sLXNjb3BlZCBsb3dlci91cHBlciB0aWNrIGtleS4KdHlwZSBQb3NpdGlvbkluZm8gc3RydWN0IHsKCWxpcXVpZGl0eSAgICAgICAgICAgICAgICBzdHJpbmcgLy8gYWdncmVnYXRlIGxpcXVpZGl0eSBmb3IgdGhpcyB0aWNrLXJhbmdlIGtleQoJZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4IHN0cmluZyAvLyBmZWUgZ3Jvd3RoIHBlciB1bml0IG9mIGxpcXVpZGl0eSBmb3IgdG9rZW4wIGFzIG9mIGxhc3QgdXBkYXRlCglmZWVHcm93dGhJbnNpZGUxTGFzdFgxMjggc3RyaW5nIC8vIGZlZSBncm93dGggcGVyIHVuaXQgb2YgbGlxdWlkaXR5IGZvciB0b2tlbjEgYXMgb2YgbGFzdCB1cGRhdGUKCgkvLyBhY2N1bXVsYXRlZCB0b2tlbjAgYW1vdW50IHdhaXRpbmcgdG8gYmUgY29sbGVjdGVkIChwcmluY2lwYWwgb3Igc3dhcCBmZWUpCgl0b2tlbnNPd2VkMCBpbnQ2NAoKCS8vIGFjY3VtdWxhdGVkIHRva2VuMSBhbW91bnQgd2FpdGluZyB0byBiZSBjb2xsZWN0ZWQgKHByaW5jaXBhbCBvciBzd2FwIGZlZSkKCXRva2Vuc093ZWQxIGludDY0Cn0KCi8vIExpcXVpZGl0eSByZXR1cm5zIGFnZ3JlZ2F0ZSBsaXF1aWRpdHkgZm9yIHRoaXMgcG9zaXRpb24gcmFuZ2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdHJpbmc6IHBvc2l0aW9uIGxpcXVpZGl0eSBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcuCmZ1bmMgKHAgKlBvc2l0aW9uSW5mbykgTGlxdWlkaXR5KCkgc3RyaW5nIHsgcmV0dXJuIHAubGlxdWlkaXR5IH0KCi8vIEZlZUdyb3d0aEluc2lkZTBMYXN0WDEyOCByZXR1cm5zIHRoZSB0b2tlbjAgZmVlLWdyb3d0aCBjaGVja3BvaW50IGZvciB0aGlzIHBvc2l0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiB0b2tlbjAgaW5zaWRlIGZlZS1ncm93dGggY2hlY2twb2ludCBzY2FsZWQgYnkgMl4xMjguCmZ1bmMgKHAgKlBvc2l0aW9uSW5mbykgRmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4KCkgc3RyaW5nIHsgcmV0dXJuIHAuZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4IH0KCi8vIEZlZUdyb3d0aEluc2lkZTFMYXN0WDEyOCByZXR1cm5zIHRoZSB0b2tlbjEgZmVlLWdyb3d0aCBjaGVja3BvaW50IGZvciB0aGlzIHBvc2l0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RyaW5nOiB0b2tlbjEgaW5zaWRlIGZlZS1ncm93dGggY2hlY2twb2ludCBzY2FsZWQgYnkgMl4xMjguCmZ1bmMgKHAgKlBvc2l0aW9uSW5mbykgRmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4KCkgc3RyaW5nIHsgcmV0dXJuIHAuZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4IH0KCi8vIFRva2Vuc093ZWQwIHJldHVybnMgdG9rZW4wIGFjY3VtdWxhdGVkIGZvciB0aGlzIHBvc2l0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW50NjQ6IHRva2VuMCBwcmluY2lwYWwgb3IgZmVlIGFtb3VudCBhd2FpdGluZyBjb2xsZWN0aW9uLgpmdW5jIChwICpQb3NpdGlvbkluZm8pIFRva2Vuc093ZWQwKCkgaW50NjQgeyByZXR1cm4gcC50b2tlbnNPd2VkMCB9CgovLyBUb2tlbnNPd2VkMSByZXR1cm5zIHRva2VuMSBhY2N1bXVsYXRlZCBmb3IgdGhpcyBwb3NpdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGludDY0OiB0b2tlbjEgcHJpbmNpcGFsIG9yIGZlZSBhbW91bnQgYXdhaXRpbmcgY29sbGVjdGlvbi4KZnVuYyAocCAqUG9zaXRpb25JbmZvKSBUb2tlbnNPd2VkMSgpIGludDY0IHsgcmV0dXJuIHAudG9rZW5zT3dlZDEgfQoKLy8gU2V0TGlxdWlkaXR5IHVwZGF0ZXMgYWdncmVnYXRlIGxpcXVpZGl0eSBmb3IgdGhpcyBwb3NpdGlvbiByYW5nZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGxpcXVpZGl0eTogcG9zaXRpb24gbGlxdWlkaXR5IGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZy4KZnVuYyAocCAqUG9zaXRpb25JbmZvKSBTZXRMaXF1aWRpdHkobGlxdWlkaXR5IHN0cmluZykgewoJcC5saXF1aWRpdHkgPSBsaXF1aWRpdHkKfQoKLy8gU2V0RmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4IHVwZGF0ZXMgdGhlIHRva2VuMCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBmZWVHcm93dGhJbnNpZGUwTGFzdFgxMjg6IHRva2VuMCBpbnNpZGUgZmVlLWdyb3d0aCBjaGVja3BvaW50IHNjYWxlZCBieSAyXjEyOCwgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgpmdW5jIChwICpQb3NpdGlvbkluZm8pIFNldEZlZUdyb3d0aEluc2lkZTBMYXN0WDEyOChmZWVHcm93dGhJbnNpZGUwTGFzdFgxMjggc3RyaW5nKSB7CglwLmZlZUdyb3d0aEluc2lkZTBMYXN0WDEyOCA9IGZlZUdyb3d0aEluc2lkZTBMYXN0WDEyOAp9CgovLyBTZXRGZWVHcm93dGhJbnNpZGUxTGFzdFgxMjggdXBkYXRlcyB0aGUgdG9rZW4xIGZlZS1ncm93dGggY2hlY2twb2ludC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGZlZUdyb3d0aEluc2lkZTFMYXN0WDEyODogdG9rZW4xIGluc2lkZSBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgc2NhbGVkIGJ5IDJeMTI4LCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcuCmZ1bmMgKHAgKlBvc2l0aW9uSW5mbykgU2V0RmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4KGZlZUdyb3d0aEluc2lkZTFMYXN0WDEyOCBzdHJpbmcpIHsKCXAuZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4ID0gZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4Cn0KCi8vIFNldFRva2Vuc093ZWQwIHVwZGF0ZXMgdG9rZW4wIGFjY3VtdWxhdGVkIGZvciB0aGlzIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5zT3dlZDA6IHRva2VuMCBwcmluY2lwYWwgb3IgZmVlIGFtb3VudCBhd2FpdGluZyBjb2xsZWN0aW9uLgpmdW5jIChwICpQb3NpdGlvbkluZm8pIFNldFRva2Vuc093ZWQwKHRva2Vuc093ZWQwIGludDY0KSB7CglwLnRva2Vuc093ZWQwID0gdG9rZW5zT3dlZDAKfQoKLy8gU2V0VG9rZW5zT3dlZDEgdXBkYXRlcyB0b2tlbjEgYWNjdW11bGF0ZWQgZm9yIHRoaXMgcG9zaXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlbnNPd2VkMTogdG9rZW4xIHByaW5jaXBhbCBvciBmZWUgYW1vdW50IGF3YWl0aW5nIGNvbGxlY3Rpb24uCmZ1bmMgKHAgKlBvc2l0aW9uSW5mbykgU2V0VG9rZW5zT3dlZDEodG9rZW5zT3dlZDEgaW50NjQpIHsKCXAudG9rZW5zT3dlZDEgPSB0b2tlbnNPd2VkMQp9CgovLyBOZXdQb3NpdGlvbkluZm8gY3JlYXRlcyBhIHplcm9lZCBwb3NpdGlvbiBzdGF0ZSBmb3IgYSB0aWNrIHJhbmdlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gUG9zaXRpb25JbmZvOiBwb3NpdGlvbiB3aXRoIHplcm8gbGlxdWlkaXR5LCBmZWUtZ3Jvd3RoIGNoZWNrcG9pbnRzLCBhbmQgb3dlZCB0b2tlbnMuCmZ1bmMgTmV3UG9zaXRpb25JbmZvKCkgUG9zaXRpb25JbmZvIHsKCXJldHVybiBQb3NpdGlvbkluZm97CgkJbGlxdWlkaXR5OiAgICAgICAgICAgICAgICAiMCIsCgkJZmVlR3Jvd3RoSW5zaWRlMExhc3RYMTI4OiAiMCIsCgkJZmVlR3Jvd3RoSW5zaWRlMUxhc3RYMTI4OiAiMCIsCgkJdG9rZW5zT3dlZDA6ICAgICAgICAgICAgICAwLAoJCXRva2Vuc093ZWQxOiAgICAgICAgICAgICAgMCwKCX0KfQoKLy8gTmV3RGVmYXVsdEZlZUFtb3VudFRpY2tTcGFjaW5nIHJldHVybnMgdGhlIGRlZmF1bHQgdGljayBzcGFjaW5nIGZvciBlYWNoIHN1cHBvcnRlZCBmZWUgdGllci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1hcFt1aW50MzJdaW50MzI6IGZlZS10aWVyIHRvIHRpY2stc3BhY2luZyBtYXBwaW5nIGZvciAxMDAsIDUwMCwgMzAwMCwgYW5kIDEwMDAwIHRpZXJzLgpmdW5jIE5ld0RlZmF1bHRGZWVBbW91bnRUaWNrU3BhY2luZygpIG1hcFt1aW50MzJdaW50MzIgewoJcmV0dXJuIG1hcFt1aW50MzJdaW50MzJ7CgkJMTAwOiAgIDEsCgkJNTAwOiAgIDEwLAoJCTMwMDA6ICA2MCwKCQkxMDAwMDogMjAwLAoJfQp9ChqdcgoJcHJveHkuZ25vEo9ycGFja2FnZSBwb29sCgovLyBDcmVhdGVQb29sIGNyZWF0ZXMgYSBuZXcgbGlxdWlkaXR5IHBvb2wgZm9yIGEgdG9rZW4gcGFpci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzCi8vICAgICByZWFsbS4KLy8gICAtIHRva2VuMFBhdGg6IFRva2VuIGNvbnRyYWN0IHBhdGggc3VwcGxpZWQgZm9yIHRva2VuMDsgdGhlIHBvb2wgb3JkZXJzIHRoZQovLyAgICAgcGFpciBjYW5vbmljYWxseSByYXRoZXIgdGhhbiBwcmVzZXJ2aW5nIHRoZSBzdXBwbGllZCBvcmRlci4KLy8gICAtIHRva2VuMVBhdGg6IFRva2VuIGNvbnRyYWN0IHBhdGggc3VwcGxpZWQgZm9yIHRva2VuMTsgbXVzdCBmb3JtIGEgZGlzdGluY3QKLy8gICAgIHJlZ2lzdGVyZWQgcGFpciB3aXRoIHRva2VuMFBhdGguCi8vICAgLSBmZWU6IEZlZSB0aWVyIGZvciB0aGUgcG9vbDsgZGV0ZXJtaW5lcyBpdHMgdGljayBzcGFjaW5nIGFuZCBzd2FwIGZlZS4KLy8gICAtIHNxcnRQcmljZVg5NjogSW5pdGlhbCBzcXVhcmUtcm9vdCBwcmljZSBpbiBRNjQuOTYgZml4ZWQtcG9pbnQgZm9ybTsgaXQgaXMKLy8gICAgIGludmVydGVkIHdoZW4gdGhlIHN1cHBsaWVkIHRva2VuIG9yZGVyIGlzIHJldmVyc2VkIGFuZCBtdXN0IGJlIGluIGJvdW5kcy4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgUG9vbCBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDcmVhdGVQb29sKAoJY3VyIHJlYWxtLAoJdG9rZW4wUGF0aCBzdHJpbmcsCgl0b2tlbjFQYXRoIHN0cmluZywKCWZlZSB1aW50MzIsCglzcXJ0UHJpY2VYOTYgc3RyaW5nLAopIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ3JlYXRlUG9vbCgKCQkwLAoJCWN1ciwKCQl0b2tlbjBQYXRoLAoJCXRva2VuMVBhdGgsCgkJZmVlLAoJCXNxcnRQcmljZVg5NiwKCSkKfQoKLy8gU2V0UG9vbENyZWF0aW9uRmVlIHNldHMgdGhlIHBvb2wgY3JlYXRpb24gZmVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMKLy8gICAgIHJlYWxtLgovLyAgIC0gZmVlOiBOZXcgcG9vbCBjcmVhdGlvbiBmZWUsIGluIHRoZSBjb25maWd1cmVkIG5hdGl2ZS10b2tlbiBiYXNlIHVuaXRzLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBQb29sIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIFNldFBvb2xDcmVhdGlvbkZlZShjdXIgcmVhbG0sIGZlZSBpbnQ2NCkgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5TZXRQb29sQ3JlYXRpb25GZWUoMCwgY3VyLCBmZWUpCn0KCi8vIEluY3JlYXNlT2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQgaW5jcmVhc2VzIHRoZSBvYnNlcnZhdGlvbiBjYXJkaW5hbGl0eSBmb3IgYSBwb29sLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMKLy8gICAgIHJlYWxtLgovLyAgIC0gdG9rZW4wUGF0aDogUGF0aCBvZiB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIHBvb2wgcGFpci4KLy8gICAtIHRva2VuMVBhdGg6IFBhdGggb2YgdGhlIHNlY29uZCB0b2tlbiBpbiB0aGUgcG9vbCBwYWlyLgovLyAgIC0gZmVlOiBGZWUgdGllciBpZGVudGlmeWluZyB0aGUgcG9vbC4KLy8gICAtIGNhcmRpbmFsaXR5TmV4dDogUmVxdWVzdGVkIG1heGltdW0gbnVtYmVyIG9mIG9yYWNsZSBvYnNlcnZhdGlvbnMgcmV0YWluZWQKLy8gICAgIGZvciB0aGUgcG9vbC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgUG9vbCBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBJbmNyZWFzZU9ic2VydmF0aW9uQ2FyZGluYWxpdHlOZXh0KAoJY3VyIHJlYWxtLAoJdG9rZW4wUGF0aCBzdHJpbmcsCgl0b2tlbjFQYXRoIHN0cmluZywKCWZlZSB1aW50MzIsCgljYXJkaW5hbGl0eU5leHQgdWludDE2LAopIHsKCWdldEltcGxlbWVudGF0aW9uKCkuSW5jcmVhc2VPYnNlcnZhdGlvbkNhcmRpbmFsaXR5TmV4dCgKCQkwLAoJCWN1ciwKCQl0b2tlbjBQYXRoLAoJCXRva2VuMVBhdGgsCgkJZmVlLAoJCWNhcmRpbmFsaXR5TmV4dCwKCSkKfQoKLy8gTWludCBhZGRzIGxpcXVpZGl0eSB0byBhIHBvc2l0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMKLy8gICAgIHJlYWxtLgovLyAgIC0gdG9rZW4wUGF0aDogUGF0aCBvZiB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIHBvb2wgcGFpci4KLy8gICAtIHRva2VuMVBhdGg6IFBhdGggb2YgdGhlIHNlY29uZCB0b2tlbiBpbiB0aGUgcG9vbCBwYWlyLgovLyAgIC0gZmVlOiBGZWUgdGllciBpZGVudGlmeWluZyB0aGUgcG9vbC4KLy8gICAtIHRpY2tMb3dlcjogTG93ZXIgaW5jbHVzaXZlIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uIHJhbmdlLgovLyAgIC0gdGlja1VwcGVyOiBVcHBlciBleGNsdXNpdmUgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24gcmFuZ2UuCi8vICAgLSBsaXF1aWRpdHlBbW91bnQ6IERlY2ltYWwgbGlxdWlkaXR5IGFtb3VudCB0byBhZGQgdG8gdGhlIHBvc2l0aW9uLgovLyAgIC0gcG9zaXRpb25DYWxsZXI6IFBvc2l0aW9uLWNvbnRyYWN0IGFkZHJlc3Mgd2hvc2UgcG9zaXRpb24gcmVjZWl2ZXMgdGhlCi8vICAgICBsaXF1aWRpdHkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQwOiBUb2tlbjAgYW1vdW50IHJlcXVpcmVkIGZvciB0aGUgbGlxdWlkaXR5IGFkZGl0aW9uLCBhcyBhIGRlY2ltYWwKLy8gICAgIHN0cmluZy4KLy8gICAtIGFtb3VudDE6IFRva2VuMSBhbW91bnQgcmVxdWlyZWQgZm9yIHRoZSBsaXF1aWRpdHkgYWRkaXRpb24sIGFzIGEgZGVjaW1hbAovLyAgICAgc3RyaW5nLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBQb29sIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIE1pbnQoCgljdXIgcmVhbG0sCgl0b2tlbjBQYXRoIHN0cmluZywKCXRva2VuMVBhdGggc3RyaW5nLAoJZmVlIHVpbnQzMiwKCXRpY2tMb3dlciBpbnQzMiwKCXRpY2tVcHBlciBpbnQzMiwKCWxpcXVpZGl0eUFtb3VudCBzdHJpbmcsCglwb3NpdGlvbkNhbGxlciBhZGRyZXNzLAopIChzdHJpbmcsIHN0cmluZykgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuTWludCgKCQkwLAoJCWN1ciwKCQl0b2tlbjBQYXRoLAoJCXRva2VuMVBhdGgsCgkJZmVlLAoJCXRpY2tMb3dlciwKCQl0aWNrVXBwZXIsCgkJbGlxdWlkaXR5QW1vdW50LAoJCXBvc2l0aW9uQ2FsbGVyLAoJKQp9CgovLyBCdXJuIHJlbW92ZXMgbGlxdWlkaXR5IGZyb20gYSBwb3NpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzCi8vICAgICByZWFsbS4KLy8gICAtIHRva2VuMFBhdGg6IFBhdGggb2YgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBwb29sIHBhaXIuCi8vICAgLSB0b2tlbjFQYXRoOiBQYXRoIG9mIHRoZSBzZWNvbmQgdG9rZW4gaW4gdGhlIHBvb2wgcGFpci4KLy8gICAtIGZlZTogRmVlIHRpZXIgaWRlbnRpZnlpbmcgdGhlIHBvb2wuCi8vICAgLSB0aWNrTG93ZXI6IExvd2VyIGluY2x1c2l2ZSB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbiByYW5nZS4KLy8gICAtIHRpY2tVcHBlcjogVXBwZXIgZXhjbHVzaXZlIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uIHJhbmdlLgovLyAgIC0gbGlxdWlkaXR5QW1vdW50OiBEZWNpbWFsIGxpcXVpZGl0eSBhbW91bnQgdG8gcmVtb3ZlIGZyb20gdGhlIHBvc2l0aW9uLgovLyAgIC0gcG9zaXRpb25DYWxsZXI6IFBvc2l0aW9uLWNvbnRyYWN0IGFkZHJlc3Mgd2hvc2UgcG9zaXRpb24gaXMgZGVjcmVhc2VkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50MDogVG9rZW4wIHByaW5jaXBhbCBjcmVkaXRlZCB0byB0aGUgcG9zaXRpb24sIGFzIGEgZGVjaW1hbCBzdHJpbmc7Ci8vICAgICB0aGUgcG9vbCBvcGVyYXRpb24gbGVhdmVzIGl0IG93ZWQgdW50aWwgYSBzdWJzZXF1ZW50IGNvbGxlY3Rpb24uCi8vICAgLSBhbW91bnQxOiBUb2tlbjEgcHJpbmNpcGFsIGNyZWRpdGVkIHRvIHRoZSBwb3NpdGlvbiwgYXMgYSBkZWNpbWFsIHN0cmluZzsKLy8gICAgIHRoZSBwb29sIG9wZXJhdGlvbiBsZWF2ZXMgaXQgb3dlZCB1bnRpbCBhIHN1YnNlcXVlbnQgY29sbGVjdGlvbi4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgV2l0aGRyYXcgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgQnVybigKCWN1ciByZWFsbSwKCXRva2VuMFBhdGggc3RyaW5nLAoJdG9rZW4xUGF0aCBzdHJpbmcsCglmZWUgdWludDMyLAoJdGlja0xvd2VyIGludDMyLAoJdGlja1VwcGVyIGludDMyLAoJbGlxdWlkaXR5QW1vdW50IHN0cmluZywKCXBvc2l0aW9uQ2FsbGVyIGFkZHJlc3MsCikgKHN0cmluZywgc3RyaW5nKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5CdXJuKAoJCTAsCgkJY3VyLAoJCXRva2VuMFBhdGgsCgkJdG9rZW4xUGF0aCwKCQlmZWUsCgkJdGlja0xvd2VyLAoJCXRpY2tVcHBlciwKCQlsaXF1aWRpdHlBbW91bnQsCgkJcG9zaXRpb25DYWxsZXIsCgkpCn0KCi8vIENvbGxlY3RTd2FwRmVlIHBheXMgYWNjcnVlZCBzd2FwIGZlZXMgZm9yIGEgcG9zaXRpb24gb3V0IHRvIHJlY2lwaWVudCwKLy8gbmV0IG9mIHRoZSB3aXRoZHJhd2FsIGZlZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzCi8vICAgICByZWFsbS4KLy8gICAtIHRva2VuMFBhdGg6IFBhdGggb2YgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBwb29sIHBhaXIuCi8vICAgLSB0b2tlbjFQYXRoOiBQYXRoIG9mIHRoZSBzZWNvbmQgdG9rZW4gaW4gdGhlIHBvb2wgcGFpci4KLy8gICAtIGZlZTogRmVlIHRpZXIgaWRlbnRpZnlpbmcgdGhlIHBvb2wuCi8vICAgLSByZWNpcGllbnQ6IE5vbi16ZXJvIGFkZHJlc3MgcmVjZWl2aW5nIHRoZSBjb2xsZWN0ZWQgdG9rZW4gYW1vdW50cyBhZnRlcgovLyAgICAgd2l0aGRyYXdhbC1mZWUgZGVkdWN0aW9uLgovLyAgIC0gdGlja0xvd2VyOiBMb3dlciBpbmNsdXNpdmUgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24gcmFuZ2UuCi8vICAgLSB0aWNrVXBwZXI6IFVwcGVyIGV4Y2x1c2l2ZSB0aWNrIGJvdW5kYXJ5IG9mIHRoZSBwb3NpdGlvbiByYW5nZS4KLy8gICAtIGFtb3VudDBSZXF1ZXN0ZWQ6IERlY2ltYWwgdG9rZW4wIGFtb3VudCByZXF1ZXN0ZWQ7IHRoZSBjb25maWd1cmVkIG1heGltdW0KLy8gICAgIHZhbHVlIHJlcXVlc3RzIGFsbCB0b2tlbjAgZmVlcyBvd2VkLgovLyAgIC0gYW1vdW50MVJlcXVlc3RlZDogRGVjaW1hbCB0b2tlbjEgYW1vdW50IHJlcXVlc3RlZDsgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bQovLyAgICAgdmFsdWUgcmVxdWVzdHMgYWxsIHRva2VuMSBmZWVzIG93ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQwOiBDb2xsZWN0ZWQgdG9rZW4wIGFtb3VudCBiZWZvcmUgd2l0aGRyYXdhbC1mZWUgZGVkdWN0aW9uLCBhcyBhCi8vICAgICBkZWNpbWFsIHN0cmluZy4KLy8gICAtIGFtb3VudDE6IENvbGxlY3RlZCB0b2tlbjEgYW1vdW50IGJlZm9yZSB3aXRoZHJhd2FsLWZlZSBkZWR1Y3Rpb24sIGFzIGEKLy8gICAgIGRlY2ltYWwgc3RyaW5nLgovLyAgIC0gZmVlMDogV2l0aGRyYXdhbCBmZWUgd2l0aGhlbGQgZnJvbSB0b2tlbjAsIGFzIGEgZGVjaW1hbCBzdHJpbmcuCi8vICAgLSBmZWUxOiBXaXRoZHJhd2FsIGZlZSB3aXRoaGVsZCBmcm9tIHRva2VuMSwgYXMgYSBkZWNpbWFsIHN0cmluZy4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgV2l0aGRyYXcgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgQ29sbGVjdFN3YXBGZWUoCgljdXIgcmVhbG0sCgl0b2tlbjBQYXRoIHN0cmluZywKCXRva2VuMVBhdGggc3RyaW5nLAoJZmVlIHVpbnQzMiwKCXJlY2lwaWVudCBhZGRyZXNzLAoJdGlja0xvd2VyIGludDMyLAoJdGlja1VwcGVyIGludDMyLAoJYW1vdW50MFJlcXVlc3RlZCBzdHJpbmcsCglhbW91bnQxUmVxdWVzdGVkIHN0cmluZywKKSAoYW1vdW50MCwgYW1vdW50MSwgZmVlMCwgZmVlMSBzdHJpbmcpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkNvbGxlY3RTd2FwRmVlKAoJCTAsCgkJY3VyLAoJCXRva2VuMFBhdGgsCgkJdG9rZW4xUGF0aCwKCQlmZWUsCgkJcmVjaXBpZW50LAoJCXRpY2tMb3dlciwKCQl0aWNrVXBwZXIsCgkJYW1vdW50MFJlcXVlc3RlZCwKCQlhbW91bnQxUmVxdWVzdGVkLAoJKQp9CgovLyBDb2xsZWN0IHBheXMgdG9rZW5zIG93ZWQgdG8gYSBwb3NpdGlvbiBvdXQgdG8gcmVjaXBpZW50IGluIGZ1bGwuIE5vCi8vIHdpdGhkcmF3YWwgZmVlIGlzIGNoYXJnZWQgb24gdGhpcyBwYXRoOyBzZWUgQ29sbGVjdFN3YXBGZWUgZm9yIHRoZQovLyBmZWUtYmVhcmluZyBwYXRoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMKLy8gICAgIHJlYWxtLgovLyAgIC0gdG9rZW4wUGF0aDogUGF0aCBvZiB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIHBvb2wgcGFpci4KLy8gICAtIHRva2VuMVBhdGg6IFBhdGggb2YgdGhlIHNlY29uZCB0b2tlbiBpbiB0aGUgcG9vbCBwYWlyLgovLyAgIC0gZmVlOiBGZWUgdGllciBpZGVudGlmeWluZyB0aGUgcG9vbC4KLy8gICAtIHJlY2lwaWVudDogTm9uLXplcm8gYWRkcmVzcyByZWNlaXZpbmcgdGhlIG93ZWQgdG9rZW4gYW1vdW50cy4KLy8gICAtIHRpY2tMb3dlcjogTG93ZXIgaW5jbHVzaXZlIHRpY2sgYm91bmRhcnkgb2YgdGhlIHBvc2l0aW9uIHJhbmdlLgovLyAgIC0gdGlja1VwcGVyOiBVcHBlciBleGNsdXNpdmUgdGljayBib3VuZGFyeSBvZiB0aGUgcG9zaXRpb24gcmFuZ2UuCi8vICAgLSBhbW91bnQwUmVxdWVzdGVkOiBEZWNpbWFsIHRva2VuMCBhbW91bnQgcmVxdWVzdGVkIGZyb20gdGhlIHBvc2l0aW9uJ3MKLy8gICAgIGFjY3J1ZWQgcHJpbmNpcGFsLgovLyAgIC0gYW1vdW50MVJlcXVlc3RlZDogRGVjaW1hbCB0b2tlbjEgYW1vdW50IHJlcXVlc3RlZCBmcm9tIHRoZSBwb3NpdGlvbidzCi8vICAgICBhY2NydWVkIHByaW5jaXBhbC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDA6IFRva2VuMCBwcmluY2lwYWwgdHJhbnNmZXJyZWQgdG8gcmVjaXBpZW50LCBhcyBhIGRlY2ltYWwgc3RyaW5nLgovLyAgIC0gYW1vdW50MTogVG9rZW4xIHByaW5jaXBhbCB0cmFuc2ZlcnJlZCB0byByZWNpcGllbnQsIGFzIGEgZGVjaW1hbCBzdHJpbmcuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3QoCgljdXIgcmVhbG0sCgl0b2tlbjBQYXRoIHN0cmluZywKCXRva2VuMVBhdGggc3RyaW5nLAoJZmVlIHVpbnQzMiwKCXJlY2lwaWVudCBhZGRyZXNzLAoJdGlja0xvd2VyIGludDMyLAoJdGlja1VwcGVyIGludDMyLAoJYW1vdW50MFJlcXVlc3RlZCBzdHJpbmcsCglhbW91bnQxUmVxdWVzdGVkIHN0cmluZywKKSAoc3RyaW5nLCBzdHJpbmcpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkNvbGxlY3QoCgkJMCwKCQljdXIsCgkJdG9rZW4wUGF0aCwKCQl0b2tlbjFQYXRoLAoJCWZlZSwKCQlyZWNpcGllbnQsCgkJdGlja0xvd2VyLAoJCXRpY2tVcHBlciwKCQlhbW91bnQwUmVxdWVzdGVkLAoJCWFtb3VudDFSZXF1ZXN0ZWQsCgkpCn0KCi8vIFNldFdpdGhkcmF3YWxGZWUgc2V0cyB0aGUgd2l0aGRyYXdhbCBmZWUgcmF0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzCi8vICAgICByZWFsbS4KLy8gICAtIGZlZTogV2l0aGRyYXdhbCBmZWUgaW4gYmFzaXMgcG9pbnRzOyB6ZXJvIGRpc2FibGVzIHRoZSBmZWUuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFBvb2wgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgU2V0V2l0aGRyYXdhbEZlZShjdXIgcmVhbG0sIGZlZSB1aW50NjQpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuU2V0V2l0aGRyYXdhbEZlZSgwLCBjdXIsIGZlZSkKfQoKLy8gU3dhcCBleGVjdXRlcyBhIHRva2VuIHN3YXAgaW4gdGhlIHBvb2wuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcwovLyAgICAgcmVhbG0uCi8vICAgLSB0b2tlbjBQYXRoOiBQYXRoIG9mIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgcG9vbCBwYWlyLgovLyAgIC0gdG9rZW4xUGF0aDogUGF0aCBvZiB0aGUgc2Vjb25kIHRva2VuIGluIHRoZSBwb29sIHBhaXIuCi8vICAgLSBmZWU6IEZlZSB0aWVyIGlkZW50aWZ5aW5nIHRoZSBwb29sLgovLyAgIC0gcmVjaXBpZW50OiBBZGRyZXNzIHJlY2VpdmluZyBvdXRwdXQgdG9rZW5zLgovLyAgIC0gemVyb0Zvck9uZTogVHJ1ZSB0byBzZWxsIHRva2VuMCBmb3IgdG9rZW4xOyBmYWxzZSB0byBzZWxsIHRva2VuMSBmb3IKLy8gICAgIHRva2VuMC4KLy8gICAtIGFtb3VudFNwZWNpZmllZDogRGVjaW1hbCBzaWduZWQgYW1vdW50OyBwb3NpdGl2ZSByZXF1ZXN0cyBleGFjdCBpbnB1dCBhbmQKLy8gICAgIG5lZ2F0aXZlIHJlcXVlc3RzIGV4YWN0IG91dHB1dC4KLy8gICAtIHNxcnRQcmljZUxpbWl0WDk2OiBQcmljZSBib3VuZGFyeSBpbiBRNjQuOTYgZml4ZWQtcG9pbnQgZm9ybSBhdCB3aGljaCB0aGUKLy8gICAgIHN3YXAgbXVzdCBzdG9wLgovLyAgIC0gc3dhcENhbGxiYWNrOiBDYWxsYmFjayBpbnZva2VkIHdpdGggdGhlIGN1cnJlbnQgcmVhbG0sIHNpZ25lZCB0b2tlbgovLyAgICAgZGVsdGFzLCBhbmQgYSBjYWxsYmFjayBtYXJrZXI7IGl0IG11c3Qgc2V0dGxlIHRoZSBpbnB1dCB0b2tlbiBhbmQgcmV0dXJuIGEKLy8gICAgIG5vbi1uaWwgZXJyb3IgdG8gYWJvcnQgc2V0dGxlbWVudC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDA6IFNpZ25lZCB0b2tlbjAgZGVsdGEgZm9yIHRoZSBzd2FwLCBhcyBhIGRlY2ltYWwgc3RyaW5nLgovLyAgIC0gYW1vdW50MTogU2lnbmVkIHRva2VuMSBkZWx0YSBmb3IgdGhlIHN3YXAsIGFzIGEgZGVjaW1hbCBzdHJpbmcuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFBvb2wgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgU3dhcCgKCWN1ciByZWFsbSwKCXRva2VuMFBhdGggc3RyaW5nLAoJdG9rZW4xUGF0aCBzdHJpbmcsCglmZWUgdWludDMyLAoJcmVjaXBpZW50IGFkZHJlc3MsCgl6ZXJvRm9yT25lIGJvb2wsCglhbW91bnRTcGVjaWZpZWQgc3RyaW5nLAoJc3FydFByaWNlTGltaXRYOTYgc3RyaW5nLAoJc3dhcENhbGxiYWNrIGZ1bmMoY3VyIHJlYWxtLCBhbW91bnQwRGVsdGEsIGFtb3VudDFEZWx0YSBpbnQ2NCwgY2FsbGJhY2tNYXJrZXIgKkNhbGxiYWNrTWFya2VyKSBlcnJvciwKKSAoc3RyaW5nLCBzdHJpbmcpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLlN3YXAoCgkJMCwKCQljdXIsCgkJdG9rZW4wUGF0aCwKCQl0b2tlbjFQYXRoLAoJCWZlZSwKCQlyZWNpcGllbnQsCgkJemVyb0Zvck9uZSwKCQlhbW91bnRTcGVjaWZpZWQsCgkJc3FydFByaWNlTGltaXRYOTYsCgkJc3dhcENhbGxiYWNrLAoJKQp9CgovLyBEcnlTd2FwIHNpbXVsYXRlcyBhIHN3YXAgd2l0aG91dCBleGVjdXRpbmcgaXQsIHJldHVybmluZyB0aGUgZXhwZWN0ZWQgb3V0cHV0LgovLwovLyBUaGlzIGlzIGEgcmVhZC1vbmx5IG9wZXJhdGlvbiB0aGF0IGRvZXMgbm90IG1vZGlmeSBwb29sIHN0YXRlLgovLyBVc2VkIGJ5IHJvdXRlciBmb3IgbXVsdGktaG9wIHN3YXAgc2ltdWxhdGlvbnMgYW5kIGJ5IGNsaWVudHMgZm9yIHByaWNlIHF1b3Rlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuMFBhdGg6IFBhdGggb2YgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBwb29sIHBhaXIuCi8vICAgLSB0b2tlbjFQYXRoOiBQYXRoIG9mIHRoZSBzZWNvbmQgdG9rZW4gaW4gdGhlIHBvb2wgcGFpci4KLy8gICAtIGZlZTogRmVlIHRpZXIgaWRlbnRpZnlpbmcgdGhlIHBvb2wuCi8vICAgLSB6ZXJvRm9yT25lOiBUcnVlIHRvIHNlbGwgdG9rZW4wIGZvciB0b2tlbjE7IGZhbHNlIHRvIHNlbGwgdG9rZW4xIGZvcgovLyAgICAgdG9rZW4wLgovLyAgIC0gYW1vdW50U3BlY2lmaWVkOiBEZWNpbWFsIHNpZ25lZCBhbW91bnQ7IHBvc2l0aXZlIHJlcXVlc3RzIGV4YWN0IGlucHV0IGFuZAovLyAgICAgbmVnYXRpdmUgcmVxdWVzdHMgZXhhY3Qgb3V0cHV0LgovLyAgIC0gc3FydFByaWNlTGltaXRYOTY6IFByaWNlIGJvdW5kYXJ5IGluIFE2NC45NiBmaXhlZC1wb2ludCBmb3JtIGF0IHdoaWNoIHRoZQovLyAgICAgc2ltdWxhdGlvbiBtdXN0IHN0b3AuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQwOiBTaW11bGF0ZWQgc2lnbmVkIHRva2VuMCBkZWx0YSwgYXMgYSBkZWNpbWFsIHN0cmluZzsgIjAiIG9uIGFuCi8vICAgICB1bnN1Y2Nlc3NmdWwgc2ltdWxhdGlvbi4KLy8gICAtIGFtb3VudDE6IFNpbXVsYXRlZCBzaWduZWQgdG9rZW4xIGRlbHRhLCBhcyBhIGRlY2ltYWwgc3RyaW5nOyAiMCIgb24gYW4KLy8gICAgIHVuc3VjY2Vzc2Z1bCBzaW11bGF0aW9uLgovLyAgIC0gZXJyb3I6IE5pbCB3aGVuIHRoZSBzaW11bGF0aW9uIHN1Y2NlZWRzOyBub24tbmlsIHdoZW4gdmFsaWRhdGlvbiwKLy8gICAgIGNvbXB1dGF0aW9uLCBvciBwb29sLWJhbGFuY2UgY2hlY2tzIGZhaWwuCmZ1bmMgRHJ5U3dhcCgKCXRva2VuMFBhdGggc3RyaW5nLAoJdG9rZW4xUGF0aCBzdHJpbmcsCglmZWUgdWludDMyLAoJemVyb0Zvck9uZSBib29sLAoJYW1vdW50U3BlY2lmaWVkIHN0cmluZywKCXNxcnRQcmljZUxpbWl0WDk2IHN0cmluZywKKSAoc3RyaW5nLCBzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5EcnlTd2FwKHRva2VuMFBhdGgsIHRva2VuMVBhdGgsIGZlZSwgemVyb0Zvck9uZSwgYW1vdW50U3BlY2lmaWVkLCBzcXJ0UHJpY2VMaW1pdFg5NikKfQoKLy8gU2V0U3dhcEVuZEhvb2sgc2V0cyB0aGUgaG9vayB0byBiZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBhIHN3YXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcwovLyAgICAgcmVhbG0uCi8vICAgLSBob29rOiBDYWxsYmFjayBpbnZva2VkIHdpdGggdGhlIGN1cnJlbnQgcmVhbG0gYW5kIHBvb2wgcGF0aCBhZnRlciBzd2FwCi8vICAgICBzZXR0bGVtZW50OyBpdHMgZXJyb3IgaXMgcHJvcGFnYXRlZCB0byBhYm9ydCB0aGUgc3dhcC4KZnVuYyBTZXRTd2FwRW5kSG9vayhjdXIgcmVhbG0sIGhvb2sgZnVuYyhjdXIgcmVhbG0sIHBvb2xQYXRoIHN0cmluZykgZXJyb3IpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuU2V0U3dhcEVuZEhvb2soMCwgY3VyLCBob29rKQp9CgovLyBTZXRTd2FwU3RhcnRIb29rIHNldHMgdGhlIGhvb2sgdG8gYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhIHN3YXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcwovLyAgICAgcmVhbG0uCi8vICAgLSBob29rOiBDYWxsYmFjayBpbnZva2VkIHdpdGggdGhlIGN1cnJlbnQgcmVhbG0sIHBvb2wgcGF0aCwgYW5kIHN3YXAKLy8gICAgIHRpbWVzdGFtcCBiZWZvcmUgc3dhcCBjb21wdXRhdGlvbi4KZnVuYyBTZXRTd2FwU3RhcnRIb29rKGN1ciByZWFsbSwgaG9vayBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aW1lc3RhbXAgaW50NjQpKSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLlNldFN3YXBTdGFydEhvb2soMCwgY3VyLCBob29rKQp9CgovLyBTZXRUaWNrQ3Jvc3NIb29rIHNldHMgdGhlIGhvb2sgdG8gYmUgY2FsbGVkIHdoZW4gYSB0aWNrIGlzIGNyb3NzZWQgZHVyaW5nIGEgc3dhcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzCi8vICAgICByZWFsbS4KLy8gICAtIGhvb2s6IENhbGxiYWNrIGludm9rZWQgd2l0aCB0aGUgY3VycmVudCByZWFsbSwgcG9vbCBwYXRoLCBjcm9zc2VkIHRpY2sKLy8gICAgIGluZGV4LCBzd2FwIGRpcmVjdGlvbiwgYW5kIGJsb2NrIHRpbWVzdGFtcC4KZnVuYyBTZXRUaWNrQ3Jvc3NIb29rKGN1ciByZWFsbSwgaG9vayBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aWNrSWQgaW50MzIsIHplcm9Gb3JPbmUgYm9vbCwgdGltZXN0YW1wIGludDY0KSkgewoJZ2V0SW1wbGVtZW50YXRpb24oKS5TZXRUaWNrQ3Jvc3NIb29rKDAsIGN1ciwgaG9vaykKfQoKLy8gQ29sbGVjdFByb3RvY29sIGNvbGxlY3RzIHByb3RvY29sIGZlZXMgZnJvbSBhIHBvb2wuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcwovLyAgICAgcmVhbG0uCi8vICAgLSB0b2tlbjBQYXRoOiBQYXRoIG9mIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgcG9vbCBwYWlyLgovLyAgIC0gdG9rZW4xUGF0aDogUGF0aCBvZiB0aGUgc2Vjb25kIHRva2VuIGluIHRoZSBwb29sIHBhaXIuCi8vICAgLSBmZWU6IEZlZSB0aWVyIGlkZW50aWZ5aW5nIHRoZSBwb29sLgovLyAgIC0gcmVjaXBpZW50OiBBZGRyZXNzIHJlY2VpdmluZyB0aGUgY29sbGVjdGVkIHByb3RvY29sIGZlZXMuCi8vICAgLSBhbW91bnQwUmVxdWVzdGVkOiBEZWNpbWFsIHRva2VuMCBwcm90b2NvbC1mZWUgYW1vdW50IHJlcXVlc3RlZDsgY29sbGVjdGlvbgovLyAgICAgaXMgY2FwcGVkIGF0IHRoZSBhdmFpbGFibGUgYW1vdW50LgovLyAgIC0gYW1vdW50MVJlcXVlc3RlZDogRGVjaW1hbCB0b2tlbjEgcHJvdG9jb2wtZmVlIGFtb3VudCByZXF1ZXN0ZWQ7IGNvbGxlY3Rpb24KLy8gICAgIGlzIGNhcHBlZCBhdCB0aGUgYXZhaWxhYmxlIGFtb3VudC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDA6IFRva2VuMCBwcm90b2NvbCBmZWUgdHJhbnNmZXJyZWQgdG8gcmVjaXBpZW50LCBhcyBhIGRlY2ltYWwgc3RyaW5nLgovLyAgIC0gYW1vdW50MTogVG9rZW4xIHByb3RvY29sIGZlZSB0cmFuc2ZlcnJlZCB0byByZWNpcGllbnQsIGFzIGEgZGVjaW1hbCBzdHJpbmcuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3RQcm90b2NvbCgKCWN1ciByZWFsbSwKCXRva2VuMFBhdGggc3RyaW5nLAoJdG9rZW4xUGF0aCBzdHJpbmcsCglmZWUgdWludDMyLAoJcmVjaXBpZW50IGFkZHJlc3MsCglhbW91bnQwUmVxdWVzdGVkIHN0cmluZywKCWFtb3VudDFSZXF1ZXN0ZWQgc3RyaW5nLAopIChzdHJpbmcsIHN0cmluZykgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdFByb3RvY29sKAoJCTAsCgkJY3VyLAoJCXRva2VuMFBhdGgsCgkJdG9rZW4xUGF0aCwKCQlmZWUsCgkJcmVjaXBpZW50LAoJCWFtb3VudDBSZXF1ZXN0ZWQsCgkJYW1vdW50MVJlcXVlc3RlZCwKCSkKfQoKLy8gU2V0RmVlUHJvdG9jb2wgc2V0cyB0aGUgcHJvdG9jb2wgZmVlIHJhdGVzIGZvciBhIHBvb2wuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcwovLyAgICAgcmVhbG0uCi8vICAgLSBmZWVQcm90b2NvbDA6IFRva2VuMCBwcm90b2NvbC1mZWUgZGVub21pbmF0b3I7IHplcm8gZGlzYWJsZXMgaXQsIHdoaWxlCi8vICAgICBub24temVybyBzdXBwb3J0ZWQgdmFsdWVzIHJvdXRlIHRoZSBjb3JyZXNwb25kaW5nIGZyYWN0aW9uIHRvIHByb3RvY29sLgovLyAgIC0gZmVlUHJvdG9jb2wxOiBUb2tlbjEgcHJvdG9jb2wtZmVlIGRlbm9taW5hdG9yOyB6ZXJvIGRpc2FibGVzIGl0LCB3aGlsZQovLyAgICAgbm9uLXplcm8gc3VwcG9ydGVkIHZhbHVlcyByb3V0ZSB0aGUgY29ycmVzcG9uZGluZyBmcmFjdGlvbiB0byBwcm90b2NvbC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgUG9vbCBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBTZXRGZWVQcm90b2NvbChjdXIgcmVhbG0sIGZlZVByb3RvY29sMCwgZmVlUHJvdG9jb2wxIHVpbnQ4KSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLlNldEZlZVByb3RvY29sKDAsIGN1ciwgZmVlUHJvdG9jb2wwLCBmZWVQcm90b2NvbDEpCn0KGqoBCgpyZW5kZXIuZ25vEpsBcGFja2FnZSBwb29sCgovLyBSZW5kZXIgZGVsZWdhdGVzIHdlYiByZW5kZXJpbmcgdG8gdGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5SZW5kZXIocGF0aCkKfQoa4hAKCXN0YXRlLmdubxLUEHBhY2thZ2UgcG9vbAoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJImduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdmVyc2lvbl9tYW5hZ2VyL3YxIgoKCS8vIGluaXRpYWxpemUgcmJhYyByb2xlcwoJXyAiZ25vLmxhbmQvci9nbm9zd2FwL3JiYWMvdjEiCikKCnZhciAoCglkb21haW5QYXRoIHN0cmluZwoKCWN1cnJlbnRBZGRyZXNzIGFkZHJlc3MKCgkvLyBrdlN0b3JlIGlzIHRoZSBjb3JlIHN0b3JhZ2UgaW5zdGFuY2UgZm9yIHRoZSBwb29sIGRvbWFpbi4KCS8vIEFsbCBwb29sIGltcGxlbWVudGF0aW9ucyBzaGFyZSB0aGlzIHNpbmdsZSBzdG9yYWdlIGluc3RhbmNlLAoJLy8gZW5zdXJpbmcgZGF0YSBjb25zaXN0ZW5jeSBhY3Jvc3MgdmVyc2lvbiB1cGdyYWRlcy4KCWt2U3RvcmUgc3RvcmUuS1ZTdG9yZQoKCS8vIHZlcnNpb25NYW5hZ2VyIGlzIHRoZSB2ZXJzaW9uIG1hbmFnZXIgZm9yIHRoZSBwb29sIGRvbWFpbi4KCS8vIEl0IG1hbmFnZXMgdGhlIHJlZ2lzdHJhdGlvbiBhbmQgc3dpdGNoaW5nIG9mIHBvb2wgaW1wbGVtZW50YXRpb25zLgoJdmVyc2lvbk1hbmFnZXIgdmVyc2lvbl9tYW5hZ2VyLlZlcnNpb25NYW5hZ2VyCgoJLy8gaW1wbGVtZW50YXRpb24gaXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcG9vbCBpbXBsZW1lbnRhdGlvbi4KCS8vIFRoaXMgcG9pbnRlciBpcyBzd2l0Y2hlZCBkdXJpbmcgdXBncmFkZXMgdG8gcG9pbnQgdG8gZGlmZmVyZW50IHZlcnNpb25zICh2MSwgdjIsIGV0Yy4pLgoJLy8gVGhlIHByb3h5IGxheWVyIHJvdXRlcyBhbGwgY2FsbHMgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KCWltcGxlbWVudGF0aW9uIElQb29sCikKCi8vIGluaXQgaW5pdGlhbGl6ZXMgdGhlIHBvb2wgZG9tYWluIHN0YXRlLgovLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBwb29sIGRvbWFpbiBjb250cmFjdCBpcyBmaXJzdCBkZXBsb3llZC4KZnVuYyBpbml0KGN1ciByZWFsbSkgewoJZG9tYWluUGF0aCA9IGN1ci5Qa2dQYXRoKCkKCWN1cnJlbnRBZGRyZXNzID0gY3VyLkFkZHJlc3MoKQoKCS8vIENyZWF0ZSBhIG5ldyBLViBzdG9yZSBpbnN0YW5jZSBmb3IgdGhpcyBkb21haW4KCWt2U3RvcmUgPSBzdG9yZS5OZXdLVlN0b3JlKGN1cnJlbnRBZGRyZXNzKQoKCS8vIEluaXRpYWxpemUgdGhlIGluaXRpYWxpemVycyBtYXAgdG8gc3RvcmUgaW1wbGVtZW50YXRpb24gcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucwoJdmVyc2lvbk1hbmFnZXIgPSB2ZXJzaW9uX21hbmFnZXIuTmV3VmVyc2lvbk1hbmFnZXIoCgkJZG9tYWluUGF0aCwKCQlrdlN0b3JlLAoJCWluaXRpYWxpemVEb21haW5TdG9yZSwKCSkKCglpbXBsZW1lbnRhdGlvbiA9IG5pbAp9CgpmdW5jIGluaXRpYWxpemVEb21haW5TdG9yZShfIGludCwgcmxtIHJlYWxtLCBrdlN0b3JlIHN0b3JlLktWU3RvcmUpIGFueSB7CglyZXR1cm4gTmV3UG9vbFN0b3JlKGt2U3RvcmUpCn0KCi8vIGdldEltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcG9vbCBpbXBsZW1lbnRhdGlvbi4KLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGFsbCBwcm94eSBmdW5jdGlvbnMgdG8gcm91dGUgY2FsbHMgdG8gdGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KLy8gSWYgbm8gaW1wbGVtZW50YXRpb24gaXMgc2V0LCBpdCBwYW5pY3MgdG8gcHJldmVudCBpbnZhbGlkIHN0YXRlLgpmdW5jIGdldEltcGxlbWVudGF0aW9uKCkgSVBvb2wgewoJaWYgaW1wbGVtZW50YXRpb24gPT0gbmlsIHsKCQlwYW5pYygiaW1wbGVtZW50YXRpb24gaXMgbm90IGluaXRpYWxpemVkIikKCX0KCglyZXR1cm4gaW1wbGVtZW50YXRpb24KfQoKZnVuYyB1cGRhdGVJbXBsZW1lbnRhdGlvbigpIGVycm9yIHsKCXJlc3VsdCA6PSB2ZXJzaW9uTWFuYWdlci5HZXRDdXJyZW50SW1wbGVtZW50YXRpb24oKQoJaWYgcmVzdWx0ID09IG5pbCB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImltcGxlbWVudGF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCIpCgl9CgoJaW1wbCwgb2sgOj0gcmVzdWx0LihJUG9vbCkKCWlmICFvayB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImltcGwgaXMgbm90IGFuIElQb29sIikKCX0KCglpbXBsZW1lbnRhdGlvbiA9IGltcGwKCglyZXR1cm4gbmlsCn0KGumoAQoJc3RvcmUuZ25vEtqoAXBhY2thZ2UgcG9vbAoKaW1wb3J0ICgKCSJlcnJvcnMiCgoJImduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MSIKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIFN0b3JlS2V5IGRlZmluZXMgdGhlIGtleXMgdXNlZCBmb3Igc3RvcmluZyBwb29sIGRhdGEgaW4gdGhlIEtWIHN0b3JlLgovLyBUaGVzZSBrZXlzIGFyZSBwcmVmaXhlZCB3aXRoIHRoZSBkb21haW4gYWRkcmVzcyB0byBlbnN1cmUgbmFtZXNwYWNlIGlzb2xhdGlvbi4KdHlwZSBTdG9yZUtleSBzdHJpbmcKCi8vIFJldHVybnM6Ci8vICAgLSBrZXlUZXh0OiB0aGUgdGV4dHVhbCBzdG9yZSBrZXkgcmVwcmVzZW50ZWQgYnkgcy4KZnVuYyAocyBTdG9yZUtleSkgU3RyaW5nKCkgc3RyaW5nIHsKCXJldHVybiBzdHJpbmcocykKfQoKY29uc3QgKAoJLy8gUG9vbCBkYXRhIHN0b3JhZ2Uga2V5cwoJU3RvcmVLZXlQb29scyAgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJwb29scyIgICAgICAgICAgICAgICAgLy8gTWFwIGNvbnRhaW5pbmcgYWxsIHBvb2xzCglTdG9yZUtleU9ic2VydmF0aW9ucyAgICAgICAgIFN0b3JlS2V5ID0gIm9ic2VydmF0aW9ucyIgICAgICAgICAvLyBwb29sUGF0aCAtPiBvYnNlcnZhdGlvbiBCK3RyZWUKCVN0b3JlS2V5RmVlQW1vdW50VGlja1NwYWNpbmcgU3RvcmVLZXkgPSAiZmVlQW1vdW50VGlja1NwYWNpbmciIC8vIEZlZSB0aWVyIHRvIHRpY2sgc3BhY2luZyBtYXBwaW5nCglTdG9yZUtleVNsb3QwRmVlUHJvdG9jb2wgICAgIFN0b3JlS2V5ID0gInNsb3QwRmVlUHJvdG9jb2wiICAgICAvLyBQcm90b2NvbCBmZWUgZGVub21pbmF0b3IocykKCgkvLyBQcm90b2NvbCBmZWUgc3RvcmFnZSBrZXlzCglTdG9yZUtleVBvb2xDcmVhdGlvbkZlZSAgICAgU3RvcmVLZXkgPSAicG9vbENyZWF0aW9uRmVlIiAgICAgLy8gUG9vbCBjcmVhdGlvbiBmZWUgYW1vdW50CglTdG9yZUtleVBlbmRpbmdQcm90b2NvbEZlZXMgU3RvcmVLZXkgPSAicGVuZGluZ1Byb3RvY29sRmVlcyIgLy8gdG9rZW5QYXRoIC0+IGFtb3VudCBoZWxkIGxvY2FsbHkgZm9yIHByb3RvY29sX2ZlZQoJU3RvcmVLZXlXaXRoZHJhd2FsRmVlQlBTICAgIFN0b3JlS2V5ID0gIndpdGhkcmF3YWxGZWVCUFMiICAgIC8vIFdpdGhkcmF3YWwgZmVlIGluIGJhc2lzIHBvaW50cwoJU3RvcmVLZXlVbmxvY2tlZCAgICAgICAgICAgIFN0b3JlS2V5ID0gInVubG9ja2VkIiAgICAgICAgICAgIC8vIEdsb2JhbCBwb29sIHJlZW50cmFuY3kgbG9jawoKCS8vIFN3YXAgaG9vayBzdG9yYWdlIGtleXMKCVN0b3JlS2V5U3dhcFN0YXJ0SG9vayBTdG9yZUtleSA9ICJzd2FwU3RhcnRIb29rIiAvLyBTd2FwIHN0YXJ0IGhvb2sgZnVuY3Rpb24KCVN0b3JlS2V5U3dhcEVuZEhvb2sgICBTdG9yZUtleSA9ICJzd2FwRW5kSG9vayIgICAvLyBTd2FwIGVuZCBob29rIGZ1bmN0aW9uCglTdG9yZUtleVRpY2tDcm9zc0hvb2sgU3RvcmVLZXkgPSAidGlja0Nyb3NzSG9vayIgLy8gVGljayBjcm9zcyBob29rIGZ1bmN0aW9uCikKCi8vIHBvb2xTdG9yZSBpbXBsZW1lbnRzIHRoZSBJUG9vbFN0b3JlIGludGVyZmFjZSBmb3IgcG9vbCBkb21haW4gc3RvcmFnZS4KLy8gSXQgcHJvdmlkZXMgdHlwZS1zYWZlIGFjY2VzcyB0byBwb29sIGRhdGEgc3RvcmVkIGluIHRoZSB1bmRlcmx5aW5nIEtWIHN0b3JlLgp0eXBlIHBvb2xTdG9yZSBzdHJ1Y3QgewoJa3ZTdG9yZSBzdG9yZS5LVlN0b3JlCn0KCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgcG9vbCBjb2xsZWN0aW9uIGtleSBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZS4KZnVuYyAocyAqcG9vbFN0b3JlKSBIYXNQb29scygpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlQb29scy5TdHJpbmcoKSkKfQoKLy8gR2V0UG9vbHMgcmV0cmlldmVzIHRoZSBtYXAgY29udGFpbmluZyBhbGwgcG9vbCBkYXRhLgovLyBUaGlzIGlzIHRoZSBtYWluIGRhdGEgc3RydWN0dXJlIHRoYXQgc3RvcmVzIGFsbCBwb29sIGluc3RhbmNlcy4KLy8gUmV0dXJuczoKLy8gICAtIHBvb2xzOiB0aGUgQit0cmVlIGNvbnRhaW5pbmcgYWxsIHBlcnNpc3RlZCBwb29sIGluc3RhbmNlczsgcGFuaWNzIGlmIHRoZQovLyAgICAgS1Ygc3RvcmUgY2Fubm90IHJlYWQgaXQgb3IgdGhlIHN0b3JlZCB2YWx1ZSBpcyBuaWwuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgR2V0UG9vbHMoKSAqYnB0cmVlLkJQVHJlZSB7Cglwb29scywgZXJyIDo9IHMua3ZTdG9yZS5HZXRCUFRyZWUoU3RvcmVLZXlQb29scy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglpZiBwb29scyA9PSBuaWwgewoJCXBhbmljKCJwb29scyBpcyBuaWwiKQoJfQoKCXJldHVybiBwb29scwp9CgovLyBTZXRQb29scyBzdG9yZXMgdGhlIG1hcCBjb250YWluaW5nIGFsbCBwb29sIGRhdGEuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSB0aGUgY3VycmVudCByZWFsbSBvciB0aGUgbWV0aG9kCi8vICAgICByZXR1cm5zIEVyclNwb29mZWRSZWFsbSBiZWZvcmUgd3JpdGluZy4KLy8gICAtIHBvb2xzOiBub24tbmlsIEIrdHJlZSBjb250YWluaW5nIHRoZSBwb29sIGluc3RhbmNlcyB0byBwZXJzaXN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgcG9vbCB0cmVlIGlzIHN0b3JlZDsgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50Ci8vICAgICByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgU2V0UG9vbHMoXyBpbnQsIHJsbSByZWFsbSwgcG9vbHMgKmJwdHJlZS5CUFRyZWUpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglpZiBwb29scyA9PSBuaWwgewoJCXBhbmljKCJwb29scyBpcyBuaWwiKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQb29scy5TdHJpbmcoKSwgcG9vbHMpCn0KCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgb2JzZXJ2YXRpb25zIGNvbGxlY3Rpb24ga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgpmdW5jIChzICpwb29sU3RvcmUpIEhhc09ic2VydmF0aW9ucygpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlPYnNlcnZhdGlvbnMuU3RyaW5nKCkpCn0KCi8vIFJldHVybnM6Ci8vICAgLSBvYnNlcnZhdGlvbnM6IHRoZSBCK3RyZWUgY29udGFpbmluZyBwZXJzaXN0ZWQgb2JzZXJ2YXRpb24gdHJlZXM7IHBhbmljcyBpZgovLyAgICAgdGhlIEtWIHN0b3JlIGNhbm5vdCByZWFkIGl0IG9yIHRoZSBzdG9yZWQgdmFsdWUgaXMgbmlsLgpmdW5jIChzICpwb29sU3RvcmUpIEdldE9ic2VydmF0aW9ucygpICpicHRyZWUuQlBUcmVlIHsKCW9ic2VydmF0aW9ucywgZXJyIDo9IHMua3ZTdG9yZS5HZXRCUFRyZWUoU3RvcmVLZXlPYnNlcnZhdGlvbnMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglpZiBvYnNlcnZhdGlvbnMgPT0gbmlsIHsKCQlwYW5pYygib2JzZXJ2YXRpb25zIGlzIG5pbCIpCgl9CglyZXR1cm4gb2JzZXJ2YXRpb25zCn0KCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSB0aGUgY3VycmVudCByZWFsbSBvciB0aGUgbWV0aG9kCi8vICAgICByZXR1cm5zIEVyclNwb29mZWRSZWFsbSBiZWZvcmUgd3JpdGluZy4KLy8gICAtIG9ic2VydmF0aW9uczogbm9uLW5pbCBCK3RyZWUgY29udGFpbmluZyB0aGUgb2JzZXJ2YXRpb24gZGF0YSB0byBwZXJzaXN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgb2JzZXJ2YXRpb24gdHJlZSBpcyBzdG9yZWQ7IEVyclNwb29mZWRSZWFsbSBmb3IgYQovLyAgICAgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwb29sU3RvcmUpIFNldE9ic2VydmF0aW9ucyhfIGludCwgcmxtIHJlYWxtLCBvYnNlcnZhdGlvbnMgKmJwdHJlZS5CUFRyZWUpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCWlmIG9ic2VydmF0aW9ucyA9PSBuaWwgewoJCXBhbmljKCJvYnNlcnZhdGlvbnMgaXMgbmlsIikKCX0KCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlPYnNlcnZhdGlvbnMuU3RyaW5nKCksIG9ic2VydmF0aW9ucykKfQoKLy8gUmV0dXJuczoKLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSBmZWUtdGllci90aWNrLXNwYWNpbmcgbWFwcGluZyBrZXkgaXMgcHJlc2VudCBpbiB0aGUKLy8gICAgIEtWIHN0b3JlLgpmdW5jIChzICpwb29sU3RvcmUpIEhhc0ZlZUFtb3VudFRpY2tTcGFjaW5nKCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleUZlZUFtb3VudFRpY2tTcGFjaW5nLlN0cmluZygpKQp9CgovLyBHZXRGZWVBbW91bnRUaWNrU3BhY2luZyByZXRyaWV2ZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBmZWUgYW1vdW50cyBhbmQgdGljayBzcGFjaW5nLgovLyBUaGlzIG1hcHBpbmcgZGV0ZXJtaW5lcyB0aGUgdGljayBzcGFjaW5nIGZvciBlYWNoIHN1cHBvcnRlZCBmZWUgdGllci4KLy8gUmV0dXJuczoKLy8gICAtIGZlZUFtb3VudFRpY2tTcGFjaW5nOiBhIGNvcHkgb2YgdGhlIGZlZSBhbW91bnQgdG8gdGljay1zcGFjaW5nIG1hcHBpbmc7Ci8vICAgICBwYW5pY3MgaWYgdGhlIEtWIHZhbHVlIGNhbm5vdCBiZSByZWFkLCBoYXMgdGhlIHdyb25nIHR5cGUsIG9yIGlzIG5pbC4KZnVuYyAocyAqcG9vbFN0b3JlKSBHZXRGZWVBbW91bnRUaWNrU3BhY2luZygpIG1hcFt1aW50MzJdaW50MzIgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleUZlZUFtb3VudFRpY2tTcGFjaW5nLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWZlZUFtb3VudFRpY2tTcGFjaW5nLCBvayA6PSByZXN1bHQuKG1hcFt1aW50MzJdaW50MzIpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIG1hcFt1aW50MzJdaW50MzI6ICVUIiwgcmVzdWx0KSkKCX0KCglpZiBmZWVBbW91bnRUaWNrU3BhY2luZyA9PSBuaWwgewoJCXBhbmljKCJmZWVBbW91bnRUaWNrU3BhY2luZyBpcyBuaWwiKQoJfQoKCXJldHVybiBjbG9uZUZlZUFtb3VudFRpY2tTcGFjaW5ncyhmZWVBbW91bnRUaWNrU3BhY2luZykKfQoKLy8gU2V0RmVlQW1vdW50VGlja1NwYWNpbmcgc3RvcmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gZmVlIGFtb3VudHMgYW5kIHRpY2sgc3BhY2luZy4KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIHRoZSBjdXJyZW50IHJlYWxtIG9yIHRoZSBtZXRob2QKLy8gICAgIHJldHVybnMgRXJyU3Bvb2ZlZFJlYWxtIGJlZm9yZSB3cml0aW5nLgovLyAgIC0gZmVlQW1vdW50VGlja1NwYWNpbmc6IG5vbi1uaWwgbWFwcGluZyBmcm9tIGZlZSB0aWVycyB0byB0aGVpciByZXF1aXJlZAovLyAgICAgaW50MzIgdGljayBzcGFjaW5nIHZhbHVlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gdGhlIG1hcHBpbmcgaXMgc3RvcmVkOyBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQKLy8gICAgIHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcG9vbFN0b3JlKSBTZXRGZWVBbW91bnRUaWNrU3BhY2luZyhfIGludCwgcmxtIHJlYWxtLCBmZWVBbW91bnRUaWNrU3BhY2luZyBtYXBbdWludDMyXWludDMyKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJaWYgZmVlQW1vdW50VGlja1NwYWNpbmcgPT0gbmlsIHsKCQlwYW5pYygiZmVlQW1vdW50VGlja1NwYWNpbmcgaXMgbmlsIikKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RmVlQW1vdW50VGlja1NwYWNpbmcuU3RyaW5nKCksIGZlZUFtb3VudFRpY2tTcGFjaW5nKQp9CgovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHNsb3QwIHByb3RvY29sLWZlZSBjb25maWd1cmF0aW9uIGtleSBpcyBwcmVzZW50IGluCi8vICAgICB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgSGFzU2xvdDBGZWVQcm90b2NvbCgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlTbG90MEZlZVByb3RvY29sLlN0cmluZygpKQp9CgovLyBHZXRTbG90MEZlZVByb3RvY29sIHJldHJpZXZlcyB0aGUgcHJvdG9jb2wgZmVlIGRlbm9taW5hdG9yKHMpIGZvciBzbG90MC4KLy8gUmV0dXJuczoKLy8gICAtIHNsb3QwRmVlUHJvdG9jb2w6IHBhY2tlZCBwcm90b2NvbC1mZWUgZGVub21pbmF0b3IgY29uZmlndXJhdGlvbiBmb3IKLy8gICAgIHNsb3QwOyBwYW5pY3MgaWYgdGhlIEtWIHZhbHVlIGNhbm5vdCBiZSByZWFkIG9yIGhhcyB0aGUgd3JvbmcgdHlwZS4KZnVuYyAocyAqcG9vbFN0b3JlKSBHZXRTbG90MEZlZVByb3RvY29sKCkgdWludDggewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVNsb3QwRmVlUHJvdG9jb2wuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJc2xvdDBGZWVQcm90b2NvbCwgb2sgOj0gcmVzdWx0Lih1aW50OCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gdWludDg6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gc2xvdDBGZWVQcm90b2NvbAp9CgovLyBTZXRTbG90MEZlZVByb3RvY29sIHN0b3JlcyB0aGUgcHJvdG9jb2wgZmVlIGRlbm9taW5hdG9yKHMpIGZvciBzbG90MC4KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIHRoZSBjdXJyZW50IHJlYWxtIG9yIHRoZSBtZXRob2QKLy8gICAgIHJldHVybnMgRXJyU3Bvb2ZlZFJlYWxtIGJlZm9yZSB3cml0aW5nLgovLyAgIC0gc2xvdDBGZWVQcm90b2NvbDogcGFja2VkIHVpbnQ4IHByb3RvY29sLWZlZSBkZW5vbWluYXRvcnMgZm9yIHRva2VuMCBhbmQKLy8gICAgIHRva2VuMS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gdGhlIHByb3RvY29sLWZlZSBjb25maWd1cmF0aW9uIGlzIHN0b3JlZDsgRXJyU3Bvb2ZlZFJlYWxtCi8vICAgICBmb3IgYSBub24tY3VycmVudCByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgU2V0U2xvdDBGZWVQcm90b2NvbChfIGludCwgcmxtIHJlYWxtLCBzbG90MEZlZVByb3RvY29sIHVpbnQ4KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVNsb3QwRmVlUHJvdG9jb2wuU3RyaW5nKCksIHNsb3QwRmVlUHJvdG9jb2wpCn0KCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgcG9vbC1jcmVhdGlvbi1mZWUga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgpmdW5jIChzICpwb29sU3RvcmUpIEhhc1Bvb2xDcmVhdGlvbkZlZSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlQb29sQ3JlYXRpb25GZWUuU3RyaW5nKCkpCn0KCi8vIEdldFBvb2xDcmVhdGlvbkZlZSByZXRyaWV2ZXMgdGhlIHBvb2wgY3JlYXRpb24gZmVlIGFtb3VudC4KLy8gUmV0dXJuczoKLy8gICAtIHBvb2xDcmVhdGlvbkZlZTogY29uZmlndXJlZCBwb29sLWNyZWF0aW9uIGNoYXJnZSBpbiB0aGUgY2hhaW4ncyBzbWFsbGVzdAovLyAgICAgY3VycmVuY3kgdW5pdDsgcGFuaWNzIGlmIHRoZSBLViB2YWx1ZSBjYW5ub3QgYmUgcmVhZCBvciBoYXMgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgR2V0UG9vbENyZWF0aW9uRmVlKCkgaW50NjQgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVBvb2xDcmVhdGlvbkZlZS5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglwb29sQ3JlYXRpb25GZWUsIG9rIDo9IHJlc3VsdC4oaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIGludDY0OiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIHBvb2xDcmVhdGlvbkZlZQp9CgovLyBTZXRQb29sQ3JlYXRpb25GZWUgc3RvcmVzIHRoZSBwb29sIGNyZWF0aW9uIGZlZSBhbW91bnQuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBsZWFkaW5nIHJlYWxtLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSB0aGUgY3VycmVudCByZWFsbSBvciB0aGUgbWV0aG9kCi8vICAgICByZXR1cm5zIEVyclNwb29mZWRSZWFsbSBiZWZvcmUgd3JpdGluZy4KLy8gICAtIHBvb2xDcmVhdGlvbkZlZTogcG9vbC1jcmVhdGlvbiBjaGFyZ2UgaW4gdGhlIGNoYWluJ3Mgc21hbGxlc3QgY3VycmVuY3kKLy8gICAgIHVuaXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBmZWUgaXMgc3RvcmVkOyBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sCi8vICAgICBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcG9vbFN0b3JlKSBTZXRQb29sQ3JlYXRpb25GZWUoXyBpbnQsIHJsbSByZWFsbSwgcG9vbENyZWF0aW9uRmVlIGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVBvb2xDcmVhdGlvbkZlZS5TdHJpbmcoKSwgcG9vbENyZWF0aW9uRmVlKQp9CgovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHBlbmRpbmcgcHJvdG9jb2wtZmVlcyBrZXkgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgSGFzUGVuZGluZ1Byb3RvY29sRmVlcygpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlQZW5kaW5nUHJvdG9jb2xGZWVzLlN0cmluZygpKQp9CgovLyBSZXR1cm5zOgovLyAgIC0gcGVuZGluZ1Byb3RvY29sRmVlczogbWFwcGluZyBmcm9tIHRva2VuIHBhdGggdG8gcGVuZGluZyBwcm90b2NvbC1mZWUKLy8gICAgIGFtb3VudCBpbiB0aGUgY2hhaW4ncyBzbWFsbGVzdCBjdXJyZW5jeSB1bml0OyBwYW5pY3MgaWYgdGhlIEtWIHZhbHVlCi8vICAgICBjYW5ub3QgYmUgcmVhZCBvciBoYXMgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpIG1hcFtzdHJpbmddaW50NjQgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVBlbmRpbmdQcm90b2NvbEZlZXMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJcGVuZGluZ1Byb3RvY29sRmVlcywgb2sgOj0gcmVzdWx0LihtYXBbc3RyaW5nXWludDY0KQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBtYXBbc3RyaW5nXWludDY0OiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIHBlbmRpbmdQcm90b2NvbEZlZXMKfQoKLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIHRoZSBjdXJyZW50IHJlYWxtIG9yIHRoZSBtZXRob2QKLy8gICAgIHJldHVybnMgRXJyU3Bvb2ZlZFJlYWxtIGJlZm9yZSB3cml0aW5nLgovLyAgIC0gcGVuZGluZ1Byb3RvY29sRmVlczogdG9rZW4tcGF0aC10by1hbW91bnQgbWFwcGluZzsgYW1vdW50cyBhcmUgaW4gdGhlCi8vICAgICBjaGFpbidzIHNtYWxsZXN0IGN1cnJlbmN5IHVuaXQgYW5kIGFyZSBjb3BpZWQgYmVmb3JlIHN0b3JhZ2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBjb3BpZWQgbWFwcGluZyBpcyBzdG9yZWQ7IEVyclNwb29mZWRSZWFsbSBmb3IgYQovLyAgICAgbm9uLWN1cnJlbnQgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwb29sU3RvcmUpIFNldFBlbmRpbmdQcm90b2NvbEZlZXMoXyBpbnQsIHJsbSByZWFsbSwgcGVuZGluZ1Byb3RvY29sRmVlcyBtYXBbc3RyaW5nXWludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJLy8gVGhlIG1hcCBpcyBjb3BpZWQgaGVyZSBzbyBpdCBpcyBhbGxvY2F0ZWQgYnksIGFuZCB0aGVyZWZvcmUgbXV0YWJsZSBmcm9tLCB0aGlzIHJlYWxtLgoJb3duZWQgOj0gbWFrZShtYXBbc3RyaW5nXWludDY0LCBsZW4ocGVuZGluZ1Byb3RvY29sRmVlcykpCglmb3IgdG9rZW5QYXRoLCBhbW91bnQgOj0gcmFuZ2UgcGVuZGluZ1Byb3RvY29sRmVlcyB7CgkJb3duZWRbdG9rZW5QYXRoXSA9IGFtb3VudAoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlQZW5kaW5nUHJvdG9jb2xGZWVzLlN0cmluZygpLCBvd25lZCkKfQoKLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB1c2VkIGFzIHRoZSBwZW5kaW5nLWZlZSBtYXAga2V5LgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBwZW5kaW5nIHByb3RvY29sLWZlZSBhbW91bnQgZm9yIHRva2VuUGF0aCBpbiB0aGUgY2hhaW4ncyBzbWFsbGVzdAovLyAgICAgY3VycmVuY3kgdW5pdCwgb3IgemVybyB3aGVuIG5vIGVudHJ5IGV4aXN0cy4KZnVuYyAocyAqcG9vbFN0b3JlKSBHZXRQZW5kaW5nUHJvdG9jb2xGZWUodG9rZW5QYXRoIHN0cmluZykgaW50NjQgewoJcmV0dXJuIHMuR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpW3Rva2VuUGF0aF0KfQoKLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIHRoZSBjdXJyZW50IHJlYWxtIG9yIHRoZSBtZXRob2QKLy8gICAgIHJldHVybnMgRXJyU3Bvb2ZlZFJlYWxtIGJlZm9yZSB3cml0aW5nLgovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwZW5kaW5nLWZlZSBlbnRyeS4KLy8gICAtIGFtb3VudDogcGVuZGluZyBwcm90b2NvbC1mZWUgYW1vdW50IHRvIGFzc2lnbiBmb3IgdG9rZW5QYXRoLCBpbiB0aGUKLy8gICAgIGNoYWluJ3Mgc21hbGxlc3QgY3VycmVuY3kgdW5pdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIGFmdGVyIHRoZSBtYXAgZW50cnkgaXMgdXBkYXRlZDsgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50Ci8vICAgICByZWFsbSwgb3Igc3RvcmUuRXJyV3JpdGVQZXJtaXNzaW9uRGVuaWVkIGZvciBhbiB1bmF1dGhvcml6ZWQgY29kZSByZWFsbS4KZnVuYyAocyAqcG9vbFN0b3JlKSBTZXRQZW5kaW5nUHJvdG9jb2xGZWUoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJaWYgcmxtLklzQ29kZSgpICYmICFzLmt2U3RvcmUuSXNXcml0ZUF1dGhvcml6ZWQocmxtLkFkZHJlc3MoKSkgewoJCXJldHVybiBlcnJvcnMuTmV3KHN0b3JlLkVycldyaXRlUGVybWlzc2lvbkRlbmllZCkKCX0KCglzLkdldFBlbmRpbmdQcm90b2NvbEZlZXMoKVt0b2tlblBhdGhdID0gYW1vdW50CgoJcmV0dXJuIG5pbAp9CgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgdGhlIGN1cnJlbnQgcmVhbG0gb3IgdGhlIG1ldGhvZAovLyAgICAgcmV0dXJucyBFcnJTcG9vZmVkUmVhbG0gYmVmb3JlIHdyaXRpbmcuCi8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggaWRlbnRpZnlpbmcgdGhlIHBlbmRpbmctZmVlIGVudHJ5IHRvIGRlbGV0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIGFmdGVyIHRoZSBtYXAgZW50cnkgaXMgcmVtb3ZlZDsgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50Ci8vICAgICByZWFsbSwgb3Igc3RvcmUuRXJyV3JpdGVQZXJtaXNzaW9uRGVuaWVkIGZvciBhbiB1bmF1dGhvcml6ZWQgY29kZSByZWFsbS4KZnVuYyAocyAqcG9vbFN0b3JlKSBSZW1vdmVQZW5kaW5nUHJvdG9jb2xGZWUoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWlmIHJsbS5Jc0NvZGUoKSAmJiAhcy5rdlN0b3JlLklzV3JpdGVBdXRob3JpemVkKHJsbS5BZGRyZXNzKCkpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhzdG9yZS5FcnJXcml0ZVBlcm1pc3Npb25EZW5pZWQpCgl9CgoJZGVsZXRlKHMuR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpLCB0b2tlblBhdGgpCgoJcmV0dXJuIG5pbAp9CgovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHdpdGhkcmF3YWwtZmVlIGtleSBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZS4KZnVuYyAocyAqcG9vbFN0b3JlKSBIYXNXaXRoZHJhd2FsRmVlQlBTKCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVdpdGhkcmF3YWxGZWVCUFMuU3RyaW5nKCkpCn0KCi8vIEdldFdpdGhkcmF3YWxGZWVCUFMgcmV0cmlldmVzIHRoZSB3aXRoZHJhd2FsIGZlZSBpbiBiYXNpcyBwb2ludHMuCi8vIFJldHVybnM6Ci8vICAgLSB3aXRoZHJhd2FsRmVlQlBTOiB3aXRoZHJhd2FsIGZlZSBleHByZXNzZWQgaW4gYmFzaXMgcG9pbnRzICgxLzEwMCBvZiBhCi8vICAgICBwZXJjZW50KTsgcGFuaWNzIGlmIHRoZSBLViB2YWx1ZSBjYW5ub3QgYmUgcmVhZCBvciBoYXMgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgR2V0V2l0aGRyYXdhbEZlZUJQUygpIHVpbnQ2NCB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5V2l0aGRyYXdhbEZlZUJQUy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgl3aXRoZHJhd2FsRmVlQlBTLCBvayA6PSByZXN1bHQuKHVpbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gdWludDY0OiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIHdpdGhkcmF3YWxGZWVCUFMKfQoKLy8gU2V0V2l0aGRyYXdhbEZlZUJQUyBzdG9yZXMgdGhlIHdpdGhkcmF3YWwgZmVlIGluIGJhc2lzIHBvaW50cy4KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIHRoZSBjdXJyZW50IHJlYWxtIG9yIHRoZSBtZXRob2QKLy8gICAgIHJldHVybnMgRXJyU3Bvb2ZlZFJlYWxtIGJlZm9yZSB3cml0aW5nLgovLyAgIC0gd2l0aGRyYXdhbEZlZUJQUzogd2l0aGRyYXdhbCBmZWUgaW4gYmFzaXMgcG9pbnRzLCB3aGVyZSAxMDAgYmFzaXMgcG9pbnRzCi8vICAgICBlcXVhbHMgb25lIHBlcmNlbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBmZWUgaXMgc3RvcmVkOyBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQgcmVhbG0sCi8vICAgICBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcG9vbFN0b3JlKSBTZXRXaXRoZHJhd2FsRmVlQlBTKF8gaW50LCBybG0gcmVhbG0sIHdpdGhkcmF3YWxGZWVCUFMgdWludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVdpdGhkcmF3YWxGZWVCUFMuU3RyaW5nKCksIHdpdGhkcmF3YWxGZWVCUFMpCn0KCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgZ2xvYmFsIHVubG9ja2VkLXN0YXRlIGtleSBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZS4KZnVuYyAocyAqcG9vbFN0b3JlKSBIYXNVbmxvY2tlZCgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlVbmxvY2tlZC5TdHJpbmcoKSkKfQoKLy8gUmV0dXJuczoKLy8gICAtIHVubG9ja2VkOiB0aGUgcGVyc2lzdGVkIGdsb2JhbCByZWVudHJhbmN5LWxvY2sgc3RhdGU7IHBhbmljcyBpZiB0aGUgS1YKLy8gICAgIHZhbHVlIGNhbm5vdCBiZSByZWFkIG9yIGhhcyB0aGUgd3JvbmcgdHlwZS4KZnVuYyAocyAqcG9vbFN0b3JlKSBHZXRVbmxvY2tlZCgpIGJvb2wgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVVubG9ja2VkLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXVubG9ja2VkLCBvayA6PSByZXN1bHQuKGJvb2wpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIGJvb2w6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gdW5sb2NrZWQKfQoKLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGxlYWRpbmcgcmVhbG0tY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIHRoZSBjdXJyZW50IHJlYWxtIG9yIHRoZSBtZXRob2QKLy8gICAgIHJldHVybnMgRXJyU3Bvb2ZlZFJlYWxtIGJlZm9yZSB3cml0aW5nLgovLyAgIC0gdW5sb2NrZWQ6IHRydWUgd2hlbiBwb29sIG9wZXJhdGlvbnMgbWF5IHByb2NlZWQgd2l0aG91dCB0aGUgZ2xvYmFsIGxvY2suCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBsb2NrIHN0YXRlIGlzIHN0b3JlZDsgRXJyU3Bvb2ZlZFJlYWxtIGZvciBhIG5vbi1jdXJyZW50Ci8vICAgICByZWFsbSwgb3IgdGhlIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgU2V0VW5sb2NrZWQoXyBpbnQsIHJsbSByZWFsbSwgdW5sb2NrZWQgYm9vbCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlVbmxvY2tlZC5TdHJpbmcoKSwgdW5sb2NrZWQpCn0KCi8vIEhhc1N3YXBTdGFydEhvb2sgY2hlY2tzIGlmIHRoZSBzd2FwIHN0YXJ0IGhvb2sgaXMgc2V0LgovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gYSBzd2FwLXN0YXJ0IGhvb2sga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgpmdW5jIChzICpwb29sU3RvcmUpIEhhc1N3YXBTdGFydEhvb2soKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5U3dhcFN0YXJ0SG9vay5TdHJpbmcoKSkKfQoKLy8gR2V0U3dhcFN0YXJ0SG9vayByZXRyaWV2ZXMgdGhlIHN3YXAgc3RhcnQgaG9vayBmdW5jdGlvbi4KLy8gUmV0dXJuczoKLy8gICAtIHN3YXBTdGFydEhvb2s6IHN0b3JlZCBjYWxsYmFjayBpbnZva2VkIGF0IHN3YXAgc3RhcnQgd2l0aCB0aGUgY3VycmVudAovLyAgICAgcmVhbG0sIHBvb2wgcGF0aCwgYW5kIGJsb2NrIHRpbWVzdGFtcDsgcGFuaWNzIGlmIHRoZSBLViB2YWx1ZSBjYW5ub3QgYmUKLy8gICAgIHJlYWQgb3IgaGFzIHRoZSB3cm9uZyBmdW5jdGlvbiB0eXBlLgpmdW5jIChzICpwb29sU3RvcmUpIEdldFN3YXBTdGFydEhvb2soKSBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aW1lc3RhbXAgaW50NjQpIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlTd2FwU3RhcnRIb29rLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXN3YXBTdGFydEhvb2ssIG9rIDo9IHJlc3VsdC4oZnVuYyhjdXIgcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGltZXN0YW1wIGludDY0KSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gZnVuYyhwb29sUGF0aCBzdHJpbmcsIHRpbWVzdGFtcCBpbnQ2NCk6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gc3dhcFN0YXJ0SG9vawp9CgovLyBTZXRTd2FwU3RhcnRIb29rIHN0b3JlcyB0aGUgc3dhcCBzdGFydCBob29rIGZ1bmN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgdGhlIGN1cnJlbnQgcmVhbG0gb3IgdGhlIG1ldGhvZAovLyAgICAgcmV0dXJucyBFcnJTcG9vZmVkUmVhbG0gYmVmb3JlIHdyaXRpbmcuCi8vICAgLSBzd2FwU3RhcnRIb29rOiBjYWxsYmFjayByZWNlaXZpbmcgdGhlIGN1cnJlbnQgcmVhbG0sIHBvb2wgcGF0aCwgYW5kCi8vICAgICBibG9jayB0aW1lc3RhbXAgd2hlbiBhIHN3YXAgc3RhcnRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgc3RvcmVkOyBFcnJTcG9vZmVkUmVhbG0gZm9yIGEgbm9uLWN1cnJlbnQKLy8gICAgIHJlYWxtLCBvciB0aGUgdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcG9vbFN0b3JlKSBTZXRTd2FwU3RhcnRIb29rKF8gaW50LCBybG0gcmVhbG0sIHN3YXBTdGFydEhvb2sgZnVuYyhjdXIgcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGltZXN0YW1wIGludDY0KSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlTd2FwU3RhcnRIb29rLlN0cmluZygpLCBzd2FwU3RhcnRIb29rKQp9CgovLyBIYXNTd2FwRW5kSG9vayBjaGVja3MgaWYgdGhlIHN3YXAgZW5kIGhvb2sgaXMgc2V0LgovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gYSBzd2FwLWVuZCBob29rIGtleSBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZS4KZnVuYyAocyAqcG9vbFN0b3JlKSBIYXNTd2FwRW5kSG9vaygpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlTd2FwRW5kSG9vay5TdHJpbmcoKSkKfQoKLy8gR2V0U3dhcEVuZEhvb2sgcmV0cmlldmVzIHRoZSBzd2FwIGVuZCBob29rIGZ1bmN0aW9uLgovLyBSZXR1cm5zOgovLyAgIC0gc3dhcEVuZEhvb2s6IHN0b3JlZCBjYWxsYmFjayByZWNlaXZpbmcgdGhlIGN1cnJlbnQgcmVhbG0gYW5kIHBvb2wgcGF0aCBhdAovLyAgICAgc3dhcCBlbmQgYW5kIHJldHVybmluZyBhbiBlcnJvcjsgcGFuaWNzIGlmIHRoZSBLViB2YWx1ZSBjYW5ub3QgYmUgcmVhZCBvcgovLyAgICAgaGFzIHRoZSB3cm9uZyBmdW5jdGlvbiB0eXBlLgpmdW5jIChzICpwb29sU3RvcmUpIEdldFN3YXBFbmRIb29rKCkgZnVuYyhjdXIgcmVhbG0sIHBvb2xQYXRoIHN0cmluZykgZXJyb3IgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVN3YXBFbmRIb29rLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXN3YXBFbmRIb29rLCBvayA6PSByZXN1bHQuKGZ1bmMoY3VyIHJlYWxtLCBwb29sUGF0aCBzdHJpbmcpIGVycm9yKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBmdW5jKHBvb2xQYXRoIHN0cmluZyk6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gc3dhcEVuZEhvb2sKfQoKLy8gU2V0U3dhcEVuZEhvb2sgc3RvcmVzIHRoZSBzd2FwIGVuZCBob29rIGZ1bmN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgdGhlIGN1cnJlbnQgcmVhbG0gb3IgdGhlIG1ldGhvZAovLyAgICAgcmV0dXJucyBFcnJTcG9vZmVkUmVhbG0gYmVmb3JlIHdyaXRpbmcuCi8vICAgLSBzd2FwRW5kSG9vazogY2FsbGJhY2sgcmVjZWl2aW5nIHRoZSBjdXJyZW50IHJlYWxtIGFuZCBwb29sIHBhdGggYXQgc3dhcAovLyAgICAgZW5kIGFuZCByZXR1cm5pbmcgYW55IGhvb2sgZXJyb3IuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBjYWxsYmFjayBpcyBzdG9yZWQ7IEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudAovLyAgICAgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwb29sU3RvcmUpIFNldFN3YXBFbmRIb29rKF8gaW50LCBybG0gcmVhbG0sIHN3YXBFbmRIb29rIGZ1bmMoY3VyIHJlYWxtLCBwb29sUGF0aCBzdHJpbmcpIGVycm9yKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVN3YXBFbmRIb29rLlN0cmluZygpLCBzd2FwRW5kSG9vaykKfQoKLy8gSGFzVGlja0Nyb3NzSG9vayBjaGVja3MgaWYgdGhlIHRpY2sgY3Jvc3MgaG9vayBpcyBzZXQuCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IHRydWUgd2hlbiBhIHRpY2stY3Jvc3MgaG9vayBrZXkgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKnBvb2xTdG9yZSkgSGFzVGlja0Nyb3NzSG9vaygpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlUaWNrQ3Jvc3NIb29rLlN0cmluZygpKQp9CgovLyBHZXRUaWNrQ3Jvc3NIb29rIHJldHJpZXZlcyB0aGUgdGljayBjcm9zcyBob29rIGZ1bmN0aW9uLgovLyBSZXR1cm5zOgovLyAgIC0gdGlja0Nyb3NzSG9vazogc3RvcmVkIGNhbGxiYWNrIHJlY2VpdmluZyB0aGUgY3VycmVudCByZWFsbSwgcG9vbCBwYXRoLAovLyAgICAgY3Jvc3NlZCB0aWNrLCBzd2FwIGRpcmVjdGlvbiwgYW5kIGJsb2NrIHRpbWVzdGFtcDsgcGFuaWNzIGlmIHRoZSBLViB2YWx1ZQovLyAgICAgY2Fubm90IGJlIHJlYWQgb3IgaGFzIHRoZSB3cm9uZyBmdW5jdGlvbiB0eXBlLgpmdW5jIChzICpwb29sU3RvcmUpIEdldFRpY2tDcm9zc0hvb2soKSBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aWNrSWQgaW50MzIsIHplcm9Gb3JPbmUgYm9vbCwgdGltZXN0YW1wIGludDY0KSB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5VGlja0Nyb3NzSG9vay5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgl0aWNrQ3Jvc3NIb29rLCBvayA6PSByZXN1bHQuKGZ1bmMoY3VyIHJlYWxtLCBwb29sUGF0aCBzdHJpbmcsIHRpY2tJZCBpbnQzMiwgemVyb0Zvck9uZSBib29sLCB0aW1lc3RhbXAgaW50NjQpKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBmdW5jKHBvb2xQYXRoIHN0cmluZywgdGlja0lkIGludDMyLCB6ZXJvRm9yT25lIGJvb2wsIHRpbWVzdGFtcCBpbnQ2NCk6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gdGlja0Nyb3NzSG9vawp9CgovLyBTZXRUaWNrQ3Jvc3NIb29rIHN0b3JlcyB0aGUgdGljayBjcm9zcyBob29rIGZ1bmN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogbGVhZGluZyByZWFsbS1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgdGhlIGN1cnJlbnQgcmVhbG0gb3IgdGhlIG1ldGhvZAovLyAgICAgcmV0dXJucyBFcnJTcG9vZmVkUmVhbG0gYmVmb3JlIHdyaXRpbmcuCi8vICAgLSB0aWNrQ3Jvc3NIb29rOiBjYWxsYmFjayByZWNlaXZpbmcgdGhlIGN1cnJlbnQgcmVhbG0sIHBvb2wgcGF0aCwgY3Jvc3NlZAovLyAgICAgdGljayBJRCwgc3dhcCBkaXJlY3Rpb24sIGFuZCBibG9jayB0aW1lc3RhbXAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBjYWxsYmFjayBpcyBzdG9yZWQ7IEVyclNwb29mZWRSZWFsbSBmb3IgYSBub24tY3VycmVudAovLyAgICAgcmVhbG0sIG9yIHRoZSB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwb29sU3RvcmUpIFNldFRpY2tDcm9zc0hvb2soXyBpbnQsIHJsbSByZWFsbSwgdGlja0Nyb3NzSG9vayBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aWNrSWQgaW50MzIsIHplcm9Gb3JPbmUgYm9vbCwgdGltZXN0YW1wIGludDY0KSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlUaWNrQ3Jvc3NIb29rLlN0cmluZygpLCB0aWNrQ3Jvc3NIb29rKQp9CgovLyBOZXdQb29sU3RvcmUgY3JlYXRlcyBhIG5ldyBwb29sIHN0b3JlIGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIEtWIHN0b3JlLgovLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIHVwZ3JhZGUgc3lzdGVtIHRvIGNyZWF0ZSBzdG9yYWdlIGluc3RhbmNlcyBmb3IgZWFjaCBpbXBsZW1lbnRhdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8gICAtIGt2U3RvcmU6IEtWIHN0b3JlIHVzZWQgdG8gcGVyc2lzdCBhbmQgcmV0cmlldmUgcG9vbC1kb21haW4gc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwb29sU3RvcmU6IGFuIElQb29sU3RvcmUgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IGt2U3RvcmUuCmZ1bmMgTmV3UG9vbFN0b3JlKGt2U3RvcmUgc3RvcmUuS1ZTdG9yZSkgSVBvb2xTdG9yZSB7CglyZXR1cm4gJnBvb2xTdG9yZXsKCQlrdlN0b3JlOiBrdlN0b3JlLAoJfQp9Chr00wIKCXR5cGVzLmdubxLl0wJwYWNrYWdlIHBvb2wKCmltcG9ydCAoCglyb3RyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3JvdHJlZS92MCIKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIElQb29sIGludGVyZmFjZSBkZWZpbmVzIGFsbCBwdWJsaWMgbWV0aG9kcyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgcG9vbCBjb250cmFjdCB2ZXJzaW9ucy4KLy8gVGhpcyBpbnRlcmZhY2Ugc2VydmVzIGFzIHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBwcm94eSBsYXllciBhbmQgaW1wbGVtZW50YXRpb24gdmVyc2lvbnMsCi8vIGVuc3VyaW5nIHRoYXQgYWxsIHZlcnNpb25zICh2MSwgdjIsIHYzLCBldGMuKSBtYWludGFpbiB0aGUgc2FtZSBwdWJsaWMgQVBJLgovLwovLyBUaGlzIGRlc2lnbiBlbmFibGVzIHNlYW1sZXNzIHVwZ3JhZGVzIHdoaWxlIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgovLyBXaGVuIHVwZ3JhZGluZyBmcm9tIHYxIHRvIHYyLCB0aGUgcHJveHkgc2ltcGx5IHN3aXRjaGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBwb2ludGVyCi8vIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHB1YmxpYyBpbnRlcmZhY2UsIGVuc3VyaW5nIHplcm8gZG93bnRpbWUgYW5kIG5vIGJyZWFraW5nIGNoYW5nZXMuCnR5cGUgSVBvb2wgaW50ZXJmYWNlIHsKCUlQb29sTWFuYWdlcgoJSVBvb2xQb3NpdGlvbgoJSVBvb2xTd2FwCglJUG9vbE9yYWNsZQoJSVBvb2xHZXR0ZXIKCVJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nCn0KCi8vIElQb29sTWFuYWdlciBpbnRlcmZhY2UgZGVmaW5lcyBwb29sIG1hbmFnZW1lbnQgb3BlcmF0aW9ucy4KLy8gVGhlc2UgbWV0aG9kcyBoYW5kbGUgcG9vbCBjcmVhdGlvbiBhbmQgZmVlIGNvbmZpZ3VyYXRpb24uCnR5cGUgSVBvb2xNYW5hZ2VyIGludGVyZmFjZSB7CgkvLyBDcmVhdGVQb29sIGNyZWF0ZXMgYSBuZXcgY29uY2VudHJhdGVkIGxpcXVpZGl0eSBwb29sLgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBwb29sIHByb3h5LgoJLy8gICAtIHRva2VuMFBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gY29udHJhY3QgcGF0aCBmb3IgdG9rZW4wLgoJLy8gICAtIHRva2VuMVBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gY29udHJhY3QgcGF0aCBmb3IgdG9rZW4xLgoJLy8gICAtIGZlZTogRmVlIHRpZXIgaWRlbnRpZnlpbmcgdGhlIG5ldyBwb29sIGFuZCBpdHMgdGljayBzcGFjaW5nLgoJLy8gICAtIHNxcnRQcmljZVg5NjogSW5pdGlhbCB0b2tlbjEvdG9rZW4wIHNxdWFyZS1yb290IHByaWNlIGVuY29kZWQgYXMgYSBROTYgZGVjaW1hbCBzdHJpbmcuCglDcmVhdGVQb29sKAoJCV8gaW50LAoJCXJsbSByZWFsbSwKCQl0b2tlbjBQYXRoIHN0cmluZywKCQl0b2tlbjFQYXRoIHN0cmluZywKCQlmZWUgdWludDMyLAoJCXNxcnRQcmljZVg5NiBzdHJpbmcsCgkpCgoJLy8gU2V0UG9vbENyZWF0aW9uRmVlIHNldHMgdGhlIHBvb2wgY3JlYXRpb24gZmVlLgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBwb29sIHByb3h5LgoJLy8gICAtIGZlZTogUG9vbC1jcmVhdGlvbiBmZWUgYW1vdW50IHRvIHN0b3JlIGZvciBmdXR1cmUgcG9vbCBjcmVhdGlvbiBvcGVyYXRpb25zLgoJU2V0UG9vbENyZWF0aW9uRmVlKF8gaW50LCBybG0gcmVhbG0sIGZlZSBpbnQ2NCkKfQoKLy8gSVBvb2xQb3NpdGlvbiBpbnRlcmZhY2UgZGVmaW5lcyBwb3NpdGlvbiBtYW5hZ2VtZW50IG9wZXJhdGlvbnMuCi8vIFRoZXNlIG1ldGhvZHMgaGFuZGxlIGxpcXVpZGl0eSBwcm92aXNpb24gYW5kIHBvc2l0aW9uIG1hbmFnZW1lbnQuCnR5cGUgSVBvb2xQb3NpdGlvbiBpbnRlcmZhY2UgewoJLy8gTWludCBhZGRzIGxpcXVpZGl0eSB0byBhIHBvb2wgcG9zaXRpb24uCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHBvb2wgcHJveHkuCgkvLyAgIC0gdG9rZW4wUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjAuCgkvLyAgIC0gdG9rZW4xUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjEuCgkvLyAgIC0gZmVlOiBGZWUgdGllciBpZGVudGlmeWluZyB0aGUgcG9vbC4KCS8vICAgLSB0aWNrTG93ZXI6IExvd2VyIGluY2x1c2l2ZSB0aWNrIG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlOyBtdXN0IGFsaWduIHRvIHBvb2wgc3BhY2luZy4KCS8vICAgLSB0aWNrVXBwZXI6IFVwcGVyIGV4Y2x1c2l2ZSB0aWNrIG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlOyBtdXN0IGFsaWduIHRvIHBvb2wgc3BhY2luZy4KCS8vICAgLSBsaXF1aWRpdHlBbW91bnQ6IFBvc2l0aXZlIGRlY2ltYWwgbGlxdWlkaXR5IGFtb3VudCB0byBhZGQuCgkvLyAgIC0gcG9zaXRpb25DYWxsZXI6IFBvc2l0aW9uLWNvbnRyYWN0IGFkZHJlc3MgdGhhdCBwcm92aWRlcyB0b2tlbnMgZm9yIHRoZSBtaW50LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50MDogVG9rZW4wIGFtb3VudCBjb25zdW1lZCwgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgoJLy8gICAtIGFtb3VudDE6IFRva2VuMSBhbW91bnQgY29uc3VtZWQsIGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZy4KCU1pbnQoCgkJXyBpbnQsCgkJcmxtIHJlYWxtLAoJCXRva2VuMFBhdGggc3RyaW5nLAoJCXRva2VuMVBhdGggc3RyaW5nLAoJCWZlZSB1aW50MzIsCgkJdGlja0xvd2VyIGludDMyLAoJCXRpY2tVcHBlciBpbnQzMiwKCQlsaXF1aWRpdHlBbW91bnQgc3RyaW5nLAoJCXBvc2l0aW9uQ2FsbGVyIGFkZHJlc3MsCgkpIChzdHJpbmcsIHN0cmluZykKCgkvLyBCdXJuIHJlbW92ZXMgbGlxdWlkaXR5IGFuZCBjcmVkaXRzIHByaW5jaXBhbCB0byB0aGUgcG9vbCBwb3NpdGlvbiBlbnRyeTsKCS8vIENvbGxlY3QgbGF0ZXIgdHJhbnNmZXJzIHRoYXQgcHJpbmNpcGFsIHdpdGhvdXQgYSB3aXRoZHJhd2FsIGZlZS4KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgcG9vbCBwcm94eS4KCS8vICAgLSB0b2tlbjBQYXRoOiBSZWdpc3RlcmVkIHRva2VuIGNvbnRyYWN0IHBhdGggZm9yIHRva2VuMC4KCS8vICAgLSB0b2tlbjFQYXRoOiBSZWdpc3RlcmVkIHRva2VuIGNvbnRyYWN0IHBhdGggZm9yIHRva2VuMS4KCS8vICAgLSBmZWU6IEZlZSB0aWVyIGlkZW50aWZ5aW5nIHRoZSBwb29sLgoJLy8gICAtIHRpY2tMb3dlcjogTG93ZXIgdGljayBvZiB0aGUgcG9zaXRpb24ncyBwcmljZSByYW5nZTsgbXVzdCBhbGlnbiB0byBwb29sIHNwYWNpbmcuCgkvLyAgIC0gdGlja1VwcGVyOiBVcHBlciB0aWNrIG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlOyBtdXN0IGFsaWduIHRvIHBvb2wgc3BhY2luZy4KCS8vICAgLSBsaXF1aWRpdHlBbW91bnQ6IE5vbi1uZWdhdGl2ZSBkZWNpbWFsIGxpcXVpZGl0eSBhbW91bnQgdG8gcmVtb3ZlLgoJLy8gICAtIHBvc2l0aW9uQ2FsbGVyOiBQb3NpdGlvbi1jb250cmFjdCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9vbCBwb3NpdGlvbi4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDA6IFRva2VuMCBwcmluY2lwYWwgY3JlZGl0ZWQgdG8gdGhlIHBvc2l0aW9uLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcuCgkvLyAgIC0gYW1vdW50MTogVG9rZW4xIHByaW5jaXBhbCBjcmVkaXRlZCB0byB0aGUgcG9zaXRpb24sIGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZy4KCUJ1cm4oCgkJXyBpbnQsCgkJcmxtIHJlYWxtLAoJCXRva2VuMFBhdGggc3RyaW5nLAoJCXRva2VuMVBhdGggc3RyaW5nLAoJCWZlZSB1aW50MzIsCgkJdGlja0xvd2VyIGludDMyLAoJCXRpY2tVcHBlciBpbnQzMiwKCQlsaXF1aWRpdHlBbW91bnQgc3RyaW5nLAoJCXBvc2l0aW9uQ2FsbGVyIGFkZHJlc3MsCgkpIChzdHJpbmcsIHN0cmluZykKCgkvLyBDb2xsZWN0U3dhcEZlZSBwYXlzIGFjY3J1ZWQgc3dhcCBmZWVzIGFuZCBhcHBsaWVzIHRoZSB3aXRoZHJhd2FsIGZlZTsKCS8vIENvbGxlY3QgcGF5cyBwcmluY2lwYWwgb3dlZCBieSBCdXJuIHdpdGhvdXQgdGhhdCBmZWUuCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHBvb2wgcHJveHkuCgkvLyAgIC0gdG9rZW4wUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjAuCgkvLyAgIC0gdG9rZW4xUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjEuCgkvLyAgIC0gZmVlOiBGZWUgdGllciBpZGVudGlmeWluZyB0aGUgcG9vbC4KCS8vICAgLSByZWNpcGllbnQ6IE5vbnplcm8gYWRkcmVzcyByZWNlaXZpbmcgY29sbGVjdGVkIHRva2VucyBhZnRlciBhbnkgd2l0aGRyYXdhbCBmZWUuCgkvLyAgIC0gdGlja0xvd2VyOiBMb3dlciB0aWNrIG9mIHRoZSBwb3NpdGlvbidzIHByaWNlIHJhbmdlLgoJLy8gICAtIHRpY2tVcHBlcjogVXBwZXIgdGljayBvZiB0aGUgcG9zaXRpb24ncyBwcmljZSByYW5nZS4KCS8vICAgLSBhbW91bnQwUmVxdWVzdGVkOiBOb24tbmVnYXRpdmUgZGVjaW1hbCBhbW91bnQgb2YgdG9rZW4wIHJlcXVlc3RlZDsgdGhlIGludDY0IG1heGltdW0gcmVxdWVzdHMgYWxsIG93ZWQgdG9rZW4wLgoJLy8gICAtIGFtb3VudDFSZXF1ZXN0ZWQ6IE5vbi1uZWdhdGl2ZSBkZWNpbWFsIGFtb3VudCBvZiB0b2tlbjEgcmVxdWVzdGVkOyB0aGUgaW50NjQgbWF4aW11bSByZXF1ZXN0cyBhbGwgb3dlZCB0b2tlbjEuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQwOiBUb2tlbjAgYW1vdW50IGNvbGxlY3RlZCBiZWZvcmUgd2l0aGRyYXdhbC1mZWUgZGVkdWN0aW9uLCBhcyBhIGRlY2ltYWwgc3RyaW5nLgoJLy8gICAtIGFtb3VudDE6IFRva2VuMSBhbW91bnQgY29sbGVjdGVkIGJlZm9yZSB3aXRoZHJhd2FsLWZlZSBkZWR1Y3Rpb24sIGFzIGEgZGVjaW1hbCBzdHJpbmcuCgkvLyAgIC0gZmVlMDogV2l0aGRyYXdhbCBmZWUgd2l0aGhlbGQgZnJvbSB0b2tlbjAsIGFzIGEgZGVjaW1hbCBzdHJpbmcuCgkvLyAgIC0gZmVlMTogV2l0aGRyYXdhbCBmZWUgd2l0aGhlbGQgZnJvbSB0b2tlbjEsIGFzIGEgZGVjaW1hbCBzdHJpbmcuCglDb2xsZWN0U3dhcEZlZSgKCQlfIGludCwKCQlybG0gcmVhbG0sCgkJdG9rZW4wUGF0aCBzdHJpbmcsCgkJdG9rZW4xUGF0aCBzdHJpbmcsCgkJZmVlIHVpbnQzMiwKCQlyZWNpcGllbnQgYWRkcmVzcywKCQl0aWNrTG93ZXIgaW50MzIsCgkJdGlja1VwcGVyIGludDMyLAoJCWFtb3VudDBSZXF1ZXN0ZWQgc3RyaW5nLAoJCWFtb3VudDFSZXF1ZXN0ZWQgc3RyaW5nLAoJKSAoYW1vdW50MCwgYW1vdW50MSwgZmVlMCwgZmVlMSBzdHJpbmcpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBwb29sIHByb3h5LgoJLy8gICAtIHRva2VuMFBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gY29udHJhY3QgcGF0aCBmb3IgdG9rZW4wLgoJLy8gICAtIHRva2VuMVBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gY29udHJhY3QgcGF0aCBmb3IgdG9rZW4xLgoJLy8gICAtIGZlZTogRmVlIHRpZXIgaWRlbnRpZnlpbmcgdGhlIHBvb2wuCgkvLyAgIC0gcmVjaXBpZW50OiBOb256ZXJvIGFkZHJlc3MgcmVjZWl2aW5nIG93ZWQgcHJpbmNpcGFsLgoJLy8gICAtIHRpY2tMb3dlcjogTG93ZXIgdGljayBvZiB0aGUgcG9zaXRpb24ncyBwcmljZSByYW5nZS4KCS8vICAgLSB0aWNrVXBwZXI6IFVwcGVyIHRpY2sgb2YgdGhlIHBvc2l0aW9uJ3MgcHJpY2UgcmFuZ2UuCgkvLyAgIC0gYW1vdW50MFJlcXVlc3RlZDogTm9uLW5lZ2F0aXZlIGRlY2ltYWwgYW1vdW50IG9mIHRva2VuMCBwcmluY2lwYWwgcmVxdWVzdGVkLgoJLy8gICAtIGFtb3VudDFSZXF1ZXN0ZWQ6IE5vbi1uZWdhdGl2ZSBkZWNpbWFsIGFtb3VudCBvZiB0b2tlbjEgcHJpbmNpcGFsIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDA6IFRva2VuMCBwcmluY2lwYWwgdHJhbnNmZXJyZWQgdG8gcmVjaXBpZW50LCBhcyBhIGRlY2ltYWwgc3RyaW5nLgoJLy8gICAtIGFtb3VudDE6IFRva2VuMSBwcmluY2lwYWwgdHJhbnNmZXJyZWQgdG8gcmVjaXBpZW50LCBhcyBhIGRlY2ltYWwgc3RyaW5nLgoJQ29sbGVjdCgKCQlfIGludCwKCQlybG0gcmVhbG0sCgkJdG9rZW4wUGF0aCBzdHJpbmcsCgkJdG9rZW4xUGF0aCBzdHJpbmcsCgkJZmVlIHVpbnQzMiwKCQlyZWNpcGllbnQgYWRkcmVzcywKCQl0aWNrTG93ZXIgaW50MzIsCgkJdGlja1VwcGVyIGludDMyLAoJCWFtb3VudDBSZXF1ZXN0ZWQgc3RyaW5nLAoJCWFtb3VudDFSZXF1ZXN0ZWQgc3RyaW5nLAoJKSAoYW1vdW50MCwgYW1vdW50MSBzdHJpbmcpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBwb29sIHByb3h5LgoJLy8gICAtIGZlZTogV2l0aGRyYXdhbCBmZWUgcmF0ZSBpbiBiYXNpcyBwb2ludHMgdG8gYXBwbHkgdG8gZmVlLWJlYXJpbmcgcG9zaXRpb24gcGF5b3V0cy4KCVNldFdpdGhkcmF3YWxGZWUoXyBpbnQsIHJsbSByZWFsbSwgZmVlIHVpbnQ2NCkKfQoKLy8gSVBvb2xTd2FwIGludGVyZmFjZSBkZWZpbmVzIHN3YXAgYW5kIHByb3RvY29sIGZlZSBvcGVyYXRpb25zLgovLyBUaGVzZSBtZXRob2RzIGhhbmRsZSB0b2tlbiBzd2FwcyBhbmQgcHJvdG9jb2wgZmVlIG1hbmFnZW1lbnQuCnR5cGUgSVBvb2xTd2FwIGludGVyZmFjZSB7CgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHBvb2wgcHJveHkuCgkvLyAgIC0gdG9rZW4wUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjAuCgkvLyAgIC0gdG9rZW4xUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjEuCgkvLyAgIC0gZmVlOiBGZWUgdGllciBpZGVudGlmeWluZyB0aGUgcG9vbC4KCS8vICAgLSByZWNpcGllbnQ6IE5vbnplcm8gYWRkcmVzcyByZWNlaXZpbmcgc3dhcCBvdXRwdXQuCgkvLyAgIC0gemVyb0Zvck9uZTogU3dhcCBkaXJlY3Rpb247IHRydWUgc3dhcHMgdG9rZW4wIGZvciB0b2tlbjEsIGZhbHNlIHN3YXBzIHRva2VuMSBmb3IgdG9rZW4wLgoJLy8gICAtIGFtb3VudFNwZWNpZmllZDogU2lnbmVkIGRlY2ltYWwgYW1vdW50OyBwb3NpdGl2ZSByZXF1ZXN0cyBleGFjdCBpbnB1dCBhbmQgbmVnYXRpdmUgcmVxdWVzdHMgZXhhY3Qgb3V0cHV0LgoJLy8gICAtIHNxcnRQcmljZUxpbWl0WDk2OiBROTYtZW5jb2RlZCBkZWNpbWFsIHNxdWFyZS1yb290IHByaWNlIGxpbWl0IGZvciB0aGUgc3dhcC4KCS8vICAgLSBzd2FwQ2FsbGJhY2s6IENhbGxiYWNrIHRoYXQgcmVjZWl2ZXMgdGhlIGN1cnJlbnQgcmVhbG0sIHNpZ25lZCB0b2tlbiBkZWx0YXMsIGFuZCBtYXJrZXIsIGFuZCBtdXN0IHNldHRsZSB0aGUgaW5wdXQtdG9rZW4gYmFsYW5jZSBvciByZXR1cm4gYW4gZXJyb3IuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQwOiBTaWduZWQgdG9rZW4wIGRlbHRhIHByb2R1Y2VkIGJ5IHRoZSBzd2FwLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcuCgkvLyAgIC0gYW1vdW50MTogU2lnbmVkIHRva2VuMSBkZWx0YSBwcm9kdWNlZCBieSB0aGUgc3dhcCwgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgoJU3dhcCgKCQlfIGludCwKCQlybG0gcmVhbG0sCgkJdG9rZW4wUGF0aCBzdHJpbmcsCgkJdG9rZW4xUGF0aCBzdHJpbmcsCgkJZmVlIHVpbnQzMiwKCQlyZWNpcGllbnQgYWRkcmVzcywKCQl6ZXJvRm9yT25lIGJvb2wsCgkJYW1vdW50U3BlY2lmaWVkIHN0cmluZywKCQlzcXJ0UHJpY2VMaW1pdFg5NiBzdHJpbmcsCgkJc3dhcENhbGxiYWNrIGZ1bmMoY3VyIHJlYWxtLCBhbW91bnQwRGVsdGEsIGFtb3VudDFEZWx0YSBpbnQ2NCwgY2FsbGJhY2tNYXJrZXIgKkNhbGxiYWNrTWFya2VyKSBlcnJvciwKCSkgKHN0cmluZywgc3RyaW5nKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdG9rZW4wUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjAuCgkvLyAgIC0gdG9rZW4xUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjEuCgkvLyAgIC0gZmVlOiBGZWUgdGllciBpZGVudGlmeWluZyB0aGUgcG9vbC4KCS8vICAgLSB6ZXJvRm9yT25lOiBTd2FwIGRpcmVjdGlvbjsgdHJ1ZSBzd2FwcyB0b2tlbjAgZm9yIHRva2VuMSwgZmFsc2Ugc3dhcHMgdG9rZW4xIGZvciB0b2tlbjAuCgkvLyAgIC0gYW1vdW50U3BlY2lmaWVkOiBTaWduZWQgZGVjaW1hbCBhbW91bnQ7IHBvc2l0aXZlIHJlcXVlc3RzIGV4YWN0IGlucHV0IGFuZCBuZWdhdGl2ZSByZXF1ZXN0cyBleGFjdCBvdXRwdXQuCgkvLyAgIC0gc3FydFByaWNlTGltaXRYOTY6IFE5Ni1lbmNvZGVkIGRlY2ltYWwgc3F1YXJlLXJvb3QgcHJpY2UgbGltaXQgZm9yIHRoZSBzaW11bGF0ZWQgc3dhcC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDA6IFNpZ25lZCB0b2tlbjAgZGVsdGEgcHJlZGljdGVkIGJ5IHRoZSBzaW11bGF0aW9uLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcuCgkvLyAgIC0gYW1vdW50MTogU2lnbmVkIHRva2VuMSBkZWx0YSBwcmVkaWN0ZWQgYnkgdGhlIHNpbXVsYXRpb24sIGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZy4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwYXJzaW5nIG9yIHN3YXAgc2ltdWxhdGlvbiB2YWxpZGF0aW9uIGZhaWxzOyBzdWNjZXNzZnVsIHNpbXVsYXRpb25zIHJldHVybiBuaWwuCglEcnlTd2FwKAoJCXRva2VuMFBhdGggc3RyaW5nLAoJCXRva2VuMVBhdGggc3RyaW5nLAoJCWZlZSB1aW50MzIsCgkJemVyb0Zvck9uZSBib29sLAoJCWFtb3VudFNwZWNpZmllZCBzdHJpbmcsCgkJc3FydFByaWNlTGltaXRYOTYgc3RyaW5nLAoJKSAoc3RyaW5nLCBzdHJpbmcsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgcG9vbCBwcm94eS4KCS8vICAgLSBob29rOiBDYWxsYmFjayBpbnZva2VkIGFmdGVyIGEgc3dhcCB3aXRoIHRoZSBjdXJyZW50IHJlYWxtIGFuZCBwb29sIHBhdGg7IGEgcmV0dXJuZWQgZXJyb3IgYWJvcnRzIHRoZSBzd2FwLgoJU2V0U3dhcEVuZEhvb2soXyBpbnQsIHJsbSByZWFsbSwgaG9vayBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nKSBlcnJvcikKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHBvb2wgcHJveHkuCgkvLyAgIC0gaG9vazogQ2FsbGJhY2sgaW52b2tlZCBiZWZvcmUgYSBzd2FwIHdpdGggdGhlIGN1cnJlbnQgcmVhbG0sIHBvb2wgcGF0aCwgYW5kIGJsb2NrIHRpbWVzdGFtcC4KCVNldFN3YXBTdGFydEhvb2soXyBpbnQsIHJsbSByZWFsbSwgaG9vayBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aW1lc3RhbXAgaW50NjQpKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBDdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIHVuY2hhbmdlZCBieSB0aGUgcG9vbCBwcm94eS4KCS8vICAgLSBob29rOiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYSB0aWNrIGlzIGNyb3NzZWQsIHJlY2VpdmluZyBjdXJyZW50IHJlYWxtLCBwb29sIHBhdGgsIHRpY2sgaWQsIGRpcmVjdGlvbiwgYW5kIHRpbWVzdGFtcC4KCVNldFRpY2tDcm9zc0hvb2soXyBpbnQsIHJsbSByZWFsbSwgaG9vayBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nLCB0aWNrSWQgaW50MzIsIHplcm9Gb3JPbmUgYm9vbCwgdGltZXN0YW1wIGludDY0KSkKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHBvb2wgcHJveHkuCgkvLyAgIC0gdG9rZW4wUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjAuCgkvLyAgIC0gdG9rZW4xUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIGZvciB0b2tlbjEuCgkvLyAgIC0gZmVlOiBGZWUgdGllciBpZGVudGlmeWluZyB0aGUgcG9vbC4KCS8vICAgLSByZWNpcGllbnQ6IE5vbnplcm8gYWRkcmVzcyByZWNlaXZpbmcgY29sbGVjdGVkIHByb3RvY29sIGZlZXMuCgkvLyAgIC0gYW1vdW50MFJlcXVlc3RlZDogTm9uLW5lZ2F0aXZlIGRlY2ltYWwgYW1vdW50IG9mIHRva2VuMCBwcm90b2NvbCBmZWVzIHJlcXVlc3RlZCwgY2FwcGVkIGJ5IGF2YWlsYWJpbGl0eS4KCS8vICAgLSBhbW91bnQxUmVxdWVzdGVkOiBOb24tbmVnYXRpdmUgZGVjaW1hbCBhbW91bnQgb2YgdG9rZW4xIHByb3RvY29sIGZlZXMgcmVxdWVzdGVkLCBjYXBwZWQgYnkgYXZhaWxhYmlsaXR5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50MDogVG9rZW4wIHByb3RvY29sIGZlZXMgdHJhbnNmZXJyZWQgdG8gcmVjaXBpZW50LCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcuCgkvLyAgIC0gYW1vdW50MTogVG9rZW4xIHByb3RvY29sIGZlZXMgdHJhbnNmZXJyZWQgdG8gcmVjaXBpZW50LCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBzdHJpbmcuCglDb2xsZWN0UHJvdG9jb2woCgkJXyBpbnQsCgkJcmxtIHJlYWxtLAoJCXRva2VuMFBhdGggc3RyaW5nLAoJCXRva2VuMVBhdGggc3RyaW5nLAoJCWZlZSB1aW50MzIsCgkJcmVjaXBpZW50IGFkZHJlc3MsCgkJYW1vdW50MFJlcXVlc3RlZCBzdHJpbmcsCgkJYW1vdW50MVJlcXVlc3RlZCBzdHJpbmcsCgkpIChhbW91bnQwLCBhbW91bnQxIHN0cmluZykKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIHBvb2wgcHJveHkuCgkvLyAgIC0gZmVlUHJvdG9jb2wwOiBQcm90b2NvbC1mZWUgZGVub21pbmF0b3IvY29uZmlndXJhdGlvbiBmb3IgdG9rZW4wIHN3YXBzLgoJLy8gICAtIGZlZVByb3RvY29sMTogUHJvdG9jb2wtZmVlIGRlbm9taW5hdG9yL2NvbmZpZ3VyYXRpb24gZm9yIHRva2VuMSBzd2Fwcy4KCVNldEZlZVByb3RvY29sKF8gaW50LCBybG0gcmVhbG0sIGZlZVByb3RvY29sMCwgZmVlUHJvdG9jb2wxIHVpbnQ4KQp9CgovLyBJUG9vbE9yYWNsZSBkZWZpbmVzIHRoZSBwb29sJ3MgVW5pc3dhcCBWMy1hbGlnbmVkIG9yYWNsZSBzdXJmYWNlLgovLwovLyBJdHMgcHVibGljIG1ldGhvZHMgbWlycm9yIHRoZSByZWxldmFudCBVbmlzd2FwIFYzIHBvb2wtc3RhdGUsIGRlcml2ZWQtc3RhdGUsCi8vIGFuZCBhY3Rpb24gc3BlY2lmaWNhdGlvbnMsIGFkYXB0ZWQgZm9yIEdub1N3YXAncyBzaW5nbGV0b24gcG9vbCByZWFsbTogZXZlcnkKLy8gb3BlcmF0aW9uIGlkZW50aWZpZXMgaXRzIHBvb2wgd2l0aCBwb29sUGF0aCwgYW5kIHVpbnQgdmFsdWVzIGNyb3NzIHRoZSBwdWJsaWMKLy8gYm91bmRhcnkgdXNpbmcgR25vU3dhcCB0eXBlcyBvciBkZWNpbWFsIHN0cmluZ3MgcmF0aGVyIHRoYW4gdGhlIEVWTSBBQkkuCi8vCi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL1VuaXN3YXAvdjMtY29yZS9ibG9iL2UzNTg5YjE5MmQwYmUyN2UxMDBjZDBkYWFmNmM5NzIwNGZkYjE4OTkvY29udHJhY3RzL2ludGVyZmFjZXMvcG9vbC9JVW5pc3dhcFYzUG9vbFN0YXRlLnNvbCNMMjEtTDMyCi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL1VuaXN3YXAvdjMtY29yZS9ibG9iL2UzNTg5YjE5MmQwYmUyN2UxMDBjZDBkYWFmNmM5NzIwNGZkYjE4OTkvY29udHJhY3RzL2ludGVyZmFjZXMvcG9vbC9JVW5pc3dhcFYzUG9vbERlcml2ZWRTdGF0ZS5zb2wjTDE4LUwzOQp0eXBlIElQb29sT3JhY2xlIGludGVyZmFjZSB7CgkvLyBHZXRTbG90MCByZXR1cm5zIGEgc2FmZSBjb3B5IG9mIGEgcG9vbCdzIHByaWNlLCB0aWNrLCBwcm90b2NvbC1mZWUsIGxvY2ssCgkvLyBhbmQgb3JhY2xlIGN1cnNvci9jYXBhY2l0eSBzdGF0ZSwgY29ycmVzcG9uZGluZyB0byBVbmlzd2FwIFYzIHNsb3QwKCkuCgkvLwoJLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vVW5pc3dhcC92My1jb3JlL2Jsb2IvZTM1ODliMTkyZDBiZTI3ZTEwMGNkMGRhYWY2Yzk3MjA0ZmRiMTg5OS9jb250cmFjdHMvaW50ZXJmYWNlcy9wb29sL0lVbmlzd2FwVjNQb29sU3RhdGUuc29sI0wyMS1MMzIKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIHNsb3QwIHN0YXRlIGlzIHJlYWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBzbG90MDogU2FmZSBjb3B5IG9mIHRoZSBwb29sJ3MgcHJpY2UsIHRpY2ssIHByb3RvY29sLWZlZSwgbG9jaywgYW5kIG9yYWNsZSBjdXJzb3IvY2FwYWNpdHkgc3RhdGUuCglHZXRTbG90MChwb29sUGF0aCBzdHJpbmcpIFNsb3QwCgoJLy8gR2V0T2JzZXJ2YXRpb25BdCByZXR1cm5zIHRoZSBvYnNlcnZhdGlvbiBzdG9yZWQgYXQgaW5kZXgsIGNvcnJlc3BvbmRpbmcgdG8KCS8vIFVuaXN3YXAgVjMgb2JzZXJ2YXRpb25zKHVpbnQyNTYpLiBBbiBpbi1yYW5nZSB1bmluaXRpYWxpemVkIHNsb3QgcmV0dXJucyBhCgkvLyB6ZXJvIG9ic2VydmF0aW9uOyBhbiBvdXQtb2YtcmFuZ2UgaW5kZXggcmV0dXJucyBhbiBlcnJvci4KCS8vCgkvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9Vbmlzd2FwL3YzLWNvcmUvYmxvYi9lMzU4OWIxOTJkMGJlMjdlMTAwY2QwZGFhZjZjOTcyMDRmZGIxODk5L2NvbnRyYWN0cy9pbnRlcmZhY2VzL3Bvb2wvSVVuaXN3YXBWM1Bvb2xTdGF0ZS5zb2wjTDk5LUwxMTUKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIG9ic2VydmF0aW9uLgoJLy8gICAtIGluZGV4OiB1aW50MTYgb2JzZXJ2YXRpb24tYnVmZmVyIGluZGV4IHRvIHJlYWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBvYnNlcnZhdGlvbjogU3RvcmVkIG9ic2VydmF0aW9uLCBvciB0aGUgemVybyBvYnNlcnZhdGlvbiBmb3IgYW4gaW4tcmFuZ2UgdW5pbml0aWFsaXplZCBzbG90LgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGlzIHVua25vd24gb3IgaW5kZXggaXMgb3V0c2lkZSB0aGUgcG9vbCdzIG9ic2VydmF0aW9uIGJ1ZmZlci4KCUdldE9ic2VydmF0aW9uQXQocG9vbFBhdGggc3RyaW5nLCBpbmRleCB1aW50MTYpIChPYnNlcnZhdGlvbiwgZXJyb3IpCgoJLy8gT2JzZXJ2ZSByZXR1cm5zIHRpY2sgYW5kIHNlY29uZHMtcGVyLWxpcXVpZGl0eSBjdW11bGF0aXZlcyBmb3IgZXZlcnkKCS8vIHJlcXVlc3RlZCBsb29rYmFjaywgY29ycmVzcG9uZGluZyB0byBVbmlzd2FwIFYzIG9ic2VydmUodWludDMyW10pLgoJLy8KCS8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL1VuaXN3YXAvdjMtY29yZS9ibG9iL2UzNTg5YjE5MmQwYmUyN2UxMDBjZDBkYWFmNmM5NzIwNGZkYjE4OTkvY29udHJhY3RzL2ludGVyZmFjZXMvcG9vbC9JVW5pc3dhcFYzUG9vbERlcml2ZWRTdGF0ZS5zb2wjTDE4LUwyMQoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2Ugb3JhY2xlIGRhdGEgaXMgcmVhZC4KCS8vICAgLSBzZWNvbmRzQWdvczogTG9va2JhY2sgZHVyYXRpb25zIGluIHNlY29uZHM7IG9uZSBjdW11bGF0aXZlIHBhaXIgaXMgcmV0dXJuZWQgZm9yIGVhY2ggZW50cnkgaW4gb3JkZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0aWNrQ3VtdWxhdGl2ZXM6IFNpZ25lZCBjdW11bGF0aXZlIHRpY2tzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCByZXF1ZXN0ZWQgbG9va2JhY2suCgkvLyAgIC0gc2Vjb25kc1BlckxpcXVpZGl0eUN1bXVsYXRpdmVzWDEyODogUTEyOC1zY2FsZWQgc2Vjb25kcy1wZXItbGlxdWlkaXR5IGN1bXVsYXRpdmVzIGFzIGRlY2ltYWwgc3RyaW5ncywgaW4gcmVxdWVzdCBvcmRlci4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiB0aGUgcG9vbCBvciByZXF1ZXN0ZWQgbG9va2JhY2sgY2Fubm90IGJlIHNlcnZlZCBieSBpdHMgb2JzZXJ2YXRpb25zLgoJT2JzZXJ2ZShwb29sUGF0aCBzdHJpbmcsIHNlY29uZHNBZ29zIFtddWludDMyKSAoW11pbnQ2NCwgW11zdHJpbmcsIGVycm9yKQoKCS8vIFNuYXBzaG90Q3VtdWxhdGl2ZXNJbnNpZGUgcmV0dXJucyBhY2N1bXVsYXRvcnMgYWNjcnVlZCB3aGlsZSB0aGUgcG9vbCBwcmljZQoJLy8gd2FzIGluc2lkZSBbdGlja0xvd2VyLCB0aWNrVXBwZXIpLCBjb3JyZXNwb25kaW5nIHRvIFVuaXN3YXAgVjMKCS8vIHNuYXBzaG90Q3VtdWxhdGl2ZXNJbnNpZGUoaW50MjQsaW50MjQpLgoJLy8KCS8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL1VuaXN3YXAvdjMtY29yZS9ibG9iL2UzNTg5YjE5MmQwYmUyN2UxMDBjZDBkYWFmNmM5NzIwNGZkYjE4OTkvY29udHJhY3RzL2ludGVyZmFjZXMvcG9vbC9JVW5pc3dhcFYzUG9vbERlcml2ZWRTdGF0ZS5zb2wjTDIzLUwzOQoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2UgaW5zaWRlIGFjY3VtdWxhdG9ycyBhcmUgcmVhZC4KCS8vICAgLSB0aWNrTG93ZXI6IExvd2VyIGJvdW5kYXJ5IG9mIHRoZSBoYWxmLW9wZW4gdGljayByYW5nZSBbdGlja0xvd2VyLCB0aWNrVXBwZXIpLgoJLy8gICAtIHRpY2tVcHBlcjogVXBwZXIgYm91bmRhcnkgb2YgdGhlIGhhbGYtb3BlbiB0aWNrIHJhbmdlIFt0aWNrTG93ZXIsIHRpY2tVcHBlcikuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0aWNrQ3VtdWxhdGl2ZUluc2lkZTogU2lnbmVkIHRpY2sgYWNjdW11bGF0b3Igd2hpbGUgdGhlIHByaWNlIHdhcyBpbnNpZGUgdGhlIHJhbmdlLgoJLy8gICAtIHNlY29uZHNQZXJMaXF1aWRpdHlJbnNpZGVYMTI4OiBRMTI4LXNjYWxlZCBzZWNvbmRzLXBlci1saXF1aWRpdHkgYWNjdW11bGF0b3IgaW5zaWRlIHRoZSByYW5nZS4KCS8vICAgLSBzZWNvbmRzSW5zaWRlOiBOdW1iZXIgb2Ygc2Vjb25kcyBmb3Igd2hpY2ggdGhlIHByaWNlIHdhcyBpbnNpZGUgdGhlIHJhbmdlLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIG9yIHRoZSByZXF1ZXN0ZWQgdGljayByYW5nZSBpcyBpbnZhbGlkIG9yIHVuYXZhaWxhYmxlLgoJU25hcHNob3RDdW11bGF0aXZlc0luc2lkZSgKCQlwb29sUGF0aCBzdHJpbmcsCgkJdGlja0xvd2VyIGludDMyLAoJCXRpY2tVcHBlciBpbnQzMiwKCSkgKGludDY0LCAqdTI1Ni5VaW50LCB1aW50MzIsIGVycm9yKQoKCS8vIE9yYWNsZUNvbnN1bHQgcmV0dXJucyB0aGUgYXJpdGhtZXRpYyBtZWFuIHRpY2sgYW5kIGhhcm1vbmljIG1lYW4gbGlxdWlkaXR5CgkvLyBvdmVyIHNlY29uZHNBZ28sIGZvbGxvd2luZyBVbmlzd2FwIFYzIHBlcmlwaGVyeSdzIE9yYWNsZUxpYnJhcnkuY29uc3VsdC4KCS8vCgkvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9Vbmlzd2FwL3YzLXBlcmlwaGVyeS9ibG9iLzA2ODIzODcxOThhMjRjN2NkNjM1NjZhMmM1ODM5ODUzMzg2MGE1ZDEvY29udHJhY3RzL2xpYnJhcmllcy9PcmFjbGVMaWJyYXJ5LnNvbCNMMTYtTDQxCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb25zdWx0ZWQgZm9yIHRoZSB0aW1lLXdlaWdodGVkIG9yYWNsZSB2YWx1ZXMuCgkvLyAgIC0gc2Vjb25kc0FnbzogTG9va2JhY2sgZHVyYXRpb24gaW4gc2Vjb25kcyBvdmVyIHdoaWNoIHRoZSBhcml0aG1ldGljIG1lYW4gdGljayBhbmQgaGFybW9uaWMgbWVhbiBsaXF1aWRpdHkgYXJlIGNhbGN1bGF0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhcml0aG1ldGljTWVhblRpY2s6IFRpbWUtd2VpZ2h0ZWQgYXJpdGhtZXRpYyBtZWFuIHRpY2sgb3ZlciBzZWNvbmRzQWdvLgoJLy8gICAtIGhhcm1vbmljTWVhbkxpcXVpZGl0eTogSGFybW9uaWMgbWVhbiBsaXF1aWRpdHkgb3ZlciBzZWNvbmRzQWdvLCByZXByZXNlbnRlZCBhcyBhIHUyNTYgdmFsdWUuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggaXMgdW5rbm93biBvciB0aGUgcmVxdWVzdGVkIGhpc3RvcnkgaXMgdW5hdmFpbGFibGUuCglPcmFjbGVDb25zdWx0KHBvb2xQYXRoIHN0cmluZywgc2Vjb25kc0FnbyB1aW50MzIpIChpbnQzMiwgKnUyNTYuVWludCwgZXJyb3IpCgoJLy8gSW5jcmVhc2VPYnNlcnZhdGlvbkNhcmRpbmFsaXR5TmV4dCBzY2hlZHVsZXMgZ3Jvd3RoIG9mIHRoZSBjaXJjdWxhcgoJLy8gb2JzZXJ2YXRpb24gYnVmZmVyLCBjb3JyZXNwb25kaW5nIHRvIFVuaXN3YXAgVjMKCS8vIGluY3JlYXNlT2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQodWludDE2KS4KCS8vCgkvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9Vbmlzd2FwL3YzLWNvcmUvYmxvYi9lMzU4OWIxOTJkMGJlMjdlMTAwY2QwZGFhZjZjOTcyMDRmZGIxODk5L2NvbnRyYWN0cy9pbnRlcmZhY2VzL3Bvb2wvSVVuaXN3YXBWM1Bvb2xBY3Rpb25zLnNvbCNMOTgtTDEwMgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBwb29sIHByb3h5LgoJLy8gICAtIHRva2VuMFBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gY29udHJhY3QgcGF0aCBmb3IgdG9rZW4wLgoJLy8gICAtIHRva2VuMVBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gY29udHJhY3QgcGF0aCBmb3IgdG9rZW4xLgoJLy8gICAtIGZlZTogRmVlIHRpZXIgaWRlbnRpZnlpbmcgdGhlIHBvb2wuCgkvLyAgIC0gY2FyZGluYWxpdHlOZXh0OiBSZXF1ZXN0ZWQgbmV4dCBvYnNlcnZhdGlvbi1idWZmZXIgY2FwYWNpdHk7IG11c3Qgbm90IGV4Y2VlZCB0aGUgaW1wbGVtZW50YXRpb24gbWF4aW11bS4KCUluY3JlYXNlT2JzZXJ2YXRpb25DYXJkaW5hbGl0eU5leHQoCgkJXyBpbnQsCgkJcmxtIHJlYWxtLAoJCXRva2VuMFBhdGggc3RyaW5nLAoJCXRva2VuMVBhdGggc3RyaW5nLAoJCWZlZSB1aW50MzIsCgkJY2FyZGluYWxpdHlOZXh0IHVpbnQxNiwKCSkKfQoKLy8gSVBvb2xHZXR0ZXIgaW50ZXJmYWNlIGRlZmluZXMgZGF0YSByZXRyaWV2YWwgb3BlcmF0aW9ucy4KLy8gVGhlc2UgbWV0aG9kcyBwcm92aWRlIHJlYWQtb25seSBhY2Nlc3MgdG8gcG9vbCBzdGF0ZSBhbmQgZGF0YS4KdHlwZSBJUG9vbEdldHRlciBpbnRlcmZhY2UgewoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBvb2wgcGF0aCB0byB0ZXN0IGluIHRoZSBwb29sIHJlZ2lzdHJ5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gYSBwb29sIGlzIHJlZ2lzdGVyZWQgYXQgcG9vbFBhdGguCglFeGlzdHNQb29sUGF0aChwb29sUGF0aCBzdHJpbmcpIGJvb2wKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSB0b2tlbjAgYmFsYW5jZSBpcyByZWFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYmFsYW5jZVRva2VuMDogQ3VycmVudCBpbnRlcm5hbCB0b2tlbjAgYmFsYW5jZSByZWNvcmRlZCBmb3IgdGhlIHBvb2wuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYSByZWdpc3RlcmVkIHBvb2wuCglHZXRCYWxhbmNlVG9rZW4wKHBvb2xQYXRoIHN0cmluZykgKGludDY0LCBlcnJvcikKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSB0b2tlbjEgYmFsYW5jZSBpcyByZWFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYmFsYW5jZVRva2VuMTogQ3VycmVudCBpbnRlcm5hbCB0b2tlbjEgYmFsYW5jZSByZWNvcmRlZCBmb3IgdGhlIHBvb2wuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYSByZWdpc3RlcmVkIHBvb2wuCglHZXRCYWxhbmNlVG9rZW4xKHBvb2xQYXRoIHN0cmluZykgKGludDY0LCBlcnJvcikKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSBmZWUgdGllciBpcyByZWFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlOiBDb25maWd1cmVkIGZlZSB0aWVyIGZvciB0aGUgcG9vbC4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhIHJlZ2lzdGVyZWQgcG9vbC4KCUdldEZlZShwb29sUGF0aCBzdHJpbmcpICh1aW50MzIsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZmVlOiBGZWUgdGllciB3aG9zZSBjb25maWd1cmVkIHRpY2sgc3BhY2luZyBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBzcGFjaW5nOiBUaWNrIGludGVydmFsIGFzc29jaWF0ZWQgd2l0aCBmZWUuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gbm8gdGljayBzcGFjaW5nIGlzIGNvbmZpZ3VyZWQgZm9yIGZlZS4KCUdldEZlZUFtb3VudFRpY2tTcGFjaW5nKGZlZSB1aW50MzIpIChzcGFjaW5nIGludDMyLCBlcnIgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2UgdG9rZW4wIGZlZSBncm93dGggaXMgcmVhZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZUdyb3d0aEdsb2JhbDBYMTI4OiBUb2tlbjAgZ2xvYmFsIGZlZS1ncm93dGggYWNjdW11bGF0b3Igc2NhbGVkIGJ5IDJeMTI4LgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGEgcmVnaXN0ZXJlZCBwb29sLgoJR2V0RmVlR3Jvd3RoR2xvYmFsMFgxMjgocG9vbFBhdGggc3RyaW5nKSAoKnUyNTYuVWludCwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2UgdG9rZW4xIGZlZSBncm93dGggaXMgcmVhZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZUdyb3d0aEdsb2JhbDFYMTI4OiBUb2tlbjEgZ2xvYmFsIGZlZS1ncm93dGggYWNjdW11bGF0b3Igc2NhbGVkIGJ5IDJeMTI4LgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGEgcmVnaXN0ZXJlZCBwb29sLgoJR2V0RmVlR3Jvd3RoR2xvYmFsMVgxMjgocG9vbFBhdGggc3RyaW5nKSAoKnUyNTYuVWludCwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2UgZmVlIGdyb3d0aCBpcyByZWFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlR3Jvd3RoR2xvYmFsMFgxMjg6IFRva2VuMCBnbG9iYWwgZmVlLWdyb3d0aCBhY2N1bXVsYXRvciBzY2FsZWQgYnkgMl4xMjguCgkvLyAgIC0gZmVlR3Jvd3RoR2xvYmFsMVgxMjg6IFRva2VuMSBnbG9iYWwgZmVlLWdyb3d0aCBhY2N1bXVsYXRvciBzY2FsZWQgYnkgMl4xMjguCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggZG9lcyBub3QgaWRlbnRpZnkgYSByZWdpc3RlcmVkIHBvb2wuCglHZXRGZWVHcm93dGhHbG9iYWxYMTI4KHBvb2xQYXRoIHN0cmluZykgKCp1MjU2LlVpbnQsICp1MjU2LlVpbnQsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIGFjdGl2ZSBsaXF1aWRpdHkgaXMgcmVhZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGxpcXVpZGl0eTogQ3VycmVudCBhY3RpdmUgbGlxdWlkaXR5IGFzIGEgdTI1NiB2YWx1ZS4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhIHJlZ2lzdGVyZWQgcG9vbC4KCUdldExpcXVpZGl0eShwb29sUGF0aCBzdHJpbmcpICgqdTI1Ni5VaW50LCBlcnJvcikKCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBlbmRpbmdQcm90b2NvbEZlZXM6IE1hcCBmcm9tIHRva2VuIGNvbnRyYWN0IHBhdGggdG8gcGVuZGluZyBwcm90b2NvbC1mZWUgYW1vdW50LgoJR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpIG1hcFtzdHJpbmddaW50NjQKCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBvb2xDcmVhdGlvbkZlZTogQ29uZmlndXJlZCBmZWUgYW1vdW50IGNoYXJnZWQgd2hlbiBjcmVhdGluZyBhIHBvb2wuCglHZXRQb29sQ3JlYXRpb25GZWUoKSBpbnQ2NAoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uLgoJLy8gICAtIGtleTogRW5jb2RlZCBwb3NpdGlvbiBrZXkgaWRlbnRpZnlpbmcgdGhlIHBvc2l0aW9uJ3MgdGljayByYW5nZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZUdyb3d0aEluc2lkZTBMYXN0WDEyODogVG9rZW4wIGluc2lkZS1mZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgYXMgYSBkZWNpbWFsIFExMjgtc2NhbGVkIHN0cmluZy4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciBrZXkgY2Fubm90IGJlIHJlc29sdmVkLgoJR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUwTGFzdFgxMjgocG9vbFBhdGgsIGtleSBzdHJpbmcpIChzdHJpbmcsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uLgoJLy8gICAtIGtleTogRW5jb2RlZCBwb3NpdGlvbiBrZXkgaWRlbnRpZnlpbmcgdGhlIHBvc2l0aW9uJ3MgdGljayByYW5nZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZUdyb3d0aEluc2lkZTFMYXN0WDEyODogVG9rZW4xIGluc2lkZS1mZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgYXMgYSBkZWNpbWFsIFExMjgtc2NhbGVkIHN0cmluZy4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciBrZXkgY2Fubm90IGJlIHJlc29sdmVkLgoJR2V0UG9zaXRpb25GZWVHcm93dGhJbnNpZGUxTGFzdFgxMjgocG9vbFBhdGgsIGtleSBzdHJpbmcpIChzdHJpbmcsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uLgoJLy8gICAtIGtleTogRW5jb2RlZCBwb3NpdGlvbiBrZXkgaWRlbnRpZnlpbmcgdGhlIHBvc2l0aW9uJ3MgdGljayByYW5nZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZUdyb3d0aEluc2lkZTBMYXN0WDEyODogVG9rZW4wIGluc2lkZS1mZWUtZ3Jvd3RoIGNoZWNrcG9pbnQgYXMgYSBkZWNpbWFsIFExMjgtc2NhbGVkIHN0cmluZy4KCS8vICAgLSBmZWVHcm93dGhJbnNpZGUxTGFzdFgxMjg6IFRva2VuMSBpbnNpZGUtZmVlLWdyb3d0aCBjaGVja3BvaW50IGFzIGEgZGVjaW1hbCBRMTI4LXNjYWxlZCBzdHJpbmcuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3Iga2V5IGNhbm5vdCBiZSByZXNvbHZlZC4KCUdldFBvc2l0aW9uRmVlR3Jvd3RoSW5zaWRlTGFzdFgxMjgocG9vbFBhdGgsIGtleSBzdHJpbmcpIChzdHJpbmcsIHN0cmluZywgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgcG9zaXRpb24uCgkvLyAgIC0ga2V5OiBFbmNvZGVkIHBvc2l0aW9uIGtleSBpZGVudGlmeWluZyB0aGUgcG9zaXRpb24ncyB0aWNrIHJhbmdlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gbGlxdWlkaXR5OiBQb3NpdGlvbiBsaXF1aWRpdHkgYXMgYSBkZWNpbWFsIHN0cmluZy4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciBrZXkgY2Fubm90IGJlIHJlc29sdmVkLgoJR2V0UG9zaXRpb25MaXF1aWRpdHkocG9vbFBhdGgsIGtleSBzdHJpbmcpIChzdHJpbmcsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uLgoJLy8gICAtIGtleTogRW5jb2RlZCBwb3NpdGlvbiBrZXkgaWRlbnRpZnlpbmcgdGhlIHBvc2l0aW9uJ3MgdGljayByYW5nZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRva2Vuc093ZWQwOiBUb2tlbjAgYW1vdW50IG93ZWQgdG8gdGhlIHBvc2l0aW9uIGluIHRoZSBwb29sIGxlZGdlci4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciBrZXkgY2Fubm90IGJlIHJlc29sdmVkLgoJR2V0UG9zaXRpb25Ub2tlbnNPd2VkMChwb29sUGF0aCwga2V5IHN0cmluZykgKGludDY0LCBlcnJvcikKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSBwb3NpdGlvbi4KCS8vICAgLSBrZXk6IEVuY29kZWQgcG9zaXRpb24ga2V5IGlkZW50aWZ5aW5nIHRoZSBwb3NpdGlvbidzIHRpY2sgcmFuZ2UuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b2tlbnNPd2VkMTogVG9rZW4xIGFtb3VudCBvd2VkIHRvIHRoZSBwb3NpdGlvbiBpbiB0aGUgcG9vbCBsZWRnZXIuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3Iga2V5IGNhbm5vdCBiZSByZXNvbHZlZC4KCUdldFBvc2l0aW9uVG9rZW5zT3dlZDEocG9vbFBhdGgsIGtleSBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2UgcHJvdG9jb2wgZmVlcyBhcmUgcmVhZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHByb3RvY29sRmVlc1Rva2VuMDogQWNjcnVlZCB0b2tlbjAgcHJvdG9jb2wtZmVlIGFtb3VudC4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhIHJlZ2lzdGVyZWQgcG9vbC4KCUdldFByb3RvY29sRmVlc1Rva2VuMChwb29sUGF0aCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2UgcHJvdG9jb2wgZmVlcyBhcmUgcmVhZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHByb3RvY29sRmVlc1Rva2VuMTogQWNjcnVlZCB0b2tlbjEgcHJvdG9jb2wtZmVlIGFtb3VudC4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhIHJlZ2lzdGVyZWQgcG9vbC4KCUdldFByb3RvY29sRmVlc1Rva2VuMShwb29sUGF0aCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wncyBzbG90MCBwcm90b2NvbCBmZWUgY29uZmlndXJhdGlvbi4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZVByb3RvY29sOiBUb2tlbi1kaXJlY3Rpb24gcHJvdG9jb2wtZmVlIGRlbm9taW5hdG9yL2NvbmZpZ3VyYXRpb24gc3RvcmVkIGluIHNsb3QwLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGEgcmVnaXN0ZXJlZCBwb29sLgoJR2V0U2xvdDBGZWVQcm90b2NvbChwb29sUGF0aCBzdHJpbmcpICh1aW50OCwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wncyBjdXJyZW50IHNxdWFyZS1yb290IHByaWNlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gc3FydFByaWNlWDk2OiBDdXJyZW50IHNxdWFyZS1yb290IHByaWNlIGVuY29kZWQgYXMgYSB1MjU2IFE5NiB2YWx1ZS4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhIHJlZ2lzdGVyZWQgcG9vbC4KCUdldFNsb3QwU3FydFByaWNlWDk2KHBvb2xQYXRoIHN0cmluZykgKCp1MjU2LlVpbnQsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIGN1cnJlbnQgdGljayBpcyByZWFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGljazogQ3VycmVudCBzaWduZWQgcHJpY2UgdGljay4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBkb2VzIG5vdCBpZGVudGlmeSBhIHJlZ2lzdGVyZWQgcG9vbC4KCUdldFNsb3QwVGljayhwb29sUGF0aCBzdHJpbmcpIChpbnQzMiwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgd2hvc2UgbG9jayBzdGF0ZSBpcyByZWFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdW5sb2NrZWQ6IFRydWUgd2hlbiB0aGUgcG9vbCBpcyBhdmFpbGFibGUgZm9yIGFub3RoZXIgc3RhdGUtY2hhbmdpbmcgb3BlcmF0aW9uLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGEgcmVnaXN0ZXJlZCBwb29sLgoJR2V0U2xvdDBVbmxvY2tlZChwb29sUGF0aCBzdHJpbmcpIChib29sLCBlcnJvcikKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSB0aWNrLgoJLy8gICAtIHRpY2s6IFNpZ25lZCB0aWNrIHdob3NlIG91dHNpZGUgY3VtdWxhdGl2ZSBpcyByZXF1ZXN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0aWNrQ3VtdWxhdGl2ZU91dHNpZGU6IFNpZ25lZCBjdW11bGF0aXZlIHRpY2sgdmFsdWUgc3RvcmVkIG91dHNpZGUgdGljay4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciB0aWNrIGNhbm5vdCBiZSByZXNvbHZlZC4KCUdldFRpY2tDdW11bGF0aXZlT3V0c2lkZShwb29sUGF0aCBzdHJpbmcsIHRpY2sgaW50MzIpIChpbnQ2NCwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgdGljay4KCS8vICAgLSB0aWNrOiBTaWduZWQgdGljayB3aG9zZSB0b2tlbjAgZmVlLWdyb3d0aCBvdXRzaWRlIHZhbHVlIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZUdyb3d0aE91dHNpZGUwWDEyODogVG9rZW4wIGZlZS1ncm93dGggb3V0c2lkZSB0aWNrLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBRMTI4LXNjYWxlZCBzdHJpbmcuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgdGljayBjYW5ub3QgYmUgcmVzb2x2ZWQuCglHZXRUaWNrRmVlR3Jvd3RoT3V0c2lkZTBYMTI4KHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKHN0cmluZywgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgdGljay4KCS8vICAgLSB0aWNrOiBTaWduZWQgdGljayB3aG9zZSB0b2tlbjEgZmVlLWdyb3d0aCBvdXRzaWRlIHZhbHVlIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGZlZUdyb3d0aE91dHNpZGUxWDEyODogVG9rZW4xIGZlZS1ncm93dGggb3V0c2lkZSB0aWNrLCBlbmNvZGVkIGFzIGEgZGVjaW1hbCBRMTI4LXNjYWxlZCBzdHJpbmcuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgdGljayBjYW5ub3QgYmUgcmVzb2x2ZWQuCglHZXRUaWNrRmVlR3Jvd3RoT3V0c2lkZTFYMTI4KHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKHN0cmluZywgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgdGljay4KCS8vICAgLSB0aWNrOiBTaWduZWQgdGljayB3aG9zZSBvdXRzaWRlIGZlZSBncm93dGggaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlR3Jvd3RoT3V0c2lkZTBYMTI4OiBUb2tlbjAgZmVlLWdyb3d0aCBvdXRzaWRlIHRpY2ssIGVuY29kZWQgYXMgYSBkZWNpbWFsIFExMjgtc2NhbGVkIHN0cmluZy4KCS8vICAgLSBmZWVHcm93dGhPdXRzaWRlMVgxMjg6IFRva2VuMSBmZWUtZ3Jvd3RoIG91dHNpZGUgdGljaywgZW5jb2RlZCBhcyBhIGRlY2ltYWwgUTEyOC1zY2FsZWQgc3RyaW5nLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIG9yIHRpY2sgY2Fubm90IGJlIHJlc29sdmVkLgoJR2V0VGlja0ZlZUdyb3d0aE91dHNpZGVYMTI4KHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKHN0cmluZywgc3RyaW5nLCBlcnJvcikKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSB0aWNrLgoJLy8gICAtIHRpY2s6IFNpZ25lZCB0aWNrIHdob3NlIGluaXRpYWxpemF0aW9uIHN0YXRlIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGluaXRpYWxpemVkOiBUcnVlIHdoZW4gdGljayBoYXMgaW5pdGlhbGl6ZWQgbGlxdWlkaXR5L2ZlZS1ncm93dGggc3RhdGUuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgdGljayBjYW5ub3QgYmUgcmVzb2x2ZWQuCglHZXRUaWNrSW5pdGlhbGl6ZWQocG9vbFBhdGggc3RyaW5nLCB0aWNrIGludDMyKSAoYm9vbCwgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgdGljay4KCS8vICAgLSB0aWNrOiBTaWduZWQgdGljayB3aG9zZSBncm9zcyBsaXF1aWRpdHkgaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gbGlxdWlkaXR5R3Jvc3M6IEdyb3NzIGxpcXVpZGl0eSBhc3NvY2lhdGVkIHdpdGggdGljaywgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIG9yIHRpY2sgY2Fubm90IGJlIHJlc29sdmVkLgoJR2V0VGlja0xpcXVpZGl0eUdyb3NzKHBvb2xQYXRoIHN0cmluZywgdGljayBpbnQzMikgKHN0cmluZywgZXJyb3IpCgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwb29sUGF0aDogQ2Fub25pY2FsIHBhdGggaWRlbnRpZnlpbmcgdGhlIHBvb2wgY29udGFpbmluZyB0aGUgdGljay4KCS8vICAgLSB0aWNrOiBTaWduZWQgdGljayB3aG9zZSBuZXQgbGlxdWlkaXR5IGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGxpcXVpZGl0eU5ldDogU2lnbmVkIG5ldCBsaXF1aWRpdHkgY2hhbmdlIGF0IHRpY2ssIGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZy4KCS8vICAgLSBlcnI6IE5vbi1uaWwgd2hlbiBwb29sUGF0aCBvciB0aWNrIGNhbm5vdCBiZSByZXNvbHZlZC4KCUdldFRpY2tMaXF1aWRpdHlOZXQocG9vbFBhdGggc3RyaW5nLCB0aWNrIGludDMyKSAoc3RyaW5nLCBlcnJvcikKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSB0aWNrLgoJLy8gICAtIHRpY2s6IFNpZ25lZCB0aWNrIHdob3NlIGVsYXBzZWQgb3V0c2lkZSB0aW1lIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHNlY29uZHNPdXRzaWRlOiBTZWNvbmRzIGVsYXBzZWQgb3V0c2lkZSB0aWNrJ3MgcmFuZ2UuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgdGljayBjYW5ub3QgYmUgcmVzb2x2ZWQuCglHZXRUaWNrU2Vjb25kc091dHNpZGUocG9vbFBhdGggc3RyaW5nLCB0aWNrIGludDMyKSAodWludDMyLCBlcnJvcikKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCBjb250YWluaW5nIHRoZSB0aWNrLgoJLy8gICAtIHRpY2s6IFNpZ25lZCB0aWNrIHdob3NlIG91dHNpZGUgc2Vjb25kcy1wZXItbGlxdWlkaXR5IHZhbHVlIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHNlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyODogT3V0c2lkZSBzZWNvbmRzLXBlci1saXF1aWRpdHkgYWNjdW11bGF0b3IgZW5jb2RlZCBhcyBhIGRlY2ltYWwgUTEyOC1zY2FsZWQgc3RyaW5nLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIG9yIHRpY2sgY2Fubm90IGJlIHJlc29sdmVkLgoJR2V0VGlja1NlY29uZHNQZXJMaXF1aWRpdHlPdXRzaWRlWDEyOChwb29sUGF0aCBzdHJpbmcsIHRpY2sgaW50MzIpIChzdHJpbmcsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIHRpY2sgc3BhY2luZyBpcyByZWFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGlja1NwYWNpbmc6IENvbmZpZ3VyZWQgc2lnbmVkIHRpY2sgaW50ZXJ2YWwgZm9yIHRoZSBwb29sLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGEgcmVnaXN0ZXJlZCBwb29sLgoJR2V0VGlja1NwYWNpbmcocG9vbFBhdGggc3RyaW5nKSAoaW50MzIsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIHRva2VuMCBwYXRoIGlzIHJlYWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b2tlbjBQYXRoOiBSZWdpc3RlcmVkIHRva2VuIGNvbnRyYWN0IHBhdGggYXNzaWduZWQgdG8gdG9rZW4wLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGEgcmVnaXN0ZXJlZCBwb29sLgoJR2V0VG9rZW4wUGF0aChwb29sUGF0aCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIHdob3NlIHRva2VuMSBwYXRoIGlzIHJlYWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0b2tlbjFQYXRoOiBSZWdpc3RlcmVkIHRva2VuIGNvbnRyYWN0IHBhdGggYXNzaWduZWQgdG8gdG9rZW4xLgoJLy8gICAtIGVycjogTm9uLW5pbCB3aGVuIHBvb2xQYXRoIGRvZXMgbm90IGlkZW50aWZ5IGEgcmVnaXN0ZXJlZCBwb29sLgoJR2V0VG9rZW4xUGF0aChwb29sUGF0aCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKQoKCS8vIFJldHVybnM6CgkvLyAgIC0gd2l0aGRyYXdhbEZlZUJQUzogQ29uZmlndXJlZCB3aXRoZHJhd2FsIGZlZSBpbiBiYXNpcyBwb2ludHMuCglHZXRXaXRoZHJhd2FsRmVlKCkgdWludDY0CgoJLy8gUmV0dXJuczoKCS8vICAgLSBwb29sczogUmVhZC1vbmx5IHRyZWUgY29udGFpbmluZyByZWdpc3RlcmVkIHBvb2wgZW50cmllcy4KCUdldFBvb2xzKCkgKnJvdHJlZS5SZWFkT25seVRyZWUKCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlQW1vdW50VGlja1NwYWNpbmdzOiBNYXAgZnJvbSBmZWUgdGllciB0byBjb25maWd1cmVkIHRpY2sgc3BhY2luZy4KCUdldEZlZUFtb3VudFRpY2tTcGFjaW5ncygpIG1hcFt1aW50MzJdaW50MzIKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSBwb3NpdGlvbnMgYXJlIHZpZXdlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBvc2l0aW9uczogUmVhZC1vbmx5IHRyZWUgY29udGFpbmluZyBwb3NpdGlvbiBlbnRyaWVzIGZvciBwb29sUGF0aCwgb3IgbmlsIHdoZW4gcG9vbFBhdGggaXMgbm90IHJlZ2lzdGVyZWQuCglHZXRQb29sUG9zaXRpb25zKHBvb2xQYXRoIHN0cmluZykgKnJvdHJlZS5SZWFkT25seVRyZWUKCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB0byBzY2FuLgoJLy8gICAtIHRpY2tMb3dlcjogSW5jbHVzaXZlIGxvd2VyIHRpY2sgYm91bmQgZm9yIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuCgkvLyAgIC0gdGlja1VwcGVyOiBFeGNsdXNpdmUgdXBwZXIgdGljayBib3VuZCBmb3IgdGhlIHJlcXVlc3RlZCByYW5nZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRpY2tzOiBJbml0aWFsaXplZCB0aWNrcyBpbiBbdGlja0xvd2VyLCB0aWNrVXBwZXIpLCBvcmRlcmVkIGJ5IHRpY2suCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgdGhlIHJlcXVlc3RlZCByYW5nZSBpcyBpbnZhbGlkLgoJR2V0SW5pdGlhbGl6ZWRUaWNrc0luUmFuZ2UocG9vbFBhdGggc3RyaW5nLCB0aWNrTG93ZXIsIHRpY2tVcHBlciBpbnQzMikgKFtdaW50MzIsIGVycm9yKQoKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcG9vbFBhdGg6IENhbm9uaWNhbCBwYXRoIGlkZW50aWZ5aW5nIHRoZSBwb29sIGNvbnRhaW5pbmcgdGhlIHRpY2suCgkvLyAgIC0gdGljazogU2lnbmVkIHRpY2sgd2hvc2UgY29tcGxldGUgc3RhdGUgaXMgcmVxdWVzdGVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gaW5mbzogVGljayBzdGF0ZSBpbmNsdWRpbmcgaW5pdGlhbGl6YXRpb24sIGxpcXVpZGl0eSwgZmVlLWdyb3d0aCwgYW5kIG9yYWNsZSBhY2N1bXVsYXRvcnMuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3IgdGljayBjYW5ub3QgYmUgcmVzb2x2ZWQuCglHZXRUaWNrSW5mbyhwb29sUGF0aCBzdHJpbmcsIHRpY2sgaW50MzIpIChUaWNrSW5mbywgZXJyb3IpCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBvb2xQYXRoOiBDYW5vbmljYWwgcGF0aCBpZGVudGlmeWluZyB0aGUgcG9vbCB3aG9zZSBiaXRtYXAgaXMgcmVhZC4KCS8vICAgLSB3b3JkUG9zOiBTaWduZWQgYml0bWFwIHdvcmQgcG9zaXRpb24gY29udGFpbmluZyAyNTYgdGljay1pbml0aWFsaXphdGlvbiBiaXRzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYml0bWFwOiBEZWNpbWFsLWVuY29kZWQgYml0bWFwIHdvcmQgZm9yIHdvcmRQb3MuCgkvLyAgIC0gZXJyOiBOb24tbmlsIHdoZW4gcG9vbFBhdGggb3Igd29yZFBvcyBjYW5ub3QgYmUgcmVzb2x2ZWQuCglHZXRUaWNrQml0bWFwcyhwb29sUGF0aCBzdHJpbmcsIHdvcmRQb3MgaW50MTYpIChzdHJpbmcsIGVycm9yKQp9CgovLyBJUG9vbFN0b3JlIGludGVyZmFjZSBkZWZpbmVzIHRoZSBzdG9yYWdlIGFic3RyYWN0aW9uIGZvciBwb29sIGRhdGEuCi8vIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgY2xlYW4gc2VwYXJhdGlvbiBiZXR3ZWVuIGJ1c2luZXNzIGxvZ2ljIGFuZCBzdG9yYWdlLAovLyBhbGxvd2luZyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIHRvIHVzZSB0aGUgc2FtZSBzdG9yYWdlIGludGVyZmFjZS4KLy8KLy8gQWxsIHBvb2wgaW1wbGVtZW50YXRpb25zICh2MSwgdjIsIGV0Yy4pIHVzZSB0aGlzIGludGVyZmFjZSB0byBhY2Nlc3MKLy8gYW5kIG1vZGlmeSBwb29sIHN0YXRlLCBlbnN1cmluZyBkYXRhIGNvbnNpc3RlbmN5IGFjcm9zcyB2ZXJzaW9ucy4KdHlwZSBJUG9vbFN0b3JlIGludGVyZmFjZSB7CgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBiYWNraW5nIHBvb2wgcmVnaXN0cnkgdHJlZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KCUhhc1Bvb2xzKCkgYm9vbAoJLy8gUmV0dXJuczoKCS8vICAgLSBwb29sczogU3RvcmVkIEIrdHJlZSBjb250YWluaW5nIHBvb2wgc3RhdGUgZW50cmllczsgdGhlIGltcGxlbWVudGF0aW9uIHBhbmljcyBpZiB0aGUgS1YgdmFsdWUgaXMgdW5yZWFkYWJsZSwgd3JvbmdseSB0eXBlZCwgb3IgbmlsLgoJR2V0UG9vbHMoKSAqYnB0cmVlLkJQVHJlZQoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3J3YXJkZWQgdG8gdGhlIHN0b3JhZ2Ugc2V0dGVyOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IHRoZSBzZXR0ZXIgcmVqZWN0cyBhIGNvbnRleHQgdGhhdCBpcyBub3QgY3VycmVudC4KCS8vICAgLSBwb29sczogQit0cmVlIHJlcGxhY2luZyB0aGUgc3RvcmVkIHBvb2wgcmVnaXN0cnkuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCBhZnRlciBzdG9yaW5nIHBvb2xzOyBub24tbmlsIGZvciBhIG5vbi1jdXJyZW50IHJsbSBvciBhbiB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGZhaWx1cmUuCglTZXRQb29scyhfIGludCwgcmxtIHJlYWxtLCBwb29scyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IKCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBiYWNraW5nIG9ic2VydmF0aW9uIHJlZ2lzdHJ5IHRyZWUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCglIYXNPYnNlcnZhdGlvbnMoKSBib29sCgkvLyBSZXR1cm5zOgoJLy8gICAtIG9ic2VydmF0aW9uczogU3RvcmVkIEIrdHJlZSBjb250YWluaW5nIHBvb2wgb2JzZXJ2YXRpb24gdHJlZXM7IHRoZSBpbXBsZW1lbnRhdGlvbiBwYW5pY3MgaWYgdGhlIEtWIHZhbHVlIGlzIHVucmVhZGFibGUsIHdyb25nbHkgdHlwZWQsIG9yIG5pbC4KCUdldE9ic2VydmF0aW9ucygpICpicHRyZWUuQlBUcmVlCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvcndhcmRlZCB0byB0aGUgc3RvcmFnZSBzZXR0ZXI7IHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHNldHRlciByZWplY3RzIGEgY29udGV4dCB0aGF0IGlzIG5vdCBjdXJyZW50LgoJLy8gICAtIG9ic2VydmF0aW9uczogQit0cmVlIHJlcGxhY2luZyB0aGUgc3RvcmVkIG9ic2VydmF0aW9uIHJlZ2lzdHJ5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBOaWwgYWZ0ZXIgc3RvcmluZyBvYnNlcnZhdGlvbnM7IG5vbi1uaWwgZm9yIGEgbm9uLWN1cnJlbnQgcmxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KCVNldE9ic2VydmF0aW9ucyhfIGludCwgcmxtIHJlYWxtLCBvYnNlcnZhdGlvbnMgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgZmVlLXRvLXRpY2stc3BhY2luZyBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCglIYXNGZWVBbW91bnRUaWNrU3BhY2luZygpIGJvb2wKCS8vIFJldHVybnM6CgkvLyAgIC0gZmVlQW1vdW50VGlja1NwYWNpbmc6IFN0b3JlZCBmZWUtdGllciB0byB0aWNrLXNwYWNpbmcgbWFwOyB0aGUgaW1wbGVtZW50YXRpb24gcGFuaWNzIGlmIHRoZSBLViB2YWx1ZSBpcyB1bnJlYWRhYmxlLCB3cm9uZ2x5IHR5cGVkLCBvciBuaWwuCglHZXRGZWVBbW91bnRUaWNrU3BhY2luZygpIG1hcFt1aW50MzJdaW50MzIKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yd2FyZGVkIHRvIHRoZSBzdG9yYWdlIHNldHRlcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgc2V0dGVyIHJlamVjdHMgYSBjb250ZXh0IHRoYXQgaXMgbm90IGN1cnJlbnQuCgkvLyAgIC0gZmVlQW1vdW50VGlja1NwYWNpbmc6IE1hcCByZXBsYWNpbmcgdGhlIGNvbmZpZ3VyZWQgZmVlLXRpZXIgdG8gdGljay1zcGFjaW5nIHZhbHVlcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIGFmdGVyIHN0b3JpbmcgdGhlIG1hcHBpbmc7IG5vbi1uaWwgZm9yIGEgbm9uLWN1cnJlbnQgcmxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KCVNldEZlZUFtb3VudFRpY2tTcGFjaW5nKF8gaW50LCBybG0gcmVhbG0sIGZlZUFtb3VudFRpY2tTcGFjaW5nIG1hcFt1aW50MzJdaW50MzIpIGVycm9yCgoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgc2xvdDAgcHJvdG9jb2wtZmVlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCglIYXNTbG90MEZlZVByb3RvY29sKCkgYm9vbAoJLy8gUmV0dXJuczoKCS8vICAgLSBzbG90MEZlZVByb3RvY29sOiBTdG9yZWQgcGFja2VkIHByb3RvY29sLWZlZSBkZW5vbWluYXRvciBjb25maWd1cmF0aW9uOyB0aGUgaW1wbGVtZW50YXRpb24gcGFuaWNzIGlmIHRoZSBLViB2YWx1ZSBpcyB1bnJlYWRhYmxlIG9yIHdyb25nbHkgdHlwZWQuCglHZXRTbG90MEZlZVByb3RvY29sKCkgdWludDgKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yd2FyZGVkIHRvIHRoZSBzdG9yYWdlIHNldHRlcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgc2V0dGVyIHJlamVjdHMgYSBjb250ZXh0IHRoYXQgaXMgbm90IGN1cnJlbnQuCgkvLyAgIC0gc2xvdDBGZWVQcm90b2NvbDogUHJvdG9jb2wtZmVlIGRlbm9taW5hdG9yL2NvbmZpZ3VyYXRpb24gdG8gc3RvcmUgaW4gc2xvdDAuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCBhZnRlciBzdG9yaW5nIHRoZSB2YWx1ZTsgbm9uLW5pbCBmb3IgYSBub24tY3VycmVudCBybG0gb3IgYW4gdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBmYWlsdXJlLgoJU2V0U2xvdDBGZWVQcm90b2NvbChfIGludCwgcmxtIHJlYWxtLCBzbG90MEZlZVByb3RvY29sIHVpbnQ4KSBlcnJvcgoKCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gYSBwb29sLWNyZWF0aW9uIGZlZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KCUhhc1Bvb2xDcmVhdGlvbkZlZSgpIGJvb2wKCS8vIFJldHVybnM6CgkvLyAgIC0gcG9vbENyZWF0aW9uRmVlOiBTdG9yZWQgcG9vbC1jcmVhdGlvbiBjaGFyZ2UgaW4gdGhlIGNoYWluJ3Mgc21hbGxlc3QgY3VycmVuY3kgdW5pdDsgdGhlIGltcGxlbWVudGF0aW9uIHBhbmljcyBpZiB0aGUgS1YgdmFsdWUgaXMgdW5yZWFkYWJsZSBvciB3cm9uZ2x5IHR5cGVkLgoJR2V0UG9vbENyZWF0aW9uRmVlKCkgaW50NjQKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yd2FyZGVkIHRvIHRoZSBzdG9yYWdlIHNldHRlcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgc2V0dGVyIHJlamVjdHMgYSBjb250ZXh0IHRoYXQgaXMgbm90IGN1cnJlbnQuCgkvLyAgIC0gcG9vbENyZWF0aW9uRmVlOiBQb29sLWNyZWF0aW9uIGZlZSBhbW91bnQgdG8gc3RvcmUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCBhZnRlciBzdG9yaW5nIHRoZSBmZWU7IG5vbi1uaWwgZm9yIGEgbm9uLWN1cnJlbnQgcmxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KCVNldFBvb2xDcmVhdGlvbkZlZShfIGludCwgcmxtIHJlYWxtLCBwb29sQ3JlYXRpb25GZWUgaW50NjQpIGVycm9yCgoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgcGVuZGluZyBwcm90b2NvbC1mZWUgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkLgoJSGFzUGVuZGluZ1Byb3RvY29sRmVlcygpIGJvb2wKCS8vIFJldHVybnM6CgkvLyAgIC0gcGVuZGluZ1Byb3RvY29sRmVlczogU3RvcmVkIHRva2VuLXBhdGggbWFwIG9mIHBlbmRpbmcgcHJvdG9jb2wtZmVlIGFtb3VudHMgaW4gdGhlIGNoYWluJ3Mgc21hbGxlc3QgY3VycmVuY3kgdW5pdDsgdGhlIGltcGxlbWVudGF0aW9uIHBhbmljcyBpZiB0aGUgS1YgdmFsdWUgaXMgdW5yZWFkYWJsZSBvciB3cm9uZ2x5IHR5cGVkLgoJR2V0UGVuZGluZ1Byb3RvY29sRmVlcygpIG1hcFtzdHJpbmddaW50NjQKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yd2FyZGVkIHRvIHRoZSBzdG9yYWdlIHNldHRlcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgc2V0dGVyIHJlamVjdHMgYSBjb250ZXh0IHRoYXQgaXMgbm90IGN1cnJlbnQuCgkvLyAgIC0gcGVuZGluZ1Byb3RvY29sRmVlczogTWFwIHJlcGxhY2luZyBhbGwgcGVuZGluZyBwcm90b2NvbC1mZWUgYmFsYW5jZXMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCBhZnRlciBzdG9yaW5nIHRoZSBtYXA7IG5vbi1uaWwgZm9yIGEgbm9uLWN1cnJlbnQgcmxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KCVNldFBlbmRpbmdQcm90b2NvbEZlZXMoXyBpbnQsIHJsbSByZWFsbSwgcGVuZGluZ1Byb3RvY29sRmVlcyBtYXBbc3RyaW5nXWludDY0KSBlcnJvcgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSB0b2tlblBhdGg6IFJlZ2lzdGVyZWQgdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBwZW5kaW5nIHByb3RvY29sIGZlZSBpcyByZWFkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBQZW5kaW5nIHByb3RvY29sLWZlZSBhbW91bnQgcmVjb3JkZWQgZm9yIHRva2VuUGF0aCwgb3IgemVybyB3aGVuIG5vbmUgaXMgc3RvcmVkLgoJR2V0UGVuZGluZ1Byb3RvY29sRmVlKHRva2VuUGF0aCBzdHJpbmcpIGludDY0CgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvcndhcmRlZCB0byB0aGUgc3RvcmFnZSBzZXR0ZXI7IHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHNldHRlciByZWplY3RzIGEgY29udGV4dCB0aGF0IGlzIG5vdCBjdXJyZW50LgoJLy8gICAtIHRva2VuUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHBlbmRpbmcgZmVlIGlzIHVwZGF0ZWQuCgkvLyAgIC0gYW1vdW50OiBQZW5kaW5nIHByb3RvY29sLWZlZSBhbW91bnQgdG8gc3RvcmUgZm9yIHRva2VuUGF0aC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIGFmdGVyIHN0b3JpbmcgdGhlIGFtb3VudDsgbm9uLW5pbCBmb3IgYSBub24tY3VycmVudCBybG0sIHVuYXV0aG9yaXplZCBjb2RlLXJlYWxtIHdyaXRlLCBvciB1bmRlcmx5aW5nIGF1dGhvcml6YXRpb24gZmFpbHVyZS4KCVNldFBlbmRpbmdQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvcndhcmRlZCB0byB0aGUgc3RvcmFnZSBzZXR0ZXI7IHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHNldHRlciByZWplY3RzIGEgY29udGV4dCB0aGF0IGlzIG5vdCBjdXJyZW50LgoJLy8gICAtIHRva2VuUGF0aDogUmVnaXN0ZXJlZCB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHBlbmRpbmcgZmVlIGVudHJ5IGlzIHJlbW92ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCBhZnRlciByZW1vdmluZyB0aGUgZW50cnk7IG5vbi1uaWwgZm9yIGEgbm9uLWN1cnJlbnQgcmxtLCB1bmF1dGhvcml6ZWQgY29kZS1yZWFsbSB3cml0ZSwgb3IgdW5kZXJseWluZyBhdXRob3JpemF0aW9uIGZhaWx1cmUuCglSZW1vdmVQZW5kaW5nUHJvdG9jb2xGZWUoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykgZXJyb3IKCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIGEgd2l0aGRyYXdhbC1mZWUgYmFzaXMtcG9pbnQgdmFsdWUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCglIYXNXaXRoZHJhd2FsRmVlQlBTKCkgYm9vbAoJLy8gUmV0dXJuczoKCS8vICAgLSB3aXRoZHJhd2FsRmVlQlBTOiBTdG9yZWQgd2l0aGRyYXdhbCBmZWUgaW4gYmFzaXMgcG9pbnRzLgoJR2V0V2l0aGRyYXdhbEZlZUJQUygpIHVpbnQ2NAoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3J3YXJkZWQgdG8gdGhlIHN0b3JhZ2Ugc2V0dGVyOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IHRoZSBzZXR0ZXIgcmVqZWN0cyBhIGNvbnRleHQgdGhhdCBpcyBub3QgY3VycmVudC4KCS8vICAgLSB3aXRoZHJhd2FsRmVlQlBTOiBXaXRoZHJhd2FsIGZlZSByYXRlIGluIGJhc2lzIHBvaW50cyB0byBzdG9yZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIGFmdGVyIHN0b3JpbmcgdGhlIHJhdGU7IG5vbi1uaWwgZm9yIGEgbm9uLWN1cnJlbnQgcmxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KCVNldFdpdGhkcmF3YWxGZWVCUFMoXyBpbnQsIHJsbSByZWFsbSwgd2l0aGRyYXdhbEZlZUJQUyB1aW50NjQpIGVycm9yCgoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgcG9vbCB1bmxvY2tlZCBmbGFnIGhhcyBiZWVuIGluaXRpYWxpemVkLgoJSGFzVW5sb2NrZWQoKSBib29sCgkvLyBSZXR1cm5zOgoJLy8gICAtIHVubG9ja2VkOiBQZXJzaXN0ZWQgZ2xvYmFsIHJlZW50cmFuY3ktbG9jayBzdGF0ZTsgdHJ1ZSBtZWFucyBwb29sIG9wZXJhdGlvbnMgbWF5IHByb2NlZWQgd2l0aG91dCB0aGUgbG9jaywgYW5kIG1hbGZvcm1lZC9taXNzaW5nIHN0b3JhZ2UgcGFuaWNzLgoJR2V0VW5sb2NrZWQoKSBib29sCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IExlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGZvcndhcmRlZCB0byB0aGUgc3RvcmFnZSBzZXR0ZXI7IHBhc3MgMC4KCS8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgdGhlIHNldHRlciByZWplY3RzIGEgY29udGV4dCB0aGF0IGlzIG5vdCBjdXJyZW50LgoJLy8gICAtIHVubG9ja2VkOiBMb2NrIGZsYWcgdG8gc3RvcmU7IGZhbHNlIG1hcmtzIHRoZSBwb29sIGFzIGxvY2tlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIGFmdGVyIHN0b3JpbmcgdGhlIGZsYWc7IG5vbi1uaWwgZm9yIGEgbm9uLWN1cnJlbnQgcmxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KCVNldFVubG9ja2VkKF8gaW50LCBybG0gcmVhbG0sIHVubG9ja2VkIGJvb2wpIGVycm9yCgoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IFRydWUgd2hlbiBhIHN3YXAtc3RhcnQgaG9vayBoYXMgYmVlbiBpbml0aWFsaXplZC4KCUhhc1N3YXBTdGFydEhvb2soKSBib29sCgkvLyBSZXR1cm5zOgoJLy8gICAtIHN3YXBTdGFydEhvb2s6IFN0b3JlZCBjYWxsYmFjayByZWNlaXZpbmcgY3VycmVudCByZWFsbSwgcG9vbCBwYXRoLCBhbmQgdGltZXN0YW1wOyBjYWxsZXJzIHNob3VsZCBjaGVjayBIYXNTd2FwU3RhcnRIb29rIGJlZm9yZSByZXRyaWV2aW5nIGl0LgoJR2V0U3dhcFN0YXJ0SG9vaygpIGZ1bmMoY3VyIHJlYWxtLCBwb29sUGF0aCBzdHJpbmcsIHRpbWVzdGFtcCBpbnQ2NCkKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yd2FyZGVkIHRvIHRoZSBzdG9yYWdlIHNldHRlcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgc2V0dGVyIHJlamVjdHMgYSBjb250ZXh0IHRoYXQgaXMgbm90IGN1cnJlbnQuCgkvLyAgIC0gc3dhcFN0YXJ0SG9vazogQ2FsbGJhY2sgaW52b2tlZCB3aXRoIGN1cnJlbnQgcmVhbG0sIHBvb2wgcGF0aCwgYW5kIHRpbWVzdGFtcCBiZWZvcmUgc3dhcHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCBhZnRlciBzdG9yaW5nIHRoZSBob29rOyBub24tbmlsIGZvciBhIG5vbi1jdXJyZW50IHJsbSBvciBhbiB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGZhaWx1cmUuCglTZXRTd2FwU3RhcnRIb29rKF8gaW50LCBybG0gcmVhbG0sIHN3YXBTdGFydEhvb2sgZnVuYyhjdXIgcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGltZXN0YW1wIGludDY0KSkgZXJyb3IKCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIGEgc3dhcC1lbmQgaG9vayBoYXMgYmVlbiBpbml0aWFsaXplZC4KCUhhc1N3YXBFbmRIb29rKCkgYm9vbAoJLy8gUmV0dXJuczoKCS8vICAgLSBzd2FwRW5kSG9vazogU3RvcmVkIGNhbGxiYWNrIHJlY2VpdmluZyBjdXJyZW50IHJlYWxtIGFuZCBwb29sIHBhdGggYW5kIHJldHVybmluZyBhIGhvb2sgZXJyb3I7IGNhbGxlcnMgc2hvdWxkIGNoZWNrIEhhc1N3YXBFbmRIb29rIGJlZm9yZSByZXRyaWV2aW5nIGl0LgoJR2V0U3dhcEVuZEhvb2soKSBmdW5jKGN1ciByZWFsbSwgcG9vbFBhdGggc3RyaW5nKSBlcnJvcgoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBMZWFkaW5nIGludGVnZXIgZGlzY3JpbWluYXRvciBmb3J3YXJkZWQgdG8gdGhlIHN0b3JhZ2Ugc2V0dGVyOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IHRoZSBzZXR0ZXIgcmVqZWN0cyBhIGNvbnRleHQgdGhhdCBpcyBub3QgY3VycmVudC4KCS8vICAgLSBzd2FwRW5kSG9vazogQ2FsbGJhY2sgaW52b2tlZCB3aXRoIGN1cnJlbnQgcmVhbG0gYW5kIHBvb2wgcGF0aCBhZnRlciBzd2FwczsgaXQgbWF5IHJldHVybiBhbiBlcnJvci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogTmlsIGFmdGVyIHN0b3JpbmcgdGhlIGhvb2s7IG5vbi1uaWwgZm9yIGEgbm9uLWN1cnJlbnQgcmxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KCVNldFN3YXBFbmRIb29rKF8gaW50LCBybG0gcmVhbG0sIHN3YXBFbmRIb29rIGZ1bmMoY3VyIHJlYWxtLCBwb29sUGF0aCBzdHJpbmcpIGVycm9yKSBlcnJvcgoKCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gYSB0aWNrLWNyb3NzIGhvb2sgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCglIYXNUaWNrQ3Jvc3NIb29rKCkgYm9vbAoJLy8gUmV0dXJuczoKCS8vICAgLSB0aWNrQ3Jvc3NIb29rOiBTdG9yZWQgY2FsbGJhY2sgcmVjZWl2aW5nIGN1cnJlbnQgcmVhbG0sIHBvb2wgcGF0aCwgY3Jvc3NlZCB0aWNrLCBkaXJlY3Rpb24sIGFuZCB0aW1lc3RhbXA7IGNhbGxlcnMgc2hvdWxkIGNoZWNrIEhhc1RpY2tDcm9zc0hvb2sgYmVmb3JlIHJldHJpZXZpbmcgaXQuCglHZXRUaWNrQ3Jvc3NIb29rKCkgZnVuYyhjdXIgcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGlja0lkIGludDMyLCB6ZXJvRm9yT25lIGJvb2wsIHRpbWVzdGFtcCBpbnQ2NCkKCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IgZm9yd2FyZGVkIHRvIHRoZSBzdG9yYWdlIHNldHRlcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyB0aGUgc2V0dGVyIHJlamVjdHMgYSBjb250ZXh0IHRoYXQgaXMgbm90IGN1cnJlbnQuCgkvLyAgIC0gdGlja0Nyb3NzSG9vazogQ2FsbGJhY2sgaW52b2tlZCB3aXRoIGN1cnJlbnQgcmVhbG0sIHBvb2wgcGF0aCwgY3Jvc3NlZCB0aWNrLCBkaXJlY3Rpb24sIGFuZCB0aW1lc3RhbXAuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IE5pbCBhZnRlciBzdG9yaW5nIHRoZSBob29rOyBub24tbmlsIGZvciBhIG5vbi1jdXJyZW50IHJsbSBvciBhbiB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGZhaWx1cmUuCglTZXRUaWNrQ3Jvc3NIb29rKF8gaW50LCBybG0gcmVhbG0sIHRpY2tDcm9zc0hvb2sgZnVuYyhjdXIgcmVhbG0sIHBvb2xQYXRoIHN0cmluZywgdGlja0lkIGludDMyLCB6ZXJvRm9yT25lIGJvb2wsIHRpbWVzdGFtcCBpbnQ2NCkpIGVycm9yCn0KCnR5cGUgQ2FsbGJhY2tNYXJrZXIgc3RydWN0e30KCi8vIE5ld0NhbGxiYWNrTWFya2VyIGFsbG9jYXRlcyBhIENhbGxiYWNrTWFya2VyIGluIHRoZSBwb29sIHJlYWxtLgovLyBDb25zdHJ1Y3Rpb24gbXVzdCBoYXBwZW4gaGVyZSBiZWNhdXNlIC9yLy1kZWNsYXJlZCB0eXBlcyBjYW4gb25seSBiZQovLyBhbGxvY2F0ZWQgaW4gdGhlaXIgb3duaW5nIHJlYWxtIChpbnRlcnJlYWxtIHYyIGNoZWNrQ29uc3RydWN0aW9uVGltZSkuCi8vIENhbGxlcnMgaW4gb3RoZXIgcmVhbG1zIChlLmcuIHBvb2wvdjEgaW1wbCkgYm9ycm93IGludG8gcG9vbCB2aWEKLy8gYm9ycm93IHJ1bGUgIzEgKGZ1bmN0aW9uIGRlZmluZWQgaW4gL3IvIHBhY2thZ2UpLgovLyBSZXR1cm5zOgovLyAgIC0gbWFya2VyOiBOZXcgbWFya2VyIHZhbHVlIGFsbG9jYXRlZCBpbiB0aGUgcG9vbCByZWFsbSBmb3Igc3dhcC1jYWxsYmFjayB2YWxpZGF0aW9uLgpmdW5jIE5ld0NhbGxiYWNrTWFya2VyKCkgKkNhbGxiYWNrTWFya2VyIHsKCXJldHVybiAmQ2FsbGJhY2tNYXJrZXJ7fQp9ChqcGAoLdXBncmFkZS5nbm8SjBhwYWNrYWdlIHBvb2wKCmltcG9ydCAoCgkiZXJyb3JzIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgopCgovLyBSZWdpc3RlckluaXRpYWxpemVyIHJlZ2lzdGVycyBhIG5ldyBwb29sIGltcGxlbWVudGF0aW9uIHZlcnNpb24uCi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGVhY2ggdmVyc2lvbiAodjEsIHYyLCBldGMuKSBkdXJpbmcgaW5pdGlhbGl6YXRpb24KLy8gdG8gcmVnaXN0ZXIgdGhlaXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgcHJveHkgc3lzdGVtLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMKLy8gICAgIHJlYWxtLgovLyAgIC0gaW5pdGlhbGl6ZXI6IFZlcnNpb24gZmFjdG9yeSByZWNlaXZpbmcgdGhlIGZvcndhcmRlZCBkaXNjcmltaW5hdG9yLCBjdXJyZW50Ci8vICAgICByZWFsbSwgYW5kIHNoYXJlZCBJUG9vbFN0b3JlOyBpdCByZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZSB0bwovLyAgICAgcmVnaXN0ZXIgYW5kIGxhdGVyIGFjdGl2YXRlLgovLwovLyBTZWN1cml0eTogT25seSBjb250cmFjdHMgd2l0aGluIHRoZSBkb21haW4gcGF0aCBjYW4gcmVnaXN0ZXIgaW5pdGlhbGl6ZXJzLgovLyBFYWNoIHBhY2thZ2UgcGF0aCBjYW4gb25seSByZWdpc3RlciBvbmNlIHRvIHByZXZlbnQgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbnMuCmZ1bmMgUmVnaXN0ZXJJbml0aWFsaXplcihjdXIgcmVhbG0sIGluaXRpYWxpemVyIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgcG9vbFN0b3JlIElQb29sU3RvcmUpIElQb29sKSB7Cglpbml0aWFsaXplckZ1bmMgOj0gZnVuYyhfIGludCwgcmxtIHJlYWxtLCBkb21haW5TdG9yZSBhbnkpIGFueSB7CgkJYWNjZXNzLkFzc2VydElzUmxtQ3VycmVudCgwLCBybG0pCgoJCWN1cnJlbnRQb29sU3RvcmUsIG9rIDo9IGRvbWFpblN0b3JlLihJUG9vbFN0b3JlKQoJCWlmICFvayB7CgkJCXBhbmljKCJkb21haW5TdG9yZSBpcyBub3QgYW4gSVBvb2xTdG9yZSIpCgkJfQoKCQlyZXR1cm4gaW5pdGlhbGl6ZXIoMCwgcmxtLCBjdXJyZW50UG9vbFN0b3JlKQoJfQoKCWVyciA6PSB2ZXJzaW9uTWFuYWdlci5SZWdpc3RlckluaXRpYWxpemVyKDAsIGN1ciwgaW5pdGlhbGl6ZXJGdW5jKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWVyciA9IHVwZGF0ZUltcGxlbWVudGF0aW9uKCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKLy8gVXBncmFkZUltcGwgc3dpdGNoZXMgdGhlIGFjdGl2ZSBwb29sIGltcGxlbWVudGF0aW9uIHRvIGEgZGlmZmVyZW50IHZlcnNpb24uCi8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHNlYW1sZXNzIHVwZ3JhZGVzIGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlciB3aXRob3V0Ci8vIGRhdGEgbWlncmF0aW9uIG9yIGRvd250aW1lLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMKLy8gICAgIHJlYWxtLgovLyAgIC0gcGFja2FnZVBhdGg6IEZ1bGwgcGFja2FnZSBwYXRoIG9mIGEgdmVyc2lvbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZm9yIHRoaXMKLy8gICAgIHBvb2wgZG9tYWluLgovLwovLyBTZWN1cml0eTogT25seSBhZG1pbiBvciBnb3Zlcm5hbmNlIGNhbiBwZXJmb3JtIHVwZ3JhZGVzLgovLyBUaGUgbmV3IGltcGxlbWVudGF0aW9uIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB2aWEgUmVnaXN0ZXJJbml0aWFsaXplci4KLy8gVGhlIHBvb2wgbXVzdCBub3QgYmUgbG9ja2VkIChzZWUgYXNzZXJ0UG9vbFVubG9ja2VkKS4KZnVuYyBVcGdyYWRlSW1wbChjdXIgcmVhbG0sIHBhY2thZ2VQYXRoIHN0cmluZykgewoJLy8gRW5zdXJlIG9ubHkgYWRtaW4gb3IgZ292ZXJuYW5jZSBjYW4gcGVyZm9ybSB1cGdyYWRlcwoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UoY2FsbGVyKQoKCWFzc2VydFBvb2xVbmxvY2tlZCgpCgoJZXJyIDo9IHZlcnNpb25NYW5hZ2VyLkNoYW5nZUltcGxlbWVudGF0aW9uKDAsIGN1ciwgcGFja2FnZVBhdGgpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJZXJyID0gdXBkYXRlSW1wbGVtZW50YXRpb24oKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CgovLyBhc3NlcnRQb29sVW5sb2NrZWQgcGFuaWNzIGlmIHRoZSBwb29sJ3MgcmVlbnRyYW5jeSBsb2NrIGlzIGN1cnJlbnRseSBoZWxkLgovLyBJdCBtaXJyb3JzIHBvb2xWMS5hc3NlcnRQb29sVW5sb2NrZWQgKHIvZ25vc3dhcC9wb29sL3YxL2xvY2suZ25vKTogcmVhZC1vbmx5LAovLyBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgYmVmb3JlIHRoZSBhZG1pbi9nb3Zlcm5hbmNlIGF1dGhvcml6YXRpb24gY2hlY2sgdG9vLgovLyBIYXNVbmxvY2tlZCgpIGlzIGZhbHNlIHVudGlsIGEgc3dhcCBoYXMgZXZlciBydW4sIHNvIHBvb2xzIHdpdGggbm8gc3dhcAovLyBoaXN0b3J5IGFyZSB1bmFmZmVjdGVkLgpmdW5jIGFzc2VydFBvb2xVbmxvY2tlZCgpIHsKCXMgOj0gTmV3UG9vbFN0b3JlKGt2U3RvcmUpCglpZiBzLkhhc1VubG9ja2VkKCkgJiYgIXMuR2V0VW5sb2NrZWQoKSB7CgkJcGFuaWMoZXJyb3JzLk5ldyhlcnJVcGdyYWRlV2hpbGVMb2NrZWQpKQoJfQp9CgovLyBHZXRJbXBsZW1lbnRhdGlvblBhY2thZ2VQYXRoIHJldHVybnMgdGhlIHBhY2thZ2UgcGF0aCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBhY2thZ2VQYXRoOiBGdWxsIHBhY2thZ2UgcGF0aCBvZiB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uOyBlbXB0eSBiZWZvcmUKLy8gICAgIGFueSB2ZXJzaW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCmZ1bmMgR2V0SW1wbGVtZW50YXRpb25QYWNrYWdlUGF0aCgpIHN0cmluZyB7CglyZXR1cm4gdmVyc2lvbk1hbmFnZXIuR2V0Q3VycmVudFBhY2thZ2VQYXRoKCkKfQoavxAKCXV0aWxzLmdubxKxEHBhY2thZ2UgcG9vbAoKaW1wb3J0ICgKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKKQoKY29uc3QgTUFYX1RJQ0sgaW50MzIgPSA4ODcyNzIKCi8vIEdldFBvb2xQYXRoIGdlbmVyYXRlcyBhIHVuaXF1ZSBwb29sIHBhdGggc3RyaW5nIGJhc2VkIG9uIHRoZSB0b2tlbiBwYXRocyBhbmQgZmVlIHRpZXIuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlbjBQYXRoOiBwYXRoIG9mIHRoZSBmaXJzdCB0b2tlbiBjb250cmFjdDsgaXQgaXMgcmVvcmRlcmVkIHdpdGgKLy8gICAgIHRva2VuMVBhdGggd2hlbiBuZWVkZWQgdG8gZm9ybSBjYW5vbmljYWwgcG9vbCBvcmRlci4KLy8gICAtIHRva2VuMVBhdGg6IHBhdGggb2YgdGhlIHNlY29uZCB0b2tlbiBjb250cmFjdDsgaXQgaXMgcmVvcmRlcmVkIHdpdGgKLy8gICAgIHRva2VuMFBhdGggd2hlbiBpdCBzb3J0cyBlYXJsaWVyLgovLyAgIC0gZmVlOiBwb29sIGZlZSB0aWVyIGVuY29kZWQgYXMgaXRzIGRlY2ltYWwgdWludDMyIHZhbHVlIGluIHRoZSBwYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcG9vbFBhdGg6IGNhbm9uaWNhbCB0b2tlbjA6dG9rZW4xOmZlZSBpZGVudGlmaWVyIHdpdGggdG9rZW4gcGF0aHMgaW4KLy8gICAgIGxleGljb2dyYXBoaWNhbCBvcmRlci4KZnVuYyBHZXRQb29sUGF0aCh0b2tlbjBQYXRoLCB0b2tlbjFQYXRoIHN0cmluZywgZmVlIHVpbnQzMikgc3RyaW5nIHsKCS8vIEFsbCB0aGUgdG9rZW4gcGF0aHMgaW4gdGhlIHBvb2wgYXJlIHNvcnRlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuCglpZiBzdHJpbmdzLkNvbXBhcmUodG9rZW4xUGF0aCwgdG9rZW4wUGF0aCkgPCAwIHsKCQl0b2tlbjBQYXRoLCB0b2tlbjFQYXRoID0gdG9rZW4xUGF0aCwgdG9rZW4wUGF0aAoJfQoKCXJldHVybiB0b2tlbjBQYXRoICsgIjoiICsgdG9rZW4xUGF0aCArICI6IiArIHN0cmNvbnYuRm9ybWF0VWludCh1aW50NjQoZmVlKSwgMTApCn0KCi8vIEVuY29kZVRpY2tLZXkgZW5jb2RlcyBhIHRpY2sgYXMgYSBmaXhlZC13aWR0aCA0LWJ5dGUga2V5IHdob3NlCi8vIGxleGljb2dyYXBoaWMgb3JkZXIgbWF0Y2hlcyB0aGUgc2lnbmVkIG51bWVyaWMgb3JkZXIuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWNrOiBzaWduZWQgdGljayBpbmRleCB0byBlbmNvZGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBrZXk6IGZpeGVkLXdpZHRoIG9yZGVyZWQga2V5IHdob3NlIGxleGljb2dyYXBoaWNhbCBvcmRlcmluZyBtYXRjaGVzIHRoZQovLyAgICAgc2lnbmVkIG51bWVyaWMgb3JkZXJpbmcgb2YgdGljay4KZnVuYyBFbmNvZGVUaWNrS2V5KHRpY2sgaW50MzIpIHN0cmluZyB7CglyZXR1cm4gdXRpbHMuRW5jb2RlSW50MzIodGljaykKfQoKLy8gRW5jb2RlUG9zaXRpb25LZXkgZW5jb2RlcyBhIHBvc2l0aW9uIHJhbmdlIGFzIHR3byBvcmRlcmVkIHRpY2sga2V5cy4KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpY2tMb3dlcjogbG93ZXIgc2lnbmVkIHRpY2sgaW5kZXggb2YgdGhlIHBvc2l0aW9uIHJhbmdlLgovLyAgIC0gdGlja1VwcGVyOiB1cHBlciBzaWduZWQgdGljayBpbmRleCBvZiB0aGUgcG9zaXRpb24gcmFuZ2UuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBrZXk6IGNvbmNhdGVuYXRpb24gb2YgdGhlIG9yZGVyZWQgZW5jb2RpbmdzIG9mIHRpY2tMb3dlciBhbmQgdGlja1VwcGVyLgpmdW5jIEVuY29kZVBvc2l0aW9uS2V5KHRpY2tMb3dlciwgdGlja1VwcGVyIGludDMyKSBzdHJpbmcgewoJcmV0dXJuIHV0aWxzLkVuY29kZUludDMyKHRpY2tMb3dlcikgKyB1dGlscy5FbmNvZGVJbnQzMih0aWNrVXBwZXIpCn0KCi8vIERlY29kZVRpY2tLZXkgZGVjb2RlcyBhIGZpeGVkLXdpZHRoIG9yZGVyZWQgdGljayBrZXkuCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBrZXk6IGZpeGVkLXdpZHRoIG9yZGVyZWQgdGljayBrZXkgcHJvZHVjZWQgYnkgRW5jb2RlVGlja0tleS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpY2s6IHNpZ25lZCB0aWNrIGluZGV4IGRlY29kZWQgZnJvbSBrZXkuCmZ1bmMgRGVjb2RlVGlja0tleShrZXkgc3RyaW5nKSBpbnQzMiB7CglyZXR1cm4gdXRpbHMuRGVjb2RlSW50MzIoa2V5KQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBITCJK0iewBEgsyNDc1NDJ1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMEnNUEw+LSOqLPC53myjgfoun1lzihgX/ZUaUiNcK64RJA3DGNe1sFbB7CH69BmyRZeTqEqEW69dweyH+TPIswJk43Qr+V1Gojf7ljekNe3EQ4mt6XUS77D3+tOUuWyYJ5zxooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==